Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14181078 | 869 days ago | IN | Create: NFTXSimpleFeeDistributor | 0 ETH | 0.4467994 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NFTXSimpleFeeDistributor
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-10 */ // Sources flattened with hardhat v2.8.2 https://hardhat.org // File contracts/solidity/interface/INFTXLPStaking.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface INFTXLPStaking { function nftxVaultFactory() external view returns (address); function rewardDistTokenImpl() external view returns (address); function stakingTokenProvider() external view returns (address); function vaultToken(address _stakingToken) external view returns (address); function stakingToken(address _vaultToken) external view returns (address); function rewardDistributionToken(uint256 vaultId) external view returns (address); function newRewardDistributionToken(uint256 vaultId) external view returns (address); function oldRewardDistributionToken(uint256 vaultId) external view returns (address); function unusedRewardDistributionToken(uint256 vaultId) external view returns (address); function rewardDistributionTokenAddr( address stakedToken, address rewardToken ) external view returns (address); // Write functions. function __NFTXLPStaking__init(address _stakingTokenProvider) external; function setNFTXVaultFactory(address newFactory) external; function setStakingTokenProvider(address newProvider) external; function addPoolForVault(uint256 vaultId) external; function updatePoolForVault(uint256 vaultId) external; function updatePoolForVaults(uint256[] calldata vaultId) external; function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool); function deposit(uint256 vaultId, uint256 amount) external; function timelockDepositFor( uint256 vaultId, address account, uint256 amount, uint256 timelockLength ) external; function exit(uint256 vaultId, uint256 amount) external; function rescue(uint256 vaultId) external; function withdraw(uint256 vaultId, uint256 amount) external; function claimRewards(uint256 vaultId) external; } // File contracts/solidity/interface/INFTXSimpleFeeDistributor.sol pragma solidity ^0.8.0; interface INFTXSimpleFeeDistributor { struct FeeReceiver { uint256 allocPoint; address receiver; bool isContract; } function nftxVaultFactory() external view returns (address); function lpStaking() external view returns (address); function inventoryStaking() external view returns (address); function treasury() external view returns (address); function allocTotal() external view returns (uint256); // Write functions. function __SimpleFeeDistributor__init__( address _lpStaking, address _treasury ) external; function rescueTokens(address token) external; function distribute(uint256 vaultId) external; function addReceiver( uint256 _allocPoint, address _receiver, bool _isContract ) external; function initializeVaultReceivers(uint256 _vaultId) external; function changeReceiverAlloc(uint256 _idx, uint256 _allocPoint) external; function changeReceiverAddress( uint256 _idx, address _address, bool _isContract ) external; function removeReceiver(uint256 _receiverIdx) external; // Configuration functions. function setTreasuryAddress(address _treasury) external; function setLPStakingAddress(address _lpStaking) external; function setInventoryStakingAddress(address _inventoryStaking) external; function setNFTXVaultFactory(address _factory) external; } // File contracts/solidity/proxy/IBeacon.sol pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function childImplementation() external view returns (address); function upgradeChildTo(address newImplementation) external; } // File contracts/solidity/interface/INFTXVaultFactory.sol pragma solidity ^0.8.0; interface INFTXVaultFactory is IBeacon { // Read functions. function numVaults() external view returns (uint256); function zapContract() external view returns (address); function feeDistributor() external view returns (address); function eligibilityManager() external view returns (address); function vault(uint256 vaultId) external view returns (address); function allVaults() external view returns (address[] memory); function vaultsForAsset(address asset) external view returns (address[] memory); function isLocked(uint256 id) external view returns (bool); function excludedFromFees(address addr) external view returns (bool); function factoryMintFee() external view returns (uint64); function factoryRandomRedeemFee() external view returns (uint64); function factoryTargetRedeemFee() external view returns (uint64); function factoryRandomSwapFee() external view returns (uint64); function factoryTargetSwapFee() external view returns (uint64); function vaultFees(uint256 vaultId) external view returns ( uint256, uint256, uint256, uint256, uint256 ); event NewFeeDistributor(address oldDistributor, address newDistributor); event NewZapContract(address oldZap, address newZap); event FeeExclusion(address feeExcluded, bool excluded); event NewEligibilityManager(address oldEligManager, address newEligManager); event NewVault( uint256 indexed vaultId, address vaultAddress, address assetAddress ); event UpdateVaultFees( uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ); event DisableVaultFees(uint256 vaultId); event UpdateFactoryFees( uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ); // Write functions. function __NFTXVaultFactory_init( address _vaultImpl, address _feeDistributor ) external; function createVault( string calldata name, string calldata symbol, address _assetAddress, bool is1155, bool allowAllItems ) external returns (uint256); function setFeeDistributor(address _feeDistributor) external; function setEligibilityManager(address _eligibilityManager) external; function setZapContract(address _zapContract) external; function setFeeExclusion(address _excludedAddr, bool excluded) external; function setFactoryFees( uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function setVaultFees( uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function disableVaultFees(uint256 vaultId) external; } // File contracts/solidity/interface/INFTXInventoryStaking.sol pragma solidity ^0.8.0; interface INFTXInventoryStaking { function nftxVaultFactory() external view returns (INFTXVaultFactory); function vaultXToken(uint256 vaultId) external view returns (address); function xTokenAddr(address baseToken) external view returns (address); function xTokenShareValue(uint256 vaultId) external view returns (uint256); function __NFTXInventoryStaking_init(address nftxFactory) external; function deployXTokenForVault(uint256 vaultId) external; function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool); function timelockMintFor( uint256 vaultId, uint256 amount, address to, uint256 timelockLength ) external returns (uint256); function deposit(uint256 vaultId, uint256 _amount) external; function withdraw(uint256 vaultId, uint256 _share) external; } // File contracts/solidity/token/IERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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 ); } // File contracts/solidity/util/Address.sol pragma solidity ^0.8.0; /** * @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); } } } } // File contracts/solidity/util/SafeERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @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 SafeERC20Upgradeable { using Address for address; function safeTransfer( IERC20Upgradeable token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20Upgradeable 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( IERC20Upgradeable 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( IERC20Upgradeable token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20Upgradeable token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require( oldAllowance >= value, "SafeERC20: decreased allowance below zero" ); uint256 newAllowance = oldAllowance - value; _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(IERC20Upgradeable 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" ); } } } // File contracts/solidity/util/SafeMathUpgradeable.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMathUpgradeable { /** * @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) { unchecked { 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) { unchecked { 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) { unchecked { // 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) { unchecked { 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) { unchecked { 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) { return a + b; } /** * @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) { 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) { return a * b; } /** * @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. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { 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) { 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) { unchecked { 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. * * 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) { unchecked { 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) { unchecked { require(b > 0, errorMessage); return a % b; } } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { require(value < 2**255, "SafeCast: value doesn't fit in an int256"); return int256(value); } } // File contracts/solidity/proxy/Initializable.sol // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require( _initializing || !_initialized, "Initializable: contract is already initialized" ); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File contracts/solidity/util/ContextUpgradeable.sol pragma solidity ^0.8.0; /* * @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 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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File contracts/solidity/util/OwnableUpgradeable.sol pragma solidity ^0.8.0; /** * @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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { 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; } uint256[49] private __gap; } // File contracts/solidity/util/PausableUpgradeable.sol pragma solidity ^0.8.0; contract PausableUpgradeable is OwnableUpgradeable { function __Pausable_init() internal initializer { __Ownable_init(); } event SetPaused(uint256 lockId, bool paused); event SetIsGuardian(address addr, bool isGuardian); mapping(address => bool) public isGuardian; mapping(uint256 => bool) public isPaused; // 0 : createVault // 1 : mint // 2 : redeem // 3 : swap // 4 : flashloan function onlyOwnerIfPaused(uint256 lockId) public view virtual { require(!isPaused[lockId] || msg.sender == owner(), "Paused"); } function unpause(uint256 lockId) public virtual onlyOwner { isPaused[lockId] = false; emit SetPaused(lockId, false); } function pause(uint256 lockId) public virtual { require(isGuardian[msg.sender], "Can't pause"); isPaused[lockId] = true; emit SetPaused(lockId, true); } function setIsGuardian(address addr, bool _isGuardian) public virtual onlyOwner { isGuardian[addr] = _isGuardian; emit SetIsGuardian(addr, _isGuardian); } } // File contracts/solidity/util/ReentrancyGuardUpgradeable.sol pragma solidity ^0.8.0; /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _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; } uint256[49] private __gap; } // File contracts/solidity/NFTXSimpleFeeDistributor.sol pragma solidity ^0.8.0; contract NFTXSimpleFeeDistributor is INFTXSimpleFeeDistributor, ReentrancyGuardUpgradeable, PausableUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; bool public distributionPaused; address public override nftxVaultFactory; address public override lpStaking; address public override treasury; // Total allocation points per vault. uint256 public override allocTotal; FeeReceiver[] public feeReceivers; address public override inventoryStaking; event UpdateTreasuryAddress(address newTreasury); event UpdateLPStakingAddress(address newLPStaking); event UpdateInventoryStakingAddress(address newInventoryStaking); event UpdateNFTXVaultFactory(address factory); event PauseDistribution(bool paused); event AddFeeReceiver(address receiver, uint256 allocPoint); event UpdateFeeReceiverAlloc(address receiver, uint256 allocPoint); event UpdateFeeReceiverAddress(address oldReceiver, address newReceiver); event RemoveFeeReceiver(address receiver); function __SimpleFeeDistributor__init__( address _lpStaking, address _treasury ) public override initializer { __Pausable_init(); setTreasuryAddress(_treasury); setLPStakingAddress(_lpStaking); _addReceiver(0.8 ether, lpStaking, true); } function distribute(uint256 vaultId) external virtual override nonReentrant { require(nftxVaultFactory != address(0)); address _vault = INFTXVaultFactory(nftxVaultFactory).vault(vaultId); uint256 tokenBalance = IERC20Upgradeable(_vault).balanceOf( address(this) ); if (distributionPaused || allocTotal == 0) { IERC20Upgradeable(_vault).safeTransfer(treasury, tokenBalance); return; } uint256 length = feeReceivers.length; uint256 leftover; for (uint256 i; i < length; ++i) { FeeReceiver memory _feeReceiver = feeReceivers[i]; uint256 amountToSend = leftover + ((tokenBalance * _feeReceiver.allocPoint) / allocTotal); uint256 currentTokenBalance = IERC20Upgradeable(_vault).balanceOf( address(this) ); amountToSend = amountToSend > currentTokenBalance ? currentTokenBalance : amountToSend; bool complete = _sendForReceiver( _feeReceiver, vaultId, _vault, amountToSend ); if (!complete) { uint256 remaining = IERC20Upgradeable(_vault).allowance( address(this), _feeReceiver.receiver ); IERC20Upgradeable(_vault).safeApprove(_feeReceiver.receiver, 0); leftover = remaining; } else { leftover = 0; } } if (leftover != 0) { uint256 currentTokenBalance = IERC20Upgradeable(_vault).balanceOf( address(this) ); IERC20Upgradeable(_vault).safeTransfer( treasury, currentTokenBalance ); } } function addReceiver( uint256 _allocPoint, address _receiver, bool _isContract ) external virtual override onlyOwner { _addReceiver(_allocPoint, _receiver, _isContract); } function initializeVaultReceivers(uint256 _vaultId) external override { require(msg.sender == nftxVaultFactory, "FeeReceiver: not factory"); INFTXLPStaking(lpStaking).addPoolForVault(_vaultId); if (inventoryStaking != address(0)) INFTXInventoryStaking(inventoryStaking).deployXTokenForVault( _vaultId ); } function changeReceiverAlloc(uint256 _receiverIdx, uint256 _allocPoint) public virtual override onlyOwner { require( _receiverIdx < feeReceivers.length, "FeeDistributor: Out of bounds" ); FeeReceiver storage feeReceiver = feeReceivers[_receiverIdx]; allocTotal -= feeReceiver.allocPoint; feeReceiver.allocPoint = _allocPoint; allocTotal += _allocPoint; emit UpdateFeeReceiverAlloc(feeReceiver.receiver, _allocPoint); } function changeReceiverAddress( uint256 _receiverIdx, address _address, bool _isContract ) public virtual override onlyOwner { FeeReceiver storage feeReceiver = feeReceivers[_receiverIdx]; address oldReceiver = feeReceiver.receiver; feeReceiver.receiver = _address; feeReceiver.isContract = _isContract; emit UpdateFeeReceiverAddress(oldReceiver, _address); } function removeReceiver(uint256 _receiverIdx) external virtual override onlyOwner { uint256 arrLength = feeReceivers.length; require(_receiverIdx < arrLength, "FeeDistributor: Out of bounds"); emit RemoveFeeReceiver(feeReceivers[_receiverIdx].receiver); allocTotal -= feeReceivers[_receiverIdx].allocPoint; // Copy the last element to what is being removed and remove the last element. feeReceivers[_receiverIdx] = feeReceivers[arrLength - 1]; feeReceivers.pop(); } function setTreasuryAddress(address _treasury) public override onlyOwner { require(_treasury != address(0), "Treasury != address(0)"); treasury = _treasury; emit UpdateTreasuryAddress(_treasury); } function setLPStakingAddress(address _lpStaking) public override onlyOwner { require(_lpStaking != address(0), "LPStaking != address(0)"); lpStaking = _lpStaking; emit UpdateLPStakingAddress(_lpStaking); } function setInventoryStakingAddress(address _inventoryStaking) public override onlyOwner { inventoryStaking = _inventoryStaking; emit UpdateInventoryStakingAddress(_inventoryStaking); } function setNFTXVaultFactory(address _factory) external override onlyOwner { require( address(nftxVaultFactory) == address(0), "nftxVaultFactory is immutable" ); nftxVaultFactory = _factory; emit UpdateNFTXVaultFactory(_factory); } function pauseFeeDistribution(bool _pause) external onlyOwner { distributionPaused = _pause; emit PauseDistribution(_pause); } function rescueTokens(address _address) external override onlyOwner { uint256 balance = IERC20Upgradeable(_address).balanceOf(address(this)); IERC20Upgradeable(_address).safeTransfer(msg.sender, balance); } function _addReceiver( uint256 _allocPoint, address _receiver, bool _isContract ) internal virtual { FeeReceiver memory _feeReceiver = FeeReceiver( _allocPoint, _receiver, _isContract ); feeReceivers.push(_feeReceiver); allocTotal += _allocPoint; emit AddFeeReceiver(_receiver, _allocPoint); } function _sendForReceiver( FeeReceiver memory _receiver, uint256 _vaultId, address _vault, uint256 amountToSend ) internal virtual returns (bool) { if (_receiver.isContract) { IERC20Upgradeable(_vault).safeIncreaseAllowance( _receiver.receiver, amountToSend ); bytes memory payload = abi.encodeWithSelector( INFTXLPStaking.receiveRewards.selector, _vaultId, amountToSend ); (bool success, ) = address(_receiver.receiver).call(payload); // If the allowance has not been spent, it means we can pass it forward to next. return success && IERC20Upgradeable(_vault).allowance( address(this), _receiver.receiver ) == 0; } else { IERC20Upgradeable(_vault).safeTransfer( _receiver.receiver, amountToSend ); return true; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"AddFeeReceiver","type":"event"},{"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":"bool","name":"paused","type":"bool"}],"name":"PauseDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"RemoveFeeReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"isGuardian","type":"bool"}],"name":"SetIsGuardian","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"SetPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"newReceiver","type":"address"}],"name":"UpdateFeeReceiverAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"UpdateFeeReceiverAlloc","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newInventoryStaking","type":"address"}],"name":"UpdateInventoryStakingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newLPStaking","type":"address"}],"name":"UpdateLPStakingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"factory","type":"address"}],"name":"UpdateNFTXVaultFactory","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"UpdateTreasuryAddress","type":"event"},{"inputs":[{"internalType":"address","name":"_lpStaking","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"name":"__SimpleFeeDistributor__init__","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bool","name":"_isContract","type":"bool"}],"name":"addReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_receiverIdx","type":"uint256"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isContract","type":"bool"}],"name":"changeReceiverAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_receiverIdx","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"changeReceiverAlloc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeReceivers","outputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bool","name":"isContract","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"initializeVaultReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inventoryStaking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGuardian","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpStaking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftxVaultFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockId","type":"uint256"}],"name":"onlyOwnerIfPaused","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockId","type":"uint256"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseFeeDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_receiverIdx","type":"uint256"}],"name":"removeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_inventoryStaking","type":"address"}],"name":"setInventoryStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"_isGuardian","type":"bool"}],"name":"setIsGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpStaking","type":"address"}],"name":"setLPStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"setNFTXVaultFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockId","type":"uint256"}],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612785806100206000396000f3fe608060405234801561001057600080fd5b50600436106101ce5760003560e01c806374a1b0b011610104578063a534cbbd116100a2578063bdf2a43c11610071578063bdf2a43c14610408578063d46307dc1461042b578063f2fde38b1461043e578063fabc1cbc1461045157600080fd5b8063a534cbbd146103bc578063a77abced146103cf578063aa463065146103e2578063af056847146103f557600080fd5b80638da5cb5b116100de5780638da5cb5b14610372578063915c5baf1461038357806391c05b0b146103965780639bf1401c146103a957600080fd5b806374a1b0b0146103395780637c77b6161461034c5780638c0fd23d1461035f57600080fd5b806336d4d031116101715780635b3817601161014b5780635b381760146102d357806361d027b31461030b5780636605bfda1461031e578063715018a61461033157600080fd5b806336d4d031146102835780633801daf1146102965780634912300d146102c657600080fd5b80630c68ba21116101ad5780630c68ba2114610217578063136439dd1461024a57806319d3d2a41461025d57806323845fb51461027057600080fd5b8062ae3bf8146101d357806303220d02146101e857806308131951146101fb575b600080fd5b6101e66101e136600461248b565b610464565b005b6101e66101f6366004612590565b610545565b610204609c5481565b6040519081526020015b60405180910390f35b61023a61022536600461248b565b60976020526000908152604090205460ff1681565b604051901515815260200161020e565b6101e6610258366004612560565b610641565b6101e661026b366004612560565b6106f8565b6101e661027e3660046124fb565b61085c565b6101e661029136600461248b565b610907565b6099546102ae9061010090046001600160a01b031681565b6040516001600160a01b03909116815260200161020e565b60995461023a9060ff1681565b6102e66102e1366004612560565b6109f3565b604080519384526001600160a01b03909216602084015215159082015260600161020e565b609b546102ae906001600160a01b031681565b6101e661032c36600461248b565b610a36565b6101e6610b22565b609e546102ae906001600160a01b031681565b6101e661035a366004612560565b610bb4565b6101e661036d366004612528565b610c28565b6065546001600160a01b03166102ae565b6101e66103913660046124c3565b610cb1565b6101e66103a4366004612560565b610da1565b609a546102ae906001600160a01b031681565b6101e66103ca36600461248b565b61121c565b6101e66103dd36600461248b565b6112b2565b6101e66103f03660046125d1565b6113c5565b6101e6610403366004612560565b611516565b61023a610416366004612560565b60986020526000908152604090205460ff1681565b6101e6610439366004612590565b61178e565b6101e661044c36600461248b565b6117e1565b6101e661045f366004612560565b611901565b6065546001600160a01b031633146104b15760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064015b60405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b1580156104f357600080fd5b505afa158015610507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052b9190612578565b90506105416001600160a01b0383163383611996565b5050565b6065546001600160a01b0316331461058d5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6000609d84815481106105b057634e487b7160e01b600052603260045260246000fd5b60009182526020918290206002909102016001810180546001600160a01b0387811674ffffffffffffffffffffffffffffffffffffffffff1983168117600160a01b89151502179093556040805191909216808252948101929092529193507f466bf064fd123a99d87cf265d40a3335a650757a2a5ece87ce6f888419f56d32910160405180910390a15050505050565b3360009081526097602052604090205460ff166106a05760405162461bcd60e51b815260206004820152600b60248201527f43616e277420706175736500000000000000000000000000000000000000000060448201526064016104a8565b600081815260986020908152604091829020805460ff191660019081179091558251848152918201527f77f1fcfcce67dc392d64f842056d2ec06c80986c47c910f7e79c5b23a2738d7491015b60405180910390a150565b60995461010090046001600160a01b031633146107575760405162461bcd60e51b815260206004820152601860248201527f46656552656365697665723a206e6f7420666163746f7279000000000000000060448201526064016104a8565b609a546040517f87a6753f000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b03909116906387a6753f90602401600060405180830381600087803b1580156107b657600080fd5b505af11580156107ca573d6000803e3d6000fd5b5050609e546001600160a01b0316159150610859905057609e546040517ff0f2a4d7000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f0f2a4d790602401600060405180830381600087803b15801561084057600080fd5b505af1158015610854573d6000803e3d6000fd5b505050505b50565b6065546001600160a01b031633146108a45760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6001600160a01b038216600081815260976020908152604091829020805460ff19168515159081179091558251938452908301527fd0b6b573d5442f7c29fd50d9735ae341581c25c6ed07748d50eda519f1ffa88a910160405180910390a15050565b6065546001600160a01b0316331461094f5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6001600160a01b0381166109a55760405162461bcd60e51b815260206004820152601760248201527f4c505374616b696e6720213d206164647265737328302900000000000000000060448201526064016104a8565b609a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f4de1363210f44b38c4e5a2ccac49005c6fc0041f1ead7de1bbc6fd23735a4fdc906020016106ed565b609d8181548110610a0357600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b03811690600160a01b900460ff1683565b6065546001600160a01b03163314610a7e5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6001600160a01b038116610ad45760405162461bcd60e51b815260206004820152601660248201527f547265617375727920213d20616464726573732830290000000000000000000060448201526064016104a8565b609b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f30d36c1dd67e2019526263df539f65050c3b537a6acf65766b5da7de7128cf36906020016106ed565b6065546001600160a01b03163314610b6a5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60008181526098602052604090205460ff161580610bdc57506065546001600160a01b031633145b6108595760405162461bcd60e51b815260206004820152600660248201527f506175736564000000000000000000000000000000000000000000000000000060448201526064016104a8565b6065546001600160a01b03163314610c705760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6099805460ff19168215159081179091556040519081527fb008f183388020de01fd4365e295aa904b691f98e63fd033f74f75273b6b285f906020016106ed565b600054610100900460ff1680610cca575060005460ff16155b610d2d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff16158015610d4f576000805461ffff19166101011790555b610d57611a3f565b610d6082610a36565b610d6983610907565b609a54610d8a90670b1a2bc2ec500000906001600160a01b03166001611af9565b8015610d9c576000805461ff00191690555b505050565b60026001541415610df45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104a8565b600260015560995461010090046001600160a01b0316610e1357600080fd5b6099546040517f81a36fb60000000000000000000000000000000000000000000000000000000081526004810183905260009161010090046001600160a01b0316906381a36fb69060240160206040518083038186803b158015610e7657600080fd5b505afa158015610e8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eae91906124a7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015610ef357600080fd5b505afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190612578565b60995490915060ff1680610f3f5750609c54155b15610f6557609b54610f5e906001600160a01b03848116911683611996565b5050611215565b609d546000805b82811015611170576000609d8281548110610f9757634e487b7160e01b600052603260045260246000fd5b600091825260208083206040805160608101825260029490940290910180548085526001909101546001600160a01b03811693850193909352600160a01b90920460ff16151590830152609c54919350610ff19088612679565b610ffb9190612659565b6110059085612641565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038916906370a082319060240160206040518083038186803b15801561104a57600080fd5b505afa15801561105e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110829190612578565b90508082116110915781611093565b805b915060006110a3848b8b86611c17565b905080611156576020840151604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201526000918b169063dd62ed3e9060440160206040518083038186803b1580156110f957600080fd5b505afa15801561110d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111319190612578565b602086015190915061114f906001600160a01b038c16906000611dcf565b955061115b565b600095505b5050505080611169906126db565b9050610f6c565b508015611210576040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f19190612578565b609b5490915061120e906001600160a01b03878116911683611996565b505b505050505b5060018055565b6065546001600160a01b031633146112645760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b609e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e74da1326dcd8931bd9213a2f7ecf361c7008ccad60543e78b5cd50ca6e556a906020016106ed565b6065546001600160a01b031633146112fa5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b60995461010090046001600160a01b0316156113585760405162461bcd60e51b815260206004820152601d60248201527f6e6674785661756c74466163746f727920697320696d6d757461626c6500000060448201526064016104a8565b609980547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b038416908102919091179091556040519081527f2693263e4020b2649b9bcc9a4b68c471d4ac35c81baa35264c695d647822b1a2906020016106ed565b6065546001600160a01b0316331461140d5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b609d54821061145e5760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a204f7574206f6620626f756e647300000060448201526064016104a8565b6000609d838154811061148157634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154609c60008282546114a79190612698565b9091555050818155609c80548391906000906114c4908490612641565b90915550506001810154604080516001600160a01b039092168252602082018490527fbf9a378b372297e179e435cdca3b5215960b36e3489288832cbdc7f323ff987d910160405180910390a1505050565b6065546001600160a01b0316331461155e5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b609d548082106115b05760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a204f7574206f6620626f756e647300000060448201526064016104a8565b7fef79c7490a6b7ae3d254565a3bdf2a58d73afe9877306e1c74121209a5527021609d83815481106115f257634e487b7160e01b600052603260045260246000fd5b6000918252602091829020600290910201600101546040516001600160a01b0390911681520160405180910390a1609d828154811061164157634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160000154609c60008282546116649190612698565b90915550609d9050611677600183612698565b8154811061169557634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201609d83815481106116c457634e487b7160e01b600052603260045260246000fd5b600091825260209091208254600290920201908155600191820180549290910180546001600160a01b031981166001600160a01b039094169384178255915460ff600160a01b918290041615150274ffffffffffffffffffffffffffffffffffffffffff19909216909217179055609d80548061175157634e487b7160e01b600052603160045260246000fd5b600082815260208120600260001990930192830201908155600101805474ffffffffffffffffffffffffffffffffffffffffff1916905590555050565b6065546001600160a01b031633146117d65760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b610d9c838383611af9565b6065546001600160a01b031633146118295760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6001600160a01b0381166118a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104a8565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031633146119495760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6000818152609860209081526040808320805460ff191690558051848152918201929092527f77f1fcfcce67dc392d64f842056d2ec06c80986c47c910f7e79c5b23a2738d7491016106ed565b6040516001600160a01b038316602482015260448101829052610d9c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611efa565b600054610100900460ff1680611a58575060005460ff16155b611abb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff16158015611add576000805461ffff19166101011790555b611ae5611fdf565b8015610859576000805461ff001916905550565b604080516060810182528481526001600160a01b0384811660208301908152841515938301938452609d8054600181018255600091825284517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7b60029092029182015591517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7c909201805495519290931674ffffffffffffffffffffffffffffffffffffffffff1990951694909417600160a01b91151591909102179055609c805491928692611bca908490612641565b9091555050604080516001600160a01b0385168152602081018690527f555ceefe9e17f4ae5f15e17c385a8eb55c46bddb25897aeabadcda1815dd5a75910160405180910390a150505050565b6000846040015115611da9576020850151611c3d906001600160a01b038516908461208d565b604080516024810186905260448082018590528251808303909101815260649091018252602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff36d52da00000000000000000000000000000000000000000000000000000000179052870151915190916000916001600160a01b0390911690611ccb9084906125f2565b6000604051808303816000865af19150503d8060008114611d08576040519150601f19603f3d011682016040523d82523d6000602084013e611d0d565b606091505b50509050808015611da057506020870151604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201529086169063dd62ed3e9060440160206040518083038186803b158015611d6657600080fd5b505afa158015611d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9e9190612578565b155b92505050611dc7565b6020850151611dc3906001600160a01b0385169084611996565b5060015b949350505050565b801580611e585750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015611e1e57600080fd5b505afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e569190612578565b155b611eca5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016104a8565b6040516001600160a01b038316602482015260448101829052610d9c90849063095ea7b360e01b906064016119db565b6000611f4f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121549092919063ffffffff16565b805190915015610d9c5780806020019051810190611f6d9190612544565b610d9c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016104a8565b600054610100900460ff1680611ff8575060005460ff16155b61205b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff1615801561207d576000805461ffff19166101011790555b61208561216d565b611ae561221e565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156120d957600080fd5b505afa1580156120ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121119190612578565b61211b9190612641565b6040516001600160a01b03851660248201526044810182905290915061214e90859063095ea7b360e01b906064016119db565b50505050565b60606121638484600085612313565b90505b9392505050565b600054610100900460ff1680612186575060005460ff16155b6121e95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff16158015611ae5576000805461ffff19166101011790558015610859576000805461ff001916905550565b600054610100900460ff1680612237575060005460ff16155b61229a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff161580156122bc576000805461ffff19166101011790555b606580546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610859576000805461ff001916905550565b60608247101561238b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016104a8565b843b6123d95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104a8565b600080866001600160a01b031685876040516123f591906125f2565b60006040518083038185875af1925050503d8060008114612432576040519150601f19603f3d011682016040523d82523d6000602084013e612437565b606091505b5091509150612447828286612452565b979650505050505050565b60608315612461575081612166565b8251156124715782518084602001fd5b8160405162461bcd60e51b81526004016104a8919061260e565b60006020828403121561249c578081fd5b81356121668161270c565b6000602082840312156124b8578081fd5b81516121668161270c565b600080604083850312156124d5578081fd5b82356124e08161270c565b915060208301356124f08161270c565b809150509250929050565b6000806040838503121561250d578182fd5b82356125188161270c565b915060208301356124f081612721565b600060208284031215612539578081fd5b813561216681612721565b600060208284031215612555578081fd5b815161216681612721565b600060208284031215612571578081fd5b5035919050565b600060208284031215612589578081fd5b5051919050565b6000806000606084860312156125a4578081fd5b8335925060208401356125b68161270c565b915060408401356125c681612721565b809150509250925092565b600080604083850312156125e3578182fd5b50508035926020909101359150565b600082516126048184602087016126af565b9190910192915050565b602081526000825180602084015261262d8160408501602087016126af565b601f01601f19169190910160400192915050565b60008219821115612654576126546126f6565b500190565b60008261267457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612693576126936126f6565b500290565b6000828210156126aa576126aa6126f6565b500390565b60005b838110156126ca5781810151838201526020016126b2565b8381111561214e5750506000910152565b60006000198214156126ef576126ef6126f6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461085957600080fd5b801515811461085957600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212203fe9ff3b45bfd982d8c6a146f9b6993270a272d42b5df19c1ea1e7d6eb568a0964736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ce5760003560e01c806374a1b0b011610104578063a534cbbd116100a2578063bdf2a43c11610071578063bdf2a43c14610408578063d46307dc1461042b578063f2fde38b1461043e578063fabc1cbc1461045157600080fd5b8063a534cbbd146103bc578063a77abced146103cf578063aa463065146103e2578063af056847146103f557600080fd5b80638da5cb5b116100de5780638da5cb5b14610372578063915c5baf1461038357806391c05b0b146103965780639bf1401c146103a957600080fd5b806374a1b0b0146103395780637c77b6161461034c5780638c0fd23d1461035f57600080fd5b806336d4d031116101715780635b3817601161014b5780635b381760146102d357806361d027b31461030b5780636605bfda1461031e578063715018a61461033157600080fd5b806336d4d031146102835780633801daf1146102965780634912300d146102c657600080fd5b80630c68ba21116101ad5780630c68ba2114610217578063136439dd1461024a57806319d3d2a41461025d57806323845fb51461027057600080fd5b8062ae3bf8146101d357806303220d02146101e857806308131951146101fb575b600080fd5b6101e66101e136600461248b565b610464565b005b6101e66101f6366004612590565b610545565b610204609c5481565b6040519081526020015b60405180910390f35b61023a61022536600461248b565b60976020526000908152604090205460ff1681565b604051901515815260200161020e565b6101e6610258366004612560565b610641565b6101e661026b366004612560565b6106f8565b6101e661027e3660046124fb565b61085c565b6101e661029136600461248b565b610907565b6099546102ae9061010090046001600160a01b031681565b6040516001600160a01b03909116815260200161020e565b60995461023a9060ff1681565b6102e66102e1366004612560565b6109f3565b604080519384526001600160a01b03909216602084015215159082015260600161020e565b609b546102ae906001600160a01b031681565b6101e661032c36600461248b565b610a36565b6101e6610b22565b609e546102ae906001600160a01b031681565b6101e661035a366004612560565b610bb4565b6101e661036d366004612528565b610c28565b6065546001600160a01b03166102ae565b6101e66103913660046124c3565b610cb1565b6101e66103a4366004612560565b610da1565b609a546102ae906001600160a01b031681565b6101e66103ca36600461248b565b61121c565b6101e66103dd36600461248b565b6112b2565b6101e66103f03660046125d1565b6113c5565b6101e6610403366004612560565b611516565b61023a610416366004612560565b60986020526000908152604090205460ff1681565b6101e6610439366004612590565b61178e565b6101e661044c36600461248b565b6117e1565b6101e661045f366004612560565b611901565b6065546001600160a01b031633146104b15760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064015b60405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b1580156104f357600080fd5b505afa158015610507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052b9190612578565b90506105416001600160a01b0383163383611996565b5050565b6065546001600160a01b0316331461058d5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6000609d84815481106105b057634e487b7160e01b600052603260045260246000fd5b60009182526020918290206002909102016001810180546001600160a01b0387811674ffffffffffffffffffffffffffffffffffffffffff1983168117600160a01b89151502179093556040805191909216808252948101929092529193507f466bf064fd123a99d87cf265d40a3335a650757a2a5ece87ce6f888419f56d32910160405180910390a15050505050565b3360009081526097602052604090205460ff166106a05760405162461bcd60e51b815260206004820152600b60248201527f43616e277420706175736500000000000000000000000000000000000000000060448201526064016104a8565b600081815260986020908152604091829020805460ff191660019081179091558251848152918201527f77f1fcfcce67dc392d64f842056d2ec06c80986c47c910f7e79c5b23a2738d7491015b60405180910390a150565b60995461010090046001600160a01b031633146107575760405162461bcd60e51b815260206004820152601860248201527f46656552656365697665723a206e6f7420666163746f7279000000000000000060448201526064016104a8565b609a546040517f87a6753f000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b03909116906387a6753f90602401600060405180830381600087803b1580156107b657600080fd5b505af11580156107ca573d6000803e3d6000fd5b5050609e546001600160a01b0316159150610859905057609e546040517ff0f2a4d7000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f0f2a4d790602401600060405180830381600087803b15801561084057600080fd5b505af1158015610854573d6000803e3d6000fd5b505050505b50565b6065546001600160a01b031633146108a45760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6001600160a01b038216600081815260976020908152604091829020805460ff19168515159081179091558251938452908301527fd0b6b573d5442f7c29fd50d9735ae341581c25c6ed07748d50eda519f1ffa88a910160405180910390a15050565b6065546001600160a01b0316331461094f5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6001600160a01b0381166109a55760405162461bcd60e51b815260206004820152601760248201527f4c505374616b696e6720213d206164647265737328302900000000000000000060448201526064016104a8565b609a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f4de1363210f44b38c4e5a2ccac49005c6fc0041f1ead7de1bbc6fd23735a4fdc906020016106ed565b609d8181548110610a0357600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b03811690600160a01b900460ff1683565b6065546001600160a01b03163314610a7e5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6001600160a01b038116610ad45760405162461bcd60e51b815260206004820152601660248201527f547265617375727920213d20616464726573732830290000000000000000000060448201526064016104a8565b609b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f30d36c1dd67e2019526263df539f65050c3b537a6acf65766b5da7de7128cf36906020016106ed565b6065546001600160a01b03163314610b6a5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60008181526098602052604090205460ff161580610bdc57506065546001600160a01b031633145b6108595760405162461bcd60e51b815260206004820152600660248201527f506175736564000000000000000000000000000000000000000000000000000060448201526064016104a8565b6065546001600160a01b03163314610c705760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6099805460ff19168215159081179091556040519081527fb008f183388020de01fd4365e295aa904b691f98e63fd033f74f75273b6b285f906020016106ed565b600054610100900460ff1680610cca575060005460ff16155b610d2d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff16158015610d4f576000805461ffff19166101011790555b610d57611a3f565b610d6082610a36565b610d6983610907565b609a54610d8a90670b1a2bc2ec500000906001600160a01b03166001611af9565b8015610d9c576000805461ff00191690555b505050565b60026001541415610df45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104a8565b600260015560995461010090046001600160a01b0316610e1357600080fd5b6099546040517f81a36fb60000000000000000000000000000000000000000000000000000000081526004810183905260009161010090046001600160a01b0316906381a36fb69060240160206040518083038186803b158015610e7657600080fd5b505afa158015610e8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eae91906124a7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015610ef357600080fd5b505afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190612578565b60995490915060ff1680610f3f5750609c54155b15610f6557609b54610f5e906001600160a01b03848116911683611996565b5050611215565b609d546000805b82811015611170576000609d8281548110610f9757634e487b7160e01b600052603260045260246000fd5b600091825260208083206040805160608101825260029490940290910180548085526001909101546001600160a01b03811693850193909352600160a01b90920460ff16151590830152609c54919350610ff19088612679565b610ffb9190612659565b6110059085612641565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038916906370a082319060240160206040518083038186803b15801561104a57600080fd5b505afa15801561105e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110829190612578565b90508082116110915781611093565b805b915060006110a3848b8b86611c17565b905080611156576020840151604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201526000918b169063dd62ed3e9060440160206040518083038186803b1580156110f957600080fd5b505afa15801561110d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111319190612578565b602086015190915061114f906001600160a01b038c16906000611dcf565b955061115b565b600095505b5050505080611169906126db565b9050610f6c565b508015611210576040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f19190612578565b609b5490915061120e906001600160a01b03878116911683611996565b505b505050505b5060018055565b6065546001600160a01b031633146112645760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b609e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e74da1326dcd8931bd9213a2f7ecf361c7008ccad60543e78b5cd50ca6e556a906020016106ed565b6065546001600160a01b031633146112fa5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b60995461010090046001600160a01b0316156113585760405162461bcd60e51b815260206004820152601d60248201527f6e6674785661756c74466163746f727920697320696d6d757461626c6500000060448201526064016104a8565b609980547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b038416908102919091179091556040519081527f2693263e4020b2649b9bcc9a4b68c471d4ac35c81baa35264c695d647822b1a2906020016106ed565b6065546001600160a01b0316331461140d5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b609d54821061145e5760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a204f7574206f6620626f756e647300000060448201526064016104a8565b6000609d838154811061148157634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154609c60008282546114a79190612698565b9091555050818155609c80548391906000906114c4908490612641565b90915550506001810154604080516001600160a01b039092168252602082018490527fbf9a378b372297e179e435cdca3b5215960b36e3489288832cbdc7f323ff987d910160405180910390a1505050565b6065546001600160a01b0316331461155e5760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b609d548082106115b05760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a204f7574206f6620626f756e647300000060448201526064016104a8565b7fef79c7490a6b7ae3d254565a3bdf2a58d73afe9877306e1c74121209a5527021609d83815481106115f257634e487b7160e01b600052603260045260246000fd5b6000918252602091829020600290910201600101546040516001600160a01b0390911681520160405180910390a1609d828154811061164157634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160000154609c60008282546116649190612698565b90915550609d9050611677600183612698565b8154811061169557634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201609d83815481106116c457634e487b7160e01b600052603260045260246000fd5b600091825260209091208254600290920201908155600191820180549290910180546001600160a01b031981166001600160a01b039094169384178255915460ff600160a01b918290041615150274ffffffffffffffffffffffffffffffffffffffffff19909216909217179055609d80548061175157634e487b7160e01b600052603160045260246000fd5b600082815260208120600260001990930192830201908155600101805474ffffffffffffffffffffffffffffffffffffffffff1916905590555050565b6065546001600160a01b031633146117d65760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b610d9c838383611af9565b6065546001600160a01b031633146118295760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6001600160a01b0381166118a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104a8565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031633146119495760405162461bcd60e51b8152602060048201819052602482015260008051602061273083398151915260448201526064016104a8565b6000818152609860209081526040808320805460ff191690558051848152918201929092527f77f1fcfcce67dc392d64f842056d2ec06c80986c47c910f7e79c5b23a2738d7491016106ed565b6040516001600160a01b038316602482015260448101829052610d9c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611efa565b600054610100900460ff1680611a58575060005460ff16155b611abb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff16158015611add576000805461ffff19166101011790555b611ae5611fdf565b8015610859576000805461ff001916905550565b604080516060810182528481526001600160a01b0384811660208301908152841515938301938452609d8054600181018255600091825284517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7b60029092029182015591517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7c909201805495519290931674ffffffffffffffffffffffffffffffffffffffffff1990951694909417600160a01b91151591909102179055609c805491928692611bca908490612641565b9091555050604080516001600160a01b0385168152602081018690527f555ceefe9e17f4ae5f15e17c385a8eb55c46bddb25897aeabadcda1815dd5a75910160405180910390a150505050565b6000846040015115611da9576020850151611c3d906001600160a01b038516908461208d565b604080516024810186905260448082018590528251808303909101815260649091018252602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff36d52da00000000000000000000000000000000000000000000000000000000179052870151915190916000916001600160a01b0390911690611ccb9084906125f2565b6000604051808303816000865af19150503d8060008114611d08576040519150601f19603f3d011682016040523d82523d6000602084013e611d0d565b606091505b50509050808015611da057506020870151604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201529086169063dd62ed3e9060440160206040518083038186803b158015611d6657600080fd5b505afa158015611d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9e9190612578565b155b92505050611dc7565b6020850151611dc3906001600160a01b0385169084611996565b5060015b949350505050565b801580611e585750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015611e1e57600080fd5b505afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e569190612578565b155b611eca5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016104a8565b6040516001600160a01b038316602482015260448101829052610d9c90849063095ea7b360e01b906064016119db565b6000611f4f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121549092919063ffffffff16565b805190915015610d9c5780806020019051810190611f6d9190612544565b610d9c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016104a8565b600054610100900460ff1680611ff8575060005460ff16155b61205b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff1615801561207d576000805461ffff19166101011790555b61208561216d565b611ae561221e565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156120d957600080fd5b505afa1580156120ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121119190612578565b61211b9190612641565b6040516001600160a01b03851660248201526044810182905290915061214e90859063095ea7b360e01b906064016119db565b50505050565b60606121638484600085612313565b90505b9392505050565b600054610100900460ff1680612186575060005460ff16155b6121e95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff16158015611ae5576000805461ffff19166101011790558015610859576000805461ff001916905550565b600054610100900460ff1680612237575060005460ff16155b61229a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a8565b600054610100900460ff161580156122bc576000805461ffff19166101011790555b606580546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610859576000805461ff001916905550565b60608247101561238b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016104a8565b843b6123d95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104a8565b600080866001600160a01b031685876040516123f591906125f2565b60006040518083038185875af1925050503d8060008114612432576040519150601f19603f3d011682016040523d82523d6000602084013e612437565b606091505b5091509150612447828286612452565b979650505050505050565b60608315612461575081612166565b8251156124715782518084602001fd5b8160405162461bcd60e51b81526004016104a8919061260e565b60006020828403121561249c578081fd5b81356121668161270c565b6000602082840312156124b8578081fd5b81516121668161270c565b600080604083850312156124d5578081fd5b82356124e08161270c565b915060208301356124f08161270c565b809150509250929050565b6000806040838503121561250d578182fd5b82356125188161270c565b915060208301356124f081612721565b600060208284031215612539578081fd5b813561216681612721565b600060208284031215612555578081fd5b815161216681612721565b600060208284031215612571578081fd5b5035919050565b600060208284031215612589578081fd5b5051919050565b6000806000606084860312156125a4578081fd5b8335925060208401356125b68161270c565b915060408401356125c681612721565b809150509250925092565b600080604083850312156125e3578182fd5b50508035926020909101359150565b600082516126048184602087016126af565b9190910192915050565b602081526000825180602084015261262d8160408501602087016126af565b601f01601f19169190910160400192915050565b60008219821115612654576126546126f6565b500190565b60008261267457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612693576126936126f6565b500290565b6000828210156126aa576126aa6126f6565b500390565b60005b838110156126ca5781810151838201526020016126b2565b8381111561214e5750506000910152565b60006000198214156126ef576126ef6126f6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461085957600080fd5b801515811461085957600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212203fe9ff3b45bfd982d8c6a146f9b6993270a272d42b5df19c1ea1e7d6eb568a0964736f6c63430008040033
Deployed Bytecode Sourcemap
42403:8587:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49177:229;;;;;;:::i;:::-;;:::i;:::-;;46953:441;;;;;;:::i;:::-;;:::i;42805:34::-;;;;;;;;;10750:25:1;;;10738:2;10723:18;42805:34:0;;;;;;;;38494:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4601:14:1;;4594:22;4576:41;;4564:2;4549:18;38494:42:0;4531:92:1;38993:184:0;;;;;;:::i;:::-;;:::i;46004:380::-;;;;;;:::i;:::-;;:::i;39185:209::-;;;;;;:::i;:::-;;:::i;48221:237::-;;;;;;:::i;:::-;;:::i;42634:40::-;;;;;;;;-1:-1:-1;;;;;42634:40:0;;;;;;-1:-1:-1;;;;;3423:55:1;;;3405:74;;3393:2;3378:18;42634:40:0;3360:125:1;42595:30:0;;;;;;;;;42846:33;;;;;;:::i;:::-;;:::i;:::-;;;;10982:25:1;;;-1:-1:-1;;;;;11043:55:1;;;11038:2;11023:18;;11016:83;11142:14;11135:22;11115:18;;;11108:50;10970:2;10955:18;42846:33:0;10937:227:1;42721:32:0;;;;;-1:-1:-1;;;;;42721:32:0;;;47984:229;;;;;;:::i;:::-;;:::i;37524:148::-;;;:::i;42888:40::-;;;;;-1:-1:-1;;;;;42888:40:0;;;38693:143;;;;;;:::i;:::-;;:::i;49020:149::-;;;;;;:::i;:::-;;:::i;36873:87::-;36946:6;;-1:-1:-1;;;;;36946:6:0;36873:87;;43484:303;;;;;;:::i;:::-;;:::i;43795:1976::-;;;;;;:::i;:::-;;:::i;42681:33::-;;;;;-1:-1:-1;;;;;42681:33:0;;;48466:240;;;;;;:::i;:::-;;:::i;48714:298::-;;;;;;:::i;:::-;;:::i;46392:553::-;;;;;;:::i;:::-;;:::i;47402:574::-;;;;;;:::i;:::-;;:::i;38543:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45779:217;;;;;;:::i;:::-;;:::i;37827:281::-;;;;;;:::i;:::-;;:::i;38844:141::-;;;;;;:::i;:::-;;:::i;49177:229::-;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;;;;;;;;;49274:52:::1;::::0;-1:-1:-1;;;49274:52:0;;49320:4:::1;49274:52;::::0;::::1;3405:74:1::0;49256:15:0::1;::::0;-1:-1:-1;;;;;49274:37:0;::::1;::::0;::::1;::::0;3378:18:1;;49274:52:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49256:70:::0;-1:-1:-1;49337:61:0::1;-1:-1:-1::0;;;;;49337:40:0;::::1;49378:10;49256:70:::0;49337:40:::1;:61::i;:::-;37164:1;49177:229:::0;:::o;46953:441::-;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;47121:31:::1;47155:12;47168;47155:26;;;;;;-1:-1:-1::0;;;47155:26:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;;47214:20;::::0;::::1;::::0;;-1:-1:-1;;;;;47245:31:0;;::::1;-1:-1:-1::0;;47287:36:0;;;;-1:-1:-1;;;47287:36:0;::::1;;;;::::0;;;47339:47:::1;::::0;;47214:20;;;::::1;3725:34:1::0;;;3775:18;;;3768:43;;;;47155:26:0;;-1:-1:-1;47339:47:0::1;::::0;3637:18:1;47339:47:0::1;;;;;;;37164:1;;46953:441:::0;;;:::o;38993:184::-;39069:10;39058:22;;;;:10;:22;;;;;;;;39050:46;;;;-1:-1:-1;;;39050:46:0;;6310:2:1;39050:46:0;;;6292:21:1;6349:2;6329:18;;;6322:30;6388:13;6368:18;;;6361:41;6419:18;;39050:46:0;6282:161:1;39050:46:0;39107:16;;;;:8;:16;;;;;;;;;:23;;-1:-1:-1;;39107:23:0;39126:4;39107:23;;;;;;39146;;11337:25:1;;;11378:18;;;11371:50;39146:23:0;;11310:18:1;39146:23:0;;;;;;;;38993:184;:::o;46004:380::-;46107:16;;;;;-1:-1:-1;;;;;46107:16:0;46093:10;:30;46085:67;;;;-1:-1:-1;;;46085:67:0;;8182:2:1;46085:67:0;;;8164:21:1;8221:2;8201:18;;;8194:30;8260:26;8240:18;;;8233:54;8304:18;;46085:67:0;8154:174:1;46085:67:0;46178:9;;46163:51;;;;;;;;10750:25:1;;;-1:-1:-1;;;;;46178:9:0;;;;46163:41;;10723:18:1;;46163:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46229:16:0;;-1:-1:-1;;;;;46229:16:0;:30;;-1:-1:-1;46225:151:0;;-1:-1:-1;46225:151:0;46296:16;;46274:102;;;;;;;;10750:25:1;;;-1:-1:-1;;;;;46296:16:0;;;;46274:60;;10723:18:1;;46274:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46225:151;46004:380;:::o;39185:209::-;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;-1:-1:-1;;;;;39308:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;;;;:30;;-1:-1:-1;;39308:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39354:32;;3990:74:1;;;4080:18;;;4073:50;39354:32:0::1;::::0;3963:18:1;39354:32:0::1;;;;;;;39185:209:::0;;:::o;48221:237::-;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;-1:-1:-1;;;;;48315:24:0;::::1;48307:60;;;::::0;-1:-1:-1;;;48307:60:0;;6650:2:1;48307:60:0::1;::::0;::::1;6632:21:1::0;6689:2;6669:18;;;6662:30;6728:25;6708:18;;;6701:53;6771:18;;48307:60:0::1;6622:173:1::0;48307:60:0::1;48378:9;:22:::0;;-1:-1:-1;;;;;;48378:22:0::1;-1:-1:-1::0;;;;;48378:22:0;::::1;::::0;;::::1;::::0;;;48416:34:::1;::::0;3405:74:1;;;48416:34:0::1;::::0;3393:2:1;3378:18;48416:34:0::1;3360:125:1::0;42846:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42846:33:0;;;-1:-1:-1;;;42846:33:0;;;;;:::o;47984:229::-;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;-1:-1:-1;;;;;48076:23:0;::::1;48068:58;;;::::0;-1:-1:-1;;;48068:58:0;;5552:2:1;48068:58:0::1;::::0;::::1;5534:21:1::0;5591:2;5571:18;;;5564:30;5630:24;5610:18;;;5603:52;5672:18;;48068:58:0::1;5524:172:1::0;48068:58:0::1;48137:8;:20:::0;;-1:-1:-1;;;;;;48137:20:0::1;-1:-1:-1::0;;;;;48137:20:0;::::1;::::0;;::::1;::::0;;;48173:32:::1;::::0;3405:74:1;;;48173:32:0::1;::::0;3393:2:1;3378:18;48173:32:0::1;3360:125:1::0;37524:148:0;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;37615:6:::1;::::0;37594:40:::1;::::0;37631:1:::1;::::0;-1:-1:-1;;;;;37615:6:0::1;::::0;37594:40:::1;::::0;37631:1;;37594:40:::1;37645:6;:19:::0;;-1:-1:-1;;;;;;37645:19:0::1;::::0;;37524:148::o;38693:143::-;38776:16;;;;:8;:16;;;;;;;;38775:17;;:42;;-1:-1:-1;36946:6:0;;-1:-1:-1;;;;;36946:6:0;38796:10;:21;38775:42;38767:61;;;;-1:-1:-1;;;38767:61:0;;5218:2:1;38767:61:0;;;5200:21:1;5257:1;5237:18;;;5230:29;5295:8;5275:18;;;5268:36;5321:18;;38767:61:0;5190:155:1;49020:149:0;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;49093:18:::1;:27:::0;;-1:-1:-1;;49093:27:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49136:25:::1;::::0;4576:41:1;;;49136:25:0::1;::::0;4564:2:1;4549:18;49136:25:0::1;4531:92:1::0;43484:303:0;33965:13;;;;;;;;:30;;-1:-1:-1;33983:12:0;;;;33982:13;33965:30;33943:126;;;;-1:-1:-1;;;33943:126:0;;7767:2:1;33943:126:0;;;7749:21:1;7806:2;7786:18;;;7779:30;7845:34;7825:18;;;7818:62;-1:-1:-1;;;7896:18:1;;;7889:44;7950:19;;33943:126:0;7739:236:1;33943:126:0;34082:19;34105:13;;;;;;34104:14;34129:101;;;;34164:13;:20;;-1:-1:-1;;34199:19:0;;;;;34129:101;43627:17:::1;:15;:17::i;:::-;43655:29;43674:9;43655:18;:29::i;:::-;43695:31;43715:10;43695:19;:31::i;:::-;43763:9;::::0;43739:40:::1;::::0;43752:9:::1;::::0;-1:-1:-1;;;;;43763:9:0::1;::::0;43739:12:::1;:40::i;:::-;34260:14:::0;34256:68;;;34307:5;34291:21;;-1:-1:-1;;34291:21:0;;;34256:68;43484:303;;;:::o;43795:1976::-;41173:1;41936:7;;:19;;41928:63;;;;-1:-1:-1;;;41928:63:0;;10023:2:1;41928:63:0;;;10005:21:1;10062:2;10042:18;;;10035:30;10101:33;10081:18;;;10074:61;10152:18;;41928:63:0;9995:181:1;41928:63:0;41173:1;42069:7;:18;43931:16:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;43931:16:0::1;43923:39;;;::::0;::::1;;44008:16;::::0;43990:50:::1;::::0;;;;::::1;::::0;::::1;10750:25:1::0;;;43973:14:0::1;::::0;44008:16:::1;::::0;::::1;-1:-1:-1::0;;;;;44008:16:0::1;::::0;43990:41:::1;::::0;10723:18:1;;43990:50:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44076:74;::::0;-1:-1:-1;;;44076:74:0;;44134:4:::1;44076:74;::::0;::::1;3405::1::0;43973:67:0;;-1:-1:-1;44053:20:0::1;::::0;-1:-1:-1;;;;;44076:35:0;::::1;::::0;::::1;::::0;3378:18:1;;44076:74:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44167:18;::::0;44053:97;;-1:-1:-1;44167:18:0::1;;::::0;:37:::1;;-1:-1:-1::0;44189:10:0::1;::::0;:15;44167:37:::1;44163:153;;;44260:8;::::0;44221:62:::1;::::0;-1:-1:-1;;;;;44221:38:0;;::::1;::::0;44260:8:::1;44270:12:::0;44221:38:::1;:62::i;:::-;44298:7;;;;44163:153;44345:12;:19:::0;44328:14:::1;::::0;44402:1059:::1;44422:6;44418:1;:10;44402:1059;;;44450:31;44484:12;44497:1;44484:15;;;;;;-1:-1:-1::0;;;44484:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;44450:49:::1;::::0;;::::1;::::0;::::1;::::0;;44484:15:::1;::::0;;;::::1;::::0;;::::1;44450:49:::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;44450:49:0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;44450:49:0;;::::1;;;;;::::0;;;;44609:10:::1;::::0;44450:49;;-1:-1:-1;44567:38:0::1;::::0;:12;:38:::1;:::i;:::-;44566:53;;;;:::i;:::-;44537:83;::::0;:8;:83:::1;:::i;:::-;44665:82;::::0;-1:-1:-1;;;44665:82:0;;44727:4:::1;44665:82;::::0;::::1;3405:74:1::0;44514:106:0;;-1:-1:-1;44635:27:0::1;::::0;-1:-1:-1;;;;;44665:35:0;::::1;::::0;::::1;::::0;3378:18:1;;44665:82:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44635:112;;44792:19;44777:12;:34;:105;;44870:12;44777:105;;;44831:19;44777:105;44762:120;;44897:13;44913:144;44948:12;44979:7;45005:6;45030:12;44913:16;:144::i;:::-;44897:160;;45077:8;45072:378;;45220:21;::::0;::::1;::::0;45126:134:::1;::::0;-1:-1:-1;;;45126:134:0;;45192:4:::1;45126:134;::::0;::::1;3725:34:1::0;-1:-1:-1;;;;;3795:15:1;;;3775:18;;;3768:43;45106:17:0::1;::::0;45126:35;::::1;::::0;::::1;::::0;3637:18:1;;45126:134:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45317:21;::::0;::::1;::::0;45106:154;;-1:-1:-1;45279:63:0::1;::::0;-1:-1:-1;;;;;45279:37:0;::::1;::::0;45340:1:::1;45279:37;:63::i;:::-;45372:9:::0;-1:-1:-1;45072:378:0::1;;;45433:1;45422:12;;45072:378;44402:1059;;;;44430:3;;;;:::i;:::-;;;44402:1059;;;-1:-1:-1::0;45477:13:0;;45473:291:::1;;45537:82;::::0;-1:-1:-1;;;45537:82:0;;45599:4:::1;45537:82;::::0;::::1;3405:74:1::0;45507:27:0::1;::::0;-1:-1:-1;;;;;45537:35:0;::::1;::::0;::::1;::::0;3378:18:1;;45537:82:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45691:8;::::0;45507:112;;-1:-1:-1;45634:118:0::1;::::0;-1:-1:-1;;;;;45634:38:0;;::::1;::::0;45691:8:::1;45507:112:::0;45634:38:::1;:118::i;:::-;45473:291;;42100:1;;;;;-1:-1:-1::0;41129:1:0;42248:22;;43795:1976::o;48466:240::-;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;48598:16:::1;:36:::0;;-1:-1:-1;;;;;;48598:36:0::1;-1:-1:-1::0;;;;;48598:36:0;::::1;::::0;;::::1;::::0;;;48650:48:::1;::::0;3405:74:1;;;48650:48:0::1;::::0;3393:2:1;3378:18;48650:48:0::1;3360:125:1::0;48714:298:0;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;48830:16:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;48830:16:0::1;48822:39:::0;48800:118:::1;;;::::0;-1:-1:-1;;;48800:118:0;;8896:2:1;48800:118:0::1;::::0;::::1;8878:21:1::0;8935:2;8915:18;;;8908:30;8974:31;8954:18;;;8947:59;9023:18;;48800:118:0::1;8868:179:1::0;48800:118:0::1;48929:16;:27:::0;;;::::1;;-1:-1:-1::0;;;;;48929:27:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;48972:32:::1;::::0;3405:74:1;;;48972:32:0::1;::::0;3393:2:1;3378:18;48972:32:0::1;3360:125:1::0;46392:553:0;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;46587:12:::1;:19:::0;46572:34;::::1;46550:113;;;::::0;-1:-1:-1;;;46550:113:0;;7409:2:1;46550:113:0::1;::::0;::::1;7391:21:1::0;7448:2;7428:18;;;7421:30;7487:31;7467:18;;;7460:59;7536:18;;46550:113:0::1;7381:179:1::0;46550:113:0::1;46674:31;46708:12;46721;46708:26;;;;;;-1:-1:-1::0;;;46708:26:0::1;;;;;;;;;;;;;;;;;;;46674:60;;46759:11;:22;;;46745:10;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;46792:36:0;;;46839:10:::1;:25:::0;;46817:11;;46839:10;46792:22:::1;::::0;46839:25:::1;::::0;46817:11;;46839:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;46903:20:0::1;::::0;::::1;::::0;46880:57:::1;::::0;;-1:-1:-1;;;;;46903:20:0;;::::1;4308:74:1::0;;4413:2;4398:18;;4391:34;;;46880:57:0::1;::::0;4281:18:1;46880:57:0::1;;;;;;;37164:1;46392:553:::0;;:::o;47402:574::-;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;47556:12:::1;:19:::0;47594:24;;::::1;47586:66;;;::::0;-1:-1:-1;;;47586:66:0;;7409:2:1;47586:66:0::1;::::0;::::1;7391:21:1::0;7448:2;7428:18;;;7421:30;7487:31;7467:18;;;7460:59;7536:18;;47586:66:0::1;7381:179:1::0;47586:66:0::1;47668:54;47686:12;47699;47686:26;;;;;;-1:-1:-1::0;;;47686:26:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;;:35;;::::0;47668:54:::1;::::0;-1:-1:-1;;;;;47686:35:0;;::::1;3405:74:1::0;;3378:18;47668:54:0::1;;;;;;;47747:12;47760;47747:26;;;;;;-1:-1:-1::0;;;47747:26:0::1;;;;;;;;;;;;;;;;;;;:37;;;47733:10;;:51;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;47912:12:0::1;::::0;-1:-1:-1;47925:13:0::1;47937:1;47925:9:::0;:13:::1;:::i;:::-;47912:27;;;;;;-1:-1:-1::0;;;47912:27:0::1;;;;;;;;;;;;;;;;;;;47883:12;47896;47883:26;;;;;;-1:-1:-1::0;;;47883:26:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;:56;;:26:::1;::::0;;::::1;;:56:::0;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;47883:56:0;::::1;-1:-1:-1::0;;;;;47883:56:0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;47883:56:0;;;::::1;;;;;-1:-1:-1::0;;47883:56:0;;;;;;::::1;::::0;;47950:12:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;47950:18:0::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;47950:18:0;;;;;::::1;;::::0;;;::::1;;::::0;;-1:-1:-1;;47950:18:0;;;;;-1:-1:-1;;47402:574:0:o;45779:217::-;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;45939:49:::1;45952:11;45965:9;45976:11;45939:12;:49::i;37827:281::-:0;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;-1:-1:-1;;;;;37930:22:0;::::1;37908:110;;;::::0;-1:-1:-1;;;37908:110:0;;5903:2:1;37908:110:0::1;::::0;::::1;5885:21:1::0;5942:2;5922:18;;;5915:30;5981:34;5961:18;;;5954:62;6052:8;6032:18;;;6025:36;6078:19;;37908:110:0::1;5875:228:1::0;37908:110:0::1;38055:6;::::0;38034:38:::1;::::0;-1:-1:-1;;;;;38034:38:0;;::::1;::::0;38055:6:::1;::::0;38034:38:::1;::::0;38055:6:::1;::::0;38034:38:::1;38083:6;:17:::0;;-1:-1:-1;;;;;;38083:17:0::1;-1:-1:-1::0;;;;;38083:17:0;;;::::1;::::0;;;::::1;::::0;;37827:281::o;38844:141::-;36946:6;;-1:-1:-1;;;;;36946:6:0;35237:10;37093:23;37085:68;;;;-1:-1:-1;;;37085:68:0;;8535:2:1;37085:68:0;;;8517:21:1;;;8554:18;;;8547:30;-1:-1:-1;;;;;;;;;;;8593:18:1;;;8586:62;8665:18;;37085:68:0;8507:182:1;37085:68:0;38932:5:::1;38913:16:::0;;;:8:::1;:16;::::0;;;;;;;:24;;-1:-1:-1;;38913:24:0::1;::::0;;38953;;11337:25:1;;;11378:18;;;11371:50;;;;38953:24:0::1;::::0;11310:18:1;38953:24:0::1;11292:135:1::0;20988:259:0;21170:58;;-1:-1:-1;;;;;4326:55:1;;21170:58:0;;;4308:74:1;4398:18;;;4391:34;;;21116:123:0;;21150:5;;21193:23;;4281:18:1;;21170:58:0;;;;-1:-1:-1;;21170:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21116:19;:123::i;38293:83::-;33965:13;;;;;;;;:30;;-1:-1:-1;33983:12:0;;;;33982:13;33965:30;33943:126;;;;-1:-1:-1;;;33943:126:0;;7767:2:1;33943:126:0;;;7749:21:1;7806:2;7786:18;;;7779:30;7845:34;7825:18;;;7818:62;-1:-1:-1;;;7896:18:1;;;7889:44;7950:19;;33943:126:0;7739:236:1;33943:126:0;34082:19;34105:13;;;;;;34104:14;34129:101;;;;34164:13;:20;;-1:-1:-1;;34199:19:0;;;;;34129:101;38352:16:::1;:14;:16::i;:::-;34260:14:::0;34256:68;;;34307:5;34291:21;;-1:-1:-1;;34291:21:0;;;38293:83;:::o;49414:414::-;49590:98;;;;;;;;;;;-1:-1:-1;;;;;49590:98:0;;;;;;;;;;;;;;;;;;49699:12;:31;;;;;;;-1:-1:-1;49699:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49699:31:0;;;;;;;-1:-1:-1;;;49699:31:0;;;;;;;;;;49741:10;:25;;49590:98;;;;49741:25;;49590:98;;49741:25;:::i;:::-;;;;-1:-1:-1;;49782:38:0;;;-1:-1:-1;;;;;4326:55:1;;4308:74;;4413:2;4398:18;;4391:34;;;49782:38:0;;4281:18:1;49782:38:0;;;;;;;49414:414;;;;:::o;49836:1151::-;50017:4;50038:9;:20;;;50034:946;;;50141:18;;;;50075:130;;-1:-1:-1;;;;;50075:47:0;;;50178:12;50075:47;:130::i;:::-;50245:152;;;;;;11606:25:1;;;11647:18;;;;11640:34;;;50245:152:0;;;;;;;;;;11579:18:1;;;;50245:152:0;;;;;;;;;;50286:38;50245:152;;;50439:18;;;50431:41;;50245:152;;-1:-1:-1;;;;;;;50431:32:0;;;;:41;;50245:152;;50431:41;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50412:60;;;50607:7;:181;;;;-1:-1:-1;50729:18:0;;;;50635:131;;-1:-1:-1;;;50635:131:0;;50701:4;50635:131;;;3725:34:1;-1:-1:-1;;;;;3795:15:1;;;3775:18;;;3768:43;50635:35:0;;;;;;3637:18:1;;50635:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:153;50607:181;50583:205;;;;;;50034:946;50878:18;;;;50821:121;;-1:-1:-1;;;;;50821:38:0;;;50915:12;50821:38;:121::i;:::-;-1:-1:-1;50964:4:0;50034:946;49836:1151;;;;;;:::o;21820:718::-;22249:10;;;22248:62;;-1:-1:-1;22265:39:0;;-1:-1:-1;;;22265:39:0;;22289:4;22265:39;;;3725:34:1;-1:-1:-1;;;;;3795:15:1;;;3775:18;;;3768:43;22265:15:0;;;;;3637:18:1;;22265:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;22248:62;22226:166;;;;-1:-1:-1;;;22226:166:0;;10383:2:1;22226:166:0;;;10365:21:1;10422:2;10402:18;;;10395:30;10461:34;10441:18;;;10434:62;10532:24;10512:18;;;10505:52;10574:19;;22226:166:0;10355:244:1;22226:166:0;22457:62;;-1:-1:-1;;;;;4326:55:1;;22457:62:0;;;4308:74:1;4398:18;;;4391:34;;;22403:127:0;;22437:5;;-1:-1:-1;;;22480:22:0;4281:18:1;;22457:62:0;4263:168:1;24064:885:0;24513:23;24539:106;24581:4;24539:106;;;;;;;;;;;;;;;;;24547:5;-1:-1:-1;;;;;24539:27:0;;;:106;;;;;:::i;:::-;24660:17;;24513:132;;-1:-1:-1;24660:21:0;24656:286;;24833:10;24822:30;;;;;;;;;;;;:::i;:::-;24796:134;;;;-1:-1:-1;;;24796:134:0;;9612:2:1;24796:134:0;;;9594:21:1;9651:2;9631:18;;;9624:30;9690:34;9670:18;;;9663:62;9761:12;9741:18;;;9734:40;9791:19;;24796:134:0;9584:232:1;36459:129:0;33965:13;;;;;;;;:30;;-1:-1:-1;33983:12:0;;;;33982:13;33965:30;33943:126;;;;-1:-1:-1;;;33943:126:0;;7767:2:1;33943:126:0;;;7749:21:1;7806:2;7786:18;;;7779:30;7845:34;7825:18;;;7818:62;-1:-1:-1;;;7896:18:1;;;7889:44;7950:19;;33943:126:0;7739:236:1;33943:126:0;34082:19;34105:13;;;;;;34104:14;34129:101;;;;34164:13;:20;;-1:-1:-1;;34199:19:0;;;;;34129:101;36517:26:::1;:24;:26::i;:::-;36554;:24;:26::i;22546:431::-:0;22711:39;;-1:-1:-1;;;22711:39:0;;22735:4;22711:39;;;3725:34:1;-1:-1:-1;;;;;3795:15:1;;;3775:18;;;3768:43;22688:20:0;;22753:5;;22711:15;;;;;3637:18:1;;22711:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;22823:135;;-1:-1:-1;;;;;4326:55:1;;22823:135:0;;;4308:74:1;4398:18;;;4391:34;;;22688:70:0;;-1:-1:-1;22769:200:0;;22803:5;;-1:-1:-1;;;22864:22:0;4281:18:1;;22823:135:0;4263:168:1;22769:200:0;22546:431;;;;:::o;15441:229::-;15578:12;15610:52;15632:6;15640:4;15646:1;15649:12;15610:21;:52::i;:::-;15603:59;;15441:229;;;;;;:::o;35090:59::-;33965:13;;;;;;;;:30;;-1:-1:-1;33983:12:0;;;;33982:13;33965:30;33943:126;;;;-1:-1:-1;;;33943:126:0;;7767:2:1;33943:126:0;;;7749:21:1;7806:2;7786:18;;;7779:30;7845:34;7825:18;;;7818:62;-1:-1:-1;;;7896:18:1;;;7889:44;7950:19;;33943:126:0;7739:236:1;33943:126:0;34082:19;34105:13;;;;;;34104:14;34129:101;;;;34164:13;:20;;-1:-1:-1;;34199:19:0;;;;;34256:68;;;;34307:5;34291:21;;-1:-1:-1;;34291:21:0;;;35090:59;:::o;36596:196::-;33965:13;;;;;;;;:30;;-1:-1:-1;33983:12:0;;;;33982:13;33965:30;33943:126;;;;-1:-1:-1;;;33943:126:0;;7767:2:1;33943:126:0;;;7749:21:1;7806:2;7786:18;;;7779:30;7845:34;7825:18;;;7818:62;-1:-1:-1;;;7896:18:1;;;7889:44;7950:19;;33943:126:0;7739:236:1;33943:126:0;34082:19;34105:13;;;;;;34104:14;34129:101;;;;34164:13;:20;;-1:-1:-1;;34199:19:0;;;;;34129:101;36707:6:::1;:18:::0;;-1:-1:-1;;;;;;36707:18:0::1;35237:10:::0;36707:18;;::::1;::::0;;;36741:43:::1;::::0;35237:10;;36664:17:::1;::::0;36741:43:::1;::::0;36664:17;;36741:43:::1;34242:1;34260:14:::0;34256:68;;;34307:5;34291:21;;-1:-1:-1;;34291:21:0;;;36596:196;:::o;16657:632::-;16827:12;16899:5;16874:21;:30;;16852:118;;;;-1:-1:-1;;;16852:118:0;;7002:2:1;16852:118:0;;;6984:21:1;7041:2;7021:18;;;7014:30;7080:34;7060:18;;;7053:62;7151:8;7131:18;;;7124:36;7177:19;;16852:118:0;6974:228:1;16852:118:0;12784:20;;16981:60;;;;-1:-1:-1;;;16981:60:0;;9254:2:1;16981:60:0;;;9236:21:1;9293:2;9273:18;;;9266:30;9332:31;9312:18;;;9305:59;9381:18;;16981:60:0;9226:179:1;16981:60:0;17115:12;17129:23;17156:6;-1:-1:-1;;;;;17156:11:0;17175:5;17196:4;17156:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17114:97;;;;17229:52;17247:7;17256:10;17268:12;17229:17;:52::i;:::-;17222:59;16657:632;-1:-1:-1;;;;;;;16657:632:0:o;19580:777::-;19730:12;19759:7;19755:595;;;-1:-1:-1;19790:10:0;19783:17;;19755:595;19904:17;;:21;19900:439;;20167:10;20161:17;20228:15;20215:10;20211:2;20207:19;20200:44;20115:148;20310:12;20303:20;;-1:-1:-1;;;20303:20:0;;;;;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:398::-;610:6;618;671:2;659:9;650:7;646:23;642:32;639:2;;;692:6;684;677:22;639:2;736:9;723:23;755:31;780:5;755:31;:::i;:::-;805:5;-1:-1:-1;862:2:1;847:18;;834:32;875:33;834:32;875:33;:::i;:::-;927:7;917:17;;;629:311;;;;;:::o;945:392::-;1010:6;1018;1071:2;1059:9;1050:7;1046:23;1042:32;1039:2;;;1092:6;1084;1077:22;1039:2;1136:9;1123:23;1155:31;1180:5;1155:31;:::i;:::-;1205:5;-1:-1:-1;1262:2:1;1247:18;;1234:32;1275:30;1234:32;1275:30;:::i;1342:251::-;1398:6;1451:2;1439:9;1430:7;1426:23;1422:32;1419:2;;;1472:6;1464;1457:22;1419:2;1516:9;1503:23;1535:28;1557:5;1535:28;:::i;1598:255::-;1665:6;1718:2;1706:9;1697:7;1693:23;1689:32;1686:2;;;1739:6;1731;1724:22;1686:2;1776:9;1770:16;1795:28;1817:5;1795:28;:::i;1858:190::-;1917:6;1970:2;1958:9;1949:7;1945:23;1941:32;1938:2;;;1991:6;1983;1976:22;1938:2;-1:-1:-1;2019:23:1;;1928:120;-1:-1:-1;1928:120:1:o;2053:194::-;2123:6;2176:2;2164:9;2155:7;2151:23;2147:32;2144:2;;;2197:6;2189;2182:22;2144:2;-1:-1:-1;2225:16:1;;2134:113;-1:-1:-1;2134:113:1:o;2252:460::-;2326:6;2334;2342;2395:2;2383:9;2374:7;2370:23;2366:32;2363:2;;;2416:6;2408;2401:22;2363:2;2457:9;2444:23;2434:33;;2517:2;2506:9;2502:18;2489:32;2530:31;2555:5;2530:31;:::i;:::-;2580:5;-1:-1:-1;2637:2:1;2622:18;;2609:32;2650:30;2609:32;2650:30;:::i;:::-;2699:7;2689:17;;;2353:359;;;;;:::o;2717:258::-;2785:6;2793;2846:2;2834:9;2825:7;2821:23;2817:32;2814:2;;;2867:6;2859;2852:22;2814:2;-1:-1:-1;;2895:23:1;;;2965:2;2950:18;;;2937:32;;-1:-1:-1;2804:171:1:o;2980:274::-;3109:3;3147:6;3141:13;3163:53;3209:6;3204:3;3197:4;3189:6;3185:17;3163:53;:::i;:::-;3232:16;;;;;3117:137;-1:-1:-1;;3117:137:1:o;4628:383::-;4777:2;4766:9;4759:21;4740:4;4809:6;4803:13;4852:6;4847:2;4836:9;4832:18;4825:34;4868:66;4927:6;4922:2;4911:9;4907:18;4902:2;4894:6;4890:15;4868:66;:::i;:::-;4995:2;4974:15;-1:-1:-1;;4970:29:1;4955:45;;;;5002:2;4951:54;;4749:262;-1:-1:-1;;4749:262:1:o;11685:128::-;11725:3;11756:1;11752:6;11749:1;11746:13;11743:2;;;11762:18;;:::i;:::-;-1:-1:-1;11798:9:1;;11733:80::o;11818:274::-;11858:1;11884;11874:2;;-1:-1:-1;;;11916:1:1;11909:88;12020:4;12017:1;12010:15;12048:4;12045:1;12038:15;11874:2;-1:-1:-1;12077:9:1;;11864:228::o;12097:168::-;12137:7;12203:1;12199;12195:6;12191:14;12188:1;12185:21;12180:1;12173:9;12166:17;12162:45;12159:2;;;12210:18;;:::i;:::-;-1:-1:-1;12250:9:1;;12149:116::o;12270:125::-;12310:4;12338:1;12335;12332:8;12329:2;;;12343:18;;:::i;:::-;-1:-1:-1;12380:9:1;;12319:76::o;12400:258::-;12472:1;12482:113;12496:6;12493:1;12490:13;12482:113;;;12572:11;;;12566:18;12553:11;;;12546:39;12518:2;12511:10;12482:113;;;12613:6;12610:1;12607:13;12604:2;;;-1:-1:-1;;12648:1:1;12630:16;;12623:27;12453:205::o;12663:135::-;12702:3;-1:-1:-1;;12723:17:1;;12720:2;;;12743:18;;:::i;:::-;-1:-1:-1;12790:1:1;12779:13;;12710:88::o;12803:184::-;-1:-1:-1;;;12852:1:1;12845:88;12952:4;12949:1;12942:15;12976:4;12973:1;12966:15;12992:154;-1:-1:-1;;;;;13071:5:1;13067:54;13060:5;13057:65;13047:2;;13136:1;13133;13126:12;13151:118;13237:5;13230:13;13223:21;13216:5;13213:32;13203:2;;13259:1;13256;13249:12
Swarm Source
ipfs://3fe9ff3b45bfd982d8c6a146f9b6993270a272d42b5df19c1ea1e7d6eb568a09
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.