More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,817 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 17732273 | 20 days ago | IN | 0 CRO | 0.6615702 | ||||
Withdraw | 17731876 | 20 days ago | IN | 0 CRO | 1.13846695 | ||||
Withdraw | 17608430 | 28 days ago | IN | 0 CRO | 0.5075 | ||||
Withdraw | 17608426 | 28 days ago | IN | 0 CRO | 0.5025 | ||||
Withdraw | 17608423 | 28 days ago | IN | 0 CRO | 0.57922995 | ||||
Withdraw | 17446152 | 38 days ago | IN | 0 CRO | 0.66564555 | ||||
Stake | 17209769 | 54 days ago | IN | 0 CRO | 0.76177735 | ||||
Withdraw | 17192067 | 55 days ago | IN | 0 CRO | 0.62322555 | ||||
Withdraw | 16999760 | 68 days ago | IN | 0 CRO | 0.75193995 | ||||
Stake | 16842301 | 78 days ago | IN | 0 CRO | 0.5751546 | ||||
Stake | 16841790 | 79 days ago | IN | 0 CRO | 0.6615096 | ||||
Withdraw | 16841730 | 79 days ago | IN | 0 CRO | 0.737603 | ||||
Withdraw | 16703736 | 88 days ago | IN | 0 CRO | 0.81531745 | ||||
Withdraw | 16700726 | 88 days ago | IN | 0 CRO | 0.5224016 | ||||
Withdraw | 16700722 | 88 days ago | IN | 0 CRO | 1.1235644 | ||||
Stake | 16697234 | 88 days ago | IN | 0 CRO | 0.74769795 | ||||
Withdraw | 16697228 | 88 days ago | IN | 0 CRO | 0.63742615 | ||||
Stake | 16305747 | 114 days ago | IN | 0 CRO | 0.76165615 | ||||
Withdraw | 16222944 | 119 days ago | IN | 0 CRO | 0.70062185 | ||||
Stake | 16103826 | 127 days ago | IN | 0 CRO | 0.74763735 | ||||
Withdraw | 16015538 | 133 days ago | IN | 0 CRO | 0.60018745 | ||||
Withdraw | 16015533 | 133 days ago | IN | 0 CRO | 0.62322555 | ||||
Stake | 15953690 | 137 days ago | IN | 0 CRO | 0.74763735 | ||||
Withdraw | 15953644 | 137 days ago | IN | 0 CRO | 0.62322555 | ||||
Stake | 15878946 | 141 days ago | IN | 0 CRO | 0.94862735 |
Loading...
Loading
Contract Name:
MultiFeeDistribution2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-01-17 */ pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; // SPDX-License-Identifier: UNLICENSED /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface IMintableToken is IERC20 { function mint(address _receiver, uint256 _amount) external returns (bool); } // EPS Staking contract for http://ellipsis.finance/ // EPS staked within this contact entitles stakers to a portion of the admin fees generated by Ellipsis' AMM contracts // Based on SNX MultiRewards by iamdefinitelyahuman - https://github.com/iamdefinitelyahuman/multi-rewards contract MultiFeeDistribution2 is ReentrancyGuard, Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; using SafeERC20 for IMintableToken; /* ========== STATE VARIABLES ========== */ struct Reward { uint256 periodFinish; uint256 rewardRate; uint256 lastUpdateTime; uint256 rewardPerTokenStored; } struct Balances { uint256 total; uint256 unlocked; uint256 locked; uint256 earned; } struct LockedBalance { uint256 amount; uint256 unlockTime; } struct RewardData { address token; uint256 amount; } IMintableToken public stakingToken; address[] public rewardTokens; mapping(address => Reward) public rewardData; // Duration that rewards are streamed over uint256 public constant rewardsDuration = 86400 * 7; // Duration of lock/earned penalty period uint256 public constant lockDuration = rewardsDuration * 13; // Addresses approved to call mint mapping(address => bool) public minters; // reward token -> distributor -> is approved to add rewards mapping(address=> mapping(address => bool)) public rewardDistributors; // Addresses approved to lock stakes mapping(address => bool) public lockedStakeWhitelist; // user -> reward token -> amount mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid; mapping(address => mapping(address => uint256)) public rewards; uint256 public totalSupply; uint256 public lockedSupply; // Private mappings for balance data mapping(address => Balances) balances; mapping(address => LockedBalance[]) userLocks; mapping(address => LockedBalance[]) userEarnings; /* ========== CONSTRUCTOR ========== */ constructor( address _stakingToken, address[] memory _minters ) public Ownable() { stakingToken = IMintableToken(_stakingToken); for (uint i; i < _minters.length; i++) { minters[_minters[i]] = true; } // First reward MUST be the staking token or things will break // related to the 50% penalty and distribution to locked balances rewardTokens.push(_stakingToken); rewardData[_stakingToken].lastUpdateTime = block.timestamp; } /* ========== ADMIN CONFIGURATION ========== */ // Add a new reward token to be distributed to stakers function addReward( address _rewardsToken, address _distributor ) public onlyOwner { require(rewardData[_rewardsToken].lastUpdateTime == 0); rewardTokens.push(_rewardsToken); rewardData[_rewardsToken].lastUpdateTime = block.timestamp; rewardDistributors[_rewardsToken][_distributor] = true; } // Modify approval for an address to call notifyRewardAmount function approveRewardDistributor( address _rewardsToken, address _distributor, bool _approved ) external onlyOwner { require(rewardData[_rewardsToken].lastUpdateTime > 0); rewardDistributors[_rewardsToken][_distributor] = _approved; } function setLockedStakeContract( address _address, bool _approved ) public onlyOwner { lockedStakeWhitelist[_address] = _approved; } /* ========== VIEWS ========== */ function _rewardPerToken(address _rewardsToken, uint256 _supply) internal view returns (uint256) { if (_supply == 0) { return rewardData[_rewardsToken].rewardPerTokenStored; } return rewardData[_rewardsToken].rewardPerTokenStored.add( lastTimeRewardApplicable(_rewardsToken).sub( rewardData[_rewardsToken].lastUpdateTime).mul( rewardData[_rewardsToken].rewardRate).mul(1e18).div(_supply) ); } function _earned( address _user, address _rewardsToken, uint256 _balance, uint256 supply ) internal view returns (uint256) { return _balance.mul( _rewardPerToken(_rewardsToken, supply).sub(userRewardPerTokenPaid[_user][_rewardsToken]) ).div(1e18).add(rewards[_user][_rewardsToken]); } function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint256) { return Math.min(block.timestamp, rewardData[_rewardsToken].periodFinish); } function rewardPerToken(address _rewardsToken) external view returns (uint256) { uint256 supply = _rewardsToken == address(stakingToken) ? lockedSupply : totalSupply; return _rewardPerToken(_rewardsToken, supply); } function getRewardForDuration(address _rewardsToken) external view returns (uint256) { return rewardData[_rewardsToken].rewardRate.mul(rewardsDuration); } // Address and claimable amount of all reward tokens for the given account function claimableRewards(address account) external view returns (RewardData[] memory rewards) { rewards = new RewardData[](rewardTokens.length); for (uint256 i = 0; i < rewards.length; i++) { // If i == 0 this is the stakingReward, distribution is based on locked balances uint256 balance = i == 0 ? balances[account].locked : balances[account].total; uint256 supply = i == 0 ? lockedSupply : totalSupply; rewards[i].token = rewardTokens[i]; rewards[i].amount = _earned(account, rewards[i].token, balance, supply); } return rewards; } // Total balance of an account, including unlocked, locked and earned tokens function totalBalance(address user) view external returns (uint256 amount) { return balances[user].total; } // Total withdrawable balance for an account to which no penalty is applied function unlockedBalance(address user) view external returns (uint256 amount) { amount = balances[user].unlocked; LockedBalance[] storage earnings = userEarnings[msg.sender]; for (uint i = 0; i < earnings.length; i++) { if (earnings[i].unlockTime > block.timestamp) { break; } amount = amount.add(earnings[i].amount); } return amount; } // Information on the "earned" balances of a user // Earned balances may be withdrawn immediately for a 50% penalty function earnedBalances( address user ) view external returns ( uint256 total, LockedBalance[] memory earningsData ) { LockedBalance[] storage earnings = userEarnings[user]; uint256 idx; for (uint i = 0; i < earnings.length; i++) { if (earnings[i].unlockTime > block.timestamp) { if (idx == 0) { earningsData = new LockedBalance[](earnings.length - i); } earningsData[idx] = earnings[i]; idx++; total = total.add(earnings[i].amount); } } return (total, earningsData); } // Information on a user's locked balances function lockedBalances( address user ) view external returns ( uint256 total, uint256 unlockable, uint256 locked, LockedBalance[] memory lockData ) { LockedBalance[] storage locks = userLocks[user]; uint256 idx; for (uint i = 0; i < locks.length; i++) { if (locks[i].unlockTime > block.timestamp) { if (idx == 0) { lockData = new LockedBalance[](locks.length - i); } lockData[idx] = locks[i]; idx++; locked = locked.add(locks[i].amount); } else { unlockable = unlockable.add(locks[i].amount); } } return (balances[user].locked, unlockable, locked, lockData); } // Final balance received and penalty balance paid by user upon calling exit function withdrawableBalance( address user ) view public returns ( uint256 amount, uint256 penaltyAmount ) { Balances storage bal = balances[user]; if (bal.earned > 0) { uint256 amountWithoutPenalty; uint256 length = userEarnings[user].length; for (uint i = 0; i < length; i++) { uint256 earnedAmount = userEarnings[user][i].amount; if (earnedAmount == 0) continue; if (userEarnings[user][i].unlockTime > block.timestamp) { break; } amountWithoutPenalty = amountWithoutPenalty.add(earnedAmount); } penaltyAmount = bal.earned.sub(amountWithoutPenalty).div(2); } amount = bal.unlocked.add(bal.earned).sub(penaltyAmount); return (amount, penaltyAmount); } /* ========== MUTATIVE FUNCTIONS ========== */ //same function signature as original `stake` function for compatibility with original ABI function stake(uint256 amount, bool ignored) external { _stake(amount, false); } function stakeLocked(uint256 amount) external { // Only allow approved contracts to stake locked, since an external contract will be used to handle locked stakes require(lockedStakeWhitelist[msg.sender], "not whitelisted"); _stake(amount, true); } // Stake tokens to receive rewards // Locked tokens cannot be withdrawn for lockDuration and are eligible to receive stakingReward rewards function _stake(uint256 amount, bool lock) internal nonReentrant updateReward(msg.sender) { require(amount > 0, "Cannot stake 0"); totalSupply = totalSupply.add(amount); Balances storage bal = balances[msg.sender]; bal.total = bal.total.add(amount); if (lock) { lockedSupply = lockedSupply.add(amount); bal.locked = bal.locked.add(amount); uint256 unlockTime = block.timestamp.div(rewardsDuration).mul(rewardsDuration).add(lockDuration); uint256 idx = userLocks[msg.sender].length; if (idx == 0 || userLocks[msg.sender][idx-1].unlockTime < unlockTime) { userLocks[msg.sender].push(LockedBalance({amount: amount, unlockTime: unlockTime})); } else { userLocks[msg.sender][idx-1].amount = userLocks[msg.sender][idx-1].amount.add(amount); } } else { bal.unlocked = bal.unlocked.add(amount); } stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Staked(msg.sender, amount); } // Mint new tokens // Minted tokens receive rewards normally but incur a 50% penalty when // withdrawn before lockDuration has passed. function mint(address user, uint256 amount) external updateReward(user) { require(minters[msg.sender], "not minter"); totalSupply = totalSupply.add(amount); Balances storage bal = balances[user]; bal.total = bal.total.add(amount); bal.earned = bal.earned.add(amount); uint256 unlockTime = block.timestamp.div(rewardsDuration).mul(rewardsDuration).add(lockDuration); LockedBalance[] storage earnings = userEarnings[user]; uint256 idx = earnings.length; if (idx == 0 || earnings[idx-1].unlockTime < unlockTime) { earnings.push(LockedBalance({amount: amount, unlockTime: unlockTime})); } else { earnings[idx-1].amount = earnings[idx-1].amount.add(amount); } stakingToken.mint(address(this), amount); emit Staked(user, amount); } // Withdraw staked tokens // First withdraws unlocked tokens, then earned tokens. Withdrawing earned tokens // incurs a 50% penalty which is distributed based on locked balances. function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) { require(amount > 0, "Cannot withdraw 0"); Balances storage bal = balances[msg.sender]; uint256 penaltyAmount; if (amount <= bal.unlocked) { bal.unlocked = bal.unlocked.sub(amount); } else { uint256 remaining = amount.sub(bal.unlocked); require(bal.earned >= remaining, "Insufficient unlocked balance"); bal.unlocked = 0; bal.earned = bal.earned.sub(remaining); for (uint i = 0; ; i++) { uint256 earnedAmount = userEarnings[msg.sender][i].amount; if (earnedAmount == 0) continue; if (penaltyAmount == 0 && userEarnings[msg.sender][i].unlockTime > block.timestamp) { penaltyAmount = remaining; require(bal.earned >= remaining, "Insufficient balance after penalty"); bal.earned = bal.earned.sub(remaining); if (bal.earned == 0) { delete userEarnings[msg.sender]; break; } remaining = remaining.mul(2); } if (remaining <= earnedAmount) { userEarnings[msg.sender][i].amount = earnedAmount.sub(remaining); break; } else { delete userEarnings[msg.sender][i]; remaining = remaining.sub(earnedAmount); } } } uint256 adjustedAmount = amount.add(penaltyAmount); bal.total = bal.total.sub(adjustedAmount); totalSupply = totalSupply.sub(adjustedAmount); stakingToken.safeTransfer(msg.sender, amount); if (penaltyAmount > 0) { _notifyReward(address(stakingToken), penaltyAmount); } emit Withdrawn(msg.sender, amount); } // Claim all pending staking rewards function getReward() public nonReentrant updateReward(msg.sender) { for (uint i; i < rewardTokens.length; i++) { address _rewardsToken = rewardTokens[i]; uint256 reward = rewards[msg.sender][_rewardsToken]; if (reward > 0) { rewards[msg.sender][_rewardsToken] = 0; IERC20(_rewardsToken).safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, _rewardsToken, reward); } } } // Withdraw all currently locked tokens where the unlock time has passed function withdrawExpiredLocks() external { LockedBalance[] storage locks = userLocks[msg.sender]; Balances storage bal = balances[msg.sender]; uint256 amount; uint256 length = locks.length; if (locks[length-1].unlockTime <= block.timestamp) { //Certik: length is guaranteed to be >= 1 amount = bal.locked; delete userLocks[msg.sender]; } else { for (uint i = 0; i < length; i++) { if (locks[i].unlockTime > block.timestamp) break; amount = amount.add(locks[i].amount); delete locks[i]; } } bal.locked = bal.locked.sub(amount); bal.total = bal.total.sub(amount); totalSupply = totalSupply.sub(amount); lockedSupply = lockedSupply.sub(amount); stakingToken.safeTransfer(msg.sender, amount); } /* ========== RESTRICTED FUNCTIONS ========== */ function _notifyReward(address _rewardsToken, uint256 reward) internal { if (block.timestamp >= rewardData[_rewardsToken].periodFinish) { rewardData[_rewardsToken].rewardRate = reward.div(rewardsDuration); } else { uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardData[_rewardsToken].rewardRate); rewardData[_rewardsToken].rewardRate = reward.add(leftover).div(rewardsDuration); } rewardData[_rewardsToken].lastUpdateTime = block.timestamp; rewardData[_rewardsToken].periodFinish = block.timestamp.add(rewardsDuration); } function notifyRewardAmount(address _rewardsToken, uint256 reward) external updateReward(address(0)) { require(rewardDistributors[_rewardsToken][msg.sender], "Not reward distributor"); require(reward > 0, "No reward"); // handle the transfer of reward tokens via `transferFrom` to reduce the number // of transactions required and ensure correctness of the reward amount IERC20(_rewardsToken).safeTransferFrom(msg.sender, address(this), reward); _notifyReward(_rewardsToken, reward); emit RewardAdded(reward); } // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner { require(tokenAddress != address(stakingToken), "Cannot withdraw staking token"); require(rewardData[tokenAddress].lastUpdateTime == 0, "Cannot withdraw reward token"); IERC20(tokenAddress).safeTransfer(owner(), tokenAmount); emit Recovered(tokenAddress, tokenAmount); } /* ========== MODIFIERS ========== */ modifier updateReward(address account) { address token = address(stakingToken); uint256 balance; uint256 supply = lockedSupply; rewardData[token].rewardPerTokenStored = _rewardPerToken(token, supply); rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token); if (account != address(0)) { // Special case, use the locked balances and supply for stakingReward rewards rewards[account][token] = _earned(account, token, balances[account].locked, supply); userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored; balance = balances[account].total; } supply = totalSupply; for (uint i = 1; i < rewardTokens.length; i++) { token = rewardTokens[i]; rewardData[token].rewardPerTokenStored = _rewardPerToken(token, supply); rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token); if (account != address(0)) { rewards[account][token] = _earned(account, token, balance, supply); userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored; } } _; } /* ========== EVENTS ========== */ event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, address indexed rewardsToken, uint256 reward); event Recovered(address token, uint256 amount); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address[]","name":"_minters","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardsToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_distributor","type":"address"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_distributor","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"approveRewardDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimableRewards","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MultiFeeDistribution2.RewardData[]","name":"rewards","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"earnedBalances","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"internalType":"struct MultiFeeDistribution2.LockedBalance[]","name":"earningsData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"lockedBalances","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"unlockable","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"internalType":"struct MultiFeeDistribution2.LockedBalance[]","name":"lockData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedStakeWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewardDistributors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setLockedStakeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"ignored","type":"bool"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IMintableToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"unlockedBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawExpiredLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"withdrawableBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620034df380380620034df833981016040819052620000349162000192565b600160009081556200004562000170565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b0319166001600160a01b03841617905560005b81518110156200010957600160056000848481518110620000ce57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101620000b1565b505060038054600181019091557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b039092166001600160a01b03199092168217905560009081526004602052604090204260029091015562000286565b3390565b80516001600160a01b03811681146200018c57600080fd5b92915050565b60008060408385031215620001a5578182fd5b620001b1848462000174565b602084810151919350906001600160401b0380821115620001d0578384fd5b818601915086601f830112620001e4578384fd5b815181811115620001f3578485fd5b8381029150620002058483016200025f565b8181528481019084860184860187018b101562000220578788fd5b8795505b838610156200024e57620002398b8262000174565b83526001959095019491860191860162000224565b508096505050505050509250929050565b6040518181016001600160401b03811182821017156200027e57600080fd5b604052919050565b61324980620002966000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80636eacd39811610125578063b66503cf116100ad578063df3798761161007c578063df3798761461045a578063e70b9e271461047b578063f12297771461048e578063f2fde38b146104a1578063f46eccc4146104b457610211565b8063b66503cf1461040c578063bcd110141461041f578063ca5c7b9114610432578063dc01f60d1461043a57610211565b80637bb7bed1116100f45780637bb7bed1146103c35780638980f11f146103d65780638da5cb5b146103e9578063a01c77bc146103f1578063abe50f19146103f957610211565b80636eacd398146103805780637035ab9814610393578063715018a6146103a657806372f702f3146103ae57610211565b80633d18b912116101a8578063590b3f8111610177578063590b3f81146103215780635e0fac2e1461033457806362cc445c14610347578063638634ee1461035a5780636724c9101461036d57610211565b80633d18b912146102d057806340b47e1a146102d857806340c10f19146102eb57806348e5d9f8146102fe57610211565b80631ace1dd8116101e45780631ace1dd8146102805780632e1a7d4d146102a0578063386a9525146102b557806339fc9713146102bd57610211565b806302b629381461021657806304554443146102405780630483a7f61461025557806318160ddd14610278575b600080fd5b610229610224366004612a77565b6104c7565b60405161023792919061316c565b60405180910390f35b610248610606565b604051610237919061314a565b610268610263366004612a77565b61060d565b604051610237949392919061317a565b61024861079b565b61029361028e366004612a77565b6107a1565b6040516102379190612cd3565b6102b36102ae366004612b8d565b6107b6565b005b610248610ca0565b6102936102cb366004612a92565b610ca7565b6102b3610cc7565b6102b36102e6366004612a92565b610fb4565b6102b36102f9366004612b47565b61109d565b61031161030c366004612a77565b6114c2565b60405161023794939291906131a9565b6102b361032f366004612b10565b6114e9565b610248610342366004612a77565b611553565b6102b3610355366004612b8d565b6115ea565b610248610368366004612a77565b611627565b6102b361037b366004612ac6565b611651565b61024861038e366004612a77565b6116ef565b6102486103a1366004612a92565b61170a565b6102b3611727565b6103b66117b0565b6040516102379190612c2a565b6103b66103d1366004612b8d565b6117bf565b6102b36103e4366004612b47565b6117e6565b6103b66118e5565b6102b36118f4565b6102b3610407366004612ba5565b611a34565b6102b361041a366004612b47565b611a43565b61024861042d366004612a77565b611ce1565b610248611d0a565b61044d610448366004612a77565b611d10565b6040516102379190612c7b565b61046d610468366004612a77565b611e78565b604051610237929190613153565b610248610489366004612a92565b611f9c565b61024861049c366004612a77565b611fb9565b6102b36104af366004612a77565b611ff2565b6102936104c2366004612a77565b6120b3565b6001600160a01b0381166000908152600c602052604081206003810154829190156105d9576001600160a01b0384166000908152600e6020526040812054815b818110156105b1576001600160a01b0387166000908152600e6020526040812080548390811061053357fe5b9060005260206000209060020201600001549050806000141561055657506105a9565b6001600160a01b0388166000908152600e6020526040902080544291908490811061057d57fe5b906000526020600020906002020160010154111561059b57506105b1565b6105a584826120c8565b9350505b600101610507565b506105d460026105ce8486600301546120ed90919063ffffffff16565b90612115565b935050505b6105fe826105f8836003015484600101546120c890919063ffffffff16565b906120ed565b925050915091565b6277f88081565b6001600160a01b0381166000908152600d602052604081208190819060609082805b8254811015610773574283828154811061064557fe5b906000526020600020906002020160010154111561074157816106bb57825481900367ffffffffffffffff8111801561067d57600080fd5b506040519080825280602002602001820160405280156106b757816020015b6106a46129ef565b81526020019060019003908161069c5790505b5093505b8281815481106106c757fe5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505084838151811061070057fe5b6020026020010181905250818060010192505061073a83828154811061072257fe5b600091825260209091206002909102015486906120c8565b945061076b565b61076883828154811061075057fe5b600091825260209091206002909102015487906120c8565b95505b60010161062f565b5050506001600160a01b0385166000908152600c602052604090206002015493509193509193565b600a5481565b60076020526000908152604090205460ff1681565b600260005414156107e25760405162461bcd60e51b81526004016107d990613113565b60405180910390fd5b600260008181559054600b5433926001600160a01b0390921691906108078382612147565b6001600160a01b03841660009081526004602052604090206003015561082c83611627565b6001600160a01b038085166000908152600460205260409020600201919091558416156108d8576001600160a01b0384166000908152600c602052604090206002015461087d9085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b6003548110156109c457600381815481106108f657fe5b6000918252602090912001546001600160a01b031693506109178483612147565b6001600160a01b03851660009081526004602052604090206003015561093c84611627565b6001600160a01b038086166000908152600460205260409020600201919091558516156109bc5761096f858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016108df565b50600085116109e55760405162461bcd60e51b81526004016107d990612ecf565b336000908152600c6020526040812060018101549091908711610a1b576001820154610a1190886120ed565b6001830155610bf0565b6000610a348360010154896120ed90919063ffffffff16565b90508083600301541015610a5a5760405162461bcd60e51b81526004016107d990612ffb565b600060018401556003830154610a7090826120ed565b600384015560005b336000908152600e60205260408120805483908110610a9357fe5b90600052602060002090600202016000015490508060001415610ab65750610be5565b83158015610af15750336000908152600e60205260409020805442919084908110610add57fe5b906000526020600020906002020160010154115b15610b63578293508285600301541015610b1d5760405162461bcd60e51b81526004016107d990612db6565b6003850154610b2c90846120ed565b60038601819055610b5557336000908152600e60205260408120610b4f91612a09565b50610bed565b610b6083600261224e565b92505b808311610ba657610b7481846120ed565b336000908152600e60205260409020805484908110610b8f57fe5b600091825260209091206002909102015550610bed565b336000908152600e60205260409020805483908110610bc157fe5b60009182526020822060029091020181815560010155610be183826120ed565b9250505b600101610a78565b50505b6000610bfc88836120c8565b8354909150610c0b90826120ed565b8355600a54610c1a90826120ed565b600a55600254610c34906001600160a01b0316338a612288565b8115610c5057600254610c50906001600160a01b0316836122e3565b336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d589604051610c89919061314a565b60405180910390a250506001600055505050505050565b62093a8081565b600660209081526000928352604080842090915290825290205460ff1681565b60026000541415610cea5760405162461bcd60e51b81526004016107d990613113565b600260008181559054600b5433926001600160a01b039092169190610d0f8382612147565b6001600160a01b038416600090815260046020526040902060030155610d3483611627565b6001600160a01b03808516600090815260046020526040902060020191909155841615610de0576001600160a01b0384166000908152600c6020526040902060020154610d859085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015610ecc5760038181548110610dfe57fe5b6000918252602090912001546001600160a01b03169350610e1f8483612147565b6001600160a01b038516600090815260046020526040902060030155610e4484611627565b6001600160a01b03808616600090815260046020526040902060020191909155851615610ec457610e77858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101610de7565b5060005b600354811015610fa857600060038281548110610ee957fe5b60009182526020808320909101543383526009825260408084206001600160a01b03909216808552919092529120549091508015610f9e573360008181526009602090815260408083206001600160a01b0387168085529252822091909155610f529183612288565b816001600160a01b0316336001600160a01b03167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610f95919061314a565b60405180910390a35b5050600101610ed0565b50506001600055505050565b610fbc6123fe565b6001600160a01b0316610fcd6118e5565b6001600160a01b031614610ff35760405162461bcd60e51b81526004016107d990612f3b565b6001600160a01b0382166000908152600460205260409020600201541561101957600080fd5b6003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b039485169081179091556000908152600460209081526040808320426002909101556006825280832094909516825292909252919020805460ff19169091179055565b600254600b5483916001600160a01b0316906000906110bc8382612147565b6001600160a01b0384166000908152600460205260409020600301556110e183611627565b6001600160a01b0380851660009081526004602052604090206002019190915584161561118d576001600160a01b0384166000908152600c60205260409020600201546111329085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b60035481101561127957600381815481106111ab57fe5b6000918252602090912001546001600160a01b031693506111cc8483612147565b6001600160a01b0385166000908152600460205260409020600301556111f184611627565b6001600160a01b0380861660009081526004602052604090206002019190915585161561127157611224858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101611194565b503360009081526005602052604090205460ff166112a95760405162461bcd60e51b81526004016107d990612fd7565b600a546112b690866120c8565b600a556001600160a01b0386166000908152600c6020526040902080546112dd90876120c8565b815560038101546112ee90876120c8565b600382015560006113196277f88061131362093a8061130d4282612115565b9061224e565b906120c8565b6001600160a01b0389166000908152600e6020526040902080549192509080158061136357508282600183038154811061134f57fe5b906000526020600020906002020160010154105b156113a55760408051808201909152898152602080820185815284546001818101875560008781529390932093516002909102909301928355519101556113f0565b6113cf898360018403815481106113b857fe5b6000918252602090912060029091020154906120c8565b8260018303815481106113de57fe5b60009182526020909120600290910201555b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906114229030908d90600401612c62565b602060405180830381600087803b15801561143c57600080fd5b505af1158015611450573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114749190612b71565b50896001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d8a6040516114ae919061314a565b60405180910390a250505050505050505050565b60046020526000908152604090208054600182015460028301546003909301549192909184565b6114f16123fe565b6001600160a01b03166115026118e5565b6001600160a01b0316146115285760405162461bcd60e51b81526004016107d990612f3b565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600c6020908152604080832060010154338452600e909252822090915b81548110156115e3574282828154811061159557fe5b90600052602060002090600202016001015411156115b2576115e3565b6115d98282815481106115c157fe5b600091825260209091206002909102015484906120c8565b925060010161157f565b5050919050565b3360009081526007602052604090205460ff166116195760405162461bcd60e51b81526004016107d990613069565b611624816001612402565b50565b6001600160a01b03811660009081526004602052604081205461164b904290612812565b92915050565b6116596123fe565b6001600160a01b031661166a6118e5565b6001600160a01b0316146116905760405162461bcd60e51b81526004016107d990612f3b565b6001600160a01b0383166000908152600460205260409020600201546116b557600080fd5b6001600160a01b03928316600090815260066020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6001600160a01b03166000908152600c602052604090205490565b600860209081526000928352604080842090915290825290205481565b61172f6123fe565b6001600160a01b03166117406118e5565b6001600160a01b0316146117665760405162461bcd60e51b81526004016107d990612f3b565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b6002546001600160a01b031681565b600381815481106117cc57fe5b6000918252602090912001546001600160a01b0316905081565b6117ee6123fe565b6001600160a01b03166117ff6118e5565b6001600160a01b0316146118255760405162461bcd60e51b81526004016107d990612f3b565b6002546001600160a01b03838116911614156118535760405162461bcd60e51b81526004016107d990612fa0565b6001600160a01b0382166000908152600460205260409020600201541561188c5760405162461bcd60e51b81526004016107d9906130dc565b6118a86118976118e5565b6001600160a01b0384169083612288565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2882826040516118d9929190612c62565b60405180910390a15050565b6001546001600160a01b031690565b336000908152600d60209081526040808320600c90925282208154919290914284600019830183811061192357fe5b90600052602060002090600202016001015411611960576002830154336000908152600d6020526040812091935061195b9190612a09565b6119d5565b60005b818110156119d3574285828154811061197857fe5b9060005260206000209060020201600101541115611995576119d3565b6119a48582815481106115c157fe5b92508481815481106119b257fe5b60009182526020822060029091020181815560019081019190915501611963565b505b60028301546119e490836120ed565b600284015582546119f590836120ed565b8355600a54611a0490836120ed565b600a55600b54611a1490836120ed565b600b55600254611a2e906001600160a01b03163384612288565b50505050565b611a3f826000612402565b5050565b600254600b546000916001600160a01b0316908290611a628382612147565b6001600160a01b038416600090815260046020526040902060030155611a8783611627565b6001600160a01b03808516600090815260046020526040902060020191909155841615611b33576001600160a01b0384166000908152600c6020526040902060020154611ad89085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015611c1f5760038181548110611b5157fe5b6000918252602090912001546001600160a01b03169350611b728483612147565b6001600160a01b038516600090815260046020526040902060030155611b9784611627565b6001600160a01b03808616600090815260046020526040902060020191909155851615611c1757611bca858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101611b3a565b506001600160a01b038616600090815260066020908152604080832033845290915290205460ff16611c635760405162461bcd60e51b81526004016107d990612f70565b60008511611c835760405162461bcd60e51b81526004016107d990612eac565b611c986001600160a01b038716333088612828565b611ca286866122e3565b7fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d85604051611cd1919061314a565b60405180910390a1505050505050565b6001600160a01b03811660009081526004602052604081206001015461164b9062093a8061224e565b600b5481565b60035460609067ffffffffffffffff81118015611d2c57600080fd5b50604051908082528060200260200182016040528015611d6657816020015b611d53612a2a565b815260200190600190039081611d4b5790505b50905060005b8151811015611e725760008115611d9b576001600160a01b0384166000908152600c6020526040902054611db8565b6001600160a01b0384166000908152600c60205260409020600201545b905060008215611dca57600a54611dce565b600b545b905060038381548110611ddd57fe5b9060005260206000200160009054906101000a90046001600160a01b0316848481518110611e0757fe5b6020026020010151600001906001600160a01b031690816001600160a01b031681525050611e4e85858581518110611e3b57fe5b60200260200101516000015184846121dc565b848481518110611e5a57fe5b60209081029190910181015101525050600101611d6c565b50919050565b6001600160a01b0381166000908152600e6020526040812060609082805b8254811015611f945742838281548110611eac57fe5b9060005260206000209060020201600101541115611f8c5781611f2257825481900367ffffffffffffffff81118015611ee457600080fd5b50604051908082528060200260200182016040528015611f1e57816020015b611f0b6129ef565b815260200190600190039081611f035790505b5093505b828181548110611f2e57fe5b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050848381518110611f6757fe5b60200260200101819052508180600101925050611f8983828154811061072257fe5b94505b600101611e96565b505050915091565b600960209081526000928352604080842090915290825290205481565b60025460009081906001600160a01b03848116911614611fdb57600a54611fdf565b600b545b9050611feb8382612147565b9392505050565b611ffa6123fe565b6001600160a01b031661200b6118e5565b6001600160a01b0316146120315760405162461bcd60e51b81526004016107d990612f3b565b6001600160a01b0381166120575760405162461bcd60e51b81526004016107d990612d11565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60056020526000908152604090205460ff1681565b600082820183811015611feb5760405162461bcd60e51b81526004016107d990612d7f565b60008282111561210f5760405162461bcd60e51b81526004016107d990612df8565b50900390565b60008082116121365760405162461bcd60e51b81526004016107d990612e75565b81838161213f57fe5b049392505050565b60008161217057506001600160a01b03821660009081526004602052604090206003015461164b565b6001600160a01b03831660009081526004602052604090206001810154600290910154611feb916121ba9185916105ce91670de0b6b3a76400009161130d9182906105f88c611627565b6001600160a01b038516600090815260046020526040902060030154906120c8565b6001600160a01b038085166000818152600960209081526040808320948816808452948252808320549383526008825280832094835293905291822054612245919061131390670de0b6b3a7640000906105ce9061223e906105f88b8a612147565b889061224e565b95945050505050565b60008261225d5750600061164b565b8282028284828161226a57fe5b0414611feb5760405162461bcd60e51b81526004016107d990612efa565b6122de8363a9059cbb60e01b84846040516024016122a7929190612c62565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612849565b505050565b6001600160a01b03821660009081526004602052604090205442106123305761230f8162093a80612115565b6001600160a01b0383166000908152600460205260409020600101556123b0565b6001600160a01b03821660009081526004602052604081205461235390426120ed565b6001600160a01b0384166000908152600460205260408120600101549192509061237e90839061224e565b905061239162093a806105ce85846120c8565b6001600160a01b03851660009081526004602052604090206001015550505b6001600160a01b03821660009081526004602052604090204260029091018190556123de9062093a806120c8565b6001600160a01b0390921660009081526004602052604090209190915550565b3390565b600260005414156124255760405162461bcd60e51b81526004016107d990613113565b600260008181559054600b5433926001600160a01b03909216919061244a8382612147565b6001600160a01b03841660009081526004602052604090206003015561246f83611627565b6001600160a01b0380851660009081526004602052604090206002019190915584161561251b576001600160a01b0384166000908152600c60205260409020600201546124c09085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015612607576003818154811061253957fe5b6000918252602090912001546001600160a01b0316935061255a8483612147565b6001600160a01b03851660009081526004602052604090206003015561257f84611627565b6001600160a01b038086166000908152600460205260409020600201919091558516156125ff576125b2858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101612522565b50600086116126285760405162461bcd60e51b81526004016107d990612d57565b600a5461263590876120c8565b600a55336000908152600c60205260409020805461265390886120c8565b8155851561279657600b5461266890886120c8565b600b55600281015461267a90886120c8565b600282015560006126996277f88061131362093a8061130d4282612115565b336000908152600d60205260409020549091508015806126ea5750336000908152600d60205260409020805483919060001984019081106126d657fe5b906000526020600020906002020160010154105b1561273957336000908152600d6020908152604080832081518083019092528c82528183018681528154600181810184559286529390942091516002909302909101918255915191015561278f565b336000908152600d60205260409020805461275e918b9160001985019081106113b857fe5b336000908152600d602052604090208054600019840190811061277d57fe5b60009182526020909120600290910201555b50506127ab565b60018101546127a590886120c8565b60018201555b6002546127c3906001600160a01b031633308a612828565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516127fc919061314a565b60405180910390a2505060016000555050505050565b60008183106128215781611feb565b5090919050565b611a2e846323b872dd60e01b8585856040516024016122a793929190612c3e565b606061289e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128d89092919063ffffffff16565b8051909150156122de57808060200190518101906128bc9190612b71565b6122de5760405162461bcd60e51b81526004016107d990613092565b60606128e784846000856128ef565b949350505050565b6060824710156129115760405162461bcd60e51b81526004016107d990612e2f565b61291a856129b0565b6129365760405162461bcd60e51b81526004016107d990613032565b60006060866001600160a01b031685876040516129539190612c0e565b60006040518083038185875af1925050503d8060008114612990576040519150601f19603f3d011682016040523d82523d6000602084013e612995565b606091505b50915091506129a58282866129b6565b979650505050505050565b3b151590565b606083156129c5575081611feb565b8251156129d55782518084602001fd5b8160405162461bcd60e51b81526004016107d99190612cde565b604051806040016040528060008152602001600081525090565b50805460008255600202906000526020600020908101906116249190612a41565b604080518082019091526000808252602082015290565b5b80821115612a5c5760008082556001820155600201612a42565b5090565b80356001600160a01b038116811461164b57600080fd5b600060208284031215612a88578081fd5b611feb8383612a60565b60008060408385031215612aa4578081fd5b612aae8484612a60565b9150612abd8460208501612a60565b90509250929050565b600080600060608486031215612ada578081fd5b8335612ae5816131f0565b92506020840135612af5816131f0565b91506040840135612b0581613205565b809150509250925092565b60008060408385031215612b22578182fd5b612b2c8484612a60565b91506020830135612b3c81613205565b809150509250929050565b60008060408385031215612b59578182fd5b612b638484612a60565b946020939093013593505050565b600060208284031215612b82578081fd5b8151611feb81613205565b600060208284031215612b9e578081fd5b5035919050565b60008060408385031215612bb7578182fd5b823591506020830135612b3c81613205565b6000815180845260208085019450808401835b83811015612c03578151805188528301518388015260409096019590820190600101612bdc565b509495945050505050565b60008251612c208184602087016131c4565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b82811015612cc657815180516001600160a01b03168552860151868501529284019290850190600101612c98565b5091979650505050505050565b901515815260200190565b6000602082528251806020840152612cfd8160408501602087016131c4565b601f01601f19169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526022908201527f496e73756666696369656e742062616c616e63652061667465722070656e616c604082015261747960f01b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b602080825260099082015268139bc81c995dd85c9960ba1b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152752737ba103932bbb0b932103234b9ba3934b13aba37b960511b604082015260600190565b6020808252601d908201527f43616e6e6f74207769746864726177207374616b696e6720746f6b656e000000604082015260600190565b6020808252600a90820152693737ba1036b4b73a32b960b11b604082015260600190565b6020808252601d908201527f496e73756666696369656e7420756e6c6f636b65642062616c616e6365000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600f908201526e1b9bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601c908201527f43616e6e6f742077697468647261772072657761726420746f6b656e00000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b6000838252604060208301526128e76040830184612bc9565b918252602082015260400190565b60008582528460208301528360408301526080606083015261319f6080830184612bc9565b9695505050505050565b93845260208401929092526040830152606082015260800190565b60005b838110156131df5781810151838201526020016131c7565b83811115611a2e5750506000910152565b6001600160a01b038116811461162457600080fd5b801515811461162457600080fdfea26469706673582212204c85a6f627876af36c6afb659c5de3fe557c922ebb151c613c086a17e66916ba64736f6c634300060c003300000000000000000000000009ad12552ec45f82be90b38dfe7b06332a680864000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000002b4cb6948010bc6cd7eceb54d5f10eb3400393f5
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80636eacd39811610125578063b66503cf116100ad578063df3798761161007c578063df3798761461045a578063e70b9e271461047b578063f12297771461048e578063f2fde38b146104a1578063f46eccc4146104b457610211565b8063b66503cf1461040c578063bcd110141461041f578063ca5c7b9114610432578063dc01f60d1461043a57610211565b80637bb7bed1116100f45780637bb7bed1146103c35780638980f11f146103d65780638da5cb5b146103e9578063a01c77bc146103f1578063abe50f19146103f957610211565b80636eacd398146103805780637035ab9814610393578063715018a6146103a657806372f702f3146103ae57610211565b80633d18b912116101a8578063590b3f8111610177578063590b3f81146103215780635e0fac2e1461033457806362cc445c14610347578063638634ee1461035a5780636724c9101461036d57610211565b80633d18b912146102d057806340b47e1a146102d857806340c10f19146102eb57806348e5d9f8146102fe57610211565b80631ace1dd8116101e45780631ace1dd8146102805780632e1a7d4d146102a0578063386a9525146102b557806339fc9713146102bd57610211565b806302b629381461021657806304554443146102405780630483a7f61461025557806318160ddd14610278575b600080fd5b610229610224366004612a77565b6104c7565b60405161023792919061316c565b60405180910390f35b610248610606565b604051610237919061314a565b610268610263366004612a77565b61060d565b604051610237949392919061317a565b61024861079b565b61029361028e366004612a77565b6107a1565b6040516102379190612cd3565b6102b36102ae366004612b8d565b6107b6565b005b610248610ca0565b6102936102cb366004612a92565b610ca7565b6102b3610cc7565b6102b36102e6366004612a92565b610fb4565b6102b36102f9366004612b47565b61109d565b61031161030c366004612a77565b6114c2565b60405161023794939291906131a9565b6102b361032f366004612b10565b6114e9565b610248610342366004612a77565b611553565b6102b3610355366004612b8d565b6115ea565b610248610368366004612a77565b611627565b6102b361037b366004612ac6565b611651565b61024861038e366004612a77565b6116ef565b6102486103a1366004612a92565b61170a565b6102b3611727565b6103b66117b0565b6040516102379190612c2a565b6103b66103d1366004612b8d565b6117bf565b6102b36103e4366004612b47565b6117e6565b6103b66118e5565b6102b36118f4565b6102b3610407366004612ba5565b611a34565b6102b361041a366004612b47565b611a43565b61024861042d366004612a77565b611ce1565b610248611d0a565b61044d610448366004612a77565b611d10565b6040516102379190612c7b565b61046d610468366004612a77565b611e78565b604051610237929190613153565b610248610489366004612a92565b611f9c565b61024861049c366004612a77565b611fb9565b6102b36104af366004612a77565b611ff2565b6102936104c2366004612a77565b6120b3565b6001600160a01b0381166000908152600c602052604081206003810154829190156105d9576001600160a01b0384166000908152600e6020526040812054815b818110156105b1576001600160a01b0387166000908152600e6020526040812080548390811061053357fe5b9060005260206000209060020201600001549050806000141561055657506105a9565b6001600160a01b0388166000908152600e6020526040902080544291908490811061057d57fe5b906000526020600020906002020160010154111561059b57506105b1565b6105a584826120c8565b9350505b600101610507565b506105d460026105ce8486600301546120ed90919063ffffffff16565b90612115565b935050505b6105fe826105f8836003015484600101546120c890919063ffffffff16565b906120ed565b925050915091565b6277f88081565b6001600160a01b0381166000908152600d602052604081208190819060609082805b8254811015610773574283828154811061064557fe5b906000526020600020906002020160010154111561074157816106bb57825481900367ffffffffffffffff8111801561067d57600080fd5b506040519080825280602002602001820160405280156106b757816020015b6106a46129ef565b81526020019060019003908161069c5790505b5093505b8281815481106106c757fe5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505084838151811061070057fe5b6020026020010181905250818060010192505061073a83828154811061072257fe5b600091825260209091206002909102015486906120c8565b945061076b565b61076883828154811061075057fe5b600091825260209091206002909102015487906120c8565b95505b60010161062f565b5050506001600160a01b0385166000908152600c602052604090206002015493509193509193565b600a5481565b60076020526000908152604090205460ff1681565b600260005414156107e25760405162461bcd60e51b81526004016107d990613113565b60405180910390fd5b600260008181559054600b5433926001600160a01b0390921691906108078382612147565b6001600160a01b03841660009081526004602052604090206003015561082c83611627565b6001600160a01b038085166000908152600460205260409020600201919091558416156108d8576001600160a01b0384166000908152600c602052604090206002015461087d9085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b6003548110156109c457600381815481106108f657fe5b6000918252602090912001546001600160a01b031693506109178483612147565b6001600160a01b03851660009081526004602052604090206003015561093c84611627565b6001600160a01b038086166000908152600460205260409020600201919091558516156109bc5761096f858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016108df565b50600085116109e55760405162461bcd60e51b81526004016107d990612ecf565b336000908152600c6020526040812060018101549091908711610a1b576001820154610a1190886120ed565b6001830155610bf0565b6000610a348360010154896120ed90919063ffffffff16565b90508083600301541015610a5a5760405162461bcd60e51b81526004016107d990612ffb565b600060018401556003830154610a7090826120ed565b600384015560005b336000908152600e60205260408120805483908110610a9357fe5b90600052602060002090600202016000015490508060001415610ab65750610be5565b83158015610af15750336000908152600e60205260409020805442919084908110610add57fe5b906000526020600020906002020160010154115b15610b63578293508285600301541015610b1d5760405162461bcd60e51b81526004016107d990612db6565b6003850154610b2c90846120ed565b60038601819055610b5557336000908152600e60205260408120610b4f91612a09565b50610bed565b610b6083600261224e565b92505b808311610ba657610b7481846120ed565b336000908152600e60205260409020805484908110610b8f57fe5b600091825260209091206002909102015550610bed565b336000908152600e60205260409020805483908110610bc157fe5b60009182526020822060029091020181815560010155610be183826120ed565b9250505b600101610a78565b50505b6000610bfc88836120c8565b8354909150610c0b90826120ed565b8355600a54610c1a90826120ed565b600a55600254610c34906001600160a01b0316338a612288565b8115610c5057600254610c50906001600160a01b0316836122e3565b336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d589604051610c89919061314a565b60405180910390a250506001600055505050505050565b62093a8081565b600660209081526000928352604080842090915290825290205460ff1681565b60026000541415610cea5760405162461bcd60e51b81526004016107d990613113565b600260008181559054600b5433926001600160a01b039092169190610d0f8382612147565b6001600160a01b038416600090815260046020526040902060030155610d3483611627565b6001600160a01b03808516600090815260046020526040902060020191909155841615610de0576001600160a01b0384166000908152600c6020526040902060020154610d859085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015610ecc5760038181548110610dfe57fe5b6000918252602090912001546001600160a01b03169350610e1f8483612147565b6001600160a01b038516600090815260046020526040902060030155610e4484611627565b6001600160a01b03808616600090815260046020526040902060020191909155851615610ec457610e77858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101610de7565b5060005b600354811015610fa857600060038281548110610ee957fe5b60009182526020808320909101543383526009825260408084206001600160a01b03909216808552919092529120549091508015610f9e573360008181526009602090815260408083206001600160a01b0387168085529252822091909155610f529183612288565b816001600160a01b0316336001600160a01b03167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610f95919061314a565b60405180910390a35b5050600101610ed0565b50506001600055505050565b610fbc6123fe565b6001600160a01b0316610fcd6118e5565b6001600160a01b031614610ff35760405162461bcd60e51b81526004016107d990612f3b565b6001600160a01b0382166000908152600460205260409020600201541561101957600080fd5b6003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b039485169081179091556000908152600460209081526040808320426002909101556006825280832094909516825292909252919020805460ff19169091179055565b600254600b5483916001600160a01b0316906000906110bc8382612147565b6001600160a01b0384166000908152600460205260409020600301556110e183611627565b6001600160a01b0380851660009081526004602052604090206002019190915584161561118d576001600160a01b0384166000908152600c60205260409020600201546111329085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b60035481101561127957600381815481106111ab57fe5b6000918252602090912001546001600160a01b031693506111cc8483612147565b6001600160a01b0385166000908152600460205260409020600301556111f184611627565b6001600160a01b0380861660009081526004602052604090206002019190915585161561127157611224858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101611194565b503360009081526005602052604090205460ff166112a95760405162461bcd60e51b81526004016107d990612fd7565b600a546112b690866120c8565b600a556001600160a01b0386166000908152600c6020526040902080546112dd90876120c8565b815560038101546112ee90876120c8565b600382015560006113196277f88061131362093a8061130d4282612115565b9061224e565b906120c8565b6001600160a01b0389166000908152600e6020526040902080549192509080158061136357508282600183038154811061134f57fe5b906000526020600020906002020160010154105b156113a55760408051808201909152898152602080820185815284546001818101875560008781529390932093516002909102909301928355519101556113f0565b6113cf898360018403815481106113b857fe5b6000918252602090912060029091020154906120c8565b8260018303815481106113de57fe5b60009182526020909120600290910201555b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906114229030908d90600401612c62565b602060405180830381600087803b15801561143c57600080fd5b505af1158015611450573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114749190612b71565b50896001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d8a6040516114ae919061314a565b60405180910390a250505050505050505050565b60046020526000908152604090208054600182015460028301546003909301549192909184565b6114f16123fe565b6001600160a01b03166115026118e5565b6001600160a01b0316146115285760405162461bcd60e51b81526004016107d990612f3b565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600c6020908152604080832060010154338452600e909252822090915b81548110156115e3574282828154811061159557fe5b90600052602060002090600202016001015411156115b2576115e3565b6115d98282815481106115c157fe5b600091825260209091206002909102015484906120c8565b925060010161157f565b5050919050565b3360009081526007602052604090205460ff166116195760405162461bcd60e51b81526004016107d990613069565b611624816001612402565b50565b6001600160a01b03811660009081526004602052604081205461164b904290612812565b92915050565b6116596123fe565b6001600160a01b031661166a6118e5565b6001600160a01b0316146116905760405162461bcd60e51b81526004016107d990612f3b565b6001600160a01b0383166000908152600460205260409020600201546116b557600080fd5b6001600160a01b03928316600090815260066020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6001600160a01b03166000908152600c602052604090205490565b600860209081526000928352604080842090915290825290205481565b61172f6123fe565b6001600160a01b03166117406118e5565b6001600160a01b0316146117665760405162461bcd60e51b81526004016107d990612f3b565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b6002546001600160a01b031681565b600381815481106117cc57fe5b6000918252602090912001546001600160a01b0316905081565b6117ee6123fe565b6001600160a01b03166117ff6118e5565b6001600160a01b0316146118255760405162461bcd60e51b81526004016107d990612f3b565b6002546001600160a01b03838116911614156118535760405162461bcd60e51b81526004016107d990612fa0565b6001600160a01b0382166000908152600460205260409020600201541561188c5760405162461bcd60e51b81526004016107d9906130dc565b6118a86118976118e5565b6001600160a01b0384169083612288565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2882826040516118d9929190612c62565b60405180910390a15050565b6001546001600160a01b031690565b336000908152600d60209081526040808320600c90925282208154919290914284600019830183811061192357fe5b90600052602060002090600202016001015411611960576002830154336000908152600d6020526040812091935061195b9190612a09565b6119d5565b60005b818110156119d3574285828154811061197857fe5b9060005260206000209060020201600101541115611995576119d3565b6119a48582815481106115c157fe5b92508481815481106119b257fe5b60009182526020822060029091020181815560019081019190915501611963565b505b60028301546119e490836120ed565b600284015582546119f590836120ed565b8355600a54611a0490836120ed565b600a55600b54611a1490836120ed565b600b55600254611a2e906001600160a01b03163384612288565b50505050565b611a3f826000612402565b5050565b600254600b546000916001600160a01b0316908290611a628382612147565b6001600160a01b038416600090815260046020526040902060030155611a8783611627565b6001600160a01b03808516600090815260046020526040902060020191909155841615611b33576001600160a01b0384166000908152600c6020526040902060020154611ad89085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015611c1f5760038181548110611b5157fe5b6000918252602090912001546001600160a01b03169350611b728483612147565b6001600160a01b038516600090815260046020526040902060030155611b9784611627565b6001600160a01b03808616600090815260046020526040902060020191909155851615611c1757611bca858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101611b3a565b506001600160a01b038616600090815260066020908152604080832033845290915290205460ff16611c635760405162461bcd60e51b81526004016107d990612f70565b60008511611c835760405162461bcd60e51b81526004016107d990612eac565b611c986001600160a01b038716333088612828565b611ca286866122e3565b7fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d85604051611cd1919061314a565b60405180910390a1505050505050565b6001600160a01b03811660009081526004602052604081206001015461164b9062093a8061224e565b600b5481565b60035460609067ffffffffffffffff81118015611d2c57600080fd5b50604051908082528060200260200182016040528015611d6657816020015b611d53612a2a565b815260200190600190039081611d4b5790505b50905060005b8151811015611e725760008115611d9b576001600160a01b0384166000908152600c6020526040902054611db8565b6001600160a01b0384166000908152600c60205260409020600201545b905060008215611dca57600a54611dce565b600b545b905060038381548110611ddd57fe5b9060005260206000200160009054906101000a90046001600160a01b0316848481518110611e0757fe5b6020026020010151600001906001600160a01b031690816001600160a01b031681525050611e4e85858581518110611e3b57fe5b60200260200101516000015184846121dc565b848481518110611e5a57fe5b60209081029190910181015101525050600101611d6c565b50919050565b6001600160a01b0381166000908152600e6020526040812060609082805b8254811015611f945742838281548110611eac57fe5b9060005260206000209060020201600101541115611f8c5781611f2257825481900367ffffffffffffffff81118015611ee457600080fd5b50604051908082528060200260200182016040528015611f1e57816020015b611f0b6129ef565b815260200190600190039081611f035790505b5093505b828181548110611f2e57fe5b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050848381518110611f6757fe5b60200260200101819052508180600101925050611f8983828154811061072257fe5b94505b600101611e96565b505050915091565b600960209081526000928352604080842090915290825290205481565b60025460009081906001600160a01b03848116911614611fdb57600a54611fdf565b600b545b9050611feb8382612147565b9392505050565b611ffa6123fe565b6001600160a01b031661200b6118e5565b6001600160a01b0316146120315760405162461bcd60e51b81526004016107d990612f3b565b6001600160a01b0381166120575760405162461bcd60e51b81526004016107d990612d11565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60056020526000908152604090205460ff1681565b600082820183811015611feb5760405162461bcd60e51b81526004016107d990612d7f565b60008282111561210f5760405162461bcd60e51b81526004016107d990612df8565b50900390565b60008082116121365760405162461bcd60e51b81526004016107d990612e75565b81838161213f57fe5b049392505050565b60008161217057506001600160a01b03821660009081526004602052604090206003015461164b565b6001600160a01b03831660009081526004602052604090206001810154600290910154611feb916121ba9185916105ce91670de0b6b3a76400009161130d9182906105f88c611627565b6001600160a01b038516600090815260046020526040902060030154906120c8565b6001600160a01b038085166000818152600960209081526040808320948816808452948252808320549383526008825280832094835293905291822054612245919061131390670de0b6b3a7640000906105ce9061223e906105f88b8a612147565b889061224e565b95945050505050565b60008261225d5750600061164b565b8282028284828161226a57fe5b0414611feb5760405162461bcd60e51b81526004016107d990612efa565b6122de8363a9059cbb60e01b84846040516024016122a7929190612c62565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612849565b505050565b6001600160a01b03821660009081526004602052604090205442106123305761230f8162093a80612115565b6001600160a01b0383166000908152600460205260409020600101556123b0565b6001600160a01b03821660009081526004602052604081205461235390426120ed565b6001600160a01b0384166000908152600460205260408120600101549192509061237e90839061224e565b905061239162093a806105ce85846120c8565b6001600160a01b03851660009081526004602052604090206001015550505b6001600160a01b03821660009081526004602052604090204260029091018190556123de9062093a806120c8565b6001600160a01b0390921660009081526004602052604090209190915550565b3390565b600260005414156124255760405162461bcd60e51b81526004016107d990613113565b600260008181559054600b5433926001600160a01b03909216919061244a8382612147565b6001600160a01b03841660009081526004602052604090206003015561246f83611627565b6001600160a01b0380851660009081526004602052604090206002019190915584161561251b576001600160a01b0384166000908152600c60205260409020600201546124c09085908590846121dc565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015612607576003818154811061253957fe5b6000918252602090912001546001600160a01b0316935061255a8483612147565b6001600160a01b03851660009081526004602052604090206003015561257f84611627565b6001600160a01b038086166000908152600460205260409020600201919091558516156125ff576125b2858585856121dc565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101612522565b50600086116126285760405162461bcd60e51b81526004016107d990612d57565b600a5461263590876120c8565b600a55336000908152600c60205260409020805461265390886120c8565b8155851561279657600b5461266890886120c8565b600b55600281015461267a90886120c8565b600282015560006126996277f88061131362093a8061130d4282612115565b336000908152600d60205260409020549091508015806126ea5750336000908152600d60205260409020805483919060001984019081106126d657fe5b906000526020600020906002020160010154105b1561273957336000908152600d6020908152604080832081518083019092528c82528183018681528154600181810184559286529390942091516002909302909101918255915191015561278f565b336000908152600d60205260409020805461275e918b9160001985019081106113b857fe5b336000908152600d602052604090208054600019840190811061277d57fe5b60009182526020909120600290910201555b50506127ab565b60018101546127a590886120c8565b60018201555b6002546127c3906001600160a01b031633308a612828565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516127fc919061314a565b60405180910390a2505060016000555050505050565b60008183106128215781611feb565b5090919050565b611a2e846323b872dd60e01b8585856040516024016122a793929190612c3e565b606061289e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128d89092919063ffffffff16565b8051909150156122de57808060200190518101906128bc9190612b71565b6122de5760405162461bcd60e51b81526004016107d990613092565b60606128e784846000856128ef565b949350505050565b6060824710156129115760405162461bcd60e51b81526004016107d990612e2f565b61291a856129b0565b6129365760405162461bcd60e51b81526004016107d990613032565b60006060866001600160a01b031685876040516129539190612c0e565b60006040518083038185875af1925050503d8060008114612990576040519150601f19603f3d011682016040523d82523d6000602084013e612995565b606091505b50915091506129a58282866129b6565b979650505050505050565b3b151590565b606083156129c5575081611feb565b8251156129d55782518084602001fd5b8160405162461bcd60e51b81526004016107d99190612cde565b604051806040016040528060008152602001600081525090565b50805460008255600202906000526020600020908101906116249190612a41565b604080518082019091526000808252602082015290565b5b80821115612a5c5760008082556001820155600201612a42565b5090565b80356001600160a01b038116811461164b57600080fd5b600060208284031215612a88578081fd5b611feb8383612a60565b60008060408385031215612aa4578081fd5b612aae8484612a60565b9150612abd8460208501612a60565b90509250929050565b600080600060608486031215612ada578081fd5b8335612ae5816131f0565b92506020840135612af5816131f0565b91506040840135612b0581613205565b809150509250925092565b60008060408385031215612b22578182fd5b612b2c8484612a60565b91506020830135612b3c81613205565b809150509250929050565b60008060408385031215612b59578182fd5b612b638484612a60565b946020939093013593505050565b600060208284031215612b82578081fd5b8151611feb81613205565b600060208284031215612b9e578081fd5b5035919050565b60008060408385031215612bb7578182fd5b823591506020830135612b3c81613205565b6000815180845260208085019450808401835b83811015612c03578151805188528301518388015260409096019590820190600101612bdc565b509495945050505050565b60008251612c208184602087016131c4565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b82811015612cc657815180516001600160a01b03168552860151868501529284019290850190600101612c98565b5091979650505050505050565b901515815260200190565b6000602082528251806020840152612cfd8160408501602087016131c4565b601f01601f19169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526022908201527f496e73756666696369656e742062616c616e63652061667465722070656e616c604082015261747960f01b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b602080825260099082015268139bc81c995dd85c9960ba1b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152752737ba103932bbb0b932103234b9ba3934b13aba37b960511b604082015260600190565b6020808252601d908201527f43616e6e6f74207769746864726177207374616b696e6720746f6b656e000000604082015260600190565b6020808252600a90820152693737ba1036b4b73a32b960b11b604082015260600190565b6020808252601d908201527f496e73756666696369656e7420756e6c6f636b65642062616c616e6365000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600f908201526e1b9bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601c908201527f43616e6e6f742077697468647261772072657761726420746f6b656e00000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b6000838252604060208301526128e76040830184612bc9565b918252602082015260400190565b60008582528460208301528360408301526080606083015261319f6080830184612bc9565b9695505050505050565b93845260208401929092526040830152606082015260800190565b60005b838110156131df5781810151838201526020016131c7565b83811115611a2e5750506000910152565b6001600160a01b038116811461162457600080fd5b801515811461162457600080fdfea26469706673582212204c85a6f627876af36c6afb659c5de3fe557c922ebb151c613c086a17e66916ba64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000009ad12552ec45f82be90b38dfe7b06332a680864000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000002b4cb6948010bc6cd7eceb54d5f10eb3400393f5
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x09ad12552ec45f82bE90B38dFE7b06332A680864
Arg [1] : _minters (address[]): 0x2B4CB6948010bc6Cd7ECEB54D5f10EB3400393f5
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000009ad12552ec45f82be90b38dfe7b06332a680864
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 0000000000000000000000002b4cb6948010bc6cd7eceb54d5f10eb3400393f5
Deployed Bytecode Sourcemap
28683:19313:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36979:912;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;29659:59;;;:::i;:::-;;;;;;;:::i;36061:828::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;30252:26::-;;;:::i;29997:52::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40935:1995::-;;;;;;:::i;:::-;;:::i;:::-;;29552:51;;;:::i;29879:69::-;;;;;;:::i;:::-;;:::i;42980:504::-;;;:::i;31215:379::-;;;;;;:::i;:::-;;:::i;39858:875::-;;;;;;:::i;:::-;;:::i;29451:44::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;31966:192::-;;;;;;:::i;:::-;;:::i;34741:442::-;;;;;;:::i;:::-;;:::i;38151:279::-;;;;;;:::i;:::-;;:::i;33110:178::-;;;;;;:::i;:::-;;:::i;31668:290::-;;;;;;:::i;:::-;;:::i;34531:121::-;;;;;;:::i;:::-;;:::i;30097:77::-;;;;;;:::i;:::-;;:::i;25112:148::-;;;:::i;29374:34::-;;;:::i;:::-;;;;;;;:::i;29415:29::-;;;;;;:::i;:::-;;:::i;45940:396::-;;;;;;:::i;:::-;;:::i;24461:87::-;;;:::i;43570:906::-;;;:::i;38049:94::-;;;;;;:::i;:::-;;:::i;45246:579::-;;;;;;:::i;:::-;;:::i;33544:168::-;;;;;;:::i;:::-;;:::i;30285:27::-;;;:::i;33800:641::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35317:688::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;30181:62::-;;;;;;:::i;:::-;;:::i;33296:240::-;;;;;;:::i;:::-;;:::i;25415:244::-;;;;;;:::i;:::-;;:::i;29767:39::-;;;;;;:::i;:::-;;:::i;36979:912::-;-1:-1:-1;;;;;37157:14:0;;37069;37157;;;:8;:14;;;;;37186:10;;;;37069:14;;37157;37186;37182:594;;-1:-1:-1;;;;;37277:18:0;;37217:28;37277:18;;;:12;:18;;;;;:25;37217:28;37317:372;37338:6;37334:1;:10;37317:372;;;-1:-1:-1;;;;;37393:18:0;;37370:20;37393:18;;;:12;:18;;;;;:21;;37412:1;;37393:21;;;;;;;;;;;;;;;;:28;;;37370:51;;37444:12;37460:1;37444:17;37440:31;;;37463:8;;;37440:31;-1:-1:-1;;;;;37494:18:0;;;;;;:12;:18;;;;;:21;;37529:15;;37494:18;37513:1;;37494:21;;;;;;;;;;;;;;;;:32;;;:50;37490:104;;;37569:5;;;37490:104;37635:38;:20;37660:12;37635:24;:38::i;:::-;37612:61;;37317:372;;37346:3;;37317:372;;;;37721:43;37762:1;37721:36;37736:20;37721:3;:10;;;:14;;:36;;;;:::i;:::-;:40;;:43::i;:::-;37705:59;;37182:594;;;37795:47;37828:13;37795:28;37812:3;:10;;;37795:3;:12;;;:16;;:28;;;;:::i;:::-;:32;;:47::i;:::-;37786:56;;37853:30;36979:912;;;:::o;29659:59::-;29698:20;29659:59;:::o;36061:828::-;-1:-1:-1;;;;;36308:15:0;;36148:13;36308:15;;;:9;:15;;;;;36148:13;;;;36226:31;;36148:13;;36356:455;36377:12;;36373:16;;36356:455;;;36437:15;36415:5;36421:1;36415:8;;;;;;;;;;;;;;;;;;:19;;;:37;36411:389;;;36477:8;36473:105;;36541:12;;:16;;;36521:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;36510:48;;36473:105;36612:5;36618:1;36612:8;;;;;;;;;;;;;;;;;;36596:24;;;;;;;;;;;;;;;;;;;;;;;;;:8;36605:3;36596:13;;;;;;;;;;;;;:24;;;;36639:5;;;;;;;36672:27;36683:5;36689:1;36683:8;;;;;;;;;;;;;;;;;;;;;:15;36672:6;;:10;:27::i;:::-;36663:36;;36411:389;;;36753:31;36768:5;36774:1;36768:8;;;;;;;;;;;;;;;;;;;;;:15;36753:10;;:14;:31::i;:::-;36740:44;;36411:389;36391:3;;36356:455;;;-1:-1:-1;;;;;;;;36829:14:0;;;;;;:8;:14;;;;;:21;;;;-1:-1:-1;36061:828:0;;;;;:::o;30252:26::-;;;;:::o;29997:52::-;;;;;;;;;;;;;;;:::o;40935:1995::-;27319:1;27925:7;;:19;;27917:63;;;;-1:-1:-1;;;27917:63:0;;;;;;;:::i;:::-;;;;;;;;;27319:1;28058:7;:18;;;46463:12;;46530::::1;::::0;41002:10:::1;::::0;-1:-1:-1;;;;;46463:12:0;;::::1;::::0;28058:7;46594:30:::1;46463:12:::0;46530;46594:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;46553:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;46670:31:::1;46564:5:::0;46670:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;46635:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;46716:21;::::1;::::0;46712:370:::1;;-1:-1:-1::0;;;;;46895:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;46871:57:::1;::::0;46879:7;;46888:5;;46921:6;46871:7:::1;:57::i;:::-;-1:-1:-1::0;;;;;46845:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:83;;;;46984:10:::1;:17:::0;;;;;:38:::1;;::::0;46943:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;:79;;;;47047:17;;;:8:::1;:17:::0;;;;:23;;-1:-1:-1;46712:370:0::1;-1:-1:-1::0;47103:11:0::1;::::0;47139:1:::1;47125:504;47146:12;:19:::0;47142:23;::::1;47125:504;;;47195:12;47208:1;47195:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47195:15:0::1;::::0;-1:-1:-1;47266:30:0::1;47195:15:::0;47289:6;47266:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;47225:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;47346:31:::1;47236:5:::0;47346:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;47311:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;47396:21;::::1;::::0;47392:226:::1;;47464:40;47472:7;47481:5;47488:7;47497:6;47464:7;:40::i;:::-;-1:-1:-1::0;;;;;47438:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:66;;;;47564:10:::1;:17:::0;;;;;:38:::1;;::::0;47523:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;47392:226:::1;47167:3;;47125:504;;;;41042:1:::2;41033:6;:10;41025:40;;;;-1:-1:-1::0;;;41025:40:0::2;;;;;;;:::i;:::-;41108:10;41076:20;41099::::0;;;:8:::2;:20;::::0;;;;41178:12:::2;::::0;::::2;::::0;41099:20;;41076;41168:22;::::2;41164:1376;;41222:12;::::0;::::2;::::0;:24:::2;::::0;41239:6;41222:16:::2;:24::i;:::-;41207:12;::::0;::::2;:39:::0;41164:1376:::2;;;41279:17;41299:24;41310:3;:12;;;41299:6;:10;;:24;;;;:::i;:::-;41279:44;;41360:9;41346:3;:10;;;:23;;41338:65;;;;-1:-1:-1::0;;;41338:65:0::2;;;;;;;:::i;:::-;41433:1;41418:12;::::0;::::2;:16:::0;41462:10:::2;::::0;::::2;::::0;:25:::2;::::0;41477:9;41462:14:::2;:25::i;:::-;41449:10;::::0;::::2;:38:::0;41507:6:::2;41502:1027;41581:10;41545:20;41568:24:::0;;;:12:::2;:24;::::0;;;;:27;;41593:1;;41568:27;::::2;;;;;;;;;;;;;;;:34;;;41545:57;;41625:12;41641:1;41625:17;41621:31;;;41644:8;;;41621:31;41675:18:::0;;:78;::::2;;;-1:-1:-1::0;41710:10:0::2;41697:24;::::0;;;:12:::2;:24;::::0;;;;:27;;41738:15:::2;::::0;41697:24;41722:1;;41697:27;::::2;;;;;;;;;;;;;;;:38;;;:56;41675:78;41671:514;;;41794:9;41778:25;;41848:9;41834:3;:10;;;:23;;41826:70;;;;-1:-1:-1::0;;;41826:70:0::2;;;;;;;:::i;:::-;41932:10;::::0;::::2;::::0;:25:::2;::::0;41947:9;41932:14:::2;:25::i;:::-;41919:10;::::0;::::2;:38:::0;;;41980:135:::2;;42048:10;42035:24;::::0;;;:12:::2;:24;::::0;;;;42028:31:::2;::::0;::::2;:::i;:::-;42086:5;;;41980:135;42149:16;:9:::0;42163:1:::2;42149:13;:16::i;:::-;42137:28;;41671:514;42220:12;42207:9;:25;42203:311;;42294:27;:12:::0;42311:9;42294:16:::2;:27::i;:::-;42270:10;42257:24;::::0;;;:12:::2;:24;::::0;;;;:27;;42282:1;;42257:27;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:64:::0;-1:-1:-1;42344:5:0::2;;42203:311;42418:10;42405:24;::::0;;;:12:::2;:24;::::0;;;;:27;;42430:1;;42405:27;::::2;;;;;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;42398:34:::0;;;::::2;;::::0;42467:27:::2;:9:::0;42481:12;42467:13:::2;:27::i;:::-;42455:39;;41502:1027;;41521:3;;41502:1027;;;;41164:1376;;42552:22;42577:25;:6:::0;42588:13;42577:10:::2;:25::i;:::-;42625:9:::0;;42552:50;;-1:-1:-1;42625:29:0::2;::::0;42552:50;42625:13:::2;:29::i;:::-;42613:41:::0;;42679:11:::2;::::0;:31:::2;::::0;42695:14;42679:15:::2;:31::i;:::-;42665:11;:45:::0;42721:12:::2;::::0;:45:::2;::::0;-1:-1:-1;;;;;42721:12:0::2;42747:10;42759:6:::0;42721:25:::2;:45::i;:::-;42781:17:::0;;42777:101:::2;;42837:12;::::0;42815:51:::2;::::0;-1:-1:-1;;;;;42837:12:0::2;42852:13:::0;42815::::2;:51::i;:::-;42903:10;-1:-1:-1::0;;;;;42893:29:0::2;;42915:6;42893:29;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;27275:1:0;28237:7;:22;-1:-1:-1;;;;;;40935:1995:0:o;29552:51::-;29594:9;29552:51;:::o;29879:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42980:504::-;27319:1;27925:7;;:19;;27917:63;;;;-1:-1:-1;;;27917:63:0;;;;;;;:::i;:::-;27319:1;28058:7;:18;;;46463:12;;46530::::1;::::0;43034:10:::1;::::0;-1:-1:-1;;;;;46463:12:0;;::::1;::::0;28058:7;46594:30:::1;46463:12:::0;46530;46594:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;46553:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;46670:31:::1;46564:5:::0;46670:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;46635:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;46716:21;::::1;::::0;46712:370:::1;;-1:-1:-1::0;;;;;46895:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;46871:57:::1;::::0;46879:7;;46888:5;;46921:6;46871:7:::1;:57::i;:::-;-1:-1:-1::0;;;;;46845:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:83;;;;46984:10:::1;:17:::0;;;;;:38:::1;;::::0;46943:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;:79;;;;47047:17;;;:8:::1;:17:::0;;;;:23;;-1:-1:-1;46712:370:0::1;-1:-1:-1::0;47103:11:0::1;::::0;47139:1:::1;47125:504;47146:12;:19:::0;47142:23;::::1;47125:504;;;47195:12;47208:1;47195:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47195:15:0::1;::::0;-1:-1:-1;47266:30:0::1;47195:15:::0;47289:6;47266:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;47225:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;47346:31:::1;47236:5:::0;47346:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;47311:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;47396:21;::::1;::::0;47392:226:::1;;47464:40;47472:7;47481:5;47488:7;47497:6;47464:7;:40::i;:::-;-1:-1:-1::0;;;;;47438:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:66;;;;47564:10:::1;:17:::0;;;;;:38:::1;;::::0;47523:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;47392:226:::1;47167:3;;47125:504;;;;43062:6:::2;43057:420;43074:12;:19:::0;43070:23;::::2;43057:420;;;43115:21;43139:12;43152:1;43139:15;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;43194:10:::2;43186:19:::0;;:7:::2;:19:::0;;;;;;-1:-1:-1;;;;;43139:15:0;;::::2;43186:34:::0;;;;;;;;;;43139:15;;-1:-1:-1;43239:10:0;;43235:231:::2;;43278:10;43307:1;43270:19:::0;;;:7:::2;:19;::::0;;;;;;;-1:-1:-1;;;;;43270:34:0;::::2;::::0;;;;;;;:38;;;;43327:54:::2;::::0;43374:6;43327:34:::2;:54::i;:::-;43428:13;-1:-1:-1::0;;;;;43405:45:0::2;43416:10;-1:-1:-1::0;;;;;43405:45:0::2;;43443:6;43405:45;;;;;;:::i;:::-;;;;;;;;43235:231;-1:-1:-1::0;;43095:3:0::2;;43057:420;;;-1:-1:-1::0;;27275:1:0;28237:7;:22;-1:-1:-1;;;42980:504:0:o;31215:379::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31363:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:40:::1;;::::0;:45;31355:54:::1;;;::::0;::::1;;31420:12;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;31420:32:0::1;-1:-1:-1::0;;;;;31420:32:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;31463:25:0;;;:10:::1;31420:32;31463:25:::0;;;;;;;31506:15:::1;31463:40;::::0;;::::1;:58:::0;31532:18:::1;:33:::0;;;;;:47;;;::::1;::::0;;;;;;;;;:54;;-1:-1:-1;;31532:54:0::1;::::0;;::::1;::::0;;31215:379::o;39858:875::-;46463:12;;46530;;39924:4;;-1:-1:-1;;;;;46463:12:0;;46439:13;;46594:30;46463:12;46530;46594:15;:30::i;:::-;-1:-1:-1;;;;;46553:17:0;;;;;;:10;:17;;;;;:38;;:71;46670:31;46564:5;46670:24;:31::i;:::-;-1:-1:-1;;;;;46635:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;46716:21;;;46712:370;;-1:-1:-1;;;;;46895:17:0;;;;;;:8;:17;;;;;:24;;;46871:57;;46879:7;;46888:5;;46921:6;46871:7;:57::i;:::-;-1:-1:-1;;;;;46845:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:83;;;;46984:10;:17;;;;;:38;;;46943:31;;;:22;:31;;;;;:38;;;;;;;;;:79;;;;47047:17;;;:8;:17;;;;:23;;-1:-1:-1;46712:370:0;-1:-1:-1;47103:11:0;;47139:1;47125:504;47146:12;:19;47142:23;;47125:504;;;47195:12;47208:1;47195:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47195:15:0;;-1:-1:-1;47266:30:0;47195:15;47289:6;47266:15;:30::i;:::-;-1:-1:-1;;;;;47225:17:0;;;;;;:10;:17;;;;;:38;;:71;47346:31;47236:5;47346:24;:31::i;:::-;-1:-1:-1;;;;;47311:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;47396:21;;;47392:226;;47464:40;47472:7;47481:5;47488:7;47497:6;47464:7;:40::i;:::-;-1:-1:-1;;;;;47438:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:66;;;;47564:10;:17;;;;;:38;;;47523:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;47392:226;47167:3;;47125:504;;;-1:-1:-1;39957:10:0::1;39949:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;39941:42;;;;-1:-1:-1::0;;;39941:42:0::1;;;;;;;:::i;:::-;40008:11;::::0;:23:::1;::::0;40024:6;40008:15:::1;:23::i;:::-;39994:11;:37:::0;-1:-1:-1;;;;;40065:14:0;::::1;40042:20;40065:14:::0;;;:8:::1;:14;::::0;;;;40102:9;;:21:::1;::::0;40116:6;40102:13:::1;:21::i;:::-;40090:33:::0;;40147:10:::1;::::0;::::1;::::0;:22:::1;::::0;40162:6;40147:14:::1;:22::i;:::-;40134:10;::::0;::::1;:35:::0;40180:18:::1;40201:75;29698:20:::0;40201:57:::1;29594:9;40201:36;:15;29594:9:::0;40201:19:::1;:36::i;:::-;:40:::0;::::1;:57::i;:::-;:61:::0;::::1;:75::i;:::-;-1:-1:-1::0;;;;;40322:18:0;::::1;40287:32;40322:18:::0;;;:12:::1;:18;::::0;;;;40365:15;;40180:96;;-1:-1:-1;40322:18:0;40397:8;;;:51:::1;;;40438:10;40409:8;40422:1;40418:3;:5;40409:15;;;;;;;;;;;;;;;;;;:26;;;:39;40397:51;40393:246;;;40479:55;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;40465:70;;::::1;::::0;;::::1;::::0;;-1:-1:-1;40465:70:0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;40393:246:::1;;;40593:34;40620:6;40593:8;40606:1;40602:3;:5;40593:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:22:::0;;:26:::1;:34::i;:::-;40568:8;40581:1;40577:3;:5;40568:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:59:::0;40393:246:::1;40649:12;::::0;:40:::1;::::0;-1:-1:-1;;;40649:40:0;;-1:-1:-1;;;;;40649:12:0;;::::1;::::0;:17:::1;::::0;:40:::1;::::0;40675:4:::1;::::0;40682:6;;40649:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40712:4;-1:-1:-1::0;;;;;40705:20:0::1;;40718:6;40705:20;;;;;;:::i;:::-;;;;;;;;47639:1;;;;39858:875:::0;;;;;;:::o;29451:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31966:192::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32108:30:0;;;::::1;;::::0;;;:20:::1;:30;::::0;;;;:42;;-1:-1:-1;;32108:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31966:192::o;34741:442::-;-1:-1:-1;;;;;34839:14:0;;34803;34839;;;:8;:14;;;;;;;;:23;;;34921:10;34908:24;;:12;:24;;;;;34839:23;;34943:209;34964:15;;34960:19;;34943:209;;;35030:15;35005:8;35014:1;35005:11;;;;;;;;;;;;;;;;;;:22;;;:40;35001:86;;;35066:5;;35001:86;35110:30;35121:8;35130:1;35121:11;;;;;;;;;;;;;;;;;;;;;:18;35110:6;;:10;:30::i;:::-;35101:39;-1:-1:-1;34981:3:0;;34943:209;;;;35162:13;34741:442;;;:::o;38151:279::-;38360:10;38339:32;;;;:20;:32;;;;;;;;38331:60;;;;-1:-1:-1;;;38331:60:0;;;;;;;:::i;:::-;38402:20;38409:6;38417:4;38402:6;:20::i;:::-;38151:279;:::o;33110:178::-;-1:-1:-1;;;;;33241:25:0;;33188:7;33241:25;;;:10;:25;;;;;:38;33215:65;;33224:15;;33215:8;:65::i;:::-;33208:72;33110:178;-1:-1:-1;;33110:178:0:o;31668:290::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31835:25:0;::::1;31878:1;31835:25:::0;;;:10:::1;:25;::::0;;;;:40:::1;;::::0;31827:53:::1;;;::::0;::::1;;-1:-1:-1::0;;;;;31891:33:0;;::::1;;::::0;;;:18:::1;:33;::::0;;;;;;;:47;;;::::1;::::0;;;;;;;;;:59;;-1:-1:-1;;31891:59:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31668:290::o;34531:121::-;-1:-1:-1;;;;;34624:14:0;34590;34624;;;:8;:14;;;;;:20;;34531:121::o;30097:77::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;25112:148::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;25203:6:::1;::::0;25182:40:::1;::::0;25219:1:::1;::::0;-1:-1:-1;;;;;25203:6:0::1;::::0;25182:40:::1;::::0;25219:1;;25182:40:::1;25233:6;:19:::0;;-1:-1:-1;;;;;;25233:19:0::1;::::0;;25112:148::o;29374:34::-;;;-1:-1:-1;;;;;29374:34:0;;:::o;29415:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29415:29:0;;-1:-1:-1;29415:29:0;:::o;45940:396::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;46067:12:::1;::::0;-1:-1:-1;;;;;46043:37:0;;::::1;46067:12:::0;::::1;46043:37;;46035:79;;;;-1:-1:-1::0;;;46035:79:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46133:24:0;::::1;;::::0;;;:10:::1;:24;::::0;;;;:39:::1;;::::0;:44;46125:85:::1;;;;-1:-1:-1::0;;;46125:85:0::1;;;;;;;:::i;:::-;46221:55;46255:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;46221:33:0;::::1;::::0;46264:11;46221:33:::1;:55::i;:::-;46292:36;46302:12;46316:11;46292:36;;;;;;;:::i;:::-;;;;;;;;45940:396:::0;;:::o;24461:87::-;24534:6;;-1:-1:-1;;;;;24534:6:0;24461:87;:::o;43570:906::-;43664:10;43622:29;43654:21;;;:9;:21;;;;;;;;43709:8;:20;;;;;43782:12;;43654:21;;43709:20;;43839:15;43654:21;-1:-1:-1;;43815:8:0;;43809:15;;;;;;;;;;;;;;;;;:26;;;:45;43805:420;;43922:10;;;;43964;43954:21;;;;:9;:21;;;;;43922:10;;-1:-1:-1;43947:28:0;;43954:21;43947:28;:::i;:::-;43805:420;;;44013:6;44008:206;44029:6;44025:1;:10;44008:206;;;44087:15;44065:5;44071:1;44065:8;;;;;;;;;;;;;;;;;;:19;;;:37;44061:48;;;44104:5;;44061:48;44137:27;44148:5;44154:1;44148:8;;;;;;;44137:27;44128:36;;44190:5;44196:1;44190:8;;;;;;;;;;;;;;;;;;;;44183:15;;;;;;;;;;;44037:3;44008:206;;;;43805:420;44248:10;;;;:22;;44263:6;44248:14;:22::i;:::-;44235:10;;;:35;44293:9;;:21;;44307:6;44293:13;:21::i;:::-;44281:33;;44339:11;;:23;;44355:6;44339:15;:23::i;:::-;44325:11;:37;44388:12;;:24;;44405:6;44388:16;:24::i;:::-;44373:12;:39;44423:12;;:45;;-1:-1:-1;;;;;44423:12:0;44449:10;44461:6;44423:25;:45::i;:::-;43570:906;;;;:::o;38049:94::-;38114:21;38121:6;38129:5;38114:6;:21::i;:::-;38049:94;;:::o;45246:579::-;46463:12;;46530;;45343:1;;-1:-1:-1;;;;;46463:12:0;;45343:1;;46594:30;46463:12;46530;46594:15;:30::i;:::-;-1:-1:-1;;;;;46553:17:0;;;;;;:10;:17;;;;;:38;;:71;46670:31;46564:5;46670:24;:31::i;:::-;-1:-1:-1;;;;;46635:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;46716:21;;;46712:370;;-1:-1:-1;;;;;46895:17:0;;;;;;:8;:17;;;;;:24;;;46871:57;;46879:7;;46888:5;;46921:6;46871:7;:57::i;:::-;-1:-1:-1;;;;;46845:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:83;;;;46984:10;:17;;;;;:38;;;46943:31;;;:22;:31;;;;;:38;;;;;;;;;:79;;;;47047:17;;;:8;:17;;;;:23;;-1:-1:-1;46712:370:0;-1:-1:-1;47103:11:0;;47139:1;47125:504;47146:12;:19;47142:23;;47125:504;;;47195:12;47208:1;47195:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47195:15:0;;-1:-1:-1;47266:30:0;47195:15;47289:6;47266:15;:30::i;:::-;-1:-1:-1;;;;;47225:17:0;;;;;;:10;:17;;;;;:38;;:71;47346:31;47236:5;47346:24;:31::i;:::-;-1:-1:-1;;;;;47311:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;47396:21;;;47392:226;;47464:40;47472:7;47481:5;47488:7;47497:6;47464:7;:40::i;:::-;-1:-1:-1;;;;;47438:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:66;;;;47564:10;:17;;;;;:38;;;47523:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;47392:226;47167:3;;47125:504;;;-1:-1:-1;;;;;;45366:33:0;::::1;;::::0;;;:18:::1;:33;::::0;;;;;;;45400:10:::1;45366:45:::0;;;;;;;;::::1;;45358:80;;;;-1:-1:-1::0;;;45358:80:0::1;;;;;;;:::i;:::-;45466:1;45457:6;:10;45449:32;;;;-1:-1:-1::0;;;45449:32:0::1;;;;;;;:::i;:::-;45662:73;-1:-1:-1::0;;;;;45662:38:0;::::1;45701:10;45721:4;45728:6:::0;45662:38:::1;:73::i;:::-;45746:36;45760:13;45775:6;45746:13;:36::i;:::-;45798:19;45810:6;45798:19;;;;;;:::i;:::-;;;;;;;;45246:579:::0;;;;;;:::o;33544:168::-;-1:-1:-1;;;;;33647:25:0;;33620:7;33647:25;;;:10;:25;;;;;:36;;;:57;;29594:9;33647:40;:57::i;30285:27::-;;;;:::o;33800:641::-;33933:12;:19;33866:27;;33916:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;33906:47;;33969:9;33964:445;33988:7;:14;33984:1;:18;33964:445;;;34118:15;34136:6;;:59;;-1:-1:-1;;;;;34172:17:0;;;;;;:8;:17;;;;;:23;34136:59;;;-1:-1:-1;;;;;34145:17:0;;;;;;:8;:17;;;;;:24;;;34136:59;34118:77;-1:-1:-1;34210:14:0;34227:6;;:35;;34251:11;;34227:35;;;34236:12;;34227:35;34210:52;;34296:12;34309:1;34296:15;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34296:15:0;34277:7;34285:1;34277:10;;;;;;;;;;;;;;:16;;:34;-1:-1:-1;;;;;34277:34:0;;;-1:-1:-1;;;;;34277:34:0;;;;;34346:51;34354:7;34363;34371:1;34363:10;;;;;;;;;;;;;;:16;;;34381:7;34390:6;34346:7;:51::i;:::-;34326:7;34334:1;34326:10;;;;;;;;;;;;;;;;;;;:17;:71;-1:-1:-1;;34004:3:0;;33964:445;;;;33800:641;;;:::o;35317:688::-;-1:-1:-1;;;;;35517:18:0;;35404:13;35517:18;;;:12;:18;;;;;35428:35;;35404:13;;35568:391;35589:15;;35585:19;;35568:391;;;35655:15;35630:8;35639:1;35630:11;;;;;;;;;;;;;;;;;;:22;;;:40;35626:322;;;35695:8;35691:112;;35763:15;;:19;;;35743:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;35728:55;;35691:112;35841:8;35850:1;35841:11;;;;;;;;;;;;;;;;;;35821:31;;;;;;;;;;;;;;;;;;;;;;;;;:12;35834:3;35821:17;;;;;;;;;;;;;:31;;;;35871:5;;;;;;;35903:29;35913:8;35922:1;35913:11;;;;;;;35903:29;35895:37;;35626:322;35606:3;;35568:391;;;;35969:28;;35317:688;;;:::o;30181:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;33296:240::-;33428:12;;33366:7;;;;-1:-1:-1;;;;;33403:38:0;;;33428:12;;33403:38;:67;;33459:11;;33403:67;;;33444:12;;33403:67;33386:84;;33488:38;33504:13;33519:6;33488:15;:38::i;:::-;33481:45;33296:240;-1:-1:-1;;;33296:240:0:o;25415:244::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25504:22:0;::::1;25496:73;;;;-1:-1:-1::0;;;25496:73:0::1;;;;;;;:::i;:::-;25606:6;::::0;25585:38:::1;::::0;-1:-1:-1;;;;;25585:38:0;;::::1;::::0;25606:6:::1;::::0;25585:38:::1;::::0;25606:6:::1;::::0;25585:38:::1;25634:6;:17:::0;;-1:-1:-1;;;;;;25634:17:0::1;-1:-1:-1::0;;;;;25634:17:0;;;::::1;::::0;;;::::1;::::0;;25415:244::o;29767:39::-;;;;;;;;;;;;;;;:::o;5524:179::-;5582:7;5614:5;;;5638:6;;;;5630:46;;;;-1:-1:-1;;;5630:46:0;;;;;;;:::i;5986:158::-;6044:7;6077:1;6072;:6;;6064:49;;;;-1:-1:-1;;;6064:49:0;;;;;;;:::i;:::-;-1:-1:-1;6131:5:0;;;5986:158::o;7101:153::-;7159:7;7191:1;7187;:5;7179:44;;;;-1:-1:-1;;;7179:44:0;;;;;;;:::i;:::-;7245:1;7241;:5;;;;;;;7101:153;-1:-1:-1;;;7101:153:0:o;32207:526::-;32295:7;32319:12;32315:98;;-1:-1:-1;;;;;;32355:25:0;;;;;;:10;:25;;;;;:46;;;32348:53;;32315:98;-1:-1:-1;;;;;32650:25:0;;;;;;:10;:25;;;;;:36;;;;32578:40;;;;;32443:282;;32512:198;;32702:7;;32512:185;;32692:4;;32512:175;;;;:39;32661:13;32512:24;:39::i;:198::-;-1:-1:-1;;;;;32443:25:0;;;;;;:10;:25;;;;;:46;;;;:50;:282::i;32741:361::-;-1:-1:-1;;;;;33064:14:0;;;32896:7;33064:14;;;:7;:14;;;;;;;;:29;;;;;;;;;;;;;32993;;;:22;:29;;;;;:44;;;;;;;;;;32923:171;;33064:29;32923:136;;33054:4;;32923:126;;32950:88;;:38;33079:13;32981:6;32950:15;:38::i;:88::-;32923:8;;:12;:126::i;:171::-;32916:178;32741:361;-1:-1:-1;;;;;32741:361:0:o;6403:220::-;6461:7;6485:6;6481:20;;-1:-1:-1;6500:1:0;6493:8;;6481:20;6524:5;;;6528:1;6524;:5;:1;6548:5;;;;;:10;6540:56;;;;-1:-1:-1;;;6540:56:0;;;;;;;:::i;18696:177::-;18779:86;18799:5;18829:23;;;18854:2;18858:5;18806:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18806:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;18806:58:0;-1:-1:-1;;;;;;18806:58:0;;;;;;;;;;18779:19;:86::i;:::-;18696:177;;;:::o;44540:698::-;-1:-1:-1;;;;;44645:25:0;;;;;;:10;:25;;;;;:38;44626:15;:57;44622:448;;44739:27;:6;29594:9;44739:10;:27::i;:::-;-1:-1:-1;;;;;44700:25:0;;;;;;:10;:25;;;;;:36;;:66;44622:448;;;-1:-1:-1;;;;;44819:25:0;;44799:17;44819:25;;;:10;:25;;;;;:38;:59;;44862:15;44819:42;:59::i;:::-;-1:-1:-1;;;;;44926:25:0;;44893:16;44926:25;;;:10;:25;;;;;:36;;;44799:79;;-1:-1:-1;44893:16:0;44912:51;;44799:79;;44912:13;:51::i;:::-;44893:70;-1:-1:-1;45017:41:0;29594:9;45017:20;:6;44893:70;45017:10;:20::i;:41::-;-1:-1:-1;;;;;44978:25:0;;;;;;:10;:25;;;;;:36;;:80;-1:-1:-1;;44622:448:0;-1:-1:-1;;;;;45082:25:0;;;;;;:10;:25;;;;;45125:15;45082:40;;;;:58;;;45192:36;;29594:9;45192:19;:36::i;:::-;-1:-1:-1;;;;;45151:25:0;;;;;;;:10;:25;;;;;:77;;;;-1:-1:-1;44540:698:0:o;23088:106::-;23176:10;23088:106;:::o;38587:1113::-;27319:1;27925:7;;:19;;27917:63;;;;-1:-1:-1;;;27917:63:0;;;;;;;:::i;:::-;27319:1;28058:7;:18;;;46463:12;;46530::::1;::::0;38665:10:::1;::::0;-1:-1:-1;;;;;46463:12:0;;::::1;::::0;28058:7;46594:30:::1;46463:12:::0;46530;46594:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;46553:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;46670:31:::1;46564:5:::0;46670:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;46635:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;46716:21;::::1;::::0;46712:370:::1;;-1:-1:-1::0;;;;;46895:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;46871:57:::1;::::0;46879:7;;46888:5;;46921:6;46871:7:::1;:57::i;:::-;-1:-1:-1::0;;;;;46845:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:83;;;;46984:10:::1;:17:::0;;;;;:38:::1;;::::0;46943:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;:79;;;;47047:17;;;:8:::1;:17:::0;;;;:23;;-1:-1:-1;46712:370:0::1;-1:-1:-1::0;47103:11:0::1;::::0;47139:1:::1;47125:504;47146:12;:19:::0;47142:23;::::1;47125:504;;;47195:12;47208:1;47195:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47195:15:0::1;::::0;-1:-1:-1;47266:30:0::1;47195:15:::0;47289:6;47266:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;47225:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;47346:31:::1;47236:5:::0;47346:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;47311:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;47396:21;::::1;::::0;47392:226:::1;;47464:40;47472:7;47481:5;47488:7;47497:6;47464:7;:40::i;:::-;-1:-1:-1::0;;;;;47438:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:66;;;;47564:10:::1;:17:::0;;;;;:38:::1;;::::0;47523:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;47392:226:::1;47167:3;;47125:504;;;;38705:1:::2;38696:6;:10;38688:37;;;;-1:-1:-1::0;;;38688:37:0::2;;;;;;;:::i;:::-;38750:11;::::0;:23:::2;::::0;38766:6;38750:15:::2;:23::i;:::-;38736:11;:37:::0;38816:10:::2;38784:20;38807::::0;;;:8:::2;:20;::::0;;;;38850:9;;:21:::2;::::0;38864:6;38850:13:::2;:21::i;:::-;38838:33:::0;;38882:694;::::2;;;38922:12;::::0;:24:::2;::::0;38939:6;38922:16:::2;:24::i;:::-;38907:12;:39:::0;38974:10:::2;::::0;::::2;::::0;:22:::2;::::0;38989:6;38974:14:::2;:22::i;:::-;38961:10;::::0;::::2;:35:::0;39011:18:::2;39032:75;29698:20:::0;39032:57:::2;29594:9;39032:36;:15;29594:9:::0;39032:19:::2;:36::i;:75::-;39146:10;39122:11;39136:21:::0;;;:9:::2;:21;::::0;;;;:28;39011:96;;-1:-1:-1;39183:8:0;;;:64:::2;;-1:-1:-1::0;39205:10:0::2;39195:21;::::0;;;:9:::2;:21;::::0;;;;:28;;39237:10;;39195:21;-1:-1:-1;;39217:5:0;;;39195:28;::::2;;;;;;;;;;;;;;;:39;;;:52;39183:64;39179:314;;;39278:10;39268:21;::::0;;;:9:::2;:21;::::0;;;;;;;39295:55;;;;::::2;::::0;;;;;;;;::::2;::::0;;;39268:83;;::::2;::::0;;::::2;::::0;;;;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;39179:314:::2;;;39440:10;39430:21;::::0;;;:9:::2;:21;::::0;;;;:28;;:47:::2;::::0;39470:6;;-1:-1:-1;;39452:5:0;;;39430:28;::::2;;;;:47;39402:10;39392:21;::::0;;;:9:::2;:21;::::0;;;;:28;;-1:-1:-1;;39414:5:0;;;39392:28;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:85:::0;39179:314:::2;38882:694;;;;;39540:12;::::0;::::2;::::0;:24:::2;::::0;39557:6;39540:16:::2;:24::i;:::-;39525:12;::::0;::::2;:39:::0;38882:694:::2;39586:12;::::0;:64:::2;::::0;-1:-1:-1;;;;;39586:12:0::2;39616:10;39636:4;39643:6:::0;39586:29:::2;:64::i;:::-;39673:10;-1:-1:-1::0;;;;;39666:26:0::2;;39685:6;39666:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;27275:1:0;28237:7;:22;-1:-1:-1;;;;;38587:1113:0:o;22118:106::-;22176:7;22207:1;22203;:5;:13;;22215:1;22203:13;;;-1:-1:-1;22211:1:0;;22118:106;-1:-1:-1;22118:106:0:o;18881:205::-;18982:96;19002:5;19032:27;;;19061:4;19067:2;19071:5;19009:68;;;;;;;;;;:::i;21001:761::-;21425:23;21451:69;21479:4;21451:69;;;;;;;;;;;;;;;;;21459:5;-1:-1:-1;;;;;21451:27:0;;;:69;;;;;:::i;:::-;21535:17;;21425:95;;-1:-1:-1;21535:21:0;21531:224;;21677:10;21666:30;;;;;;;;;;;;:::i;:::-;21658:85;;;;-1:-1:-1;;;21658:85:0;;;;;;;:::i;13792:195::-;13895:12;13927:52;13949:6;13957:4;13963:1;13966:12;13927:21;:52::i;:::-;13920:59;13792:195;-1:-1:-1;;;;13792:195:0:o;14844:530::-;14971:12;15029:5;15004:21;:30;;14996:81;;;;-1:-1:-1;;;14996:81:0;;;;;;;:::i;:::-;15096:18;15107:6;15096:10;:18::i;:::-;15088:60;;;;-1:-1:-1;;;15088:60:0;;;;;;;:::i;:::-;15222:12;15236:23;15263:6;-1:-1:-1;;;;;15263:11:0;15283:5;15291:4;15263:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15221:75;;;;15314:52;15332:7;15341:10;15353:12;15314:17;:52::i;:::-;15307:59;14844:530;-1:-1:-1;;;;;;;14844:530:0:o;10874:422::-;11241:20;11280:8;;;10874:422::o;17384:742::-;17499:12;17528:7;17524:595;;;-1:-1:-1;17559:10:0;17552:17;;17524:595;17673:17;;:21;17669:439;;17936:10;17930:17;17997:15;17984:10;17980:2;17976:19;17969:44;17884:148;18079:12;18072:20;;-1:-1:-1;;;18072:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;31377:54;;32275:35;;32265:2;;32324:1;;32314:12;545:241;;649:2;637:9;628:7;624:23;620:32;617:2;;;-1:-1;;655:12;617:2;717:53;762:7;738:22;717:53;:::i;793:366::-;;;914:2;902:9;893:7;889:23;885:32;882:2;;;-1:-1;;920:12;882:2;982:53;1027:7;1003:22;982:53;:::i;:::-;972:63;;1090:53;1135:7;1072:2;1115:9;1111:22;1090:53;:::i;:::-;1080:63;;876:283;;;;;:::o;1166:485::-;;;;1301:2;1289:9;1280:7;1276:23;1272:32;1269:2;;;-1:-1;;1307:12;1269:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1359:63;-1:-1;1459:2;1498:22;;72:20;97:33;72:20;97:33;:::i;:::-;1467:63;-1:-1;1567:2;1603:22;;206:20;231:30;206:20;231:30;:::i;:::-;1575:60;;;;1263:388;;;;;:::o;1658:360::-;;;1776:2;1764:9;1755:7;1751:23;1747:32;1744:2;;;-1:-1;;1782:12;1744:2;1844:53;1889:7;1865:22;1844:53;:::i;:::-;1834:63;;1934:2;1974:9;1970:22;206:20;231:30;255:5;231:30;:::i;:::-;1942:60;;;;1738:280;;;;;:::o;2025:366::-;;;2146:2;2134:9;2125:7;2121:23;2117:32;2114:2;;;-1:-1;;2152:12;2114:2;2214:53;2259:7;2235:22;2214:53;:::i;:::-;2204:63;2304:2;2343:22;;;;475:20;;-1:-1;;;2108:283::o;2398:257::-;;2510:2;2498:9;2489:7;2485:23;2481:32;2478:2;;;-1:-1;;2516:12;2478:2;354:6;348:13;366:30;390:5;366:30;:::i;2662:241::-;;2766:2;2754:9;2745:7;2741:23;2737:32;2734:2;;;-1:-1;;2772:12;2734:2;-1:-1;475:20;;2728:175;-1:-1;2728:175::o;2910:360::-;;;3028:2;3016:9;3007:7;3003:23;2999:32;2996:2;;;-1:-1;;3034:12;2996:2;488:6;475:20;3086:63;;3186:2;3226:9;3222:22;206:20;231:30;255:5;231:30;:::i;4208:938::-;;4494:5;29608:12;30529:6;30524:3;30517:19;30566:4;;30561:3;30557:14;4506:124;;30566:4;4732:5;29245:14;-1:-1;4771:353;4796:6;4793:1;4790:13;4771:353;;;4857:13;;14383:23;;15295:37;;14549:16;;14543:23;14620:14;;;15295:37;3564:4;3555:14;;;;30198;;;;4818:1;4811:9;4771:353;;;-1:-1;5130:10;;4394:752;-1:-1;;;;;4394:752::o;15464:271::-;;6442:5;29608:12;6553:52;6598:6;6593:3;6586:4;6579:5;6575:16;6553:52;:::i;:::-;6617:16;;;;;15598:137;-1:-1;;15598:137::o;15742:222::-;-1:-1;;;;;31377:54;;;;3938:37;;15869:2;15854:18;;15840:124::o;15971:444::-;-1:-1;;;;;31377:54;;;3938:37;;31377:54;;;;16318:2;16303:18;;3938:37;16401:2;16386:18;;15295:37;;;;16154:2;16139:18;;16125:290::o;16422:333::-;-1:-1;;;;;31377:54;;;;3938:37;;16741:2;16726:18;;15295:37;16577:2;16562:18;;16548:207::o;16762:482::-;16995:2;17009:47;;;29608:12;;16980:18;;;30517:19;;;16762:482;;16995:2;30557:14;;;;;;29245;;;16762:482;5797:344;5822:6;5819:1;5816:13;5797:344;;;5883:13;;14958:23;;-1:-1;;;;;31377:54;3938:37;;15120:16;;15114:23;15191:14;;;15295:37;3849:14;;;;30198;;;;31388:42;5837:9;5797:344;;;-1:-1;17062:172;;16966:278;-1:-1;;;;;;;16966:278::o;17251:210::-;31289:13;;31282:21;6236:34;;17372:2;17357:18;;17343:118::o;17743:310::-;;17890:2;17911:17;17904:47;6969:5;29608:12;30529:6;17890:2;17879:9;17875:18;30517:19;7063:52;7108:6;30557:14;17879:9;30557:14;17890:2;7089:5;7085:16;7063:52;:::i;:::-;32195:7;32179:14;-1:-1;;32175:28;7127:39;;;;30557:14;7127:39;;17861:192;-1:-1;;17861:192::o;18060:416::-;18260:2;18274:47;;;7403:2;18245:18;;;30517:19;7439:34;30557:14;;;7419:55;-1:-1;;;7494:12;;;7487:30;7536:12;;;18231:245::o;18483:416::-;18683:2;18697:47;;;7787:2;18668:18;;;30517:19;-1:-1;;;30557:14;;;7803:37;7859:12;;;18654:245::o;18906:416::-;19106:2;19120:47;;;8110:2;19091:18;;;30517:19;8146:29;30557:14;;;8126:50;8195:12;;;19077:245::o;19329:416::-;19529:2;19543:47;;;8446:2;19514:18;;;30517:19;8482:34;30557:14;;;8462:55;-1:-1;;;8537:12;;;8530:26;8575:12;;;19500:245::o;19752:416::-;19952:2;19966:47;;;8826:2;19937:18;;;30517:19;8862:32;30557:14;;;8842:53;8914:12;;;19923:245::o;20175:416::-;20375:2;20389:47;;;9165:2;20360:18;;;30517:19;9201:34;30557:14;;;9181:55;-1:-1;;;9256:12;;;9249:30;9298:12;;;20346:245::o;20598:416::-;20798:2;20812:47;;;9549:2;20783:18;;;30517:19;9585:28;30557:14;;;9565:49;9633:12;;;20769:245::o;21021:416::-;21221:2;21235:47;;;9884:1;21206:18;;;30517:19;-1:-1;;;30557:14;;;9899:32;9950:12;;;21192:245::o;21444:416::-;21644:2;21658:47;;;10201:2;21629:18;;;30517:19;-1:-1;;;30557:14;;;10217:40;10276:12;;;21615:245::o;21867:416::-;22067:2;22081:47;;;10527:2;22052:18;;;30517:19;10563:34;30557:14;;;10543:55;-1:-1;;;10618:12;;;10611:25;10655:12;;;22038:245::o;22290:416::-;22490:2;22504:47;;;22475:18;;;30517:19;10942:34;30557:14;;;10922:55;10996:12;;;22461:245::o;22713:416::-;22913:2;22927:47;;;11247:2;22898:18;;;30517:19;-1:-1;;;30557:14;;;11263:45;11327:12;;;22884:245::o;23136:416::-;23336:2;23350:47;;;11578:2;23321:18;;;30517:19;11614:31;30557:14;;;11594:52;11665:12;;;23307:245::o;23559:416::-;23759:2;23773:47;;;11916:2;23744:18;;;30517:19;-1:-1;;;30557:14;;;11932:33;11984:12;;;23730:245::o;23982:416::-;24182:2;24196:47;;;12235:2;24167:18;;;30517:19;12271:31;30557:14;;;12251:52;12322:12;;;24153:245::o;24405:416::-;24605:2;24619:47;;;12573:2;24590:18;;;30517:19;12609:31;30557:14;;;12589:52;12660:12;;;24576:245::o;24828:416::-;25028:2;25042:47;;;12911:2;25013:18;;;30517:19;-1:-1;;;30557:14;;;12927:38;12984:12;;;24999:245::o;25251:416::-;25451:2;25465:47;;;13235:2;25436:18;;;30517:19;13271:34;30557:14;;;13251:55;-1:-1;;;13326:12;;;13319:34;13372:12;;;25422:245::o;25674:416::-;25874:2;25888:47;;;13623:2;25859:18;;;30517:19;13659:30;30557:14;;;13639:51;13709:12;;;25845:245::o;26097:416::-;26297:2;26311:47;;;13960:2;26282:18;;;30517:19;13996:33;30557:14;;;13976:54;14049:12;;;26268:245::o;26520:222::-;15295:37;;;26647:2;26632:18;;26618:124::o;26749:605::-;;15325:5;15302:3;15295:37;27016:2;27134;27123:9;27119:18;27112:48;27174:170;27016:2;27005:9;27001:18;27330:6;27174:170;:::i;27361:333::-;15295:37;;;27680:2;27665:18;;15295:37;27516:2;27501:18;;27487:207::o;27701:828::-;;15325:5;15302:3;15295:37;15325:5;28189:2;28178:9;28174:18;15295:37;15325:5;28272:2;28261:9;28257:18;15295:37;28024:3;28309:2;28298:9;28294:18;28287:48;28349:170;28024:3;28013:9;28009:19;28505:6;28349:170;:::i;:::-;28341:178;27995:534;-1:-1;;;;;;27995:534::o;28536:556::-;15295:37;;;28912:2;28897:18;;15295:37;;;;28995:2;28980:18;;15295:37;29078:2;29063:18;;15295:37;28747:3;28732:19;;28718:374::o;31835:268::-;31900:1;31907:101;31921:6;31918:1;31915:13;31907:101;;;31988:11;;;31982:18;31969:11;;;31962:39;31943:2;31936:10;31907:101;;;32023:6;32020:1;32017:13;32014:2;;;-1:-1;;31900:1;32070:16;;32063:27;31884:219::o;32216:117::-;-1:-1;;;;;31377:54;;32275:35;;32265:2;;32324:1;;32314:12;32340:111;32421:5;31289:13;31282:21;32399:5;32396:32;32386:2;;32442:1;;32432:12
Swarm Source
ipfs://4c85a6f627876af36c6afb659c5de3fe557c922ebb151c613c086a17e66916ba
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
CRONOS | 100.00% | $0.093207 | 7,352.2079 | $685.28 |
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.