Feature Tip: Add private address tag to any address under My Name Tag !
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
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 19681217 | 101 days ago | IN | 0 ETH | 0.03227071 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
stakingManagerV3
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-18 */ // SPDX-License-Identifier: MIT AND Unlicense // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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"); (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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @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 proxied contracts do not make use of 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. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * 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. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.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 onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20PermitUpgradeable { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool); } // File @openzeppelin/contracts-upgradeable/token/ERC20/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.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 AddressUpgradeable for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ 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' 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)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20PermitUpgradeable token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token)); } } // File contracts/stakingManagerV3.sol // Original license: SPDX_License_Identifier: Unlicense pragma solidity 0.8.9; contract stakingManagerV3 is OwnableUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; // Wrappers around ERC20 operations that throw on failure IERC20Upgradeable public stakeToken; // Token to be staked and rewarded address public presaleContract; //presale contract address uint256 public tokensStakedByPresale; //total tokens staked by preSale uint256 public tokensStaked; // Total tokens staked uint256 private lastRewardedBlock; // Last block number the user had their rewards calculated uint256 private accumulatedRewardsPerShare; // Accumulated rewards per share times REWARDS_PRECISION uint256 public rewardTokensPerBlock; // Number of reward tokens minted per block uint256 private constant REWARDS_PRECISION = 1e12; // A big number to perform mul and div operations uint256 public lockedTime; //To lock the tokens in contract for definite time. bool public harvestLock; //To lock the harvest/claim. uint public endBlock; //At this block,the rewards generation will be stopped. uint256 public claimStart; //Users can claim after this time in epoch. // Staking user for a pool struct PoolStaker { uint256 amount; // The tokens quantity the user has staked. uint256 stakedTime; //the time at tokens staked uint256 lastUpdatedBlock; uint256 Harvestedrewards; // The reward tokens quantity the user harvested uint256 rewardDebt; // The amount relative to accumulatedRewardsPerShare the user can't get as reward } // staker address => PoolStaker mapping(address => PoolStaker) public poolStakers; mapping(address => uint) public userLockedRewards; bool resetFlag; mapping(address => bool) public isBlacklisted; // Events event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event HarvestRewards(address indexed user, uint256 amount); /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function __stakingManager_init(address _rewardTokenAddress, address _presale, uint256 _rewardTokensPerBlock, uint _lockTime, uint _endBlock) public initializer { __Ownable_init_unchained(); rewardTokensPerBlock = _rewardTokensPerBlock; stakeToken = IERC20Upgradeable(_rewardTokenAddress); presaleContract = _presale; lockedTime = _lockTime; endBlock = _endBlock; harvestLock = true; } modifier onlyPresale() { require(msg.sender == presaleContract, 'This method is only for presale Contract'); _; } /** * @dev Deposit tokens to the pool */ function deposit(uint256 _amount) external { require(block.number < endBlock, 'staking has been ended'); require(_amount > 0, "Deposit amount can't be zero"); PoolStaker storage staker = poolStakers[msg.sender]; // Update pool stakers harvestRewards(); // Update current staker staker.amount += _amount; staker.rewardDebt = (staker.amount * accumulatedRewardsPerShare) / REWARDS_PRECISION; staker.stakedTime = block.timestamp; staker.lastUpdatedBlock = block.number; // Update pool tokensStaked += _amount; // Deposit tokens emit Deposit(msg.sender, _amount); stakeToken.safeTransferFrom(msg.sender, address(this), _amount); } /** * @dev Deposit tokens to pool by presale contract */ function depositByPresale(address _user, uint256 _amount) external onlyPresale { require(block.number < endBlock, 'staking has been ended'); require(_amount > 0, "Deposit amount can't be zero"); PoolStaker storage staker = poolStakers[_user]; // Update pool stakers _harvestRewards(_user); // Update current staker staker.amount += _amount; staker.rewardDebt = (staker.amount * accumulatedRewardsPerShare) / REWARDS_PRECISION; staker.stakedTime = block.timestamp; // Update pool tokensStaked += _amount; tokensStakedByPresale += _amount; // Deposit tokens emit Deposit(_user, _amount); stakeToken.safeTransferFrom(presaleContract, address(this), _amount); } /** * @dev Withdraw all tokens from existing pool */ function withdraw() external { PoolStaker memory staker = poolStakers[msg.sender]; uint256 amount = staker.amount; require(staker.stakedTime + lockedTime <= block.timestamp && claimStart + lockedTime <= block.timestamp, 'you are not allowed to withdraw before locked Time'); require(amount > 0, "Withdraw amount can't be zero"); // Pay rewards harvestRewards(); //delete staker delete poolStakers[msg.sender]; // Update pool tokensStaked -= amount; // Withdraw tokens emit Withdraw(msg.sender, amount); stakeToken.safeTransfer(msg.sender, amount); } /** * @dev Harvest user rewards */ function harvestRewards() public { _harvestRewards(msg.sender); } /** * @dev Harvest user rewards */ function _harvestRewards(address _user) private { require(!isBlacklisted[_user], 'This Address is Blacklisted'); updatePoolRewards(); PoolStaker storage staker = poolStakers[_user]; uint256 rewardsToHarvest = ((staker.amount * accumulatedRewardsPerShare) / REWARDS_PRECISION) - staker.rewardDebt; if (rewardsToHarvest == 0) { return; } staker.Harvestedrewards += rewardsToHarvest; staker.rewardDebt = (staker.amount * accumulatedRewardsPerShare) / REWARDS_PRECISION; if (!harvestLock) { if (userLockedRewards[_user] > 0) { rewardsToHarvest += userLockedRewards[_user]; userLockedRewards[_user] = 0; } emit HarvestRewards(_user, rewardsToHarvest); stakeToken.safeTransfer(_user, rewardsToHarvest); } else { userLockedRewards[_user] += rewardsToHarvest; } } /** * @dev Update pool's accumulatedRewardsPerShare and lastRewardedBlock */ function updatePoolRewards() private { if (tokensStaked == 0) { lastRewardedBlock = block.number; return; } uint256 blocksSinceLastReward = block.number > endBlock ? endBlock - lastRewardedBlock : block.number - lastRewardedBlock; uint256 rewards = blocksSinceLastReward * rewardTokensPerBlock; accumulatedRewardsPerShare = accumulatedRewardsPerShare + ((rewards * REWARDS_PRECISION) / tokensStaked); lastRewardedBlock = block.number > endBlock ? endBlock : block.number; } /** *@dev To get the number of rewards that user can get */ function getRewards(address _user) public view returns (uint) { if (tokensStaked == 0) { return 0; } uint256 blocksSinceLastReward = block.number > endBlock ? endBlock - lastRewardedBlock : block.number - lastRewardedBlock; uint256 rewards = blocksSinceLastReward * rewardTokensPerBlock; uint256 accCalc = accumulatedRewardsPerShare + ((rewards * REWARDS_PRECISION) / tokensStaked); PoolStaker memory staker = poolStakers[_user]; return ((staker.amount * accCalc) / REWARDS_PRECISION) - staker.rewardDebt + userLockedRewards[_user]; } function setHarvestLock(bool _harvestlock) external onlyOwner { harvestLock = _harvestlock; } function setPresale(address _presale) external onlyOwner { presaleContract = _presale; } function setStakeToken(address _stakeToken) external onlyOwner { stakeToken = IERC20Upgradeable(_stakeToken); } function setLockedTime(uint _time) external onlyOwner { lockedTime = _time; } function setEndBlock(uint _endBlock) external onlyOwner { endBlock = _endBlock; } function setClaimStart(uint _claimStart) external onlyOwner { claimStart = _claimStart; } /** * @dev To add users to blacklist which restricts blacklisted users from claiming * @param _usersToBlacklist addresses of the users */ function blacklistUsers(address[] calldata _usersToBlacklist) external onlyOwner { for (uint256 i = 0; i < _usersToBlacklist.length; i++) { isBlacklisted[_usersToBlacklist[i]] = true; } } /** * @dev To remove users from blacklist which restricts blacklisted users from claiming * @param _userToRemoveFromBlacklist addresses of the users */ function removeFromBlacklist(address[] calldata _userToRemoveFromBlacklist) external onlyOwner { for (uint256 i = 0; i < _userToRemoveFromBlacklist.length; i++) { isBlacklisted[_userToRemoveFromBlacklist[i]] = false; } } function withdrawToken(uint256 _amount) external onlyOwner { stakeToken.safeTransfer(owner(), _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"HarvestRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_rewardTokenAddress","type":"address"},{"internalType":"address","name":"_presale","type":"address"},{"internalType":"uint256","name":"_rewardTokensPerBlock","type":"uint256"},{"internalType":"uint256","name":"_lockTime","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"name":"__stakingManager_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_usersToBlacklist","type":"address[]"}],"name":"blacklistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositByPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolStakers","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stakedTime","type":"uint256"},{"internalType":"uint256","name":"lastUpdatedBlock","type":"uint256"},{"internalType":"uint256","name":"Harvestedrewards","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userToRemoveFromBlacklist","type":"address[]"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardTokensPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStart","type":"uint256"}],"name":"setClaimStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"name":"setEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_harvestlock","type":"bool"}],"name":"setHarvestLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setLockedTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_presale","type":"address"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"setStakeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensStakedByPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLockedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50620000226200002860201b60201c565b620001d2565b600060019054906101000a900460ff16156200007b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000729062000175565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff1614620000ec5760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff604051620000e39190620001b5565b60405180910390a15b565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b60006200015d602783620000ee565b91506200016a82620000ff565b604082019050919050565b6000602082019050818103600083015262000190816200014e565b9050919050565b600060ff82169050919050565b620001af8162000197565b82525050565b6000602082019050620001cc6000830184620001a4565b92915050565b612c5680620001e26000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806391c6196611610104578063c713aa94116100a2578063df1dcaa911610071578063df1dcaa9146104d3578063f04d688f146104ef578063f2fde38b1461050d578063fe575a8714610529576101da565b8063c713aa9414610449578063cddb3e7b14610465578063d0bad4b114610499578063d5fcc7b6146104b7576101da565b8063a8b38205116100de578063a8b38205146103d7578063b0aa1e04146103f5578063b6b55f2514610411578063bb3d676a1461042d576101da565b806391c6196614610381578063979f8d961461039d57806399a03316146103b9576101da565b806351ed6a301161017c5780637d7366aa1161014b5780637d7366aa146102f957806389daf799146103295780638a6876ad146103455780638da5cb5b14610363576101da565b806351ed6a301461028357806363d9df85146102a1578063715018a6146102bf57806379ee54f7146102c9576101da565b80632be11ae2116101b85780632be11ae21461023757806334df99a1146102415780633ccfd60b1461025d57806350baa62214610267576101da565b80630397d458146101df578063083c6323146101fb57806329d0fa3e14610219575b600080fd5b6101f960048036038101906101f49190611de4565b610559565b005b6102036105a5565b6040516102109190611e2a565b60405180910390f35b6102216105ab565b60405161022e9190611e2a565b60405180910390f35b61023f6105b1565b005b61025b60048036038101906102569190611e71565b6105bc565b005b6102656107b1565b005b610281600480360381019061027c9190611eec565b610a16565b005b61028b610a75565b6040516102989190611f78565b60405180910390f35b6102a9610a9b565b6040516102b69190611fa2565b60405180910390f35b6102c7610ac1565b005b6102e360048036038101906102de9190611de4565b610ad5565b6040516102f09190611e2a565b60405180910390f35b610313600480360381019061030e9190611de4565b610c61565b6040516103209190611e2a565b60405180910390f35b610343600480360381019061033e9190612022565b610c79565b005b61034d610d26565b60405161035a9190611e2a565b60405180910390f35b61036b610d2c565b6040516103789190611fa2565b60405180910390f35b61039b6004803603810190610396919061206f565b610d56565b005b6103b760048036038101906103b291906120e7565b610ffd565b005b6103c1611022565b6040516103ce9190611e2a565b60405180910390f35b6103df611028565b6040516103ec9190611e2a565b60405180910390f35b61040f600480360381019061040a9190611eec565b61102e565b005b61042b60048036038101906104269190611eec565b611040565b005b61044760048036038101906104429190612022565b611223565b005b610463600480360381019061045e9190611eec565b6112d0565b005b61047f600480360381019061047a9190611de4565b6112e2565b604051610490959493929190612114565b60405180910390f35b6104a1611318565b6040516104ae9190612176565b60405180910390f35b6104d160048036038101906104cc9190611de4565b61132b565b005b6104ed60048036038101906104e89190611eec565b611377565b005b6104f7611389565b6040516105049190611e2a565b60405180910390f35b61052760048036038101906105229190611de4565b61138f565b005b610543600480360381019061053e9190611de4565b611413565b6040516105509190612176565b60405180910390f35b610561611433565b80606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606e5481565b606b5481565b6105ba336114b1565b565b60008060019054906101000a900460ff161590508080156105ed5750600160008054906101000a900460ff1660ff16105b8061061a57506105fc306117ff565b1580156106195750600160008054906101000a900460ff1660ff16145b5b610659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065090612214565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610696576001600060016101000a81548160ff0219169083151502179055505b61069e611822565b83606b8190555085606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082606c8190555081606e819055506001606d60006101000a81548160ff02191690831515021790555080156107a95760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516107a0919061227c565b60405180910390a15b505050505050565b6000607060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905060008160000151905042606c54836020015161084d91906122c6565b1115801561086a575042606c54606f5461086791906122c6565b11155b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a09061238e565b60405180910390fd5b600081116108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e3906123fa565b60405180910390fd5b6108f46105b1565b607060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160009055600482016000905550508060686000828254610970919061241a565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516109bd9190611e2a565b60405180910390a2610a123382606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118839092919063ffffffff16565b5050565b610a1e611433565b610a72610a29610d2c565b82606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118839092919063ffffffff16565b50565b606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ac9611433565b610ad36000611909565b565b6000806068541415610aea5760009050610c5c565b6000606e544311610b085760695443610b03919061241a565b610b19565b606954606e54610b18919061241a565b5b90506000606b5482610b2b919061244e565b9050600060685464e8d4a5100083610b43919061244e565b610b4d91906124d7565b606a54610b5a91906122c6565b90506000607060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050607160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816080015164e8d4a51000848460000151610c37919061244e565b610c4191906124d7565b610c4b919061241a565b610c5591906122c6565b9450505050505b919050565b60716020528060005260406000206000915090505481565b610c81611433565b60005b82829050811015610d2157600060736000858585818110610ca857610ca7612508565b5b9050602002016020810190610cbd9190611de4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d1990612537565b915050610c84565b505050565b60675481565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd906125f2565b60405180910390fd5b606e544310610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e219061265e565b60405180910390fd5b60008111610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e64906126ca565b60405180910390fd5b6000607060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610eb9836114b1565b81816000016000828254610ecd91906122c6565b9250508190555064e8d4a51000606a548260000154610eec919061244e565b610ef691906124d7565b81600401819055504281600101819055508160686000828254610f1991906122c6565b925050819055508160676000828254610f3291906122c6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c83604051610f7f9190611e2a565b60405180910390a2610ff8606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163084606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166119cf909392919063ffffffff16565b505050565b611005611433565b80606d60006101000a81548160ff02191690831515021790555050565b60685481565b606c5481565b611036611433565b80606f8190555050565b606e544310611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b9061265e565b60405180910390fd5b600081116110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be906126ca565b60405180910390fd5b6000607060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506111126105b1565b8181600001600082825461112691906122c6565b9250508190555064e8d4a51000606a548260000154611145919061244e565b61114f91906124d7565b8160040181905550428160010181905550438160020181905550816068600082825461117b91906122c6565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c836040516111c89190611e2a565b60405180910390a261121f333084606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166119cf909392919063ffffffff16565b5050565b61122b611433565b60005b828290508110156112cb5760016073600085858581811061125257611251612508565b5b90506020020160208101906112679190611de4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806112c390612537565b91505061122e565b505050565b6112d8611433565b80606e8190555050565b60706020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b606d60009054906101000a900460ff1681565b611333611433565b80606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61137f611433565b80606c8190555050565b606f5481565b611397611433565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe9061275c565b60405180910390fd5b61141081611909565b50565b60736020528060005260406000206000915054906101000a900460ff1681565b61143b611a58565b73ffffffffffffffffffffffffffffffffffffffff16611459610d2c565b73ffffffffffffffffffffffffffffffffffffffff16146114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906127c8565b60405180910390fd5b565b607360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590612834565b60405180910390fd5b611546611a60565b6000607060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816004015464e8d4a51000606a5484600001546115a8919061244e565b6115b291906124d7565b6115bc919061241a565b905060008114156115ce5750506117fc565b808260030160008282546115e291906122c6565b9250508190555064e8d4a51000606a548360000154611601919061244e565b61160b91906124d7565b8260040181905550606d60009054906101000a900460ff166117a2576000607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561170257607160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816116ba91906122c6565b90506000607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8273ffffffffffffffffffffffffffffffffffffffff167fdaaebb9609cb2f719c59c9d334be287bf4def107ad3dec4a6f90d8abaa94c73c826040516117489190611e2a565b60405180910390a261179d8382606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118839092919063ffffffff16565b6117f9565b80607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f191906122c6565b925050819055505b50505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611868906128c6565b60405180910390fd5b61188161187c611a58565b611909565b565b6119048363a9059cbb60e01b84846040516024016118a29291906128e6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b09565b505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611a52846323b872dd60e01b8585856040516024016119f09392919061290f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b09565b50505050565b600033905090565b60006068541415611a775743606981905550611b07565b6000606e544311611a955760695443611a90919061241a565b611aa6565b606954606e54611aa5919061241a565b5b90506000606b5482611ab8919061244e565b905060685464e8d4a5100082611ace919061244e565b611ad891906124d7565b606a54611ae591906122c6565b606a81905550606e544311611afa5743611afe565b606e545b60698190555050505b565b6000611b6b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611bd19092919063ffffffff16565b9050600081511480611b8d575080806020019051810190611b8c919061295b565b5b611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc3906129fa565b60405180910390fd5b505050565b6060611be08484600085611be9565b90509392505050565b606082471015611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590612a8c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c579190612b26565b60006040518083038185875af1925050503d8060008114611c94576040519150601f19603f3d011682016040523d82523d6000602084013e611c99565b606091505b5091509150611caa87838387611cb6565b92505050949350505050565b60608315611d1957600083511415611d1157611cd1856117ff565b611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790612b89565b60405180910390fd5b5b829050611d24565b611d238383611d2c565b5b949350505050565b600082511115611d3f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d739190612bfe565b60405180910390fd5b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611db182611d86565b9050919050565b611dc181611da6565b8114611dcc57600080fd5b50565b600081359050611dde81611db8565b92915050565b600060208284031215611dfa57611df9611d7c565b5b6000611e0884828501611dcf565b91505092915050565b6000819050919050565b611e2481611e11565b82525050565b6000602082019050611e3f6000830184611e1b565b92915050565b611e4e81611e11565b8114611e5957600080fd5b50565b600081359050611e6b81611e45565b92915050565b600080600080600060a08688031215611e8d57611e8c611d7c565b5b6000611e9b88828901611dcf565b9550506020611eac88828901611dcf565b9450506040611ebd88828901611e5c565b9350506060611ece88828901611e5c565b9250506080611edf88828901611e5c565b9150509295509295909350565b600060208284031215611f0257611f01611d7c565b5b6000611f1084828501611e5c565b91505092915050565b6000819050919050565b6000611f3e611f39611f3484611d86565b611f19565b611d86565b9050919050565b6000611f5082611f23565b9050919050565b6000611f6282611f45565b9050919050565b611f7281611f57565b82525050565b6000602082019050611f8d6000830184611f69565b92915050565b611f9c81611da6565b82525050565b6000602082019050611fb76000830184611f93565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611fe257611fe1611fbd565b5b8235905067ffffffffffffffff811115611fff57611ffe611fc2565b5b60208301915083602082028301111561201b5761201a611fc7565b5b9250929050565b6000806020838503121561203957612038611d7c565b5b600083013567ffffffffffffffff81111561205757612056611d81565b5b61206385828601611fcc565b92509250509250929050565b6000806040838503121561208657612085611d7c565b5b600061209485828601611dcf565b92505060206120a585828601611e5c565b9150509250929050565b60008115159050919050565b6120c4816120af565b81146120cf57600080fd5b50565b6000813590506120e1816120bb565b92915050565b6000602082840312156120fd576120fc611d7c565b5b600061210b848285016120d2565b91505092915050565b600060a0820190506121296000830188611e1b565b6121366020830187611e1b565b6121436040830186611e1b565b6121506060830185611e1b565b61215d6080830184611e1b565b9695505050505050565b612170816120af565b82525050565b600060208201905061218b6000830184612167565b92915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006121fe602e83612191565b9150612209826121a2565b604082019050919050565b6000602082019050818103600083015261222d816121f1565b9050919050565b6000819050919050565b600060ff82169050919050565b600061226661226161225c84612234565b611f19565b61223e565b9050919050565b6122768161224b565b82525050565b6000602082019050612291600083018461226d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006122d182611e11565b91506122dc83611e11565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561231157612310612297565b5b828201905092915050565b7f796f7520617265206e6f7420616c6c6f77656420746f2077697468647261772060008201527f6265666f7265206c6f636b65642054696d650000000000000000000000000000602082015250565b6000612378603283612191565b91506123838261231c565b604082019050919050565b600060208201905081810360008301526123a78161236b565b9050919050565b7f576974686472617720616d6f756e742063616e2774206265207a65726f000000600082015250565b60006123e4601d83612191565b91506123ef826123ae565b602082019050919050565b60006020820190508181036000830152612413816123d7565b9050919050565b600061242582611e11565b915061243083611e11565b92508282101561244357612442612297565b5b828203905092915050565b600061245982611e11565b915061246483611e11565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561249d5761249c612297565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006124e282611e11565b91506124ed83611e11565b9250826124fd576124fc6124a8565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061254282611e11565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561257557612574612297565b5b600182019050919050565b7f54686973206d6574686f64206973206f6e6c7920666f722070726573616c652060008201527f436f6e7472616374000000000000000000000000000000000000000000000000602082015250565b60006125dc602883612191565b91506125e782612580565b604082019050919050565b6000602082019050818103600083015261260b816125cf565b9050919050565b7f7374616b696e6720686173206265656e20656e64656400000000000000000000600082015250565b6000612648601683612191565b915061265382612612565b602082019050919050565b600060208201905081810360008301526126778161263b565b9050919050565b7f4465706f73697420616d6f756e742063616e2774206265207a65726f00000000600082015250565b60006126b4601c83612191565b91506126bf8261267e565b602082019050919050565b600060208201905081810360008301526126e3816126a7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612746602683612191565b9150612751826126ea565b604082019050919050565b6000602082019050818103600083015261277581612739565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006127b2602083612191565b91506127bd8261277c565b602082019050919050565b600060208201905081810360008301526127e1816127a5565b9050919050565b7f54686973204164647265737320697320426c61636b6c69737465640000000000600082015250565b600061281e601b83612191565b9150612829826127e8565b602082019050919050565b6000602082019050818103600083015261284d81612811565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006128b0602b83612191565b91506128bb82612854565b604082019050919050565b600060208201905081810360008301526128df816128a3565b9050919050565b60006040820190506128fb6000830185611f93565b6129086020830184611e1b565b9392505050565b60006060820190506129246000830186611f93565b6129316020830185611f93565b61293e6040830184611e1b565b949350505050565b600081519050612955816120bb565b92915050565b60006020828403121561297157612970611d7c565b5b600061297f84828501612946565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006129e4602a83612191565b91506129ef82612988565b604082019050919050565b60006020820190508181036000830152612a13816129d7565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612a76602683612191565b9150612a8182612a1a565b604082019050919050565b60006020820190508181036000830152612aa581612a69565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612ae0578082015181840152602081019050612ac5565b83811115612aef576000848401525b50505050565b6000612b0082612aac565b612b0a8185612ab7565b9350612b1a818560208601612ac2565b80840191505092915050565b6000612b328284612af5565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612b73601d83612191565b9150612b7e82612b3d565b602082019050919050565b60006020820190508181036000830152612ba281612b66565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b6000612bd082612ba9565b612bda8185612191565b9350612bea818560208601612ac2565b612bf381612bb4565b840191505092915050565b60006020820190508181036000830152612c188184612bc5565b90509291505056fea26469706673582212209e470b527579ede77d40082ea00cad3252499f577be53d7443488f9c6e5f4b0064736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806391c6196611610104578063c713aa94116100a2578063df1dcaa911610071578063df1dcaa9146104d3578063f04d688f146104ef578063f2fde38b1461050d578063fe575a8714610529576101da565b8063c713aa9414610449578063cddb3e7b14610465578063d0bad4b114610499578063d5fcc7b6146104b7576101da565b8063a8b38205116100de578063a8b38205146103d7578063b0aa1e04146103f5578063b6b55f2514610411578063bb3d676a1461042d576101da565b806391c6196614610381578063979f8d961461039d57806399a03316146103b9576101da565b806351ed6a301161017c5780637d7366aa1161014b5780637d7366aa146102f957806389daf799146103295780638a6876ad146103455780638da5cb5b14610363576101da565b806351ed6a301461028357806363d9df85146102a1578063715018a6146102bf57806379ee54f7146102c9576101da565b80632be11ae2116101b85780632be11ae21461023757806334df99a1146102415780633ccfd60b1461025d57806350baa62214610267576101da565b80630397d458146101df578063083c6323146101fb57806329d0fa3e14610219575b600080fd5b6101f960048036038101906101f49190611de4565b610559565b005b6102036105a5565b6040516102109190611e2a565b60405180910390f35b6102216105ab565b60405161022e9190611e2a565b60405180910390f35b61023f6105b1565b005b61025b60048036038101906102569190611e71565b6105bc565b005b6102656107b1565b005b610281600480360381019061027c9190611eec565b610a16565b005b61028b610a75565b6040516102989190611f78565b60405180910390f35b6102a9610a9b565b6040516102b69190611fa2565b60405180910390f35b6102c7610ac1565b005b6102e360048036038101906102de9190611de4565b610ad5565b6040516102f09190611e2a565b60405180910390f35b610313600480360381019061030e9190611de4565b610c61565b6040516103209190611e2a565b60405180910390f35b610343600480360381019061033e9190612022565b610c79565b005b61034d610d26565b60405161035a9190611e2a565b60405180910390f35b61036b610d2c565b6040516103789190611fa2565b60405180910390f35b61039b6004803603810190610396919061206f565b610d56565b005b6103b760048036038101906103b291906120e7565b610ffd565b005b6103c1611022565b6040516103ce9190611e2a565b60405180910390f35b6103df611028565b6040516103ec9190611e2a565b60405180910390f35b61040f600480360381019061040a9190611eec565b61102e565b005b61042b60048036038101906104269190611eec565b611040565b005b61044760048036038101906104429190612022565b611223565b005b610463600480360381019061045e9190611eec565b6112d0565b005b61047f600480360381019061047a9190611de4565b6112e2565b604051610490959493929190612114565b60405180910390f35b6104a1611318565b6040516104ae9190612176565b60405180910390f35b6104d160048036038101906104cc9190611de4565b61132b565b005b6104ed60048036038101906104e89190611eec565b611377565b005b6104f7611389565b6040516105049190611e2a565b60405180910390f35b61052760048036038101906105229190611de4565b61138f565b005b610543600480360381019061053e9190611de4565b611413565b6040516105509190612176565b60405180910390f35b610561611433565b80606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606e5481565b606b5481565b6105ba336114b1565b565b60008060019054906101000a900460ff161590508080156105ed5750600160008054906101000a900460ff1660ff16105b8061061a57506105fc306117ff565b1580156106195750600160008054906101000a900460ff1660ff16145b5b610659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065090612214565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610696576001600060016101000a81548160ff0219169083151502179055505b61069e611822565b83606b8190555085606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082606c8190555081606e819055506001606d60006101000a81548160ff02191690831515021790555080156107a95760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516107a0919061227c565b60405180910390a15b505050505050565b6000607060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905060008160000151905042606c54836020015161084d91906122c6565b1115801561086a575042606c54606f5461086791906122c6565b11155b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a09061238e565b60405180910390fd5b600081116108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e3906123fa565b60405180910390fd5b6108f46105b1565b607060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160009055600482016000905550508060686000828254610970919061241a565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516109bd9190611e2a565b60405180910390a2610a123382606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118839092919063ffffffff16565b5050565b610a1e611433565b610a72610a29610d2c565b82606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118839092919063ffffffff16565b50565b606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ac9611433565b610ad36000611909565b565b6000806068541415610aea5760009050610c5c565b6000606e544311610b085760695443610b03919061241a565b610b19565b606954606e54610b18919061241a565b5b90506000606b5482610b2b919061244e565b9050600060685464e8d4a5100083610b43919061244e565b610b4d91906124d7565b606a54610b5a91906122c6565b90506000607060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050607160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816080015164e8d4a51000848460000151610c37919061244e565b610c4191906124d7565b610c4b919061241a565b610c5591906122c6565b9450505050505b919050565b60716020528060005260406000206000915090505481565b610c81611433565b60005b82829050811015610d2157600060736000858585818110610ca857610ca7612508565b5b9050602002016020810190610cbd9190611de4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d1990612537565b915050610c84565b505050565b60675481565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd906125f2565b60405180910390fd5b606e544310610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e219061265e565b60405180910390fd5b60008111610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e64906126ca565b60405180910390fd5b6000607060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610eb9836114b1565b81816000016000828254610ecd91906122c6565b9250508190555064e8d4a51000606a548260000154610eec919061244e565b610ef691906124d7565b81600401819055504281600101819055508160686000828254610f1991906122c6565b925050819055508160676000828254610f3291906122c6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c83604051610f7f9190611e2a565b60405180910390a2610ff8606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163084606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166119cf909392919063ffffffff16565b505050565b611005611433565b80606d60006101000a81548160ff02191690831515021790555050565b60685481565b606c5481565b611036611433565b80606f8190555050565b606e544310611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b9061265e565b60405180910390fd5b600081116110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be906126ca565b60405180910390fd5b6000607060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506111126105b1565b8181600001600082825461112691906122c6565b9250508190555064e8d4a51000606a548260000154611145919061244e565b61114f91906124d7565b8160040181905550428160010181905550438160020181905550816068600082825461117b91906122c6565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c836040516111c89190611e2a565b60405180910390a261121f333084606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166119cf909392919063ffffffff16565b5050565b61122b611433565b60005b828290508110156112cb5760016073600085858581811061125257611251612508565b5b90506020020160208101906112679190611de4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806112c390612537565b91505061122e565b505050565b6112d8611433565b80606e8190555050565b60706020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b606d60009054906101000a900460ff1681565b611333611433565b80606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61137f611433565b80606c8190555050565b606f5481565b611397611433565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe9061275c565b60405180910390fd5b61141081611909565b50565b60736020528060005260406000206000915054906101000a900460ff1681565b61143b611a58565b73ffffffffffffffffffffffffffffffffffffffff16611459610d2c565b73ffffffffffffffffffffffffffffffffffffffff16146114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906127c8565b60405180910390fd5b565b607360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590612834565b60405180910390fd5b611546611a60565b6000607060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816004015464e8d4a51000606a5484600001546115a8919061244e565b6115b291906124d7565b6115bc919061241a565b905060008114156115ce5750506117fc565b808260030160008282546115e291906122c6565b9250508190555064e8d4a51000606a548360000154611601919061244e565b61160b91906124d7565b8260040181905550606d60009054906101000a900460ff166117a2576000607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561170257607160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816116ba91906122c6565b90506000607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8273ffffffffffffffffffffffffffffffffffffffff167fdaaebb9609cb2f719c59c9d334be287bf4def107ad3dec4a6f90d8abaa94c73c826040516117489190611e2a565b60405180910390a261179d8382606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118839092919063ffffffff16565b6117f9565b80607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f191906122c6565b925050819055505b50505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611868906128c6565b60405180910390fd5b61188161187c611a58565b611909565b565b6119048363a9059cbb60e01b84846040516024016118a29291906128e6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b09565b505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611a52846323b872dd60e01b8585856040516024016119f09392919061290f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b09565b50505050565b600033905090565b60006068541415611a775743606981905550611b07565b6000606e544311611a955760695443611a90919061241a565b611aa6565b606954606e54611aa5919061241a565b5b90506000606b5482611ab8919061244e565b905060685464e8d4a5100082611ace919061244e565b611ad891906124d7565b606a54611ae591906122c6565b606a81905550606e544311611afa5743611afe565b606e545b60698190555050505b565b6000611b6b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611bd19092919063ffffffff16565b9050600081511480611b8d575080806020019051810190611b8c919061295b565b5b611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc3906129fa565b60405180910390fd5b505050565b6060611be08484600085611be9565b90509392505050565b606082471015611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590612a8c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c579190612b26565b60006040518083038185875af1925050503d8060008114611c94576040519150601f19603f3d011682016040523d82523d6000602084013e611c99565b606091505b5091509150611caa87838387611cb6565b92505050949350505050565b60608315611d1957600083511415611d1157611cd1856117ff565b611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790612b89565b60405180910390fd5b5b829050611d24565b611d238383611d2c565b5b949350505050565b600082511115611d3f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d739190612bfe565b60405180910390fd5b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611db182611d86565b9050919050565b611dc181611da6565b8114611dcc57600080fd5b50565b600081359050611dde81611db8565b92915050565b600060208284031215611dfa57611df9611d7c565b5b6000611e0884828501611dcf565b91505092915050565b6000819050919050565b611e2481611e11565b82525050565b6000602082019050611e3f6000830184611e1b565b92915050565b611e4e81611e11565b8114611e5957600080fd5b50565b600081359050611e6b81611e45565b92915050565b600080600080600060a08688031215611e8d57611e8c611d7c565b5b6000611e9b88828901611dcf565b9550506020611eac88828901611dcf565b9450506040611ebd88828901611e5c565b9350506060611ece88828901611e5c565b9250506080611edf88828901611e5c565b9150509295509295909350565b600060208284031215611f0257611f01611d7c565b5b6000611f1084828501611e5c565b91505092915050565b6000819050919050565b6000611f3e611f39611f3484611d86565b611f19565b611d86565b9050919050565b6000611f5082611f23565b9050919050565b6000611f6282611f45565b9050919050565b611f7281611f57565b82525050565b6000602082019050611f8d6000830184611f69565b92915050565b611f9c81611da6565b82525050565b6000602082019050611fb76000830184611f93565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611fe257611fe1611fbd565b5b8235905067ffffffffffffffff811115611fff57611ffe611fc2565b5b60208301915083602082028301111561201b5761201a611fc7565b5b9250929050565b6000806020838503121561203957612038611d7c565b5b600083013567ffffffffffffffff81111561205757612056611d81565b5b61206385828601611fcc565b92509250509250929050565b6000806040838503121561208657612085611d7c565b5b600061209485828601611dcf565b92505060206120a585828601611e5c565b9150509250929050565b60008115159050919050565b6120c4816120af565b81146120cf57600080fd5b50565b6000813590506120e1816120bb565b92915050565b6000602082840312156120fd576120fc611d7c565b5b600061210b848285016120d2565b91505092915050565b600060a0820190506121296000830188611e1b565b6121366020830187611e1b565b6121436040830186611e1b565b6121506060830185611e1b565b61215d6080830184611e1b565b9695505050505050565b612170816120af565b82525050565b600060208201905061218b6000830184612167565b92915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006121fe602e83612191565b9150612209826121a2565b604082019050919050565b6000602082019050818103600083015261222d816121f1565b9050919050565b6000819050919050565b600060ff82169050919050565b600061226661226161225c84612234565b611f19565b61223e565b9050919050565b6122768161224b565b82525050565b6000602082019050612291600083018461226d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006122d182611e11565b91506122dc83611e11565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561231157612310612297565b5b828201905092915050565b7f796f7520617265206e6f7420616c6c6f77656420746f2077697468647261772060008201527f6265666f7265206c6f636b65642054696d650000000000000000000000000000602082015250565b6000612378603283612191565b91506123838261231c565b604082019050919050565b600060208201905081810360008301526123a78161236b565b9050919050565b7f576974686472617720616d6f756e742063616e2774206265207a65726f000000600082015250565b60006123e4601d83612191565b91506123ef826123ae565b602082019050919050565b60006020820190508181036000830152612413816123d7565b9050919050565b600061242582611e11565b915061243083611e11565b92508282101561244357612442612297565b5b828203905092915050565b600061245982611e11565b915061246483611e11565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561249d5761249c612297565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006124e282611e11565b91506124ed83611e11565b9250826124fd576124fc6124a8565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061254282611e11565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561257557612574612297565b5b600182019050919050565b7f54686973206d6574686f64206973206f6e6c7920666f722070726573616c652060008201527f436f6e7472616374000000000000000000000000000000000000000000000000602082015250565b60006125dc602883612191565b91506125e782612580565b604082019050919050565b6000602082019050818103600083015261260b816125cf565b9050919050565b7f7374616b696e6720686173206265656e20656e64656400000000000000000000600082015250565b6000612648601683612191565b915061265382612612565b602082019050919050565b600060208201905081810360008301526126778161263b565b9050919050565b7f4465706f73697420616d6f756e742063616e2774206265207a65726f00000000600082015250565b60006126b4601c83612191565b91506126bf8261267e565b602082019050919050565b600060208201905081810360008301526126e3816126a7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612746602683612191565b9150612751826126ea565b604082019050919050565b6000602082019050818103600083015261277581612739565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006127b2602083612191565b91506127bd8261277c565b602082019050919050565b600060208201905081810360008301526127e1816127a5565b9050919050565b7f54686973204164647265737320697320426c61636b6c69737465640000000000600082015250565b600061281e601b83612191565b9150612829826127e8565b602082019050919050565b6000602082019050818103600083015261284d81612811565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006128b0602b83612191565b91506128bb82612854565b604082019050919050565b600060208201905081810360008301526128df816128a3565b9050919050565b60006040820190506128fb6000830185611f93565b6129086020830184611e1b565b9392505050565b60006060820190506129246000830186611f93565b6129316020830185611f93565b61293e6040830184611e1b565b949350505050565b600081519050612955816120bb565b92915050565b60006020828403121561297157612970611d7c565b5b600061297f84828501612946565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006129e4602a83612191565b91506129ef82612988565b604082019050919050565b60006020820190508181036000830152612a13816129d7565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612a76602683612191565b9150612a8182612a1a565b604082019050919050565b60006020820190508181036000830152612aa581612a69565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612ae0578082015181840152602081019050612ac5565b83811115612aef576000848401525b50505050565b6000612b0082612aac565b612b0a8185612ab7565b9350612b1a818560208601612ac2565b80840191505092915050565b6000612b328284612af5565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612b73601d83612191565b9150612b7e82612b3d565b602082019050919050565b60006020820190508181036000830152612ba281612b66565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b6000612bd082612ba9565b612bda8185612191565b9350612bea818560208601612ac2565b612bf381612bb4565b840191505092915050565b60006020820190508181036000830152612c188184612bc5565b90509291505056fea26469706673582212209e470b527579ede77d40082ea00cad3252499f577be53d7443488f9c6e5f4b0064736f6c63430008090033
Deployed Bytecode Sourcemap
34093:8722:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41506:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35057:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34728:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39019:73;;;:::i;:::-;;36126:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38342:625;;;:::i;:::-;;42699:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34259:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34334:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20225:103;;;:::i;:::-;;40712:579;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35703:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42453:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34396:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19584:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37527:745;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41297:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34470:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34918:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41817:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36738:714;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42073:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41722:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35647:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;35000:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41404:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41631:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35138:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20483:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35776:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41506:119;19470:13;:11;:13::i;:::-;41607:11:::1;41576:10;;:43;;;;;;;;;;;;;;;;;;41506:119:::0;:::o;35057:20::-;;;;:::o;34728:35::-;;;;:::o;39019:73::-;39059:27;39075:10;39059:15;:27::i;:::-;39019:73::o;36126:422::-;13190:19;13213:13;;;;;;;;;;;13212:14;13190:36;;13260:14;:34;;;;;13293:1;13278:12;;;;;;;;;;:16;;;13260:34;13259:108;;;;13301:44;13339:4;13301:29;:44::i;:::-;13300:45;:66;;;;;13365:1;13349:12;;;;;;;;;;:17;;;13300:66;13259:108;13237:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;13467:1;13452:12;;:16;;;;;;;;;;;;;;;;;;13483:14;13479:67;;;13530:4;13514:13;;:20;;;;;;;;;;;;;;;;;;13479:67;36293:26:::1;:24;:26::i;:::-;36349:21;36326:20;:44;;;;36408:19;36377:10;;:51;;;;;;;;;;;;;;;;;;36453:8;36435:15;;:26;;;;;;;;;;;;;;;;;;36481:9;36468:10;:22;;;;36508:9;36497:8;:20;;;;36538:4;36524:11;;:18;;;;;;;;;;;;;;;;;;13572:14:::0;13568:102;;;13619:5;13603:13;;:21;;;;;;;;;;;;;;;;;;13644:14;13656:1;13644:14;;;;;;:::i;:::-;;;;;;;;13568:102;13179:498;36126:422;;;;;:::o;38342:625::-;38378:24;38405:11;:23;38417:10;38405:23;;;;;;;;;;;;;;;38378:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38435:14;38452:6;:13;;;38435:30;;38514:15;38500:10;;38480:6;:17;;;:30;;;;:::i;:::-;:49;;:95;;;;;38560:15;38546:10;;38533;;:23;;;;:::i;:::-;:42;;38480:95;38472:158;;;;;;;;;;;;:::i;:::-;;;;;;;;;38654:1;38645:6;:10;38637:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;38718:16;:14;:16::i;:::-;38771:11;:23;38783:10;38771:23;;;;;;;;;;;;;;;;38764:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38839:6;38823:12;;:22;;;;;;;:::i;:::-;;;;;;;;38892:10;38883:28;;;38904:6;38883:28;;;;;;:::i;:::-;;;;;;;;38918:43;38942:10;38954:6;38918:10;;;;;;;;;;;:23;;;;:43;;;;;:::i;:::-;38371:596;;38342:625::o;42699:113::-;19470:13;:11;:13::i;:::-;42765:41:::1;42789:7;:5;:7::i;:::-;42798;42765:10;;;;;;;;;;;:23;;;;:41;;;;;:::i;:::-;42699:113:::0;:::o;34259:35::-;;;;;;;;;;;;;:::o;34334:30::-;;;;;;;;;;;;;:::o;20225:103::-;19470:13;:11;:13::i;:::-;20290:30:::1;20317:1;20290:18;:30::i;:::-;20225:103::o:0;40712:579::-;40768:4;40801:1;40785:12;;:17;40781:48;;;40820:1;40813:8;;;;40781:48;40835:29;40882:8;;40867:12;:23;:89;;40939:17;;40924:12;:32;;;;:::i;:::-;40867:89;;;40904:17;;40893:8;;:28;;;;:::i;:::-;40867:89;40835:121;;40963:15;41005:20;;40981:21;:44;;;;:::i;:::-;40963:62;;41032:15;41112:12;;34857:4;41081:7;:27;;;;:::i;:::-;41080:44;;;;:::i;:::-;41050:26;;:75;;;;:::i;:::-;41032:93;;41132:24;41159:11;:18;41171:5;41159:18;;;;;;;;;;;;;;;41132:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41261:17;:24;41279:5;41261:24;;;;;;;;;;;;;;;;41241:6;:17;;;34857:4;41209:7;41193:6;:13;;;:23;;;;:::i;:::-;41192:45;;;;:::i;:::-;41191:67;;;;:::i;:::-;:94;;;;:::i;:::-;41184:101;;;;;;40712:579;;;;:::o;35703:49::-;;;;;;;;;;;;;;;;;:::o;42453:240::-;19470:13;:11;:13::i;:::-;42560:9:::1;42555:133;42579:26;;:33;;42575:1;:37;42555:133;;;42675:5;42628:13;:44;42642:26;;42669:1;42642:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;42628:44;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;42614:3;;;;;:::i;:::-;;;;42555:133;;;;42453:240:::0;;:::o;34396:36::-;;;;:::o;19584:87::-;19630:7;19657:6;;;;;;;;;;;19650:13;;19584:87;:::o;37527:745::-;36606:15;;;;;;;;;;;36592:29;;:10;:29;;;36584:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;37636:8:::1;;37621:12;:23;37613:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37696:1;37686:7;:11;37678:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;37739:25;37767:11;:18;37779:5;37767:18;;;;;;;;;;;;;;;37739:46;;37822:22;37838:5;37822:15;:22::i;:::-;37900:7;37883:6;:13;;;:24;;;;;;;:::i;:::-;;;;;;;;34857:4;37951:26;;37935:6;:13;;;:42;;;;:::i;:::-;37934:64;;;;:::i;:::-;37914:6;:17;;:84;;;;38025:15;38005:6;:17;;:35;;;;38085:7;38069:12;;:23;;;;;;;:::i;:::-;;;;;;;;38124:7;38099:21;;:32;;;;;;;:::i;:::-;;;;;;;;38176:5;38168:23;;;38183:7;38168:23;;;;;;:::i;:::-;;;;;;;;38198:68;38226:15;;;;;;;;;;;38251:4;38258:7;38198:10;;;;;;;;;;;:27;;;;:68;;;;;;:::i;:::-;37606:666;37527:745:::0;;:::o;41297:101::-;19470:13;:11;:13::i;:::-;41380:12:::1;41366:11;;:26;;;;;;;;;;;;;;;;;;41297:101:::0;:::o;34470:27::-;;;;:::o;34918:25::-;;;;:::o;41817:97::-;19470:13;:11;:13::i;:::-;41897:11:::1;41884:10;:24;;;;41817:97:::0;:::o;36738:714::-;36811:8;;36796:12;:23;36788:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36871:1;36861:7;:11;36853:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;36914:25;36942:11;:23;36954:10;36942:23;;;;;;;;;;;;;;;36914:51;;37002:16;:14;:16::i;:::-;37074:7;37057:6;:13;;;:24;;;;;;;:::i;:::-;;;;;;;;34857:4;37125:26;;37109:6;:13;;;:42;;;;:::i;:::-;37108:64;;;;:::i;:::-;37088:6;:17;;:84;;;;37199:15;37179:6;:17;;:35;;;;37247:12;37221:6;:23;;:38;;;;37304:7;37288:12;;:23;;;;;;;:::i;:::-;;;;;;;;37356:10;37348:28;;;37368:7;37348:28;;;;;;:::i;:::-;;;;;;;;37383:63;37411:10;37431:4;37438:7;37383:10;;;;;;;;;;;:27;;;;:63;;;;;;:::i;:::-;36781:671;36738:714;:::o;42073:207::-;19470:13;:11;:13::i;:::-;42166:9:::1;42161:114;42185:17;;:24;;42181:1;:28;42161:114;;;42263:4;42225:13;:35;42239:17;;42257:1;42239:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;42225:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;42211:3;;;;;:::i;:::-;;;;42161:114;;;;42073:207:::0;;:::o;41722:89::-;19470:13;:11;:13::i;:::-;41796:9:::1;41785:8;:20;;;;41722:89:::0;:::o;35647:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35000:23::-;;;;;;;;;;;;;:::o;41404:96::-;19470:13;:11;:13::i;:::-;41486:8:::1;41468:15;;:26;;;;;;;;;;;;;;;;;;41404:96:::0;:::o;41631:85::-;19470:13;:11;:13::i;:::-;41705:5:::1;41692:10;:18;;;;41631:85:::0;:::o;35138:25::-;;;;:::o;20483:201::-;19470:13;:11;:13::i;:::-;20592:1:::1;20572:22;;:8;:22;;;;20564:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20648:28;20667:8;20648:18;:28::i;:::-;20483:201:::0;:::o;35776:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;19749:132::-;19824:12;:10;:12::i;:::-;19813:23;;:7;:5;:7::i;:::-;:23;;;19805:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19749:132::o;39144:877::-;39208:13;:20;39222:5;39208:20;;;;;;;;;;;;;;;;;;;;;;;;;39207:21;39199:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39269:19;:17;:19::i;:::-;39295:25;39323:11;:18;39335:5;39323:18;;;;;;;;;;;;;;;39295:46;;39348:24;39444:6;:17;;;34857:4;39393:26;;39377:6;:13;;;:42;;;;:::i;:::-;39376:64;;;;:::i;:::-;39375:86;;;;:::i;:::-;39348:113;;39492:1;39472:16;:21;39468:50;;;39504:7;;;;39468:50;39553:16;39526:6;:23;;;:43;;;;;;;:::i;:::-;;;;;;;;34857:4;39613:26;;39597:6;:13;;;:42;;;;:::i;:::-;39596:64;;;;:::i;:::-;39576:6;:17;;:84;;;;39672:11;;;;;;;;;;;39667:349;;39725:1;39698:17;:24;39716:5;39698:24;;;;;;;;;;;;;;;;:28;39694:138;;;39759:17;:24;39777:5;39759:24;;;;;;;;;;;;;;;;39739:44;;;;;:::i;:::-;;;39821:1;39794:17;:24;39812:5;39794:24;;;;;;;;;;;;;;;:28;;;;39694:138;39860:5;39845:39;;;39867:16;39845:39;;;;;;:::i;:::-;;;;;;;;39893:48;39917:5;39924:16;39893:10;;;;;;;;;;;:23;;;;:48;;;;;:::i;:::-;39667:349;;;39992:16;39964:17;:24;39982:5;39964:24;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;39667:349;39192:829;;39144:877;;:::o;1612:326::-;1672:4;1929:1;1907:7;:19;;;:23;1900:30;;1612:326;;;:::o;19232:113::-;15333:13;;;;;;;;;;;15325:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;19305:32:::1;19324:12;:10;:12::i;:::-;19305:18;:32::i;:::-;19232:113::o:0;27737:188::-;27831:86;27851:5;27881:23;;;27906:2;27910:5;27858:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27831:19;:86::i;:::-;27737:188;;;:::o;20844:191::-;20918:16;20937:6;;;;;;;;;;;20918:25;;20963:8;20954:6;;:17;;;;;;;;;;;;;;;;;;21018:8;20987:40;;21008:8;20987:40;;;;;;;;;;;;20907:128;20844:191;:::o;28170:216::-;28282:96;28302:5;28332:27;;;28361:4;28367:2;28371:5;28309:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28282:19;:96::i;:::-;28170:216;;;;:::o;17567:98::-;17620:7;17647:10;17640:17;;17567:98;:::o;40115:520::-;40179:1;40163:12;;:17;40159:87;;;40211:12;40191:17;:32;;;;40232:7;;40159:87;40252:29;40299:8;;40284:12;:23;:89;;40356:17;;40341:12;:32;;;;:::i;:::-;40284:89;;;40321:17;;40310:8;;:28;;;;:::i;:::-;40284:89;40252:121;;40380:15;40422:20;;40398:21;:44;;;;:::i;:::-;40380:62;;40540:12;;34857:4;40509:7;:27;;;;:::i;:::-;40508:44;;;;:::i;:::-;40478:26;;:75;;;;:::i;:::-;40449:26;:104;;;;40595:8;;40580:12;:23;:49;;40617:12;40580:49;;;40606:8;;40580:49;40560:17;:69;;;;40152:483;;40115:520;:::o;32160:660::-;32595:23;32621:69;32649:4;32621:69;;;;;;;;;;;;;;;;;32629:5;32621:27;;;;:69;;;;;:::i;:::-;32595:95;;32730:1;32709:10;:17;:22;:56;;;;32746:10;32735:30;;;;;;;;;;;;:::i;:::-;32709:56;32701:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32241:579;32160:660;;:::o;4367:229::-;4504:12;4536:52;4558:6;4566:4;4572:1;4575:12;4536:21;:52::i;:::-;4529:59;;4367:229;;;;;:::o;5453:455::-;5623:12;5681:5;5656:21;:30;;5648:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5741:12;5755:23;5782:6;:11;;5801:5;5808:4;5782:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5740:73;;;;5831:69;5858:6;5866:7;5875:10;5887:12;5831:26;:69::i;:::-;5824:76;;;;5453:455;;;;;;:::o;8026:644::-;8211:12;8240:7;8236:427;;;8289:1;8268:10;:17;:22;8264:290;;;8486:18;8497:6;8486:10;:18::i;:::-;8478:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8264:290;8575:10;8568:17;;;;8236:427;8618:33;8626:10;8638:12;8618:7;:33::i;:::-;8026:644;;;;;;;:::o;9212:552::-;9393:1;9373:10;:17;:21;9369:388;;;9605:10;9599:17;9662:15;9649:10;9645:2;9641:19;9634:44;9369:388;9732:12;9725:20;;;;;;;;;;;:::i;:::-;;;;;;;;88:117:1;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:911::-;1979:6;1987;1995;2003;2011;2060:3;2048:9;2039:7;2035:23;2031:33;2028:120;;;2067:79;;:::i;:::-;2028:120;2187:1;2212:53;2257:7;2248:6;2237:9;2233:22;2212:53;:::i;:::-;2202:63;;2158:117;2314:2;2340:53;2385:7;2376:6;2365:9;2361:22;2340:53;:::i;:::-;2330:63;;2285:118;2442:2;2468:53;2513:7;2504:6;2493:9;2489:22;2468:53;:::i;:::-;2458:63;;2413:118;2570:2;2596:53;2641:7;2632:6;2621:9;2617:22;2596:53;:::i;:::-;2586:63;;2541:118;2698:3;2725:53;2770:7;2761:6;2750:9;2746:22;2725:53;:::i;:::-;2715:63;;2669:119;1884:911;;;;;;;;:::o;2801:329::-;2860:6;2909:2;2897:9;2888:7;2884:23;2880:32;2877:119;;;2915:79;;:::i;:::-;2877:119;3035:1;3060:53;3105:7;3096:6;3085:9;3081:22;3060:53;:::i;:::-;3050:63;;3006:117;2801:329;;;;:::o;3136:60::-;3164:3;3185:5;3178:12;;3136:60;;;:::o;3202:142::-;3252:9;3285:53;3303:34;3312:24;3330:5;3312:24;:::i;:::-;3303:34;:::i;:::-;3285:53;:::i;:::-;3272:66;;3202:142;;;:::o;3350:126::-;3400:9;3433:37;3464:5;3433:37;:::i;:::-;3420:50;;3350:126;;;:::o;3482:151::-;3557:9;3590:37;3621:5;3590:37;:::i;:::-;3577:50;;3482:151;;;:::o;3639:181::-;3751:62;3807:5;3751:62;:::i;:::-;3746:3;3739:75;3639:181;;:::o;3826:272::-;3944:4;3982:2;3971:9;3967:18;3959:26;;3995:96;4088:1;4077:9;4073:17;4064:6;3995:96;:::i;:::-;3826:272;;;;:::o;4104:118::-;4191:24;4209:5;4191:24;:::i;:::-;4186:3;4179:37;4104:118;;:::o;4228:222::-;4321:4;4359:2;4348:9;4344:18;4336:26;;4372:71;4440:1;4429:9;4425:17;4416:6;4372:71;:::i;:::-;4228:222;;;;:::o;4456:117::-;4565:1;4562;4555:12;4579:117;4688:1;4685;4678:12;4702:117;4811:1;4808;4801:12;4842:568;4915:8;4925:6;4975:3;4968:4;4960:6;4956:17;4952:27;4942:122;;4983:79;;:::i;:::-;4942:122;5096:6;5083:20;5073:30;;5126:18;5118:6;5115:30;5112:117;;;5148:79;;:::i;:::-;5112:117;5262:4;5254:6;5250:17;5238:29;;5316:3;5308:4;5300:6;5296:17;5286:8;5282:32;5279:41;5276:128;;;5323:79;;:::i;:::-;5276:128;4842:568;;;;;:::o;5416:559::-;5502:6;5510;5559:2;5547:9;5538:7;5534:23;5530:32;5527:119;;;5565:79;;:::i;:::-;5527:119;5713:1;5702:9;5698:17;5685:31;5743:18;5735:6;5732:30;5729:117;;;5765:79;;:::i;:::-;5729:117;5878:80;5950:7;5941:6;5930:9;5926:22;5878:80;:::i;:::-;5860:98;;;;5656:312;5416:559;;;;;:::o;5981:474::-;6049:6;6057;6106:2;6094:9;6085:7;6081:23;6077:32;6074:119;;;6112:79;;:::i;:::-;6074:119;6232:1;6257:53;6302:7;6293:6;6282:9;6278:22;6257:53;:::i;:::-;6247:63;;6203:117;6359:2;6385:53;6430:7;6421:6;6410:9;6406:22;6385:53;:::i;:::-;6375:63;;6330:118;5981:474;;;;;:::o;6461:90::-;6495:7;6538:5;6531:13;6524:21;6513:32;;6461:90;;;:::o;6557:116::-;6627:21;6642:5;6627:21;:::i;:::-;6620:5;6617:32;6607:60;;6663:1;6660;6653:12;6607:60;6557:116;:::o;6679:133::-;6722:5;6760:6;6747:20;6738:29;;6776:30;6800:5;6776:30;:::i;:::-;6679:133;;;;:::o;6818:323::-;6874:6;6923:2;6911:9;6902:7;6898:23;6894:32;6891:119;;;6929:79;;:::i;:::-;6891:119;7049:1;7074:50;7116:7;7107:6;7096:9;7092:22;7074:50;:::i;:::-;7064:60;;7020:114;6818:323;;;;:::o;7147:664::-;7352:4;7390:3;7379:9;7375:19;7367:27;;7404:71;7472:1;7461:9;7457:17;7448:6;7404:71;:::i;:::-;7485:72;7553:2;7542:9;7538:18;7529:6;7485:72;:::i;:::-;7567;7635:2;7624:9;7620:18;7611:6;7567:72;:::i;:::-;7649;7717:2;7706:9;7702:18;7693:6;7649:72;:::i;:::-;7731:73;7799:3;7788:9;7784:19;7775:6;7731:73;:::i;:::-;7147:664;;;;;;;;:::o;7817:109::-;7898:21;7913:5;7898:21;:::i;:::-;7893:3;7886:34;7817:109;;:::o;7932:210::-;8019:4;8057:2;8046:9;8042:18;8034:26;;8070:65;8132:1;8121:9;8117:17;8108:6;8070:65;:::i;:::-;7932:210;;;;:::o;8148:169::-;8232:11;8266:6;8261:3;8254:19;8306:4;8301:3;8297:14;8282:29;;8148:169;;;;:::o;8323:233::-;8463:34;8459:1;8451:6;8447:14;8440:58;8532:16;8527:2;8519:6;8515:15;8508:41;8323:233;:::o;8562:366::-;8704:3;8725:67;8789:2;8784:3;8725:67;:::i;:::-;8718:74;;8801:93;8890:3;8801:93;:::i;:::-;8919:2;8914:3;8910:12;8903:19;;8562:366;;;:::o;8934:419::-;9100:4;9138:2;9127:9;9123:18;9115:26;;9187:9;9181:4;9177:20;9173:1;9162:9;9158:17;9151:47;9215:131;9341:4;9215:131;:::i;:::-;9207:139;;8934:419;;;:::o;9359:85::-;9404:7;9433:5;9422:16;;9359:85;;;:::o;9450:86::-;9485:7;9525:4;9518:5;9514:16;9503:27;;9450:86;;;:::o;9542:154::-;9598:9;9631:59;9647:42;9656:32;9682:5;9656:32;:::i;:::-;9647:42;:::i;:::-;9631:59;:::i;:::-;9618:72;;9542:154;;;:::o;9702:143::-;9795:43;9832:5;9795:43;:::i;:::-;9790:3;9783:56;9702:143;;:::o;9851:234::-;9950:4;9988:2;9977:9;9973:18;9965:26;;10001:77;10075:1;10064:9;10060:17;10051:6;10001:77;:::i;:::-;9851:234;;;;:::o;10091:180::-;10139:77;10136:1;10129:88;10236:4;10233:1;10226:15;10260:4;10257:1;10250:15;10277:305;10317:3;10336:20;10354:1;10336:20;:::i;:::-;10331:25;;10370:20;10388:1;10370:20;:::i;:::-;10365:25;;10524:1;10456:66;10452:74;10449:1;10446:81;10443:107;;;10530:18;;:::i;:::-;10443:107;10574:1;10571;10567:9;10560:16;;10277:305;;;;:::o;10588:237::-;10728:34;10724:1;10716:6;10712:14;10705:58;10797:20;10792:2;10784:6;10780:15;10773:45;10588:237;:::o;10831:366::-;10973:3;10994:67;11058:2;11053:3;10994:67;:::i;:::-;10987:74;;11070:93;11159:3;11070:93;:::i;:::-;11188:2;11183:3;11179:12;11172:19;;10831:366;;;:::o;11203:419::-;11369:4;11407:2;11396:9;11392:18;11384:26;;11456:9;11450:4;11446:20;11442:1;11431:9;11427:17;11420:47;11484:131;11610:4;11484:131;:::i;:::-;11476:139;;11203:419;;;:::o;11628:179::-;11768:31;11764:1;11756:6;11752:14;11745:55;11628:179;:::o;11813:366::-;11955:3;11976:67;12040:2;12035:3;11976:67;:::i;:::-;11969:74;;12052:93;12141:3;12052:93;:::i;:::-;12170:2;12165:3;12161:12;12154:19;;11813:366;;;:::o;12185:419::-;12351:4;12389:2;12378:9;12374:18;12366:26;;12438:9;12432:4;12428:20;12424:1;12413:9;12409:17;12402:47;12466:131;12592:4;12466:131;:::i;:::-;12458:139;;12185:419;;;:::o;12610:191::-;12650:4;12670:20;12688:1;12670:20;:::i;:::-;12665:25;;12704:20;12722:1;12704:20;:::i;:::-;12699:25;;12743:1;12740;12737:8;12734:34;;;12748:18;;:::i;:::-;12734:34;12793:1;12790;12786:9;12778:17;;12610:191;;;;:::o;12807:348::-;12847:7;12870:20;12888:1;12870:20;:::i;:::-;12865:25;;12904:20;12922:1;12904:20;:::i;:::-;12899:25;;13092:1;13024:66;13020:74;13017:1;13014:81;13009:1;13002:9;12995:17;12991:105;12988:131;;;13099:18;;:::i;:::-;12988:131;13147:1;13144;13140:9;13129:20;;12807:348;;;;:::o;13161:180::-;13209:77;13206:1;13199:88;13306:4;13303:1;13296:15;13330:4;13327:1;13320:15;13347:185;13387:1;13404:20;13422:1;13404:20;:::i;:::-;13399:25;;13438:20;13456:1;13438:20;:::i;:::-;13433:25;;13477:1;13467:35;;13482:18;;:::i;:::-;13467:35;13524:1;13521;13517:9;13512:14;;13347:185;;;;:::o;13538:180::-;13586:77;13583:1;13576:88;13683:4;13680:1;13673:15;13707:4;13704:1;13697:15;13724:233;13763:3;13786:24;13804:5;13786:24;:::i;:::-;13777:33;;13832:66;13825:5;13822:77;13819:103;;;13902:18;;:::i;:::-;13819:103;13949:1;13942:5;13938:13;13931:20;;13724:233;;;:::o;13963:227::-;14103:34;14099:1;14091:6;14087:14;14080:58;14172:10;14167:2;14159:6;14155:15;14148:35;13963:227;:::o;14196:366::-;14338:3;14359:67;14423:2;14418:3;14359:67;:::i;:::-;14352:74;;14435:93;14524:3;14435:93;:::i;:::-;14553:2;14548:3;14544:12;14537:19;;14196:366;;;:::o;14568:419::-;14734:4;14772:2;14761:9;14757:18;14749:26;;14821:9;14815:4;14811:20;14807:1;14796:9;14792:17;14785:47;14849:131;14975:4;14849:131;:::i;:::-;14841:139;;14568:419;;;:::o;14993:172::-;15133:24;15129:1;15121:6;15117:14;15110:48;14993:172;:::o;15171:366::-;15313:3;15334:67;15398:2;15393:3;15334:67;:::i;:::-;15327:74;;15410:93;15499:3;15410:93;:::i;:::-;15528:2;15523:3;15519:12;15512:19;;15171:366;;;:::o;15543:419::-;15709:4;15747:2;15736:9;15732:18;15724:26;;15796:9;15790:4;15786:20;15782:1;15771:9;15767:17;15760:47;15824:131;15950:4;15824:131;:::i;:::-;15816:139;;15543:419;;;:::o;15968:178::-;16108:30;16104:1;16096:6;16092:14;16085:54;15968:178;:::o;16152:366::-;16294:3;16315:67;16379:2;16374:3;16315:67;:::i;:::-;16308:74;;16391:93;16480:3;16391:93;:::i;:::-;16509:2;16504:3;16500:12;16493:19;;16152:366;;;:::o;16524:419::-;16690:4;16728:2;16717:9;16713:18;16705:26;;16777:9;16771:4;16767:20;16763:1;16752:9;16748:17;16741:47;16805:131;16931:4;16805:131;:::i;:::-;16797:139;;16524:419;;;:::o;16949:225::-;17089:34;17085:1;17077:6;17073:14;17066:58;17158:8;17153:2;17145:6;17141:15;17134:33;16949:225;:::o;17180:366::-;17322:3;17343:67;17407:2;17402:3;17343:67;:::i;:::-;17336:74;;17419:93;17508:3;17419:93;:::i;:::-;17537:2;17532:3;17528:12;17521:19;;17180:366;;;:::o;17552:419::-;17718:4;17756:2;17745:9;17741:18;17733:26;;17805:9;17799:4;17795:20;17791:1;17780:9;17776:17;17769:47;17833:131;17959:4;17833:131;:::i;:::-;17825:139;;17552:419;;;:::o;17977:182::-;18117:34;18113:1;18105:6;18101:14;18094:58;17977:182;:::o;18165:366::-;18307:3;18328:67;18392:2;18387:3;18328:67;:::i;:::-;18321:74;;18404:93;18493:3;18404:93;:::i;:::-;18522:2;18517:3;18513:12;18506:19;;18165:366;;;:::o;18537:419::-;18703:4;18741:2;18730:9;18726:18;18718:26;;18790:9;18784:4;18780:20;18776:1;18765:9;18761:17;18754:47;18818:131;18944:4;18818:131;:::i;:::-;18810:139;;18537:419;;;:::o;18962:177::-;19102:29;19098:1;19090:6;19086:14;19079:53;18962:177;:::o;19145:366::-;19287:3;19308:67;19372:2;19367:3;19308:67;:::i;:::-;19301:74;;19384:93;19473:3;19384:93;:::i;:::-;19502:2;19497:3;19493:12;19486:19;;19145:366;;;:::o;19517:419::-;19683:4;19721:2;19710:9;19706:18;19698:26;;19770:9;19764:4;19760:20;19756:1;19745:9;19741:17;19734:47;19798:131;19924:4;19798:131;:::i;:::-;19790:139;;19517:419;;;:::o;19942:230::-;20082:34;20078:1;20070:6;20066:14;20059:58;20151:13;20146:2;20138:6;20134:15;20127:38;19942:230;:::o;20178:366::-;20320:3;20341:67;20405:2;20400:3;20341:67;:::i;:::-;20334:74;;20417:93;20506:3;20417:93;:::i;:::-;20535:2;20530:3;20526:12;20519:19;;20178:366;;;:::o;20550:419::-;20716:4;20754:2;20743:9;20739:18;20731:26;;20803:9;20797:4;20793:20;20789:1;20778:9;20774:17;20767:47;20831:131;20957:4;20831:131;:::i;:::-;20823:139;;20550:419;;;:::o;20975:332::-;21096:4;21134:2;21123:9;21119:18;21111:26;;21147:71;21215:1;21204:9;21200:17;21191:6;21147:71;:::i;:::-;21228:72;21296:2;21285:9;21281:18;21272:6;21228:72;:::i;:::-;20975:332;;;;;:::o;21313:442::-;21462:4;21500:2;21489:9;21485:18;21477:26;;21513:71;21581:1;21570:9;21566:17;21557:6;21513:71;:::i;:::-;21594:72;21662:2;21651:9;21647:18;21638:6;21594:72;:::i;:::-;21676;21744:2;21733:9;21729:18;21720:6;21676:72;:::i;:::-;21313:442;;;;;;:::o;21761:137::-;21815:5;21846:6;21840:13;21831:22;;21862:30;21886:5;21862:30;:::i;:::-;21761:137;;;;:::o;21904:345::-;21971:6;22020:2;22008:9;21999:7;21995:23;21991:32;21988:119;;;22026:79;;:::i;:::-;21988:119;22146:1;22171:61;22224:7;22215:6;22204:9;22200:22;22171:61;:::i;:::-;22161:71;;22117:125;21904:345;;;;:::o;22255:229::-;22395:34;22391:1;22383:6;22379:14;22372:58;22464:12;22459:2;22451:6;22447:15;22440:37;22255:229;:::o;22490:366::-;22632:3;22653:67;22717:2;22712:3;22653:67;:::i;:::-;22646:74;;22729:93;22818:3;22729:93;:::i;:::-;22847:2;22842:3;22838:12;22831:19;;22490:366;;;:::o;22862:419::-;23028:4;23066:2;23055:9;23051:18;23043:26;;23115:9;23109:4;23105:20;23101:1;23090:9;23086:17;23079:47;23143:131;23269:4;23143:131;:::i;:::-;23135:139;;22862:419;;;:::o;23287:225::-;23427:34;23423:1;23415:6;23411:14;23404:58;23496:8;23491:2;23483:6;23479:15;23472:33;23287:225;:::o;23518:366::-;23660:3;23681:67;23745:2;23740:3;23681:67;:::i;:::-;23674:74;;23757:93;23846:3;23757:93;:::i;:::-;23875:2;23870:3;23866:12;23859:19;;23518:366;;;:::o;23890:419::-;24056:4;24094:2;24083:9;24079:18;24071:26;;24143:9;24137:4;24133:20;24129:1;24118:9;24114:17;24107:47;24171:131;24297:4;24171:131;:::i;:::-;24163:139;;23890:419;;;:::o;24315:98::-;24366:6;24400:5;24394:12;24384:22;;24315:98;;;:::o;24419:147::-;24520:11;24557:3;24542:18;;24419:147;;;;:::o;24572:307::-;24640:1;24650:113;24664:6;24661:1;24658:13;24650:113;;;24749:1;24744:3;24740:11;24734:18;24730:1;24725:3;24721:11;24714:39;24686:2;24683:1;24679:10;24674:15;;24650:113;;;24781:6;24778:1;24775:13;24772:101;;;24861:1;24852:6;24847:3;24843:16;24836:27;24772:101;24621:258;24572:307;;;:::o;24885:373::-;24989:3;25017:38;25049:5;25017:38;:::i;:::-;25071:88;25152:6;25147:3;25071:88;:::i;:::-;25064:95;;25168:52;25213:6;25208:3;25201:4;25194:5;25190:16;25168:52;:::i;:::-;25245:6;25240:3;25236:16;25229:23;;24993:265;24885:373;;;;:::o;25264:271::-;25394:3;25416:93;25505:3;25496:6;25416:93;:::i;:::-;25409:100;;25526:3;25519:10;;25264:271;;;;:::o;25541:179::-;25681:31;25677:1;25669:6;25665:14;25658:55;25541:179;:::o;25726:366::-;25868:3;25889:67;25953:2;25948:3;25889:67;:::i;:::-;25882:74;;25965:93;26054:3;25965:93;:::i;:::-;26083:2;26078:3;26074:12;26067:19;;25726:366;;;:::o;26098:419::-;26264:4;26302:2;26291:9;26287:18;26279:26;;26351:9;26345:4;26341:20;26337:1;26326:9;26322:17;26315:47;26379:131;26505:4;26379:131;:::i;:::-;26371:139;;26098:419;;;:::o;26523:99::-;26575:6;26609:5;26603:12;26593:22;;26523:99;;;:::o;26628:102::-;26669:6;26720:2;26716:7;26711:2;26704:5;26700:14;26696:28;26686:38;;26628:102;;;:::o;26736:364::-;26824:3;26852:39;26885:5;26852:39;:::i;:::-;26907:71;26971:6;26966:3;26907:71;:::i;:::-;26900:78;;26987:52;27032:6;27027:3;27020:4;27013:5;27009:16;26987:52;:::i;:::-;27064:29;27086:6;27064:29;:::i;:::-;27059:3;27055:39;27048:46;;26828:272;26736:364;;;;:::o;27106:313::-;27219:4;27257:2;27246:9;27242:18;27234:26;;27306:9;27300:4;27296:20;27292:1;27281:9;27277:17;27270:47;27334:78;27407:4;27398:6;27334:78;:::i;:::-;27326:86;;27106:313;;;;:::o
Swarm Source
ipfs://9e470b527579ede77d40082ea00cad3252499f577be53d7443488f9c6e5f4b00
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.