More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,545 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 21385165 | 50 days ago | IN | 0 ETH | 0.00216877 | ||||
Compound Reward | 21385162 | 50 days ago | IN | 0 ETH | 0.00187278 | ||||
Compound Reward | 21355187 | 54 days ago | IN | 0 ETH | 0.00134409 | ||||
Compound Reward | 21343089 | 56 days ago | IN | 0 ETH | 0.00201846 | ||||
Compound Reward | 21340825 | 56 days ago | IN | 0 ETH | 0.00248078 | ||||
Compound Reward | 21311565 | 60 days ago | IN | 0 ETH | 0.0023575 | ||||
Compound Reward | 21188041 | 77 days ago | IN | 0 ETH | 0.00847917 | ||||
Withdraw | 21172930 | 79 days ago | IN | 0 ETH | 0.0076504 | ||||
Compound Reward | 21169396 | 80 days ago | IN | 0 ETH | 0.00338079 | ||||
Compound Reward | 21168294 | 80 days ago | IN | 0 ETH | 0.00449088 | ||||
Compound Reward | 21148225 | 83 days ago | IN | 0 ETH | 0.00140444 | ||||
Withdraw | 21142692 | 84 days ago | IN | 0 ETH | 0.00366487 | ||||
Compound Reward | 21120212 | 87 days ago | IN | 0 ETH | 0.0006022 | ||||
Compound Reward | 21118271 | 87 days ago | IN | 0 ETH | 0.0007882 | ||||
Compound Reward | 21109502 | 88 days ago | IN | 0 ETH | 0.00158032 | ||||
Compound Reward | 21099430 | 90 days ago | IN | 0 ETH | 0.00069368 | ||||
Compound Reward | 21061226 | 95 days ago | IN | 0 ETH | 0.00066019 | ||||
Compound Reward | 21030496 | 99 days ago | IN | 0 ETH | 0.00237382 | ||||
Compound Reward | 21020672 | 101 days ago | IN | 0 ETH | 0.00146261 | ||||
Withdraw | 20988490 | 105 days ago | IN | 0 ETH | 0.00450335 | ||||
Compound Reward | 20910097 | 116 days ago | IN | 0 ETH | 0.00112718 | ||||
Withdraw | 20901718 | 117 days ago | IN | 0 ETH | 0.00147941 | ||||
Withdraw | 20901703 | 117 days ago | IN | 0 ETH | 0.00128493 | ||||
Compound Reward | 20901700 | 117 days ago | IN | 0 ETH | 0.00097849 | ||||
Compound Reward | 20880232 | 120 days ago | IN | 0 ETH | 0.00176186 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Staking
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-10 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // 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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.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 Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [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://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-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 IERC20Permit { /** * @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/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit 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(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: Staking.sol pragma solidity ^0.8.0; contract Staking is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Whether it is initialized bool public isInitialized; uint256 public duration; uint256 public slot; // Whether a limit is set for users bool public hasUserLimit; // The pool limit (0 if none) uint256 public poolLimitPerUser; // The block number when staking starts. uint256 public startBlock; // The block number when staking ends. uint256 public bonusEndBlock; address public walletA; uint256 private constant MIN_SLOT = 1; uint256 private constant MAX_SLOT = 60 * 60 * 24; uint256 private constant DAY_LENGTH = 60 * 60 * 24; uint256 private constant MAX_INT = type(uint256).max; // The staked token address stakingToken; uint256 private totalEarnedTokenDeposed; struct Lockup { uint8 stakeType; uint256 duration; uint256 depositFee; uint256 withdrawFee; uint256 rate; uint256 lastRewardBlock; uint256 totalStaked; uint256 totalEarned; uint256 totalCompounded; uint256 totalWithdrawn; bool depositFeeReverse; bool withdrawFeeReverse; } struct UserInfo { uint256 lastRewardBlock; uint256 totalStaked; uint256 totalEarned; uint256 totalCompounded; uint256 totalWithdrawn; } struct Stake { uint8 stakeType; uint256 duration; uint256 end; uint256 lastRewardBlock; uint256 staked; uint256 earned; uint256 compounded; uint256 withdrawn; } uint256 constant MAX_STAKES = 2048; Lockup[] public lockups; mapping(address => Stake[]) public userStakes; mapping(address => mapping(uint8 => UserInfo)) public userStaked; event Deposit(address indexed user, uint256 stakeType, uint256 amount, uint256 depositFee, bool depositFeeReverse, uint256 fee); event Withdraw(address indexed user, uint256 stakeType, uint256 amount, uint256 depositFee, bool depositFeeReverse, uint256 fee); event EmergencyWithdraw(address indexed user, uint256 amount); event AdminTokenRecovered(address tokenRecovered, uint256 amount); event NewStartAndEndBlocks(uint256 startBlock, uint256 endBlock); event LockupUpdated(uint8 _type, uint256 _duration, uint256 _fee0, uint256 _fee1, uint256 _rate, bool _depositFeeReverse, bool _withdrawFeeReverse); event NewPoolLimit(bool hasUserLimit, uint256 poolLimitPerUser); event RewardsStop(uint256 blockNumber); event DurationUpdated(uint256 duration); event SetSettings( address _walletA ); /* +++ * @notice Initialize the contract * @param _stakingToken: staked token address */ function initialize( address _stakingToken, uint256 _slot, uint256 _duration ) external onlyOwner { require(!isInitialized, "Already initialized"); require(_slot >= MIN_SLOT && _slot <= MAX_SLOT, "Incorrect slot!"); require((DAY_LENGTH / _slot) * _slot == DAY_LENGTH, "Incorrect slot!"); require(_duration > 0, "Incorrect duration!"); slot = _slot; duration = _duration; // Make this contract initialized isInitialized = true; stakingToken = _stakingToken; walletA = msg.sender; lockups.push(Lockup(0, 0, 0, 200, 1500, 0, 0, 0, 0, 0, false, false)); lockups.push(Lockup(1, 30 * 24 * 60 * 60, 0, 0, 2500, 0, 0, 0, 0, 0, false, false)); lockups.push(Lockup(2, 90 * 24 * 60 * 60, 0, 0, 4000, 0, 0, 0, 0, 0, false, false)); lockups.push(Lockup(3, 180 * 24 * 60 * 60, 0, 0, 5000, 0, 0, 0, 0, 0, false, false)); lockups.push(Lockup(4, 360 * 24 * 60 * 60, 0, 0, 6000, 0, 0, 0, 0, 0, false, false)); } /* +++ * @notice Deposit staked tokens */ function deposit(uint256 _amount, uint8 _stakeType) external nonReentrant { require(isInitialized, "Not initialized"); require(startBlock > 0, "Pool not started"); require(_amount > 0, "Amount should be greater than 0"); require(_stakeType < lockups.length, "Invalid stake type"); UserInfo storage user = userStaked[msg.sender][_stakeType]; Lockup storage lockup = lockups[_stakeType]; //calc user and lockup reward _calcUserLockupReward(_stakeType); uint256 beforeAmount = IERC20(stakingToken).balanceOf(address(this)); IERC20(stakingToken).safeTransferFrom( address(msg.sender), address(this), _amount ); uint256 afterAmount = IERC20(stakingToken).balanceOf(address(this)); uint256 realAmount = afterAmount.sub(beforeAmount); if (hasUserLimit) { require( realAmount.add(user.totalStaked) <= poolLimitPerUser, "User amount above limit" ); } uint256 fee; if (lockup.depositFee > 0) { fee = realAmount.mul(lockup.depositFee).div(10000); if (fee > 0) { if(lockup.depositFeeReverse == false){ IERC20(stakingToken).safeTransfer(walletA, fee); realAmount = realAmount.sub(fee); } else { realAmount = realAmount.add(fee); } } } _addStake(_stakeType, msg.sender, lockup.duration, realAmount); user.totalStaked = user.totalStaked.add(realAmount); lockup.totalStaked = lockup.totalStaked.add(realAmount); emit Deposit(msg.sender, _stakeType, realAmount, lockup.depositFee, lockup.depositFeeReverse, fee); } /* +++ */ function _addStake(uint8 _stakeType, address _account, uint256 _duration, uint256 _amount) internal { Stake[] storage stakes = userStakes[_account]; // uint256 end = _getSlot().add(_duration.mul(DAY_LENGTH / slot)); uint256 end = block.timestamp.add(_duration).div(slot); uint256 i = stakes.length; require(i < MAX_STAKES, "Max stakes"); stakes.push(); // insert the stake Stake storage newStake = stakes[i]; newStake.stakeType = _stakeType; newStake.duration = _duration; newStake.end = end; newStake.staked = _amount; newStake.lastRewardBlock = _getSlot(); } /* +++ * @notice Withdraw staked tokens and collect reward tokens * @param _amount: amount to withdraw (in earnedToken) */ function withdraw(uint256 _amount, uint8 _stakeType) external nonReentrant { require(isInitialized, "Not initialized"); require(startBlock > 0, "Pool not started"); require(_amount > 0, "Amount should be greator than 0"); require(_stakeType < lockups.length, "Invalid stake type"); UserInfo storage user = userStaked[msg.sender][_stakeType]; Stake[] storage stakes = userStakes[msg.sender]; Lockup storage lockup = lockups[_stakeType]; uint256 remained = _amount; uint256 rewardAmount = _claimReward(_stakeType, _amount); if (rewardAmount >= remained) { remained = 0; } else { remained = remained.sub(rewardAmount); } uint256 pending = 0; for (uint256 j = 0; j < stakes.length; j++) { Stake storage stake = stakes[j]; if (stake.stakeType != _stakeType) continue; if (stake.staked == 0) continue; if (_getSlot() <= stake.end) continue; if (remained == 0) break; uint256 _pending = stake.staked; if (_pending > remained) { _pending = remained; } stake.staked = stake.staked.sub(_pending); remained = remained.sub(_pending); pending = pending.add(_pending); } if (pending > 0) { require(availableRewardTokens() >= pending, "Insufficient reward tokens"); lockup.totalStaked = lockup.totalStaked.sub(pending); user.totalStaked = user.totalStaked.sub(pending); uint256 fee; if (lockup.withdrawFee > 0) { fee = pending.mul(lockup.withdrawFee).div(10000); if(fee > 0){ if(lockup.withdrawFeeReverse == false){ IERC20(stakingToken).safeTransfer(walletA, fee); pending = pending.sub(fee); } else { pending = pending.add(fee); } } } IERC20(stakingToken).safeTransfer(address(msg.sender), pending); emit Withdraw(msg.sender, _stakeType, pending, lockup.withdrawFee, lockup.withdrawFeeReverse, fee); } } /* +++ */ function _claimReward(uint8 _stakeType, uint256 _amount) internal returns (uint256){ require(isInitialized, "Not initialized"); require(startBlock > 0, "Pool not started"); require(_amount > 0, "Amount should be greator than 0"); require(_stakeType < lockups.length, "Invalid stake type"); UserInfo storage user = userStaked[msg.sender][_stakeType]; Stake[] storage stakes = userStakes[msg.sender]; Lockup storage lockup = lockups[_stakeType]; //calc user and lockup reward _calcUserLockupReward(_stakeType); //calc stake reward _calcStakeReward(_stakeType); uint256 remained = _amount; uint256 pending = 0; for (uint256 j = 0; j < stakes.length; j++) { Stake storage stake = stakes[j]; if (stake.stakeType != _stakeType) continue; // if (stake.amount == 0) continue; if (_getSlot() <= stake.end) continue; uint256 _pending = stake.earned.sub(stake.compounded).sub(stake.withdrawn); if (_pending > remained) { _pending = remained; } remained = remained.sub(_pending); pending = pending.add(_pending); stake.withdrawn = stake.withdrawn + _pending; if (remained == 0) { break; } } if (pending > 0) { require(availableRewardTokens() >= pending, "Insufficient reward tokens"); IERC20(stakingToken).safeTransfer(address(msg.sender), pending); lockup.totalWithdrawn = lockup.totalWithdrawn + pending; user.totalWithdrawn = user.totalWithdrawn + pending; emit Withdraw(msg.sender, _stakeType, pending, lockup.withdrawFee, lockup.withdrawFeeReverse, 0); } return pending; } /* +++ */ function claimReward(uint8 _stakeType) external payable nonReentrant { require(isInitialized, "Not initialized"); require(startBlock > 0, "Pool not started"); require(_stakeType < lockups.length, "Invalid stake type"); _claimReward(_stakeType, MAX_INT); } /* +++ */ function claimReward(uint8 _stakeType, uint256 _amount) external payable nonReentrant { require(isInitialized, "Not initialized"); require(startBlock > 0, "Pool not started"); require(_stakeType < lockups.length, "Invalid stake type"); _claimReward(_stakeType, _amount); } /* +++ */ function compoundReward(uint8 _stakeType) external payable nonReentrant { require(isInitialized, "Not initialized"); require(startBlock > 0, "Pool not started"); require(_stakeType < lockups.length, "Invalid stake type"); UserInfo storage user = userStaked[msg.sender][_stakeType]; Stake[] storage stakes = userStakes[msg.sender]; Lockup storage lockup = lockups[_stakeType]; //calc user and lockup reward _calcUserLockupReward(_stakeType); //calc stake reward _calcStakeReward(_stakeType); uint256 pending = 0; for (uint256 j = 0; j < stakes.length; j++) { Stake storage stake = stakes[j]; if (stake.stakeType != _stakeType) continue; // if (stake.staked == 0) continue; uint256 _pending = stake.earned.sub(stake.compounded).sub(stake.withdrawn); pending = pending.add(_pending); stake.staked = stake.staked.add(_pending); stake.compounded = stake.compounded.add(_pending); } if (pending > 0) { user.totalStaked = user.totalStaked.add(pending); user.totalCompounded = user.totalCompounded.add(pending); lockup.totalStaked = lockup.totalStaked.add(pending); lockup.totalCompounded = lockup.totalCompounded.add(pending); emit Deposit(msg.sender, _stakeType, pending, lockup.depositFee, lockup.depositFeeReverse, 0); } } /* +++ */ function _calcUserLockupReward(uint8 _stakeType) internal { require(isInitialized, "Not initialized"); require(startBlock > 0, "Pool not started"); require(_stakeType < lockups.length, "Invalid stake type"); Lockup storage lockup = lockups[_stakeType]; UserInfo storage user = userStaked[msg.sender][_stakeType]; uint256 currentSlot = _getSlot(); uint256 rate; uint256 pending; rate = _getRate(lockup.rate).mul(_getMultiplier(lockup.lastRewardBlock, currentSlot)); pending = lockup.totalStaked.mul(rate).div(10 ** 24); lockup.totalEarned = lockup.totalEarned + pending; lockup.lastRewardBlock = currentSlot; rate = _getRate(lockup.rate).mul(_getMultiplier(user.lastRewardBlock, currentSlot)); pending = user.totalStaked.mul(rate).div(10 ** 24); user.totalEarned = user.totalEarned + pending; user.lastRewardBlock = currentSlot; } /* +++ */ function _calcStakeReward(uint8 _stakeType) internal { require(isInitialized, "Not initialized"); require(startBlock > 0, "Pool not started"); require(_stakeType < lockups.length, "Invalid stake type"); Stake[] storage stakes = userStakes[msg.sender]; Lockup storage lockup = lockups[_stakeType]; uint256 currentSlot = _getSlot(); uint256 rate; uint256 pending; for (uint256 j = 0; j < stakes.length; j++) { Stake storage stake = stakes[j]; if (stake.stakeType != _stakeType) continue; if (stake.staked == 0) continue; rate = _getRate(lockup.rate).mul(_getMultiplier(stake.lastRewardBlock, currentSlot)); pending = stake.staked.mul(rate).div(10 ** 24); stake.earned = stake.earned.add(pending); stake.lastRewardBlock = currentSlot; } } /* +++ * @notice Withdraw staked tokens without caring about rewards * @dev Needs to be for emergency. */ function emergencyWithdraw(uint8 _stakeType) external nonReentrant { require(isInitialized, "Not initialized"); require(startBlock > 0, "Pool not started"); require(_stakeType < lockups.length, "Invalid stake type"); UserInfo storage user = userStaked[msg.sender][_stakeType]; Stake[] storage stakes = userStakes[msg.sender]; Lockup storage lockup = lockups[_stakeType]; //calc user and lockup reward _calcUserLockupReward(_stakeType); //calc stake reward _calcStakeReward(_stakeType); uint256 amountToTransfer = 0; uint256 totalStaked = 0; uint256 totalCompounded = 0; uint256 totalEarned = 0; for (uint256 j = 0; j < stakes.length; j++) { Stake storage stake = stakes[j]; if (stake.stakeType != _stakeType) continue; if (stake.staked == 0) continue; if (_getSlot() > stake.end) continue; amountToTransfer = amountToTransfer.add(stake.staked).sub(stake.compounded); totalStaked = totalStaked.add(stake.staked); totalCompounded = totalCompounded.add(stake.compounded); totalEarned = totalEarned.add(stake.earned); stake.staked = 0; stake.earned = 0; stake.withdrawn = 0; stake.compounded = 0; } if (amountToTransfer > 0) { lockup.totalStaked = lockup.totalStaked.sub(totalStaked); lockup.totalEarned = lockup.totalEarned.sub(totalEarned); lockup.totalCompounded = lockup.totalCompounded.sub(totalCompounded); user.totalStaked = user.totalStaked.sub(totalStaked); user.totalEarned = user.totalEarned.sub(totalEarned); user.totalCompounded = user.totalCompounded.sub(totalCompounded); IERC20(stakingToken).safeTransfer(address(msg.sender), amountToTransfer); } emit EmergencyWithdraw(msg.sender, amountToTransfer); } /* +++ */ function rewardPerStakeType(uint8 _stakeType) public view returns (uint256) { if (_stakeType >= lockups.length) return 0; return lockups[_stakeType].rate; } /** +++ * @notice Available amount of reward token */ function availableRewardTokens() public view returns (uint256) { uint256 _amount = IERC20(stakingToken).balanceOf(address(this)); uint256 reserved; // for (uint256 j = 0; j < lockups.length; j++) { // Lockup storage lockup = lockups[j]; // reserved = reserved.add(lockup.totalStaked + lockup.totalEarned - lockup.totalCompounded - lockup.totalWithdrawn); // } if (_amount > reserved) return _amount.sub(reserved); else return 0; } /* +++ */ function userInfo(uint8 _stakeType, address _account) public view returns (uint256 amount, uint256 available, uint256 locked) { Stake[] storage stakes = userStakes[_account]; for (uint256 i = 0; i < stakes.length; i++) { Stake storage stake = stakes[i]; if (stake.stakeType != _stakeType) continue; if (stake.staked == 0) continue; amount = amount.add(stake.staked); if (_getSlot() > stake.end) { available = available.add(stake.staked); } else { locked = locked.add(stake.staked); } } } /* +++ * @notice View function to see pending reward on frontend. * @param _user: user address * @return Pending reward for a given user */ function pendingReward(address _account, uint8 _stakeType) external view returns (uint256) { if (_stakeType >= lockups.length) return 0; if (startBlock == 0) return 0; Stake[] storage stakes = userStakes[_account]; Lockup storage lockup = lockups[_stakeType]; if (lockup.totalStaked == 0) return 0; uint256 pending = 0; for (uint256 i = 0; i < stakes.length; i++) { Stake storage stake = stakes[i]; if (stake.stakeType != _stakeType) continue; // if (stake.staked == 0) continue; pending = pending.add(stake.earned - stake.compounded - stake.withdrawn); uint256 rate = _getRate(lockup.rate).mul(_getMultiplier(stake.lastRewardBlock, _getSlot())); uint256 reward = stake.staked.mul(rate).div(10 ** 24); pending = pending.add(reward); } return pending; } /* +++ * @notice Deposit reward token * @dev Only call by owner. Needs to be for deposit of reward token. */ function depositRewards(uint _amount) external onlyOwner nonReentrant { require(_amount > 0); uint256 beforeAmt = IERC20(stakingToken).balanceOf(address(this)); IERC20(stakingToken).safeTransferFrom(msg.sender, address(this), _amount); uint256 afterAmt = IERC20(stakingToken).balanceOf(address(this)); totalEarnedTokenDeposed = totalEarnedTokenDeposed.add(afterAmt).sub(beforeAmt); } /* +++ * @notice It allows the admin to recover wrong tokens sent to the contract */ function recoverWrongTokens(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { uint256 reserved; if (_tokenAddress == stakingToken) { for (uint256 j = 0; j < lockups.length; j++) { Lockup storage lockup = lockups[j]; reserved = reserved.add(lockup.totalStaked + lockup.totalEarned - lockup.totalCompounded - lockup.totalWithdrawn); } } if (reserved > 0) { uint256 tokenBal = IERC20(_tokenAddress).balanceOf(address(this)); require(_tokenAmount <= tokenBal.sub(reserved), "Insufficient balance"); } if (_tokenAddress == address(0x0)) { payable(msg.sender).transfer(_tokenAmount); } else { IERC20(_tokenAddress).safeTransfer(address(msg.sender), _tokenAmount); } emit AdminTokenRecovered(_tokenAddress, _tokenAmount); } /* +++ */ function startReward() external onlyOwner { require(startBlock == 0, "Pool was already started"); startBlock = _getSlot().add(1); bonusEndBlock = startBlock.add(duration.mul(DAY_LENGTH / slot)); emit NewStartAndEndBlocks(startBlock, bonusEndBlock); } /* +++ */ function stopReward() external onlyOwner { bonusEndBlock = _getSlot(); } /* +++ * @notice Update pool * @dev Only callable by owner. */ function updatePoolLimitPerUser(bool _hasUserLimit, uint256 _poolLimitPerUser) external onlyOwner { hasUserLimit = _hasUserLimit; if (_hasUserLimit) { poolLimitPerUser = _poolLimitPerUser; } else { poolLimitPerUser = 0; } emit NewPoolLimit(hasUserLimit, poolLimitPerUser); } /* +++ */ function updateLockup(uint8 _stakeType, uint256 _duration, uint256 _depositFee, uint256 _withdrawFee, uint256 _rate, bool _depositFeeReverse, bool _withdrawFeeReverse) external onlyOwner { require(_stakeType < lockups.length, "Lockup Not found"); require(_depositFee < 2000, "Invalid deposit fee"); require(_withdrawFee < 2000, "Invalid withdraw fee"); Lockup storage _lockup = lockups[_stakeType]; // require(_lockup.totalStaked == 0, "Lockup already staked"); if(_lockup.totalStaked == 0){ _lockup.duration = _duration; _lockup.rate = _rate; } _lockup.depositFee = _depositFee; _lockup.withdrawFee = _withdrawFee; _lockup.depositFeeReverse = _depositFeeReverse; _lockup.withdrawFeeReverse = _withdrawFeeReverse; emit LockupUpdated(_stakeType, _lockup.duration, _depositFee, _withdrawFee, _lockup.rate, _depositFeeReverse, _withdrawFeeReverse); } /* +++ */ function addLockup(uint256 _duration, uint256 _depositFee, uint256 _withdrawFee, uint256 _rate, bool _depositFeeReverse, bool _withdrawFeeReverse) external onlyOwner { require(_depositFee < 2000, "Invalid deposit fee"); require(_withdrawFee < 2000, "Invalid withdraw fee"); lockups.push(); Lockup storage _lockup = lockups[lockups.length - 1]; _lockup.duration = _duration; _lockup.depositFee = _depositFee; _lockup.withdrawFee = _withdrawFee; _lockup.rate = _rate; _lockup.depositFeeReverse = _depositFeeReverse; _lockup.withdrawFeeReverse = _withdrawFeeReverse; emit LockupUpdated(uint8(lockups.length - 1), _duration, _depositFee, _withdrawFee, _rate, _depositFeeReverse, _withdrawFeeReverse); } /* +++ */ function setDuration(uint256 _duration) external onlyOwner { require(startBlock == 0, "Pool was already started"); require(_duration >= 30, "lower limit reached"); duration = _duration; emit DurationUpdated(_duration); } /* +++ */ function setSettings( address _feeAddr ) external onlyOwner { require(_feeAddr != address(0x0), "Invalid Address"); walletA = _feeAddr; emit SetSettings(_feeAddr); } /* +++ * @notice Return reward rate per slot. */ function _getRate(uint256 _rate) internal view returns (uint256) { uint256 rate = _rate.mul(10 ** 20).div(365).div(DAY_LENGTH / slot); return rate; } /* +++ * @notice Return reward multiplier over the given _from to _to block. */ function _getMultiplier(uint256 _from, uint256 _to) internal view returns (uint256) { if (_from >= bonusEndBlock) { return 0; } else if (_to <= bonusEndBlock) { return _to.sub(_from); } else { return bonusEndBlock.sub(_from); } } /* +++ */ function _getSlot() internal view returns (uint256 _slot) { _slot = block.timestamp.div(slot); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenRecovered","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"depositFeeReverse","type":"bool"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"DurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_type","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rate","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_depositFeeReverse","type":"bool"},{"indexed":false,"internalType":"bool","name":"_withdrawFeeReverse","type":"bool"}],"name":"LockupUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"hasUserLimit","type":"bool"},{"indexed":false,"internalType":"uint256","name":"poolLimitPerUser","type":"uint256"}],"name":"NewPoolLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewStartAndEndBlocks","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"RewardsStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_walletA","type":"address"}],"name":"SetSettings","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"depositFeeReverse","type":"bool"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"},{"internalType":"uint256","name":"_withdrawFee","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"bool","name":"_depositFeeReverse","type":"bool"},{"internalType":"bool","name":"_withdrawFeeReverse","type":"bool"}],"name":"addLockup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableRewardTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"claimReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"compoundReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasUserLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockups","outputs":[{"internalType":"uint8","name":"stakeType","type":"uint8"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"depositFee","type":"uint256"},{"internalType":"uint256","name":"withdrawFee","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalEarned","type":"uint256"},{"internalType":"uint256","name":"totalCompounded","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn","type":"uint256"},{"internalType":"bool","name":"depositFeeReverse","type":"bool"},{"internalType":"bool","name":"withdrawFeeReverse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverWrongTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"rewardPerStakeType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddr","type":"address"}],"name":"setSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"},{"internalType":"uint256","name":"_withdrawFee","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"bool","name":"_depositFeeReverse","type":"bool"},{"internalType":"bool","name":"_withdrawFeeReverse","type":"bool"}],"name":"updateLockup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasUserLimit","type":"bool"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"}],"name":"updatePoolLimitPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalEarned","type":"uint256"},{"internalType":"uint256","name":"totalCompounded","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userStakes","outputs":[{"internalType":"uint8","name":"stakeType","type":"uint8"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"},{"internalType":"uint256","name":"earned","type":"uint256"},{"internalType":"uint256","name":"compounded","type":"uint256"},{"internalType":"uint256","name":"withdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"walletA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001d3362000027565b6001805562000077565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613b8280620000876000396000f3fe6080604052600436106101fd5760003560e01c806378d57eea1161010d57806392e8990e116100a0578063b5d5b5fa1161006f578063b5d5b5fa14610628578063b77e7da014610687578063f2fde38b146106a7578063f6be71d1146106c7578063fbe32b35146106e757600080fd5b806392e8990e146105b95780639f94e272146105d3578063a01d3c2c146105e8578063a0b409051461060857600080fd5b80638da5cb5b116100dc5780638da5cb5b146104695780638e6f4fb71461049b5780638fa2ecf51461051c578063903d42961461059957600080fd5b806378d57eea146104015780637a1ac61e1461041457806380dc0672146104345780638bdf67f21461044957600080fd5b806348cd4cb111610190578063689f16231161015f578063689f1623146103695780636a277fb31461037c578063715018a61461039c578063746c8ae1146103b157806376fa17d2146103c657600080fd5b806348cd4cb11461030a57806353f7ffd214610320578063654cfdff1461033357806366fe9f8a1461035357600080fd5b80631aed6553116101cc5780631aed65531461028a5780632ee37d41146102a0578063392e53cd146102c05780633f138d4b146102ea57600080fd5b806302cffc0a146102095780630fb5a6b41461023c578063155622a4146102525780631a88bc661461027457600080fd5b3661020457005b600080fd5b34801561021557600080fd5b506102296102243660046136f0565b610707565b6040519081526020015b60405180910390f35b34801561024857600080fd5b5061022960035481565b34801561025e57600080fd5b5061027261026d3660046136f0565b61074d565b005b34801561028057600080fd5b5061022960045481565b34801561029657600080fd5b5061022960085481565b3480156102ac57600080fd5b506102726102bb366004613719565b610a3e565b3480156102cc57600080fd5b506002546102da9060ff1681565b6040519015158152602001610233565b3480156102f657600080fd5b506102726103053660046137a0565b610c08565b34801561031657600080fd5b5061022960075481565b61027261032e3660046137ca565b610e10565b34801561033f57600080fd5b5061027261034e3660046137e6565b610eb2565b34801561035f57600080fd5b5061022960065481565b6102726103773660046136f0565b61126a565b34801561038857600080fd5b50610272610397366004613812565b61130d565b3480156103a857600080fd5b50610272611496565b3480156103bd57600080fd5b506102726114aa565b3480156103d257600080fd5b506103e66103e1366004613870565b611585565b60408051938452602084019290925290820152606001610233565b61027261040f3660046136f0565b611665565b34801561042057600080fd5b5061027261042f36600461389a565b6118d6565b34801561044057600080fd5b50610272612136565b34801561045557600080fd5b506102726104643660046138cd565b61214b565b34801561047557600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610233565b3480156104a757600080fd5b506104bb6104b63660046138cd565b6122a0565b6040805160ff909d168d5260208d019b909b52998b019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501526101208401521515610140830152151561016082015261018001610233565b34801561052857600080fd5b506105716105373660046138e6565b600e602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610233565b3480156105a557600080fd5b506102726105b43660046137e6565b61231c565b3480156105c557600080fd5b506005546102da9060ff1681565b3480156105df57600080fd5b506102296126df565b3480156105f457600080fd5b50610272610603366004613910565b612774565b34801561061457600080fd5b5061027261062336600461392b565b612819565b34801561063457600080fd5b506106486106433660046137a0565b612897565b6040805160ff90991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610233565b34801561069357600080fd5b50600954610483906001600160a01b031681565b3480156106b357600080fd5b506102726106c2366004613910565b6128fd565b3480156106d357600080fd5b506102726106e23660046138cd565b612976565b3480156106f357600080fd5b506102296107023660046138e6565b612a45565b600c5460009060ff83161061071e57506000919050565b600c8260ff168154811061073457610734613949565b90600052602060002090600b0201600401549050919050565b6002600154036107785760405162461bcd60e51b815260040161076f9061395f565b60405180910390fd5b600260018190555460ff1661079f5760405162461bcd60e51b815260040161076f90613996565b6000600754116107c15760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106107e55760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061082557610825613949565b90600052602060002090600b0201905061083e84612bb3565b61084784612d17565b60008060008060005b865481101561096457600087828154811061086d5761086d613949565b60009182526020909120600890910201805490915060ff8b81169116146108945750610952565b80600401546000036108a65750610952565b80600201546108b3612e9e565b11156108bf5750610952565b6108e481600601546108de836004015489612eba90919063ffffffff16565b90612ecd565b95506108fd816004015486612eba90919063ffffffff16565b9450610916816006015485612eba90919063ffffffff16565b935061092f816005015484612eba90919063ffffffff16565b600060048301819055600583018190556007830181905560069092019190915591505b8061095c81613a2b565b915050610850565b5083156109fa57600685015461097a9084612ecd565b6006860155600785015461098e9082612ecd565b600786015560088501546109a29083612ecd565b600886015560018701546109b69084612ecd565b600188015560028701546109ca9082612ecd565b600288015560038701546109de9083612ecd565b6003880155600a546109fa906001600160a01b03163386612ed9565b60405184815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695906020015b60405180910390a2505060018055505050505050565b610a46612f41565b600c5460ff881610610a8d5760405162461bcd60e51b815260206004820152601060248201526f131bd8dadd5c08139bdd08199bdd5b9960821b604482015260640161076f565b6107d08510610ad45760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706f7369742066656560681b604482015260640161076f565b6107d08410610b1c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642077697468647261772066656560601b604482015260640161076f565b6000600c8860ff1681548110610b3457610b34613949565b90600052602060002090600b020190508060060154600003610b5f5760018101879055600481018490555b6002810186905560038101859055600a81018054831515610100810261ff001987151590811661ffff199094169390931717909255600183015460048401546040805160ff8e168152602081019390935282018a905260608201899052608082015260a081019190915260c08101919091527ffed2bed01df3e3b626df9ce252cf51b567dd316bdf4d4551802dd0e619b3a9e19060e00160405180910390a15050505050505050565b610c10612f41565b600a546000906001600160a01b0390811690841603610caf5760005b600c54811015610cad576000600c8281548110610c4b57610c4b613949565b90600052602060002090600b02019050610c978160090154826008015483600701548460060154610c7c9190613a44565b610c869190613a57565b610c909190613a57565b8490612eba565b9250508080610ca590613a2b565b915050610c2c565b505b8015610d74576040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d209190613a6a565b9050610d2c8183612ecd565b831115610d725760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161076f565b505b6001600160a01b038316610db557604051339083156108fc029084906000818181858888f19350505050158015610daf573d6000803e3d6000fd5b50610dc9565b610dc96001600160a01b0384163384612ed9565b604080516001600160a01b0385168152602081018490527f74f5dcd55c394cb1c6d3b9da22c2464bcc46c38cc3865bd629ed75823249b40b910160405180910390a1505050565b600260015403610e325760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff16610e595760405162461bcd60e51b815260040161076f90613996565b600060075411610e7b5760405162461bcd60e51b815260040161076f906139bf565b600c5460ff831610610e9f5760405162461bcd60e51b815260040161076f906139e9565b610ea98282612f9b565b50506001805550565b600260015403610ed45760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff16610efb5760405162461bcd60e51b815260040161076f90613996565b600060075411610f1d5760405162461bcd60e51b815260040161076f906139bf565b60008211610f6d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161076f565b600c5460ff821610610f915760405162461bcd60e51b815260040161076f906139e9565b336000908152600e6020908152604080832060ff851680855292528220600c805491939290918110610fc557610fc5613949565b90600052602060002090600b02019050610fde83612bb3565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190613a6a565b600a54909150611066906001600160a01b03163330886132af565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d39190613a6a565b905060006110e18284612ecd565b60055490915060ff1615611150576006546001860154611102908390612eba565b11156111505760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d6974000000000000000000604482015260640161076f565b6002840154600090156111d45761118061271061117a8760020154856132ed90919063ffffffff16565b906132f9565b905080156111d457600a85015460ff1615156000036111c757600954600a546111b6916001600160a01b03918216911683612ed9565b6111c08282612ecd565b91506111d4565b6111d18282612eba565b91505b6111e48733876001015485613305565b60018601546111f39083612eba565b600187015560068501546112079083612eba565b60068601556002850154600a8601546040805160ff808c168252602082018790529181019390935216151560608201526080810182905233907fd8d55df1c6c8df43b677eb6bc8ab5fe3554d521c8acb973089382f50ade2bab59060a001610a28565b60026001540361128c5760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166112b35760405162461bcd60e51b815260040161076f90613996565b6000600754116112d55760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106112f95760405162461bcd60e51b815260040161076f906139e9565b61130581600019612f9b565b505060018055565b611315612f41565b6107d0851061135c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706f7369742066656560681b604482015260640161076f565b6107d084106113a45760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642077697468647261772066656560601b604482015260640161076f565b600c80546001908101808355600083815292916113c091613a57565b815481106113d0576113d0613949565b60009182526020909120600b909102016001818101899055600282018890556003820187905560048201869055600a8201805461ffff191686151561ff0019161761010086151502179055600c549192507ffed2bed01df3e3b626df9ce252cf51b567dd316bdf4d4551802dd0e619b3a9e19161144d9190613a57565b6040805160ff9092168252602082018a90528101889052606081018790526080810186905284151560a082015283151560c082015260e00160405180910390a150505050505050565b61149e612f41565b6114a860006133df565b565b6114b2612f41565b600754156114fd5760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b604482015260640161076f565b611510600161150a612e9e565b90612eba565b60075560045461153d906115349061152b9062015180613a83565b600354906132ed565b60075490612eba565b60088190556007546040517f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069261157b928252602082015260400190565b60405180910390a1565b6001600160a01b0381166000908152600d6020526040812081908190815b815481101561165c5760008282815481106115c0576115c0613949565b60009182526020909120600890910201805490915060ff8981169116146115e7575061164a565b80600401546000036115f9575061164a565b6004810154611609908790612eba565b95508060020154611618612e9e565b111561163557600481015461162e908690612eba565b9450611648565b6004810154611645908590612eba565b93505b505b8061165481613a2b565b9150506115a3565b50509250925092565b6002600154036116875760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166116ae5760405162461bcd60e51b815260040161076f90613996565b6000600754116116d05760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106116f45760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061173457611734613949565b90600052602060002090600b0201905061174d84612bb3565b61175684612d17565b6000805b835481101561181257600084828154811061177757611777613949565b60009182526020909120600890910201805490915060ff88811691161461179e5750611800565b60006117c382600701546108de84600601548560050154612ecd90919063ffffffff16565b90506117cf8482612eba565b60048301549094506117e19082612eba565b600483015560068201546117f59082612eba565b826006018190555050505b8061180a81613a2b565b91505061175a565b5080156118cb5760018401546118289082612eba565b6001850155600384015461183c9082612eba565b600385015560068201546118509082612eba565b600683015560088201546118649082612eba565b60088301556002820154600a8301546040805160ff808a168252602082018690529181019390935216151560608201526000608082015233907fd8d55df1c6c8df43b677eb6bc8ab5fe3554d521c8acb973089382f50ade2bab59060a00160405180910390a25b505060018055505050565b6118de612f41565b60025460ff16156119275760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161076f565b6001821015801561193b5750620151808211155b6119795760405162461bcd60e51b815260206004820152600f60248201526e496e636f727265637420736c6f742160881b604482015260640161076f565b62015180826119888183613a83565b6119929190613aa5565b146119d15760405162461bcd60e51b815260206004820152600f60248201526e496e636f727265637420736c6f742160881b604482015260640161076f565b60008111611a175760405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206475726174696f6e2160681b604482015260640161076f565b81600481905550806003819055506001600260006101000a81548160ff02191690831515021790555082600a60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555033600960006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c604051806101800160405280600060ff168152602001600081526020016000815260200160c881526020016105dc815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600160ff16815260200162278d00815260200160008152602001600081526020016109c4815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600260ff1681526020016276a70081526020016000815260200160008152602001610fa0815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600360ff16815260200162ed4e0081526020016000815260200160008152602001611388815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600460ff1681526020016301da9c0081526020016000815260200160008152602001611770815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050505050565b61213e612f41565b612146612e9e565b600855565b612153612f41565b6002600154036121755760405162461bcd60e51b815260040161076f9061395f565b60026001558061218457600080fd5b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190613a6a565b600a5490915061220c906001600160a01b03163330856132af565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122799190613a6a565b9050612294826108de83600b54612eba90919063ffffffff16565b600b5550506001805550565b600c81815481106122b057600080fd5b60009182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a015460ff998a169b5097999698959794969395929491939092909180821691610100909104168c565b60026001540361233e5760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166123655760405162461bcd60e51b815260040161076f90613996565b6000600754116123875760405162461bcd60e51b815260040161076f906139bf565b600082116123d75760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e203000604482015260640161076f565b600c5460ff8216106123fb5760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061243b5761243b613949565b600091825260208220600b90910201915085906124588683612f9b565b905081811061246a5760009150612477565b6124748282612ecd565b91505b6000805b855481101561254857600086828154811061249857612498613949565b60009182526020909120600890910201805490915060ff8a81169116146124bf5750612536565b80600401546000036124d15750612536565b80600201546124de612e9e565b116124e95750612536565b846000036124f75750612548565b6004810154858111156125075750845b60048201546125169082612ecd565b60048301556125258682612ecd565b95506125318482612eba565b935050505b8061254081613a2b565b91505061247b565b5080156126d157806125586126df565b10156125a65760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604482015260640161076f565b60068401546125b59082612ecd565b600685015560018601546125c99082612ecd565b6001870155600384015460009015612651576125f861271061117a8760030154856132ed90919063ffffffff16565b9050801561265157600a850154610100900460ff16151560000361264457600954600a54612633916001600160a01b03918216911683612ed9565b61263d8282612ecd565b9150612651565b61264e8282612eba565b91505b600a54612668906001600160a01b03163384612ed9565b6003850154600a8601546040805160ff808d168252602082018790529181019390935261010090910416151560608201526080810182905233907f6fc339a1802fa2084c1e0ee155517a99c78b03e21a71582fe048f318a84599849060a00160405180910390a2505b505060018055505050505050565b600a546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561272c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127509190613a6a565b90506000811561276b576127648282612ecd565b9250505090565b60009250505090565b61277c612f41565b6001600160a01b0381166127c45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015260640161076f565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f51e75be93503449807046766a7c53e9e4563efe11aff3833d7975190b5686d63906020015b60405180910390a150565b612821612f41565b6005805460ff19168315801591909117909155612842576006819055612848565b60006006555b6005546006546040517f6d8e269443e5f2ffc1c2f09adbc884cd839ef06bfaf781503a474d1df30074d89261288b9260ff90911615158252602082015260400190565b60405180910390a15050565b600d60205281600052604060002081815481106128b357600080fd5b60009182526020909120600890910201805460018201546002830154600384015460048501546005860154600687015460079097015460ff90961698509396509194909391929188565b612905612f41565b6001600160a01b03811661296a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b612973816133df565b50565b61297e612f41565b600754156129c95760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b604482015260640161076f565b601e811015612a105760405162461bcd60e51b81526020600482015260136024820152721b1bddd95c881b1a5b5a5d081c995858da1959606a1b604482015260640161076f565b60038190556040518181527f91abcc2d6823e3a3f11d31b208dd3065d2c6a791f1c7c9fe96a42ce12897eac59060200161280e565b600c5460009060ff831610612a5c57506000612bad565b600754600003612a6e57506000612bad565b6001600160a01b0383166000908152600d60205260408120600c805491929160ff8616908110612aa057612aa0613949565b90600052602060002090600b020190508060060154600003612ac757600092505050612bad565b6000805b8354811015612ba7576000848281548110612ae857612ae8613949565b60009182526020909120600890910201805490915060ff888116911614612b0f5750612b95565b612b2b816007015482600601548360050154610c869190613a57565b92506000612b5a612b478360030154612b42612e9e565b61342f565b612b548760040154613469565b906132ed565b90506000612b8369d3c21bcecceda100000061117a8486600401546132ed90919063ffffffff16565b9050612b8f8582612eba565b94505050505b80612b9f81613a2b565b915050612acb565b50925050505b92915050565b60025460ff16612bd55760405162461bcd60e51b815260040161076f90613996565b600060075411612bf75760405162461bcd60e51b815260040161076f906139bf565b600c5460ff821610612c1b5760405162461bcd60e51b815260040161076f906139e9565b6000600c8260ff1681548110612c3357612c33613949565b60009182526020808320338452600e8252604080852060ff88168652909252908320600b90920201925090612c66612e9e565b9050600080612c7c612b4786600501548561342f565b9150612ca369d3c21bcecceda100000061117a8488600601546132ed90919063ffffffff16565b9050808560070154612cb59190613a44565b6007860155600585018390558354612cd190612b47908561342f565b9150612cf869d3c21bcecceda100000061117a8487600101546132ed90919063ffffffff16565b9050808460020154612d0a9190613a44565b6002850155505090555050565b60025460ff16612d395760405162461bcd60e51b815260040161076f90613996565b600060075411612d5b5760405162461bcd60e51b815260040161076f906139bf565b600c5460ff821610612d7f5760405162461bcd60e51b815260040161076f906139e9565b336000908152600d60205260408120600c805491929160ff8516908110612da857612da8613949565b90600052602060002090600b020190506000612dc2612e9e565b905060008060005b8554811015612e95576000868281548110612de757612de7613949565b60009182526020909120600890910201805490915060ff898116911614612e0e5750612e83565b8060040154600003612e205750612e83565b612e3e612e3182600301548761342f565b612b548860040154613469565b9350612e6569d3c21bcecceda100000061117a8684600401546132ed90919063ffffffff16565b6005820154909350612e779084612eba565b60058201556003018490555b80612e8d81613a2b565b915050612dca565b50505050505050565b6000612eb5600454426132f990919063ffffffff16565b905090565b6000612ec68284613a44565b9392505050565b6000612ec68284613a57565b6040516001600160a01b038316602482015260448101829052612f3c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613497565b505050565b6000546001600160a01b031633146114a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60025460009060ff16612fc05760405162461bcd60e51b815260040161076f90613996565b600060075411612fe25760405162461bcd60e51b815260040161076f906139bf565b600082116130325760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e203000604482015260640161076f565b600c5460ff8416106130565760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8816808552908352818420948452600d9092528220600c80549193929091811061309657613096613949565b90600052602060002090600b020190506130af86612bb3565b6130b886612d17565b846000805b845481101561319d5760008582815481106130da576130da613949565b60009182526020909120600890910201805490915060ff8b8116911614613101575061318b565b806002015461310e612e9e565b11613119575061318b565b600061313e82600701546108de84600601548560050154612ecd90919063ffffffff16565b90508481111561314b5750835b6131558582612ecd565b94506131618482612eba565b93508082600701546131739190613a44565b6007830155600085900361318857505061319d565b50505b8061319581613a2b565b9150506130bd565b5080156132a457806131ad6126df565b10156131fb5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604482015260640161076f565b600a54613212906001600160a01b03163383612ed9565b8083600901546132229190613a44565b60098401556004850154613237908290613a44565b60048601556003830154600a8401546040805160ff808d168252602082018690529181019390935261010090910416151560608201526000608082015233907f6fc339a1802fa2084c1e0ee155517a99c78b03e21a71582fe048f318a84599849060a00160405180910390a25b979650505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526132e79085906323b872dd60e01b90608401612f05565b50505050565b6000612ec68284613aa5565b6000612ec68284613a83565b6001600160a01b0383166000908152600d602052604081206004549091906133319061117a4287612eba565b825490915061080081106133745760405162461bcd60e51b815260206004820152600a6024820152694d6178207374616b657360b01b604482015260640161076f565b825460010180845560008481529084908390811061339457613394613949565b60009182526020909120600890910201805460ff191660ff8a1617815560018101879055600281018490556004810186905590506133d0612e9e565b60039091015550505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600854831061344257506000612bad565b600854821161345c576134558284612ecd565b9050612bad565b6008546134559084612ecd565b600080612ec6600454620151806134809190613a83565b61117a61016d818768056bc75e2d631000006132ed565b60006134ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135699092919063ffffffff16565b805190915015612f3c578080602001905181019061350a9190613abc565b612f3c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161076f565b60606135788484600085613580565b949350505050565b6060824710156135e15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161076f565b6001600160a01b0385163b6136385760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076f565b600080866001600160a01b031685876040516136549190613afd565b60006040518083038185875af1925050503d8060008114613691576040519150601f19603f3d011682016040523d82523d6000602084013e613696565b606091505b50915091506132a4828286606083156136b0575081612ec6565b8251156136c05782518084602001fd5b8160405162461bcd60e51b815260040161076f9190613b19565b803560ff811681146136eb57600080fd5b919050565b60006020828403121561370257600080fd5b612ec6826136da565b801515811461297357600080fd5b600080600080600080600060e0888a03121561373457600080fd5b61373d886136da565b96506020880135955060408801359450606088013593506080880135925060a08801356137698161370b565b915060c08801356137798161370b565b8091505092959891949750929550565b80356001600160a01b03811681146136eb57600080fd5b600080604083850312156137b357600080fd5b6137bc83613789565b946020939093013593505050565b600080604083850312156137dd57600080fd5b6137bc836136da565b600080604083850312156137f957600080fd5b82359150613809602084016136da565b90509250929050565b60008060008060008060c0878903121561382b57600080fd5b8635955060208701359450604087013593506060870135925060808701356138528161370b565b915060a08701356138628161370b565b809150509295509295509295565b6000806040838503121561388357600080fd5b61388c836136da565b915061380960208401613789565b6000806000606084860312156138af57600080fd5b6138b884613789565b95602085013595506040909401359392505050565b6000602082840312156138df57600080fd5b5035919050565b600080604083850312156138f957600080fd5b61390283613789565b9150613809602084016136da565b60006020828403121561392257600080fd5b612ec682613789565b6000806040838503121561393e57600080fd5b82356137bc8161370b565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e139bdd081a5b9a5d1a585b1a5e9959608a1b604082015260600190565b60208082526010908201526f141bdbdb081b9bdd081cdd185c9d195960821b604082015260600190565b602080825260129082015271496e76616c6964207374616b65207479706560701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201613a3d57613a3d613a15565b5060010190565b80820180821115612bad57612bad613a15565b81810381811115612bad57612bad613a15565b600060208284031215613a7c57600080fd5b5051919050565b600082613aa057634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417612bad57612bad613a15565b600060208284031215613ace57600080fd5b8151612ec68161370b565b60005b83811015613af4578181015183820152602001613adc565b50506000910152565b60008251613b0f818460208701613ad9565b9190910192915050565b6020815260008251806020840152613b38816040850160208701613ad9565b601f01601f1916919091016040019291505056fea2646970667358221220e8b4a903c6f727e8613c18dab2da25cb165ea984372e49bb09265e653b31ce6a64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c806378d57eea1161010d57806392e8990e116100a0578063b5d5b5fa1161006f578063b5d5b5fa14610628578063b77e7da014610687578063f2fde38b146106a7578063f6be71d1146106c7578063fbe32b35146106e757600080fd5b806392e8990e146105b95780639f94e272146105d3578063a01d3c2c146105e8578063a0b409051461060857600080fd5b80638da5cb5b116100dc5780638da5cb5b146104695780638e6f4fb71461049b5780638fa2ecf51461051c578063903d42961461059957600080fd5b806378d57eea146104015780637a1ac61e1461041457806380dc0672146104345780638bdf67f21461044957600080fd5b806348cd4cb111610190578063689f16231161015f578063689f1623146103695780636a277fb31461037c578063715018a61461039c578063746c8ae1146103b157806376fa17d2146103c657600080fd5b806348cd4cb11461030a57806353f7ffd214610320578063654cfdff1461033357806366fe9f8a1461035357600080fd5b80631aed6553116101cc5780631aed65531461028a5780632ee37d41146102a0578063392e53cd146102c05780633f138d4b146102ea57600080fd5b806302cffc0a146102095780630fb5a6b41461023c578063155622a4146102525780631a88bc661461027457600080fd5b3661020457005b600080fd5b34801561021557600080fd5b506102296102243660046136f0565b610707565b6040519081526020015b60405180910390f35b34801561024857600080fd5b5061022960035481565b34801561025e57600080fd5b5061027261026d3660046136f0565b61074d565b005b34801561028057600080fd5b5061022960045481565b34801561029657600080fd5b5061022960085481565b3480156102ac57600080fd5b506102726102bb366004613719565b610a3e565b3480156102cc57600080fd5b506002546102da9060ff1681565b6040519015158152602001610233565b3480156102f657600080fd5b506102726103053660046137a0565b610c08565b34801561031657600080fd5b5061022960075481565b61027261032e3660046137ca565b610e10565b34801561033f57600080fd5b5061027261034e3660046137e6565b610eb2565b34801561035f57600080fd5b5061022960065481565b6102726103773660046136f0565b61126a565b34801561038857600080fd5b50610272610397366004613812565b61130d565b3480156103a857600080fd5b50610272611496565b3480156103bd57600080fd5b506102726114aa565b3480156103d257600080fd5b506103e66103e1366004613870565b611585565b60408051938452602084019290925290820152606001610233565b61027261040f3660046136f0565b611665565b34801561042057600080fd5b5061027261042f36600461389a565b6118d6565b34801561044057600080fd5b50610272612136565b34801561045557600080fd5b506102726104643660046138cd565b61214b565b34801561047557600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610233565b3480156104a757600080fd5b506104bb6104b63660046138cd565b6122a0565b6040805160ff909d168d5260208d019b909b52998b019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501526101208401521515610140830152151561016082015261018001610233565b34801561052857600080fd5b506105716105373660046138e6565b600e602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610233565b3480156105a557600080fd5b506102726105b43660046137e6565b61231c565b3480156105c557600080fd5b506005546102da9060ff1681565b3480156105df57600080fd5b506102296126df565b3480156105f457600080fd5b50610272610603366004613910565b612774565b34801561061457600080fd5b5061027261062336600461392b565b612819565b34801561063457600080fd5b506106486106433660046137a0565b612897565b6040805160ff90991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610233565b34801561069357600080fd5b50600954610483906001600160a01b031681565b3480156106b357600080fd5b506102726106c2366004613910565b6128fd565b3480156106d357600080fd5b506102726106e23660046138cd565b612976565b3480156106f357600080fd5b506102296107023660046138e6565b612a45565b600c5460009060ff83161061071e57506000919050565b600c8260ff168154811061073457610734613949565b90600052602060002090600b0201600401549050919050565b6002600154036107785760405162461bcd60e51b815260040161076f9061395f565b60405180910390fd5b600260018190555460ff1661079f5760405162461bcd60e51b815260040161076f90613996565b6000600754116107c15760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106107e55760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061082557610825613949565b90600052602060002090600b0201905061083e84612bb3565b61084784612d17565b60008060008060005b865481101561096457600087828154811061086d5761086d613949565b60009182526020909120600890910201805490915060ff8b81169116146108945750610952565b80600401546000036108a65750610952565b80600201546108b3612e9e565b11156108bf5750610952565b6108e481600601546108de836004015489612eba90919063ffffffff16565b90612ecd565b95506108fd816004015486612eba90919063ffffffff16565b9450610916816006015485612eba90919063ffffffff16565b935061092f816005015484612eba90919063ffffffff16565b600060048301819055600583018190556007830181905560069092019190915591505b8061095c81613a2b565b915050610850565b5083156109fa57600685015461097a9084612ecd565b6006860155600785015461098e9082612ecd565b600786015560088501546109a29083612ecd565b600886015560018701546109b69084612ecd565b600188015560028701546109ca9082612ecd565b600288015560038701546109de9083612ecd565b6003880155600a546109fa906001600160a01b03163386612ed9565b60405184815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695906020015b60405180910390a2505060018055505050505050565b610a46612f41565b600c5460ff881610610a8d5760405162461bcd60e51b815260206004820152601060248201526f131bd8dadd5c08139bdd08199bdd5b9960821b604482015260640161076f565b6107d08510610ad45760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706f7369742066656560681b604482015260640161076f565b6107d08410610b1c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642077697468647261772066656560601b604482015260640161076f565b6000600c8860ff1681548110610b3457610b34613949565b90600052602060002090600b020190508060060154600003610b5f5760018101879055600481018490555b6002810186905560038101859055600a81018054831515610100810261ff001987151590811661ffff199094169390931717909255600183015460048401546040805160ff8e168152602081019390935282018a905260608201899052608082015260a081019190915260c08101919091527ffed2bed01df3e3b626df9ce252cf51b567dd316bdf4d4551802dd0e619b3a9e19060e00160405180910390a15050505050505050565b610c10612f41565b600a546000906001600160a01b0390811690841603610caf5760005b600c54811015610cad576000600c8281548110610c4b57610c4b613949565b90600052602060002090600b02019050610c978160090154826008015483600701548460060154610c7c9190613a44565b610c869190613a57565b610c909190613a57565b8490612eba565b9250508080610ca590613a2b565b915050610c2c565b505b8015610d74576040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d209190613a6a565b9050610d2c8183612ecd565b831115610d725760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161076f565b505b6001600160a01b038316610db557604051339083156108fc029084906000818181858888f19350505050158015610daf573d6000803e3d6000fd5b50610dc9565b610dc96001600160a01b0384163384612ed9565b604080516001600160a01b0385168152602081018490527f74f5dcd55c394cb1c6d3b9da22c2464bcc46c38cc3865bd629ed75823249b40b910160405180910390a1505050565b600260015403610e325760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff16610e595760405162461bcd60e51b815260040161076f90613996565b600060075411610e7b5760405162461bcd60e51b815260040161076f906139bf565b600c5460ff831610610e9f5760405162461bcd60e51b815260040161076f906139e9565b610ea98282612f9b565b50506001805550565b600260015403610ed45760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff16610efb5760405162461bcd60e51b815260040161076f90613996565b600060075411610f1d5760405162461bcd60e51b815260040161076f906139bf565b60008211610f6d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161076f565b600c5460ff821610610f915760405162461bcd60e51b815260040161076f906139e9565b336000908152600e6020908152604080832060ff851680855292528220600c805491939290918110610fc557610fc5613949565b90600052602060002090600b02019050610fde83612bb3565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190613a6a565b600a54909150611066906001600160a01b03163330886132af565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d39190613a6a565b905060006110e18284612ecd565b60055490915060ff1615611150576006546001860154611102908390612eba565b11156111505760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d6974000000000000000000604482015260640161076f565b6002840154600090156111d45761118061271061117a8760020154856132ed90919063ffffffff16565b906132f9565b905080156111d457600a85015460ff1615156000036111c757600954600a546111b6916001600160a01b03918216911683612ed9565b6111c08282612ecd565b91506111d4565b6111d18282612eba565b91505b6111e48733876001015485613305565b60018601546111f39083612eba565b600187015560068501546112079083612eba565b60068601556002850154600a8601546040805160ff808c168252602082018790529181019390935216151560608201526080810182905233907fd8d55df1c6c8df43b677eb6bc8ab5fe3554d521c8acb973089382f50ade2bab59060a001610a28565b60026001540361128c5760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166112b35760405162461bcd60e51b815260040161076f90613996565b6000600754116112d55760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106112f95760405162461bcd60e51b815260040161076f906139e9565b61130581600019612f9b565b505060018055565b611315612f41565b6107d0851061135c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706f7369742066656560681b604482015260640161076f565b6107d084106113a45760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642077697468647261772066656560601b604482015260640161076f565b600c80546001908101808355600083815292916113c091613a57565b815481106113d0576113d0613949565b60009182526020909120600b909102016001818101899055600282018890556003820187905560048201869055600a8201805461ffff191686151561ff0019161761010086151502179055600c549192507ffed2bed01df3e3b626df9ce252cf51b567dd316bdf4d4551802dd0e619b3a9e19161144d9190613a57565b6040805160ff9092168252602082018a90528101889052606081018790526080810186905284151560a082015283151560c082015260e00160405180910390a150505050505050565b61149e612f41565b6114a860006133df565b565b6114b2612f41565b600754156114fd5760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b604482015260640161076f565b611510600161150a612e9e565b90612eba565b60075560045461153d906115349061152b9062015180613a83565b600354906132ed565b60075490612eba565b60088190556007546040517f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069261157b928252602082015260400190565b60405180910390a1565b6001600160a01b0381166000908152600d6020526040812081908190815b815481101561165c5760008282815481106115c0576115c0613949565b60009182526020909120600890910201805490915060ff8981169116146115e7575061164a565b80600401546000036115f9575061164a565b6004810154611609908790612eba565b95508060020154611618612e9e565b111561163557600481015461162e908690612eba565b9450611648565b6004810154611645908590612eba565b93505b505b8061165481613a2b565b9150506115a3565b50509250925092565b6002600154036116875760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166116ae5760405162461bcd60e51b815260040161076f90613996565b6000600754116116d05760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106116f45760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061173457611734613949565b90600052602060002090600b0201905061174d84612bb3565b61175684612d17565b6000805b835481101561181257600084828154811061177757611777613949565b60009182526020909120600890910201805490915060ff88811691161461179e5750611800565b60006117c382600701546108de84600601548560050154612ecd90919063ffffffff16565b90506117cf8482612eba565b60048301549094506117e19082612eba565b600483015560068201546117f59082612eba565b826006018190555050505b8061180a81613a2b565b91505061175a565b5080156118cb5760018401546118289082612eba565b6001850155600384015461183c9082612eba565b600385015560068201546118509082612eba565b600683015560088201546118649082612eba565b60088301556002820154600a8301546040805160ff808a168252602082018690529181019390935216151560608201526000608082015233907fd8d55df1c6c8df43b677eb6bc8ab5fe3554d521c8acb973089382f50ade2bab59060a00160405180910390a25b505060018055505050565b6118de612f41565b60025460ff16156119275760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161076f565b6001821015801561193b5750620151808211155b6119795760405162461bcd60e51b815260206004820152600f60248201526e496e636f727265637420736c6f742160881b604482015260640161076f565b62015180826119888183613a83565b6119929190613aa5565b146119d15760405162461bcd60e51b815260206004820152600f60248201526e496e636f727265637420736c6f742160881b604482015260640161076f565b60008111611a175760405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206475726174696f6e2160681b604482015260640161076f565b81600481905550806003819055506001600260006101000a81548160ff02191690831515021790555082600a60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555033600960006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c604051806101800160405280600060ff168152602001600081526020016000815260200160c881526020016105dc815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600160ff16815260200162278d00815260200160008152602001600081526020016109c4815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600260ff1681526020016276a70081526020016000815260200160008152602001610fa0815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600360ff16815260200162ed4e0081526020016000815260200160008152602001611388815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600460ff1681526020016301da9c0081526020016000815260200160008152602001611770815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050505050565b61213e612f41565b612146612e9e565b600855565b612153612f41565b6002600154036121755760405162461bcd60e51b815260040161076f9061395f565b60026001558061218457600080fd5b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190613a6a565b600a5490915061220c906001600160a01b03163330856132af565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122799190613a6a565b9050612294826108de83600b54612eba90919063ffffffff16565b600b5550506001805550565b600c81815481106122b057600080fd5b60009182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a015460ff998a169b5097999698959794969395929491939092909180821691610100909104168c565b60026001540361233e5760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166123655760405162461bcd60e51b815260040161076f90613996565b6000600754116123875760405162461bcd60e51b815260040161076f906139bf565b600082116123d75760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e203000604482015260640161076f565b600c5460ff8216106123fb5760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061243b5761243b613949565b600091825260208220600b90910201915085906124588683612f9b565b905081811061246a5760009150612477565b6124748282612ecd565b91505b6000805b855481101561254857600086828154811061249857612498613949565b60009182526020909120600890910201805490915060ff8a81169116146124bf5750612536565b80600401546000036124d15750612536565b80600201546124de612e9e565b116124e95750612536565b846000036124f75750612548565b6004810154858111156125075750845b60048201546125169082612ecd565b60048301556125258682612ecd565b95506125318482612eba565b935050505b8061254081613a2b565b91505061247b565b5080156126d157806125586126df565b10156125a65760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604482015260640161076f565b60068401546125b59082612ecd565b600685015560018601546125c99082612ecd565b6001870155600384015460009015612651576125f861271061117a8760030154856132ed90919063ffffffff16565b9050801561265157600a850154610100900460ff16151560000361264457600954600a54612633916001600160a01b03918216911683612ed9565b61263d8282612ecd565b9150612651565b61264e8282612eba565b91505b600a54612668906001600160a01b03163384612ed9565b6003850154600a8601546040805160ff808d168252602082018790529181019390935261010090910416151560608201526080810182905233907f6fc339a1802fa2084c1e0ee155517a99c78b03e21a71582fe048f318a84599849060a00160405180910390a2505b505060018055505050505050565b600a546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561272c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127509190613a6a565b90506000811561276b576127648282612ecd565b9250505090565b60009250505090565b61277c612f41565b6001600160a01b0381166127c45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015260640161076f565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f51e75be93503449807046766a7c53e9e4563efe11aff3833d7975190b5686d63906020015b60405180910390a150565b612821612f41565b6005805460ff19168315801591909117909155612842576006819055612848565b60006006555b6005546006546040517f6d8e269443e5f2ffc1c2f09adbc884cd839ef06bfaf781503a474d1df30074d89261288b9260ff90911615158252602082015260400190565b60405180910390a15050565b600d60205281600052604060002081815481106128b357600080fd5b60009182526020909120600890910201805460018201546002830154600384015460048501546005860154600687015460079097015460ff90961698509396509194909391929188565b612905612f41565b6001600160a01b03811661296a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b612973816133df565b50565b61297e612f41565b600754156129c95760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b604482015260640161076f565b601e811015612a105760405162461bcd60e51b81526020600482015260136024820152721b1bddd95c881b1a5b5a5d081c995858da1959606a1b604482015260640161076f565b60038190556040518181527f91abcc2d6823e3a3f11d31b208dd3065d2c6a791f1c7c9fe96a42ce12897eac59060200161280e565b600c5460009060ff831610612a5c57506000612bad565b600754600003612a6e57506000612bad565b6001600160a01b0383166000908152600d60205260408120600c805491929160ff8616908110612aa057612aa0613949565b90600052602060002090600b020190508060060154600003612ac757600092505050612bad565b6000805b8354811015612ba7576000848281548110612ae857612ae8613949565b60009182526020909120600890910201805490915060ff888116911614612b0f5750612b95565b612b2b816007015482600601548360050154610c869190613a57565b92506000612b5a612b478360030154612b42612e9e565b61342f565b612b548760040154613469565b906132ed565b90506000612b8369d3c21bcecceda100000061117a8486600401546132ed90919063ffffffff16565b9050612b8f8582612eba565b94505050505b80612b9f81613a2b565b915050612acb565b50925050505b92915050565b60025460ff16612bd55760405162461bcd60e51b815260040161076f90613996565b600060075411612bf75760405162461bcd60e51b815260040161076f906139bf565b600c5460ff821610612c1b5760405162461bcd60e51b815260040161076f906139e9565b6000600c8260ff1681548110612c3357612c33613949565b60009182526020808320338452600e8252604080852060ff88168652909252908320600b90920201925090612c66612e9e565b9050600080612c7c612b4786600501548561342f565b9150612ca369d3c21bcecceda100000061117a8488600601546132ed90919063ffffffff16565b9050808560070154612cb59190613a44565b6007860155600585018390558354612cd190612b47908561342f565b9150612cf869d3c21bcecceda100000061117a8487600101546132ed90919063ffffffff16565b9050808460020154612d0a9190613a44565b6002850155505090555050565b60025460ff16612d395760405162461bcd60e51b815260040161076f90613996565b600060075411612d5b5760405162461bcd60e51b815260040161076f906139bf565b600c5460ff821610612d7f5760405162461bcd60e51b815260040161076f906139e9565b336000908152600d60205260408120600c805491929160ff8516908110612da857612da8613949565b90600052602060002090600b020190506000612dc2612e9e565b905060008060005b8554811015612e95576000868281548110612de757612de7613949565b60009182526020909120600890910201805490915060ff898116911614612e0e5750612e83565b8060040154600003612e205750612e83565b612e3e612e3182600301548761342f565b612b548860040154613469565b9350612e6569d3c21bcecceda100000061117a8684600401546132ed90919063ffffffff16565b6005820154909350612e779084612eba565b60058201556003018490555b80612e8d81613a2b565b915050612dca565b50505050505050565b6000612eb5600454426132f990919063ffffffff16565b905090565b6000612ec68284613a44565b9392505050565b6000612ec68284613a57565b6040516001600160a01b038316602482015260448101829052612f3c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613497565b505050565b6000546001600160a01b031633146114a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60025460009060ff16612fc05760405162461bcd60e51b815260040161076f90613996565b600060075411612fe25760405162461bcd60e51b815260040161076f906139bf565b600082116130325760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e203000604482015260640161076f565b600c5460ff8416106130565760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8816808552908352818420948452600d9092528220600c80549193929091811061309657613096613949565b90600052602060002090600b020190506130af86612bb3565b6130b886612d17565b846000805b845481101561319d5760008582815481106130da576130da613949565b60009182526020909120600890910201805490915060ff8b8116911614613101575061318b565b806002015461310e612e9e565b11613119575061318b565b600061313e82600701546108de84600601548560050154612ecd90919063ffffffff16565b90508481111561314b5750835b6131558582612ecd565b94506131618482612eba565b93508082600701546131739190613a44565b6007830155600085900361318857505061319d565b50505b8061319581613a2b565b9150506130bd565b5080156132a457806131ad6126df565b10156131fb5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604482015260640161076f565b600a54613212906001600160a01b03163383612ed9565b8083600901546132229190613a44565b60098401556004850154613237908290613a44565b60048601556003830154600a8401546040805160ff808d168252602082018690529181019390935261010090910416151560608201526000608082015233907f6fc339a1802fa2084c1e0ee155517a99c78b03e21a71582fe048f318a84599849060a00160405180910390a25b979650505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526132e79085906323b872dd60e01b90608401612f05565b50505050565b6000612ec68284613aa5565b6000612ec68284613a83565b6001600160a01b0383166000908152600d602052604081206004549091906133319061117a4287612eba565b825490915061080081106133745760405162461bcd60e51b815260206004820152600a6024820152694d6178207374616b657360b01b604482015260640161076f565b825460010180845560008481529084908390811061339457613394613949565b60009182526020909120600890910201805460ff191660ff8a1617815560018101879055600281018490556004810186905590506133d0612e9e565b60039091015550505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600854831061344257506000612bad565b600854821161345c576134558284612ecd565b9050612bad565b6008546134559084612ecd565b600080612ec6600454620151806134809190613a83565b61117a61016d818768056bc75e2d631000006132ed565b60006134ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135699092919063ffffffff16565b805190915015612f3c578080602001905181019061350a9190613abc565b612f3c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161076f565b60606135788484600085613580565b949350505050565b6060824710156135e15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161076f565b6001600160a01b0385163b6136385760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076f565b600080866001600160a01b031685876040516136549190613afd565b60006040518083038185875af1925050503d8060008114613691576040519150601f19603f3d011682016040523d82523d6000602084013e613696565b606091505b50915091506132a4828286606083156136b0575081612ec6565b8251156136c05782518084602001fd5b8160405162461bcd60e51b815260040161076f9190613b19565b803560ff811681146136eb57600080fd5b919050565b60006020828403121561370257600080fd5b612ec6826136da565b801515811461297357600080fd5b600080600080600080600060e0888a03121561373457600080fd5b61373d886136da565b96506020880135955060408801359450606088013593506080880135925060a08801356137698161370b565b915060c08801356137798161370b565b8091505092959891949750929550565b80356001600160a01b03811681146136eb57600080fd5b600080604083850312156137b357600080fd5b6137bc83613789565b946020939093013593505050565b600080604083850312156137dd57600080fd5b6137bc836136da565b600080604083850312156137f957600080fd5b82359150613809602084016136da565b90509250929050565b60008060008060008060c0878903121561382b57600080fd5b8635955060208701359450604087013593506060870135925060808701356138528161370b565b915060a08701356138628161370b565b809150509295509295509295565b6000806040838503121561388357600080fd5b61388c836136da565b915061380960208401613789565b6000806000606084860312156138af57600080fd5b6138b884613789565b95602085013595506040909401359392505050565b6000602082840312156138df57600080fd5b5035919050565b600080604083850312156138f957600080fd5b61390283613789565b9150613809602084016136da565b60006020828403121561392257600080fd5b612ec682613789565b6000806040838503121561393e57600080fd5b82356137bc8161370b565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e139bdd081a5b9a5d1a585b1a5e9959608a1b604082015260600190565b60208082526010908201526f141bdbdb081b9bdd081cdd185c9d195960821b604082015260600190565b602080825260129082015271496e76616c6964207374616b65207479706560701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201613a3d57613a3d613a15565b5060010190565b80820180821115612bad57612bad613a15565b81810381811115612bad57612bad613a15565b600060208284031215613a7c57600080fd5b5051919050565b600082613aa057634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417612bad57612bad613a15565b600060208284031215613ace57600080fd5b8151612ec68161370b565b60005b83811015613af4578181015183820152602001613adc565b50506000910152565b60008251613b0f818460208701613ad9565b9190910192915050565b6020815260008251806020840152613b38816040850160208701613ad9565b601f01601f1916919091016040019291505056fea2646970667358221220e8b4a903c6f727e8613c18dab2da25cb165ea984372e49bb09265e653b31ce6a64736f6c63430008110033
Deployed Bytecode Sourcemap
31755:25878:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49232:181;;;;;;;;;;-1:-1:-1;49232:181:0;;;;;:::i;:::-;;:::i;:::-;;;508:25:1;;;496:2;481:18;49232:181:0;;;;;;;;31943:23;;;;;;;;;;;;;;;;47146:2063;;;;;;;;;;-1:-1:-1;47146:2063:0;;;;;:::i;:::-;;:::i;:::-;;31975:19;;;;;;;;;;;;;;;;32272:28;;;;;;;;;;;;;;;;54375:1010;;;;;;;;;;-1:-1:-1;54375:1010:0;;;;;:::i;:::-;;:::i;31911:25::-;;;;;;;;;;-1:-1:-1;31911:25:0;;;;;;;;;;;1559:14:1;;1552:22;1534:41;;1522:2;1507:18;31911:25:0;1394:187:1;52543:938:0;;;;;;;;;;-1:-1:-1;52543:938:0;;;;;:::i;:::-;;:::i;32196:25::-;;;;;;;;;;;;;;;;43176:315;;;;;;:::i;:::-;;:::i;35803:1866::-;;;;;;;;;;-1:-1:-1;35803:1866:0;;;;;:::i;:::-;;:::i;32110:31::-;;;;;;;;;;;;;;;;42855:298;;;;;;:::i;:::-;;:::i;55408:808::-;;;;;;;;;;-1:-1:-1;55408:808:0;;;;;:::i;:::-;;:::i;5535:103::-;;;;;;;;;;;;;:::i;53504:295::-;;;;;;;;;;;;;:::i;50090:650::-;;;;;;;;;;-1:-1:-1;50090:650:0;;;;;:::i;:::-;;:::i;:::-;;;;3652:25:1;;;3708:2;3693:18;;3686:34;;;;3736:18;;;3729:34;3640:2;3625:18;50090:650:0;3450:319:1;43514:1530:0;;;;;;:::i;:::-;;:::i;34663:1073::-;;;;;;;;;;-1:-1:-1;34663:1073:0;;;;;:::i;:::-;;:::i;53822:86::-;;;;;;;;;;;;;:::i;51996:437::-;;;;;;;;;;-1:-1:-1;51996:437:0;;;;;:::i;:::-;;:::i;4887:87::-;;;;;;;;;;-1:-1:-1;4933:7:0;4960:6;-1:-1:-1;;;;;4960:6:0;4887:87;;;-1:-1:-1;;;;;4450:32:1;;;4432:51;;4420:2;4405:18;4887:87:0;4286:203:1;33537:23:0;;;;;;;;;;-1:-1:-1;33537:23:0;;;;;:::i;:::-;;:::i;:::-;;;;4965:4:1;4953:17;;;4935:36;;5002:2;4987:18;;4980:34;;;;5030:18;;;5023:34;;;;5088:2;5073:18;;5066:34;;;;5131:3;5116:19;;5109:35;;;;5175:3;5160:19;;5153:35;;;;5219:3;5204:19;;5197:35;5263:3;5248:19;;5241:35;5307:3;5292:19;;5285:35;5351:3;5336:19;;5329:35;5408:15;5401:23;5395:3;5380:19;;5373:52;5469:15;5462:23;5456:3;5441:19;;5434:52;4922:3;4907:19;33537:23:0;4494:998:1;33619:64:0;;;;;;;;;;-1:-1:-1;33619:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6017:25:1;;;6073:2;6058:18;;6051:34;;;;6101:18;;;6094:34;;;;6159:2;6144:18;;6137:34;6202:3;6187:19;;6180:35;6004:3;5989:19;33619:64:0;5758:463:1;38538:2350:0;;;;;;;;;;-1:-1:-1;38538:2350:0;;;;;:::i;:::-;;:::i;32044:24::-;;;;;;;;;;-1:-1:-1;32044:24:0;;;;;;;;49492:575;;;;;;;;;;;;;:::i;56525:213::-;;;;;;;;;;-1:-1:-1;56525:213:0;;;;;:::i;:::-;;:::i;54002:350::-;;;;;;;;;;-1:-1:-1;54002:350:0;;;;;:::i;:::-;;:::i;33567:45::-;;;;;;;;;;-1:-1:-1;33567:45:0;;;;;:::i;:::-;;:::i;:::-;;;;7100:4:1;7088:17;;;7070:36;;7137:2;7122:18;;7115:34;;;;7165:18;;;7158:34;;;;7223:2;7208:18;;7201:34;;;;7266:3;7251:19;;7244:35;7310:3;7295:19;;7288:35;7354:3;7339:19;;7332:35;7398:3;7383:19;;7376:35;7057:3;7042:19;33567:45:0;6731:686:1;32309:22:0;;;;;;;;;;-1:-1:-1;32309:22:0;;;;-1:-1:-1;;;;;32309:22:0;;;5793:201;;;;;;;;;;-1:-1:-1;5793:201:0;;;;;:::i;:::-;;:::i;56239:263::-;;;;;;;;;;-1:-1:-1;56239:263:0;;;;;:::i;:::-;;:::i;50917:939::-;;;;;;;;;;-1:-1:-1;50917:939:0;;;;;:::i;:::-;;:::i;49232:181::-;49337:7;:14;49299:7;;49323:28;;;;49319:42;;-1:-1:-1;49360:1:0;;49232:181;-1:-1:-1;49232:181:0:o;49319:42::-;49381:7;49389:10;49381:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;49374:31;;49232:181;;;:::o;47146:2063::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;47232:13;::::1;;47224:41;;;;-1:-1:-1::0;;;47224:41:0::1;;;;;;;:::i;:::-;47297:1;47284:10;;:14;47276:43;;;;-1:-1:-1::0;;;47276:43:0::1;;;;;;;:::i;:::-;47351:7;:14:::0;47338:27:::1;::::0;::::1;;47330:58;;;;-1:-1:-1::0;;;47330:58:0::1;;;;;;;:::i;:::-;47436:10;47401:21;47425:22:::0;;;:10:::1;:22;::::0;;;;;;;:34:::1;::::0;::::1;::::0;;;;;;;;;47495:22;;;:10:::1;:22:::0;;;;;47552:7:::1;:19:::0;;47495:22;;47401:21;47552:7;;:19;::::1;;;;;:::i;:::-;;;;;;;;;;;47528:43;;47623:33;47645:10;47623:21;:33::i;:::-;47696:28;47713:10;47696:16;:28::i;:::-;47737:24;47776:19:::0;47810:23:::1;47848:19:::0;47889:9:::1;47884:670;47908:13:::0;;47904:17;::::1;47884:670;;;47943:19;47965:6;47972:1;47965:9;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;47993:15:::0;;47965:9;;-1:-1:-1;47993:29:0::1;::::0;;::::1;:15:::0;::::1;:29;47989:43;;48024:8;;;47989:43;48051:5;:12;;;48067:1;48051:17:::0;48047:31:::1;;48070:8;;;48047:31;48110:5;:9;;;48097:10;:8;:10::i;:::-;:22;48093:36;;;48121:8;;;48093:36;48167:56;48206:5;:16;;;48167:34;48188:5;:12;;;48167:16;:20;;:34;;;;:::i;:::-;:38:::0;::::1;:56::i;:::-;48148:75;;48252:29;48268:5;:12;;;48252:11;:15;;:29;;;;:::i;:::-;48238:43;;48314:37;48334:5;:16;;;48314:15;:19;;:37;;;;:::i;:::-;48296:55;;48380:29;48396:5;:12;;;48380:11;:15;;:29;;;;:::i;:::-;48441:1;48426:12;::::0;::::1;:16:::0;;;48457:12:::1;::::0;::::1;:16:::0;;;48488:15:::1;::::0;::::1;:19:::0;;;48522:16:::1;::::0;;::::1;:20:::0;;;;48366:43;-1:-1:-1;47884:670:0::1;47923:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47884:670;;;-1:-1:-1::0;48570:20:0;;48566:571:::1;;48630:18;::::0;::::1;::::0;:35:::1;::::0;48653:11;48630:22:::1;:35::i;:::-;48609:18;::::0;::::1;:56:::0;48701:18:::1;::::0;::::1;::::0;:35:::1;::::0;48724:11;48701:22:::1;:35::i;:::-;48680:18;::::0;::::1;:56:::0;48776:22:::1;::::0;::::1;::::0;:43:::1;::::0;48803:15;48776:26:::1;:43::i;:::-;48751:22;::::0;::::1;:68:::0;48855:16:::1;::::0;::::1;::::0;:33:::1;::::0;48876:11;48855:20:::1;:33::i;:::-;48836:16;::::0;::::1;:52:::0;48922:16:::1;::::0;::::1;::::0;:33:::1;::::0;48943:11;48922:20:::1;:33::i;:::-;48903:16;::::0;::::1;:52:::0;48993:20:::1;::::0;::::1;::::0;:41:::1;::::0;49018:15;48993:24:::1;:41::i;:::-;48970:20;::::0;::::1;:64:::0;49058:12:::1;::::0;49051:72:::1;::::0;-1:-1:-1;;;;;49058:12:0::1;49093:10;49106:16:::0;49051:33:::1;:72::i;:::-;49154:47;::::0;508:25:1;;;49172:10:0::1;::::0;49154:47:::1;::::0;496:2:1;481:18;49154:47:0::1;;;;;;;;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;;;;;;47146:2063:0:o;54375:1010::-;4773:13;:11;:13::i;:::-;54594:7:::1;:14:::0;54581:27:::1;::::0;::::1;;54573:56;;;::::0;-1:-1:-1;;;54573:56:0;;9424:2:1;54573:56:0::1;::::0;::::1;9406:21:1::0;9463:2;9443:18;;;9436:30;-1:-1:-1;;;9482:18:1;;;9475:46;9538:18;;54573:56:0::1;9222:340:1::0;54573:56:0::1;54662:4;54648:11;:18;54640:50;;;::::0;-1:-1:-1;;;54640:50:0;;9769:2:1;54640:50:0::1;::::0;::::1;9751:21:1::0;9808:2;9788:18;;;9781:30;-1:-1:-1;;;9827:18:1;;;9820:49;9886:18;;54640:50:0::1;9567:343:1::0;54640:50:0::1;54724:4;54709:12;:19;54701:52;;;::::0;-1:-1:-1;;;54701:52:0;;10117:2:1;54701:52:0::1;::::0;::::1;10099:21:1::0;10156:2;10136:18;;;10129:30;-1:-1:-1;;;10175:18:1;;;10168:50;10235:18;;54701:52:0::1;9915:344:1::0;54701:52:0::1;54766:22;54791:7;54799:10;54791:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;54766:44;;54898:7;:19;;;54921:1;54898:24:::0;54895:118:::1;;54938:16;::::0;::::1;:28:::0;;;54981:12:::1;::::0;::::1;:20:::0;;;54895:118:::1;55033:18;::::0;::::1;:32:::0;;;55076:19:::1;::::0;::::1;:34:::0;;;55129:25:::1;::::0;::::1;:46:::0;;55186:48;::::1;;55129:46;55186:48:::0;::::1;-1:-1:-1::0;;55129:46:0;::::1;;55186:48:::0;;;-1:-1:-1;;55186:48:0;;;;;;;::::1;::::0;;;-1:-1:-1;55278:16:0;::::1;::::0;55323:12:::1;::::0;::::1;::::0;55252:125:::1;::::0;;10593:4:1;10581:17;;10563:36;;10630:2;10615:18;;10608:34;;;;10658:18;;10651:34;;;10716:2;10701:18;;10694:34;;;10759:3;10744:19;;10737:35;10803:3;10788:19;;10781:51;;;;10863:3;10848:19;;10841:51;;;;55252:125:0::1;::::0;10550:3:1;10535:19;55252:125:0::1;;;;;;;54562:823;54375:1010:::0;;;;;;;:::o;52543:938::-;4773:13;:11;:13::i;:::-;52696:12:::1;::::0;52646:16:::1;::::0;-1:-1:-1;;;;;52696:12:0;;::::1;52679:29:::0;;::::1;::::0;52675:307:::1;;52730:9;52725:246;52749:7;:14:::0;52745:18;::::1;52725:246;;;52789:21;52813:7;52821:1;52813:10;;;;;;;;:::i;:::-;;;;;;;;;;;52789:34;;52853:102;52933:6;:21;;;52908:6;:22;;;52887:6;:18;;;52866:6;:18;;;:39;;;;:::i;:::-;:64;;;;:::i;:::-;:88;;;;:::i;:::-;52853:8:::0;;:12:::1;:102::i;:::-;52842:113;;52770:201;52765:3;;;;;:::i;:::-;;;;52725:246;;;;52675:307;52998:12:::0;;52994:196:::1;;53046:46;::::0;-1:-1:-1;;;53046:46:0;;53086:4:::1;53046:46;::::0;::::1;4432:51:1::0;53027:16:0::1;::::0;-1:-1:-1;;;;;53046:31:0;::::1;::::0;::::1;::::0;4405:18:1;;53046:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53027:65:::0;-1:-1:-1;53131:22:0::1;53027:65:::0;53144:8;53131:12:::1;:22::i;:::-;53115:12;:38;;53107:71;;;::::0;-1:-1:-1;;;53107:71:0;;11557:2:1;53107:71:0::1;::::0;::::1;11539:21:1::0;11596:2;11576:18;;;11569:30;-1:-1:-1;;;11615:18:1;;;11608:50;11675:18;;53107:71:0::1;11355:344:1::0;53107:71:0::1;53012:178;52994:196;-1:-1:-1::0;;;;;53206:29:0;::::1;53202:206;;53252:42;::::0;53260:10:::1;::::0;53252:42;::::1;;;::::0;53281:12;;53252:42:::1;::::0;;;53281:12;53260:10;53252:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53202:206;;;53327:69;-1:-1:-1::0;;;;;53327:34:0;::::1;53370:10;53383:12:::0;53327:34:::1;:69::i;:::-;53425:48;::::0;;-1:-1:-1;;;;;11896:32:1;;11878:51;;11960:2;11945:18;;11938:34;;;53425:48:0::1;::::0;11851:18:1;53425:48:0::1;;;;;;;52635:846;52543:938:::0;;:::o;43176:315::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;43281:13;::::1;;43273:41;;;;-1:-1:-1::0;;;43273:41:0::1;;;;;;;:::i;:::-;43346:1;43333:10;;:14;43325:43;;;;-1:-1:-1::0;;;43325:43:0::1;;;;;;;:::i;:::-;43400:7;:14:::0;43387:27:::1;::::0;::::1;;43379:58;;;;-1:-1:-1::0;;;43379:58:0::1;;;;;;;:::i;:::-;43450:33;43463:10;43475:7;43450:12;:33::i;:::-;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;43176:315:0:o;35803:1866::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;35896:13;::::1;;35888:41;;;;-1:-1:-1::0;;;35888:41:0::1;;;;;;;:::i;:::-;35961:1;35948:10;;:14;35940:43;;;;-1:-1:-1::0;;;35940:43:0::1;;;;;;;:::i;:::-;36012:1;36002:7;:11;35994:55;;;::::0;-1:-1:-1;;;35994:55:0;;12185:2:1;35994:55:0::1;::::0;::::1;12167:21:1::0;12224:2;12204:18;;;12197:30;12263:33;12243:18;;;12236:61;12314:18;;35994:55:0::1;11983:355:1::0;35994:55:0::1;36081:7;:14:::0;36068:27:::1;::::0;::::1;;36060:58;;;;-1:-1:-1::0;;;36060:58:0::1;;;;;;;:::i;:::-;36166:10;36131:21;36155:22:::0;;;:10:::1;:22;::::0;;;;;;;:34:::1;::::0;::::1;::::0;;;;;;;36224:7:::1;:19:::0;;36155:34;;36131:21;36224:7;;:19;::::1;;;;;:::i;:::-;;;;;;;;;;;36200:43;;36295:33;36317:10;36295:21;:33::i;:::-;36371:12;::::0;36364:45:::1;::::0;-1:-1:-1;;;36364:45:0;;36403:4:::1;36364:45;::::0;::::1;4432:51:1::0;36341:20:0::1;::::0;-1:-1:-1;;;;;36371:12:0::1;::::0;36364:30:::1;::::0;4405:18:1;;36364:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36427:12;::::0;36341:68;;-1:-1:-1;36420:132:0::1;::::0;-1:-1:-1;;;;;36427:12:0::1;36480:10;36514:4;36534:7:::0;36420:37:::1;:132::i;:::-;36592:12;::::0;36585:45:::1;::::0;-1:-1:-1;;;36585:45:0;;36624:4:::1;36585:45;::::0;::::1;4432:51:1::0;36563:19:0::1;::::0;-1:-1:-1;;;;;36592:12:0::1;::::0;36585:30:::1;::::0;4405:18:1;;36585:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36563:67:::0;-1:-1:-1;36641:18:0::1;36662:29;36563:67:::0;36678:12;36662:15:::1;:29::i;:::-;36708:12;::::0;36641:50;;-1:-1:-1;36708:12:0::1;;36704:182;;;36799:16;::::0;36778::::1;::::0;::::1;::::0;36763:32:::1;::::0;:10;;:14:::1;:32::i;:::-;:52;;36737:137;;;::::0;-1:-1:-1;;;36737:137:0;;12545:2:1;36737:137:0::1;::::0;::::1;12527:21:1::0;12584:2;12564:18;;;12557:30;12623:25;12603:18;;;12596:53;12666:18;;36737:137:0::1;12343:347:1::0;36737:137:0::1;36922:17;::::0;::::1;::::0;36896:11:::1;::::0;36922:21;36918:428:::1;;36966:44;37004:5;36966:33;36981:6;:17;;;36966:10;:14;;:33;;;;:::i;:::-;:37:::0;::::1;:44::i;:::-;36960:50:::0;-1:-1:-1;37029:7:0;;37025:310:::1;;37060:24;::::0;::::1;::::0;::::1;;:33;;:24;:33:::0;37057:263:::1;;37151:7;::::0;37124:12:::1;::::0;37117:47:::1;::::0;-1:-1:-1;;;;;37124:12:0;;::::1;::::0;37151:7:::1;37160:3:::0;37117:33:::1;:47::i;:::-;37200:19;:10:::0;37215:3;37200:14:::1;:19::i;:::-;37187:32;;37057:263;;;37281:19;:10:::0;37296:3;37281:14:::1;:19::i;:::-;37268:32;;37057:263;37358:62;37368:10;37380;37392:6;:15;;;37409:10;37358:9;:62::i;:::-;37452:16;::::0;::::1;::::0;:32:::1;::::0;37473:10;37452:20:::1;:32::i;:::-;37433:16;::::0;::::1;:51:::0;37516:18:::1;::::0;::::1;::::0;:34:::1;::::0;37539:10;37516:22:::1;:34::i;:::-;37495:18;::::0;::::1;:55:::0;37612:17:::1;::::0;::::1;::::0;37631:24:::1;::::0;::::1;::::0;37568:93:::1;::::0;;37631:24:::1;12964:17:1::0;;;12946:36;;13013:2;12998:18;;12991:34;;;13041:18;;;13034:34;;;;37631:24:0::1;13111:14:1::0;13104:22;13099:2;13084:18;;13077:50;13158:3;13143:19;;13136:35;;;37576:10:0::1;::::0;37568:93:::1;::::0;12933:3:1;12918:19;37568:93:0::1;12695:482:1::0;42855:298:0;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;42943:13;::::1;;42935:41;;;;-1:-1:-1::0;;;42935:41:0::1;;;;;;;:::i;:::-;43008:1;42995:10;;:14;42987:43;;;;-1:-1:-1::0;;;42987:43:0::1;;;;;;;:::i;:::-;43062:7;:14:::0;43049:27:::1;::::0;::::1;;43041:58;;;;-1:-1:-1::0;;;43041:58:0::1;;;;;;;:::i;:::-;43112:33;43125:10;-1:-1:-1::0;;43112:12:0::1;:33::i;:::-;-1:-1:-1::0;;1768:1:0;2722:22;;42855:298::o;55408:808::-;4773:13;:11;:13::i;:::-;55607:4:::1;55593:11;:18;55585:50;;;::::0;-1:-1:-1;;;55585:50:0;;9769:2:1;55585:50:0::1;::::0;::::1;9751:21:1::0;9808:2;9788:18;;;9781:30;-1:-1:-1;;;9827:18:1;;;9820:49;9886:18;;55585:50:0::1;9567:343:1::0;55585:50:0::1;55669:4;55654:12;:19;55646:52;;;::::0;-1:-1:-1;;;55646:52:0;;10117:2:1;55646:52:0::1;::::0;::::1;10099:21:1::0;10156:2;10136:18;;;10129:30;-1:-1:-1;;;10175:18:1;;;10168:50;10235:18;;55646:52:0::1;9915:344:1::0;55646:52:0::1;55711:7;:14:::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;55711:14:0;;;-1:-1:-1;55711:7:0;55771:18:::1;::::0;::::1;:::i;:::-;55763:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;55801:16;::::0;;::::1;:28:::0;;;55840:18:::1;::::0;::::1;:32:::0;;;55883:19:::1;::::0;::::1;:34:::0;;;55928:12:::1;::::0;::::1;:20:::0;;;55959:25:::1;::::0;::::1;:46:::0;;-1:-1:-1;;56016:48:0;55959:46;::::1;;-1:-1:-1::0;;56016:48:0;;55959:46:::1;56016:48:::0;::::1;;;;::::0;;56102:7:::1;:14:::0;55763:27;;-1:-1:-1;56082:126:0::1;::::0;56102:18:::1;::::0;55801:16;56102:18:::1;:::i;:::-;56082:126;::::0;;10593:4:1;10581:17;;;10563:36;;10630:2;10615:18;;10608:34;;;10658:18;;10651:34;;;10716:2;10701:18;;10694:34;;;10759:3;10744:19;;10737:35;;;10816:14;;10809:22;10803:3;10788:19;;10781:51;10876:14;;10869:22;10863:3;10848:19;;10841:51;10550:3;10535:19;56082:126:0::1;;;;;;;55574:642;55408:808:::0;;;;;;:::o;5535:103::-;4773:13;:11;:13::i;:::-;5600:30:::1;5627:1;5600:18;:30::i;:::-;5535:103::o:0;53504:295::-;4773:13;:11;:13::i;:::-;53565:10:::1;::::0;:15;53557:52:::1;;;::::0;-1:-1:-1;;;53557:52:0;;13384:2:1;53557:52:0::1;::::0;::::1;13366:21:1::0;13423:2;13403:18;;;13396:30;-1:-1:-1;;;13442:18:1;;;13435:54;13506:18;;53557:52:0::1;13182:348:1::0;53557:52:0::1;53635:17;53650:1;53635:10;:8;:10::i;:::-;:14:::0;::::1;:17::i;:::-;53622:10;:30:::0;53720:4:::1;::::0;53679:47:::1;::::0;53694:31:::1;::::0;53707:17:::1;::::0;32480:12:::1;53707:17;:::i;:::-;53694:8;::::0;;:12:::1;:31::i;:::-;53679:10;::::0;;:14:::1;:47::i;:::-;53663:13;:63:::0;;;53765:10:::1;::::0;53744:47:::1;::::0;::::1;::::0;::::1;::::0;13931:25:1;;13987:2;13972:18;;13965:34;13919:2;13904:18;;13757:248;53744:47:0::1;;;;;;;;53504:295::o:0;50090:650::-;-1:-1:-1;;;;;50252:20:0;;50165:14;50252:20;;;:10;:20;;;;;50165:14;;;;;50285:448;50309:13;;50305:17;;50285:448;;;50344:19;50366:6;50373:1;50366:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;50396:15;;50366:9;;-1:-1:-1;50396:29:0;;;;:15;;:29;50392:43;;50427:8;;;50392:43;50454:5;:12;;;50470:1;50454:17;50450:31;;50473:8;;;50450:31;50518:12;;;;50507:24;;:6;;:10;:24::i;:::-;50498:33;;50563:5;:9;;;50550:10;:8;:10::i;:::-;:22;50546:176;;;50619:12;;;;50605:27;;:9;;:13;:27::i;:::-;50593:39;;50546:176;;;50693:12;;;;50682:24;;:6;;:10;:24::i;:::-;50673:33;;50546:176;50329:404;50285:448;50324:3;;;;:::i;:::-;;;;50285:448;;;;50216:524;50090:650;;;;;:::o;43514:1530::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;43605:13;::::1;;43597:41;;;;-1:-1:-1::0;;;43597:41:0::1;;;;;;;:::i;:::-;43670:1;43657:10;;:14;43649:43;;;;-1:-1:-1::0;;;43649:43:0::1;;;;;;;:::i;:::-;43724:7;:14:::0;43711:27:::1;::::0;::::1;;43703:58;;;;-1:-1:-1::0;;;43703:58:0::1;;;;;;;:::i;:::-;43809:10;43774:21;43798:22:::0;;;:10:::1;:22;::::0;;;;;;;:34:::1;::::0;::::1;::::0;;;;;;;;;43868:22;;;:10:::1;:22:::0;;;;;43925:7:::1;:19:::0;;43868:22;;43774:21;43925:7;;:19;::::1;;;;;:::i;:::-;;;;;;;;;;;43901:43;;43996:33;44018:10;43996:21;:33::i;:::-;44069:28;44086:10;44069:16;:28::i;:::-;44110:15;44145:9:::0;44140:468:::1;44164:13:::0;;44160:17;::::1;44140:468;;;44199:19;44221:6;44228:1;44221:9;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;44249:15:::0;;44221:9;;-1:-1:-1;44249:29:0::1;::::0;;::::1;:15:::0;::::1;:29;44245:43;;44280:8;;;44245:43;44354:16;44373:55;44412:5;:15;;;44373:34;44390:5;:16;;;44373:5;:12;;;:16;;:34;;;;:::i;:55::-;44354:74:::0;-1:-1:-1;44453:21:0::1;:7:::0;44354:74;44453:11:::1;:21::i;:::-;44506:12;::::0;::::1;::::0;44443:31;;-1:-1:-1;44506:26:0::1;::::0;44523:8;44506:16:::1;:26::i;:::-;44491:12;::::0;::::1;:41:::0;44566:16:::1;::::0;::::1;::::0;:30:::1;::::0;44587:8;44566:20:::1;:30::i;:::-;44547:5;:16;;:49;;;;44184:424;;44140:468;44179:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44140:468;;;-1:-1:-1::0;44624:11:0;;44620:417:::1;;44673:16;::::0;::::1;::::0;:29:::1;::::0;44694:7;44673:20:::1;:29::i;:::-;44654:16;::::0;::::1;:48:::0;44740:20:::1;::::0;::::1;::::0;:33:::1;::::0;44765:7;44740:24:::1;:33::i;:::-;44717:20;::::0;::::1;:56:::0;44809:18:::1;::::0;::::1;::::0;:31:::1;::::0;44832:7;44809:22:::1;:31::i;:::-;44788:18;::::0;::::1;:52:::0;44880:22:::1;::::0;::::1;::::0;:35:::1;::::0;44907:7;44880:26:::1;:35::i;:::-;44855:22;::::0;::::1;:60:::0;44978:17:::1;::::0;::::1;::::0;44997:24:::1;::::0;::::1;::::0;44937:88:::1;::::0;;44997:24:::1;12964:17:1::0;;;12946:36;;13013:2;12998:18;;12991:34;;;13041:18;;;13034:34;;;;44997:24:0::1;13111:14:1::0;13104:22;13099:2;13084:18;;13077:50;44997:24:0::1;13158:3:1::0;13143:19;;13136:35;44945:10:0::1;::::0;44937:88:::1;::::0;12933:3:1;12918:19;44937:88:0::1;;;;;;;44620:417;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;;;43514:1530:0:o;34663:1073::-;4773:13;:11;:13::i;:::-;34813::::1;::::0;::::1;;34812:14;34804:46;;;::::0;-1:-1:-1;;;34804:46:0;;14707:2:1;34804:46:0::1;::::0;::::1;14689:21:1::0;14746:2;14726:18;;;14719:30;-1:-1:-1;;;14765:18:1;;;14758:49;14824:18;;34804:46:0::1;14505:343:1::0;34804:46:0::1;32377:1;34869:5;:17;;:38;;;;;32422:12;34890:5;:17;;34869:38;34861:66;;;::::0;-1:-1:-1;;;34861:66:0;;15055:2:1;34861:66:0::1;::::0;::::1;15037:21:1::0;15094:2;15074:18;;;15067:30;-1:-1:-1;;;15113:18:1;;;15106:45;15168:18;;34861:66:0::1;14853:339:1::0;34861:66:0::1;32480:12;34969:5:::0;34947:18:::1;34969:5:::0;32480:12;34947:18:::1;:::i;:::-;34946:28;;;;:::i;:::-;:42;34938:70;;;::::0;-1:-1:-1;;;34938:70:0;;15055:2:1;34938:70:0::1;::::0;::::1;15037:21:1::0;15094:2;15074:18;;;15067:30;-1:-1:-1;;;15113:18:1;;;15106:45;15168:18;;34938:70:0::1;14853:339:1::0;34938:70:0::1;35039:1;35027:9;:13;35019:45;;;::::0;-1:-1:-1;;;35019:45:0;;15572:2:1;35019:45:0::1;::::0;::::1;15554:21:1::0;15611:2;15591:18;;;15584:30;-1:-1:-1;;;15630:18:1;;;15623:49;15689:18;;35019:45:0::1;15370:343:1::0;35019:45:0::1;35084:5;35077:4;:12;;;;35111:9;35100:8;:20;;;;35192:4;35176:13;;:20;;;;;;;;;;;;;;;;;;35222:13;35207:12;;:28;;;;;-1:-1:-1::0;;;;;35207:28:0::1;;;;;-1:-1:-1::0;;;;;35207:28:0::1;;;;;;35256:10;35246:7;;:20;;;;;-1:-1:-1::0;;;;;35246:20:0::1;;;;;-1:-1:-1::0;;;;;35246:20:0::1;;;;;;35279:7;35292:55;;;;;;;;35299:1;35292:55;;;;;;35302:1;35292:55;;;;35305:1;35292:55;;;;35308:3;35292:55;;;;35313:4;35292:55;;;;35319:1;35292:55;;;;35322:1;35292:55;;;;35325:1;35292:55;;;;35328:1;35292:55;;;;35331:1;35292:55;;;;35334:5;35292:55;;;;;;35341:5;35292:55;;;;::::0;35279:69:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35359:7;35372:69;;;;;;;;35379:1;35372:69;;;;;;35382:17;35372:69;;;;35401:1;35372:69;;;;35404:1;35372:69;;;;35407:4;35372:69;;;;35413:1;35372:69;;;;35416:1;35372:69;;;;35419:1;35372:69;;;;35422:1;35372:69;;;;35425:1;35372:69;;;;35428:5;35372:69;;;;;;35435:5;35372:69;;;;::::0;35359:83:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35453:7;35466:69;;;;;;;;35473:1;35466:69;;;;;;35476:17;35466:69;;;;35495:1;35466:69;;;;35498:1;35466:69;;;;35501:4;35466:69;;;;35507:1;35466:69;;;;35510:1;35466:69;;;;35513:1;35466:69;;;;35516:1;35466:69;;;;35519:1;35466:69;;;;35522:5;35466:69;;;;;;35529:5;35466:69;;;;::::0;35453:83:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35547:7;35560:70;;;;;;;;35567:1;35560:70;;;;;;35570:18;35560:70;;;;35590:1;35560:70;;;;35593:1;35560:70;;;;35596:4;35560:70;;;;35602:1;35560:70;;;;35605:1;35560:70;;;;35608:1;35560:70;;;;35611:1;35560:70;;;;35614:1;35560:70;;;;35617:5;35560:70;;;;;;35624:5;35560:70;;;;::::0;35547:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35642:7;35655:70;;;;;;;;35662:1;35655:70;;;;;;35665:18;35655:70;;;;35685:1;35655:70;;;;35688:1;35655:70;;;;35691:4;35655:70;;;;35697:1;35655:70;;;;35700:1;35655:70;;;;35703:1;35655:70;;;;35706:1;35655:70;;;;35709:1;35655:70;;;;35712:5;35655:70;;;;;;35719:5;35655:70;;;;::::0;35642:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34663:1073:::0;;;:::o;53822:86::-;4773:13;:11;:13::i;:::-;53890:10:::1;:8;:10::i;:::-;53874:13;:26:::0;53822:86::o;51996:437::-;4773:13;:11;:13::i;:::-;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;-1:-1:-1::0;;;2402:63:0::1;;;;;;;:::i;:::-;1812:1;2543:7;:18:::0;52085:11;52077:20:::2;;;::::0;::::2;;52137:12;::::0;52130:45:::2;::::0;-1:-1:-1;;;52130:45:0;;52169:4:::2;52130:45;::::0;::::2;4432:51:1::0;52110:17:0::2;::::0;-1:-1:-1;;;;;52137:12:0::2;::::0;52130:30:::2;::::0;4405:18:1;;52130:45:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52193:12;::::0;52110:65;;-1:-1:-1;52186:73:0::2;::::0;-1:-1:-1;;;;;52193:12:0::2;52224:10;52244:4;52251:7:::0;52186:37:::2;:73::i;:::-;52296:12;::::0;52289:45:::2;::::0;-1:-1:-1;;;52289:45:0;;52328:4:::2;52289:45;::::0;::::2;4432:51:1::0;52270:16:0::2;::::0;-1:-1:-1;;;;;52296:12:0::2;::::0;52289:30:::2;::::0;4405:18:1;;52289:45:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52270:64;;52373:52;52415:9;52373:37;52401:8;52373:23;;:27;;:37;;;;:::i;:52::-;52347:23;:78:::0;-1:-1:-1;;1768:1:0::1;2722:22:::0;;-1:-1:-1;51996:437:0:o;33537:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33537:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38538:2350::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;38632:13;::::1;;38624:41;;;;-1:-1:-1::0;;;38624:41:0::1;;;;;;;:::i;:::-;38697:1;38684:10;;:14;38676:43;;;;-1:-1:-1::0;;;38676:43:0::1;;;;;;;:::i;:::-;38748:1;38738:7;:11;38730:55;;;::::0;-1:-1:-1;;;38730:55:0;;15920:2:1;38730:55:0::1;::::0;::::1;15902:21:1::0;15959:2;15939:18;;;15932:30;15998:33;15978:18;;;15971:61;16049:18;;38730:55:0::1;15718:355:1::0;38730:55:0::1;38817:7;:14:::0;38804:27:::1;::::0;::::1;;38796:58;;;;-1:-1:-1::0;;;38796:58:0::1;;;;;;;:::i;:::-;38902:10;38867:21;38891:22:::0;;;:10:::1;:22;::::0;;;;;;;:34:::1;::::0;::::1;::::0;;;;;;;;;38961:22;;;:10:::1;:22:::0;;;;;39018:7:::1;:19:::0;;38961:22;;38867:21;39018:7;;:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;-1:-1:-1;39069:7:0;;39110:33:::1;39123:10:::0;39069:7;39110:12:::1;:33::i;:::-;39087:56;;39174:8;39158:12;:24;39154:139;;39210:1;39199:12;;39154:139;;;39255:26;:8:::0;39268:12;39255::::1;:26::i;:::-;39244:37;;39154:139;39305:15;39342:9:::0;39337:590:::1;39361:13:::0;;39357:17;::::1;39337:590;;;39396:19;39418:6;39425:1;39418:9;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;39446:15:::0;;39418:9;;-1:-1:-1;39446:29:0::1;::::0;;::::1;:15:::0;::::1;:29;39442:43;;39477:8;;;39442:43;39504:5;:12;;;39520:1;39504:17:::0;39500:31:::1;;39523:8;;;39500:31;39564:5;:9;;;39550:10;:8;:10::i;:::-;:23;39546:37;;39575:8;;;39546:37;39602:8;39614:1;39602:13:::0;39598:24:::1;;39617:5;;;39598:24;39658:12;::::0;::::1;::::0;39689:19;;::::1;39685:79;;;-1:-1:-1::0;39740:8:0;39685:79:::1;39795:12;::::0;::::1;::::0;:26:::1;::::0;39812:8;39795:16:::1;:26::i;:::-;39780:12;::::0;::::1;:41:::0;39847:22:::1;:8:::0;39860;39847:12:::1;:22::i;:::-;39836:33:::0;-1:-1:-1;39894:21:0::1;:7:::0;39906:8;39894:11:::1;:21::i;:::-;39884:31;;39381:546;;39337:590;39376:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39337:590;;;-1:-1:-1::0;39943:11:0;;39939:940:::1;;40006:7;39979:23;:21;:23::i;:::-;:34;;39971:73;;;::::0;-1:-1:-1;;;39971:73:0;;16280:2:1;39971:73:0::1;::::0;::::1;16262:21:1::0;16319:2;16299:18;;;16292:30;16358:28;16338:18;;;16331:56;16404:18;;39971:73:0::1;16078:350:1::0;39971:73:0::1;40082:18;::::0;::::1;::::0;:31:::1;::::0;40105:7;40082:22:::1;:31::i;:::-;40061:18;::::0;::::1;:52:::0;40147:16:::1;::::0;::::1;::::0;:29:::1;::::0;40168:7;40147:20:::1;:29::i;:::-;40128:16;::::0;::::1;:48:::0;40223:18:::1;::::0;::::1;::::0;40193:11:::1;::::0;40223:22;40219:454:::1;;40272:42;40308:5;40272:31;40284:6;:18;;;40272:7;:11;;:31;;;;:::i;:42::-;40266:48:::0;-1:-1:-1;40336:7:0;;40333:325:::1;;40370:25;::::0;::::1;::::0;::::1;::::0;::::1;;;:34;;40399:5;40370:34:::0;40367:272:::1;;40466:7;::::0;40439:12:::1;::::0;40432:47:::1;::::0;-1:-1:-1;;;;;40439:12:0;;::::1;::::0;40466:7:::1;40475:3:::0;40432:33:::1;:47::i;:::-;40516:16;:7:::0;40528:3;40516:11:::1;:16::i;:::-;40506:26;;40367:272;;;40599:16;:7:::0;40611:3;40599:11:::1;:16::i;:::-;40589:26;;40367:272;40696:12;::::0;40689:63:::1;::::0;-1:-1:-1;;;;;40696:12:0::1;40731:10;40744:7:::0;40689:33:::1;:63::i;:::-;40814:18;::::0;::::1;::::0;40834:25:::1;::::0;::::1;::::0;40772:93:::1;::::0;;40834:25:::1;12964:17:1::0;;;12946:36;;13013:2;12998:18;;12991:34;;;13041:18;;;13034:34;;;;40834:25:0::1;::::0;;::::1;;13111:14:1::0;13104:22;13099:2;13084:18;;13077:50;13158:3;13143:19;;13136:35;;;40781:10:0::1;::::0;40772:93:::1;::::0;12933:3:1;12918:19;40772:93:0::1;;;;;;;39956:923;39939:940;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;;;;;;38538:2350:0:o;49492:575::-;49593:12;;49586:45;;-1:-1:-1;;;49586:45:0;;49625:4;49586:45;;;4432:51:1;49546:7:0;;;;-1:-1:-1;;;;;49593:12:0;;;;49586:30;;4405:18:1;;49586:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49568:63;-1:-1:-1;49644:16:0;49961:18;;49957:102;;50001:21;:7;50013:8;50001:11;:21::i;:::-;49994:28;;;;49492:575;:::o;49957:102::-;50058:1;50051:8;;;;49492:575;:::o;56525:213::-;4773:13;:11;:13::i;:::-;-1:-1:-1;;;;;56618:24:0;::::1;56610:52;;;::::0;-1:-1:-1;;;56610:52:0;;16635:2:1;56610:52:0::1;::::0;::::1;16617:21:1::0;16674:2;16654:18;;;16647:30;-1:-1:-1;;;16693:18:1;;;16686:45;16748:18;;56610:52:0::1;16433:339:1::0;56610:52:0::1;56673:7;:18:::0;;-1:-1:-1;;;;;;56673:18:0::1;-1:-1:-1::0;;;;;56673:18:0;::::1;::::0;;::::1;::::0;;;56709:21:::1;::::0;4432:51:1;;;56709:21:0::1;::::0;4420:2:1;4405:18;56709:21:0::1;;;;;;;;56525:213:::0;:::o;54002:350::-;4773:13;:11;:13::i;:::-;54111:12:::1;:28:::0;;-1:-1:-1;;54111:28:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;54150:135:::1;;54184:16;:36:::0;;;54150:135:::1;;;54272:1;54253:16;:20:::0;54150:135:::1;54313:12;::::0;54327:16:::1;::::0;54300:44:::1;::::0;::::1;::::0;::::1;::::0;54313:12:::1;::::0;;::::1;16970:14:1::0;16963:22;16945:41;;17017:2;17002:18;;16995:34;16933:2;16918:18;;16777:258;54300:44:0::1;;;;;;;;54002:350:::0;;:::o;33567:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33567:45:0;;-1:-1:-1;33567:45:0;;;;;;;;:::o;5793:201::-;4773:13;:11;:13::i;:::-;-1:-1:-1;;;;;5882:22:0;::::1;5874:73;;;::::0;-1:-1:-1;;;5874:73:0;;17242:2:1;5874:73:0::1;::::0;::::1;17224:21:1::0;17281:2;17261:18;;;17254:30;17320:34;17300:18;;;17293:62;-1:-1:-1;;;17371:18:1;;;17364:36;17417:19;;5874:73:0::1;17040:402:1::0;5874:73:0::1;5958:28;5977:8;5958:18;:28::i;:::-;5793:201:::0;:::o;56239:263::-;4773:13;:11;:13::i;:::-;56317:10:::1;::::0;:15;56309:52:::1;;;::::0;-1:-1:-1;;;56309:52:0;;13384:2:1;56309:52:0::1;::::0;::::1;13366:21:1::0;13423:2;13403:18;;;13396:30;-1:-1:-1;;;13442:18:1;;;13435:54;13506:18;;56309:52:0::1;13182:348:1::0;56309:52:0::1;56393:2;56380:9;:15;;56372:47;;;::::0;-1:-1:-1;;;56372:47:0;;17649:2:1;56372:47:0::1;::::0;::::1;17631:21:1::0;17688:2;17668:18;;;17661:30;-1:-1:-1;;;17707:18:1;;;17700:49;17766:18;;56372:47:0::1;17447:343:1::0;56372:47:0::1;56432:8;:20:::0;;;56468:26:::1;::::0;508:25:1;;;56468:26:0::1;::::0;496:2:1;481:18;56468:26:0::1;362:177:1::0;50917:939:0;51037:7;:14;50999:7;;51023:28;;;;51019:42;;-1:-1:-1;51060:1:0;51053:8;;51019:42;51076:10;;51090:1;51076:15;51072:29;;-1:-1:-1;51100:1:0;51093:8;;51072:29;-1:-1:-1;;;;;51139:20:0;;51114:22;51139:20;;;:10;:20;;;;;51194:7;:19;;51139:20;;51114:22;51194:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;51170:43;;51230:6;:18;;;51252:1;51230:23;51226:37;;51262:1;51255:8;;;;;;51226:37;51276:15;51311:9;51306:518;51330:13;;51326:17;;51306:518;;;51365:19;51387:6;51394:1;51387:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;51415:15;;51387:9;;-1:-1:-1;51415:29:0;;;;:15;;:29;51411:43;;51446:8;;;51411:43;51530:62;51576:5;:15;;;51557:5;:16;;;51542:5;:12;;;:31;;;;:::i;51530:62::-;51520:72;;51607:12;51622:76;51648:49;51663:5;:21;;;51686:10;:8;:10::i;:::-;51648:14;:49::i;:::-;51622:21;51631:6;:11;;;51622:8;:21::i;:::-;:25;;:76::i;:::-;51607:91;;51713:14;51730:36;51757:8;51730:22;51747:4;51730:5;:12;;;:16;;:22;;;;:::i;:36::-;51713:53;-1:-1:-1;51791:19:0;:7;51713:53;51791:11;:19::i;:::-;51781:29;;51350:474;;;51306:518;51345:3;;;;:::i;:::-;;;;51306:518;;;-1:-1:-1;51841:7:0;-1:-1:-1;;;50917:939:0;;;;;:::o;45067:986::-;45144:13;;;;45136:41;;;;-1:-1:-1;;;45136:41:0;;;;;;;:::i;:::-;45209:1;45196:10;;:14;45188:43;;;;-1:-1:-1;;;45188:43:0;;;;;;;:::i;:::-;45263:7;:14;45250:27;;;;45242:58;;;;-1:-1:-1;;;45242:58:0;;;;;;;:::i;:::-;45313:21;45337:7;45345:10;45337:19;;;;;;;;;;:::i;:::-;;;;;;;;;45402:10;45391:22;;:10;:22;;;;;;:34;;;;;;;;;;;45337:19;;;;;;-1:-1:-1;45391:34:0;45458:10;:8;:10::i;:::-;45436:32;;45479:12;45502:15;45537:78;45563:51;45578:6;:22;;;45602:11;45563:14;:51::i;45537:78::-;45530:85;;45636:42;45669:8;45636:28;45659:4;45636:6;:18;;;:22;;:28;;;;:::i;:42::-;45626:52;;45731:7;45710:6;:18;;;:28;;;;:::i;:::-;45689:18;;;:49;45749:22;;;:36;;;45846:20;;45805:76;;45831:49;;45774:11;45831:14;:49::i;45805:76::-;45798:83;;45902:40;45933:8;45902:26;45923:4;45902;:16;;;:20;;:26;;;;:::i;:40::-;45892:50;;45991:7;45972:4;:16;;;:26;;;;:::i;:::-;45953:16;;;:45;-1:-1:-1;;46009:34:0;;-1:-1:-1;;45067:986:0:o;46076:933::-;46148:13;;;;46140:41;;;;-1:-1:-1;;;46140:41:0;;;;;;;:::i;:::-;46213:1;46200:10;;:14;46192:43;;;;-1:-1:-1;;;46192:43:0;;;;;;;:::i;:::-;46267:7;:14;46254:27;;;;46246:58;;;;-1:-1:-1;;;46246:58:0;;;;;;;:::i;:::-;46353:10;46317:22;46342;;;:10;:22;;;;;46399:7;:19;;46342:22;;46317;46399:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;46375:43;;46431:19;46453:10;:8;:10::i;:::-;46431:32;;46474:12;46497:15;46530:9;46525:475;46549:13;;46545:17;;46525:475;;;46584:19;46606:6;46613:1;46606:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;46634:15;;46606:9;;-1:-1:-1;46634:29:0;;;;:15;;:29;46630:43;;46665:8;;;46630:43;46692:5;:12;;;46708:1;46692:17;46688:31;;46711:8;;;46688:31;46743:77;46769:50;46784:5;:21;;;46807:11;46769:14;:50::i;:::-;46743:21;46752:6;:11;;;46743:8;:21::i;:77::-;46736:84;;46847:36;46874:8;46847:22;46864:4;46847:5;:12;;;:16;;:22;;;;:::i;:36::-;46913:12;;;;46837:46;;-1:-1:-1;46913:25:0;;46837:46;46913:16;:25::i;:::-;46898:12;;;:40;46953:21;;:35;;;46525:475;46564:3;;;;:::i;:::-;;;;46525:475;;;;46129:880;;;;;46076:933;:::o;57465:130::-;57523:13;57562:25;57582:4;;57562:15;:19;;:25;;;;:::i;:::-;57554:33;;57465:130;:::o;9228:98::-;9286:7;9313:5;9317:1;9313;:5;:::i;:::-;9306:12;9228:98;-1:-1:-1;;;9228:98:0:o;9609:::-;9667:7;9694:5;9698:1;9694;:5;:::i;27904:211::-;28048:58;;-1:-1:-1;;;;;11896:32:1;;28048:58:0;;;11878:51:1;11945:18;;;11938:34;;;28021:86:0;;28041:5;;-1:-1:-1;;;28071:23:0;11851:18:1;;28048:58:0;;;;-1:-1:-1;;28048:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28048:58:0;-1:-1:-1;;;;;;28048:58:0;;;;;;;;;;28021:19;:86::i;:::-;27904:211;;;:::o;5052:132::-;4933:7;4960:6;-1:-1:-1;;;;;4960:6:0;3518:10;5116:23;5108:68;;;;-1:-1:-1;;;5108:68:0;;17997:2:1;5108:68:0;;;17979:21:1;;;18016:18;;;18009:30;18075:34;18055:18;;;18048:62;18127:18;;5108:68:0;17795:356:1;40913:1917:0;41015:13;;40988:7;;41015:13;;41007:41;;;;-1:-1:-1;;;41007:41:0;;;;;;;:::i;:::-;41080:1;41067:10;;:14;41059:43;;;;-1:-1:-1;;;41059:43:0;;;;;;;:::i;:::-;41131:1;41121:7;:11;41113:55;;;;-1:-1:-1;;;41113:55:0;;15920:2:1;41113:55:0;;;15902:21:1;15959:2;15939:18;;;15932:30;15998:33;15978:18;;;15971:61;16049:18;;41113:55:0;15718:355:1;41113:55:0;41200:7;:14;41187:27;;;;41179:58;;;;-1:-1:-1;;;41179:58:0;;;;;;;:::i;:::-;41285:10;41250:21;41274:22;;;:10;:22;;;;;;;;:34;;;;;;;;;;;;41344:22;;;:10;:22;;;;;41401:7;:19;;41344:22;;41250:21;41401:7;;:19;;;;;;:::i;:::-;;;;;;;;;;;41377:43;;41472:33;41494:10;41472:21;:33::i;:::-;41545:28;41562:10;41545:16;:28::i;:::-;41605:7;41586:16;;41655:681;41679:13;;41675:17;;41655:681;;;41714:19;41736:6;41743:1;41736:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;41764:15;;41736:9;;-1:-1:-1;41764:29:0;;;;:15;;:29;41760:43;;41795:8;;;41760:43;41885:5;:9;;;41871:10;:8;:10::i;:::-;:23;41867:37;;41896:8;;;41867:37;41921:16;41940:55;41979:5;:15;;;41940:34;41957:5;:16;;;41940:5;:12;;;:16;;:34;;;;:::i;:55::-;41921:74;;42027:8;42016;:19;42012:79;;;-1:-1:-1;42067:8:0;42012:79;42118:22;:8;42131;42118:12;:22::i;:::-;42107:33;-1:-1:-1;42167:21:0;:7;42179:8;42167:11;:21::i;:::-;42157:31;;42239:8;42221:5;:15;;;:26;;;;:::i;:::-;42203:15;;;:44;42280:1;42268:13;;;42264:59;;42302:5;;;;42264:59;41699:637;;41655:681;41694:3;;;;:::i;:::-;;;;41655:681;;;-1:-1:-1;42352:11:0;;42348:448;;42415:7;42388:23;:21;:23::i;:::-;:34;;42380:73;;;;-1:-1:-1;;;42380:73:0;;16280:2:1;42380:73:0;;;16262:21:1;16319:2;16299:18;;;16292:30;16358:28;16338:18;;;16331:56;16404:18;;42380:73:0;16078:350:1;42380:73:0;42475:12;;42468:63;;-1:-1:-1;;;;;42475:12:0;42510:10;42523:7;42468:33;:63::i;:::-;42596:7;42572:6;:21;;;:31;;;;:::i;:::-;42548:21;;;:55;42640:19;;;;:29;;42662:7;;42640:29;:::i;:::-;42618:19;;;:51;42733:18;;;;42753:25;;;;42691:91;;;42753:25;12964:17:1;;;12946:36;;13013:2;12998:18;;12991:34;;;13041:18;;;13034:34;;;;42753:25:0;;;;;13111:14:1;13104:22;13099:2;13084:18;;13077:50;42780:1:0;13158:3:1;13143:19;;13136:35;42700:10:0;;42691:91;;12933:3:1;12918:19;42691:91:0;;;;;;;42348:448;42815:7;40913:1917;-1:-1:-1;;;;;;;40913:1917:0:o;28123:248::-;28294:68;;-1:-1:-1;;;;;18414:15:1;;;28294:68:0;;;18396:34:1;18466:15;;18446:18;;;18439:43;18498:18;;;18491:34;;;28267:96:0;;28287:5;;-1:-1:-1;;;28317:27:0;18331:18:1;;28294:68:0;18156:375:1;28267:96:0;28123:248;;;;:::o;9966:98::-;10024:7;10051:5;10055:1;10051;:5;:::i;10365:98::-;10423:7;10450:5;10454:1;10450;:5;:::i;37692:692::-;-1:-1:-1;;;;;37828:20:0;;37803:22;37828:20;;;:10;:20;;;;;37986:4;;37828:20;;37803:22;37951:40;;:30;:15;37971:9;37951:19;:30::i;:40::-;38016:13;;37937:54;;-1:-1:-1;33524:4:0;38048:14;;38040:37;;;;-1:-1:-1;;;38040:37:0;;18738:2:1;38040:37:0;;;18720:21:1;18777:2;18757:18;;;18750:30;-1:-1:-1;;;18796:18:1;;;18789:40;18846:18;;38040:37:0;18536:334:1;38040:37:0;38090:13;;;;;;;-1:-1:-1;38090:13:0;;;-1:-1:-1;38090:6:0;;38177:1;;38170:9;;;;;;:::i;:::-;;;;;;;;;;;;;;38190:31;;-1:-1:-1;;38190:31:0;;;;;;;-1:-1:-1;38232:17:0;;:29;;;38272:12;;;:18;;;38301:15;;;:25;;;38170:9;-1:-1:-1;38364:10:0;:8;:10::i;:::-;38337:24;;;;:37;-1:-1:-1;;;;;;;37692:692:0:o;6154:191::-;6228:16;6247:6;;-1:-1:-1;;;;;6264:17:0;;;-1:-1:-1;;;;;;6264:17:0;;;;;;6297:40;;6247:6;;;;;;;6297:40;;6228:16;6297:40;6217:128;6154:191;:::o;57113:329::-;57203:7;57241:13;;57232:5;:22;57228:207;;-1:-1:-1;57278:1:0;57271:8;;57228:207;57308:13;;57301:3;:20;57297:138;;57345:14;:3;57353:5;57345:7;:14::i;:::-;57338:21;;;;57297:138;57399:13;;:24;;57417:5;57399:17;:24::i;56812:196::-;56883:7;56910:12;56925:51;56971:4;;32480:12;56958:17;;;;:::i;:::-;56925:28;56949:3;56925:28;:5;56935:8;56925:9;:19::i;30971:716::-;31395:23;31421:69;31449:4;31421:69;;;;;;;;;;;;;;;;;31429:5;-1:-1:-1;;;;;31421:27:0;;;:69;;;;;:::i;:::-;31505:17;;31395:95;;-1:-1:-1;31505:21:0;31501:179;;31602:10;31591:30;;;;;;;;;;;;:::i;:::-;31583:85;;;;-1:-1:-1;;;31583:85:0;;19327:2:1;31583:85:0;;;19309:21:1;19366:2;19346:18;;;19339:30;19405:34;19385:18;;;19378:62;-1:-1:-1;;;19456:18:1;;;19449:40;19506:19;;31583:85:0;19125:406:1;17371:229:0;17508:12;17540:52;17562:6;17570:4;17576:1;17579:12;17540:21;:52::i;:::-;17533:59;17371:229;-1:-1:-1;;;;17371:229:0:o;18491:510::-;18661:12;18719:5;18694:21;:30;;18686:81;;;;-1:-1:-1;;;18686:81:0;;19738:2:1;18686:81:0;;;19720:21:1;19777:2;19757:18;;;19750:30;19816:34;19796:18;;;19789:62;-1:-1:-1;;;19867:18:1;;;19860:36;19913:19;;18686:81:0;19536:402:1;18686:81:0;-1:-1:-1;;;;;14921:19:0;;;18778:60;;;;-1:-1:-1;;;18778:60:0;;20145:2:1;18778:60:0;;;20127:21:1;20184:2;20164:18;;;20157:30;20223:31;20203:18;;;20196:59;20272:18;;18778:60:0;19943:353:1;18778:60:0;18852:12;18866:23;18893:6;-1:-1:-1;;;;;18893:11:0;18912:5;18919:4;18893:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18851:73;;;;18942:51;18959:7;18968:10;18980:12;21327;21356:7;21352:580;;;-1:-1:-1;21387:10:0;21380:17;;21352:580;21501:17;;:21;21497:424;;21749:10;21743:17;21810:15;21797:10;21793:2;21789:19;21782:44;21497:424;21892:12;21885:20;;-1:-1:-1;;;21885:20:0;;;;;;;;:::i;14:156:1:-;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:182::-;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;324:27;341:9;324:27;:::i;544:118::-;630:5;623:13;616:21;609:5;606:32;596:60;;652:1;649;642:12;667:722;772:6;780;788;796;804;812;820;873:3;861:9;852:7;848:23;844:33;841:53;;;890:1;887;880:12;841:53;913:27;930:9;913:27;:::i;:::-;903:37;;987:2;976:9;972:18;959:32;949:42;;1038:2;1027:9;1023:18;1010:32;1000:42;;1089:2;1078:9;1074:18;1061:32;1051:42;;1140:3;1129:9;1125:19;1112:33;1102:43;;1195:3;1184:9;1180:19;1167:33;1209:28;1231:5;1209:28;:::i;:::-;1256:5;-1:-1:-1;1313:3:1;1298:19;;1285:33;1327:30;1285:33;1327:30;:::i;:::-;1376:7;1366:17;;;667:722;;;;;;;;;;:::o;1586:173::-;1654:20;;-1:-1:-1;;;;;1703:31:1;;1693:42;;1683:70;;1749:1;1746;1739:12;1764:254;1832:6;1840;1893:2;1881:9;1872:7;1868:23;1864:32;1861:52;;;1909:1;1906;1899:12;1861:52;1932:29;1951:9;1932:29;:::i;:::-;1922:39;2008:2;1993:18;;;;1980:32;;-1:-1:-1;;;1764:254:1:o;2023:250::-;2089:6;2097;2150:2;2138:9;2129:7;2125:23;2121:32;2118:52;;;2166:1;2163;2156:12;2118:52;2189:27;2206:9;2189:27;:::i;2278:250::-;2344:6;2352;2405:2;2393:9;2384:7;2380:23;2376:32;2373:52;;;2421:1;2418;2411:12;2373:52;2457:9;2444:23;2434:33;;2486:36;2518:2;2507:9;2503:18;2486:36;:::i;:::-;2476:46;;2278:250;;;;;:::o;2533:651::-;2631:6;2639;2647;2655;2663;2671;2724:3;2712:9;2703:7;2699:23;2695:33;2692:53;;;2741:1;2738;2731:12;2692:53;2777:9;2764:23;2754:33;;2834:2;2823:9;2819:18;2806:32;2796:42;;2885:2;2874:9;2870:18;2857:32;2847:42;;2936:2;2925:9;2921:18;2908:32;2898:42;;2990:3;2979:9;2975:19;2962:33;3004:28;3026:5;3004:28;:::i;:::-;3051:5;-1:-1:-1;3108:3:1;3093:19;;3080:33;3122:30;3080:33;3122:30;:::i;:::-;3171:7;3161:17;;;2533:651;;;;;;;;:::o;3189:256::-;3255:6;3263;3316:2;3304:9;3295:7;3291:23;3287:32;3284:52;;;3332:1;3329;3322:12;3284:52;3355:27;3372:9;3355:27;:::i;:::-;3345:37;;3401:38;3435:2;3424:9;3420:18;3401:38;:::i;3774:322::-;3851:6;3859;3867;3920:2;3908:9;3899:7;3895:23;3891:32;3888:52;;;3936:1;3933;3926:12;3888:52;3959:29;3978:9;3959:29;:::i;:::-;3949:39;4035:2;4020:18;;4007:32;;-1:-1:-1;4086:2:1;4071:18;;;4058:32;;3774:322;-1:-1:-1;;;3774:322:1:o;4101:180::-;4160:6;4213:2;4201:9;4192:7;4188:23;4184:32;4181:52;;;4229:1;4226;4219:12;4181:52;-1:-1:-1;4252:23:1;;4101:180;-1:-1:-1;4101:180:1:o;5497:256::-;5563:6;5571;5624:2;5612:9;5603:7;5599:23;5595:32;5592:52;;;5640:1;5637;5630:12;5592:52;5663:29;5682:9;5663:29;:::i;:::-;5653:39;;5711:36;5743:2;5732:9;5728:18;5711:36;:::i;6226:186::-;6285:6;6338:2;6326:9;6317:7;6313:23;6309:32;6306:52;;;6354:1;6351;6344:12;6306:52;6377:29;6396:9;6377:29;:::i;6417:309::-;6482:6;6490;6543:2;6531:9;6522:7;6518:23;6514:32;6511:52;;;6559:1;6556;6549:12;6511:52;6598:9;6585:23;6617:28;6639:5;6617:28;:::i;7422:127::-;7483:10;7478:3;7474:20;7471:1;7464:31;7514:4;7511:1;7504:15;7538:4;7535:1;7528:15;7554:355;7756:2;7738:21;;;7795:2;7775:18;;;7768:30;7834:33;7829:2;7814:18;;7807:61;7900:2;7885:18;;7554:355::o;7914:339::-;8116:2;8098:21;;;8155:2;8135:18;;;8128:30;-1:-1:-1;;;8189:2:1;8174:18;;8167:45;8244:2;8229:18;;7914:339::o;8258:340::-;8460:2;8442:21;;;8499:2;8479:18;;;8472:30;-1:-1:-1;;;8533:2:1;8518:18;;8511:46;8589:2;8574:18;;8258:340::o;8603:342::-;8805:2;8787:21;;;8844:2;8824:18;;;8817:30;-1:-1:-1;;;8878:2:1;8863:18;;8856:48;8936:2;8921:18;;8603:342::o;8950:127::-;9011:10;9006:3;9002:20;8999:1;8992:31;9042:4;9039:1;9032:15;9066:4;9063:1;9056:15;9082:135;9121:3;9142:17;;;9139:43;;9162:18;;:::i;:::-;-1:-1:-1;9209:1:1;9198:13;;9082:135::o;10903:125::-;10968:9;;;10989:10;;;10986:36;;;11002:18;;:::i;11033:128::-;11100:9;;;11121:11;;;11118:37;;;11135:18;;:::i;11166:184::-;11236:6;11289:2;11277:9;11268:7;11264:23;11260:32;11257:52;;;11305:1;11302;11295:12;11257:52;-1:-1:-1;11328:16:1;;11166:184;-1:-1:-1;11166:184:1:o;13535:217::-;13575:1;13601;13591:132;;13645:10;13640:3;13636:20;13633:1;13626:31;13680:4;13677:1;13670:15;13708:4;13705:1;13698:15;13591:132;-1:-1:-1;13737:9:1;;13535:217::o;15197:168::-;15270:9;;;15301;;15318:15;;;15312:22;;15298:37;15288:71;;15339:18;;:::i;18875:245::-;18942:6;18995:2;18983:9;18974:7;18970:23;18966:32;18963:52;;;19011:1;19008;19001:12;18963:52;19043:9;19037:16;19062:28;19084:5;19062:28;:::i;20301:250::-;20386:1;20396:113;20410:6;20407:1;20404:13;20396:113;;;20486:11;;;20480:18;20467:11;;;20460:39;20432:2;20425:10;20396:113;;;-1:-1:-1;;20543:1:1;20525:16;;20518:27;20301:250::o;20556:287::-;20685:3;20723:6;20717:13;20739:66;20798:6;20793:3;20786:4;20778:6;20774:17;20739:66;:::i;:::-;20821:16;;;;;20556:287;-1:-1:-1;;20556:287:1:o;20848:396::-;20997:2;20986:9;20979:21;20960:4;21029:6;21023:13;21072:6;21067:2;21056:9;21052:18;21045:34;21088:79;21160:6;21155:2;21144:9;21140:18;21135:2;21127:6;21123:15;21088:79;:::i;:::-;21228:2;21207:15;-1:-1:-1;;21203:29:1;21188:45;;;;21235:2;21184:54;;20848:396;-1:-1:-1;;20848:396:1:o
Swarm Source
ipfs://e8b4a903c6f727e8613c18dab2da25cb165ea984372e49bb09265e653b31ce6a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.008728 | 6,938,717.3136 | $60,560.44 |
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.