Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 8 internal transactions
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
StakeV2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-05-26 */ /** *Submitted for verification at cronoscan.com on 2023-05-24 */ /** *Submitted for verification at polygonscan.com on 2023-05-24 */ // Sources flattened with hardhat v2.11.2 https://hardhat.org // File contracts/v2/IStakeFee.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface IStakeFee { enum FeeType { Stake, Withdraw, Claim, AddBooster, RemoveBooster } function getFees( address pool, address account, FeeType _type ) external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] // // 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/[email protected] // // 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/security/[email protected] // // 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/security/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/utils/math/[email protected] // // 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/token/ERC721/[email protected] // // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/introspection/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC20/[email protected] // // 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/extensions/[email protected] // // 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/utils/[email protected] // // 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/utils/[email protected] // // 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 contracts/v2/StakeV2.sol // pragma solidity ^0.8.4; contract StakeV2 is ReentrancyGuard, Pausable, Ownable, IERC721Receiver { using SafeMath for uint256; using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ IERC20 public immutable rewardsToken; address[] public collectionAddresses; mapping(address => uint256) public collectionRatio; mapping(address => bool) public isAllowedCollection; mapping(address => uint256) public totalStaked; mapping(address => mapping(address => uint256)) public collectionToUserToBalances; mapping(address => uint256) public rewardPerTokenStored; // sum of R/L from 0 to now mapping(address => uint256) public lastUpdateTime; uint256 public periodFinish = 0; uint256 public rewardsDuration = 7 days; uint256 public rewardRate = 0; mapping(address => mapping(address => uint256)) public collectionToUserToRewardPerTokenPaid; // R/L from o to last update mapping(address => mapping(address => uint256)) public collectionToUserToRewards; mapping(address => mapping(uint256 => address)) public nftToUser; // fee IStakeFee public stakeFee; address public chargePayee; // booster address public booster; mapping(address => uint256) public userToBoosterBalance; uint256 public boosterRatio = 2000; // 20%, must divide by 1e4 mapping(address => uint256) public B; // user booster balance * user nft balance /* ========== CONSTRUCTOR ========== */ constructor( address _rewardsToken, address[] memory _collections, uint256[] memory _ratios, address _booster, uint256 _boosterRatio, IStakeFee _stakeFee ) Ownable() { rewardsToken = IERC20(_rewardsToken); collectionAddresses = _collections; chargePayee = msg.sender; for (uint256 i = 0; i < _collections.length; i++) { collectionRatio[_collections[i]] = _ratios[i]; isAllowedCollection[_collections[i]] = true; } booster = _booster; boosterRatio = _boosterRatio; stakeFee = _stakeFee; } /* ========== VIEWS ========== */ function balanceOf(address collection, address account) external view returns (uint256) { return collectionToUserToBalances[collection][account]; } function lastTimeRewardApplicable() public view returns (uint256) { return block.timestamp < periodFinish ? block.timestamp : periodFinish; } function rewardPerToken(address collection) public view returns (uint256) { if (totalStaked[collection] == 0) { return rewardPerTokenStored[collection]; } uint256 top = rewardRate.mul(collectionRatio[collection]).mul(1e4); uint256 bot = ( (totalStaked[collection].mul(1e4)).add( B[collection].mul(boosterRatio) ) ).mul(100); return rewardPerTokenStored[collection].add( lastTimeRewardApplicable() .sub(lastUpdateTime[collection]) .mul(1e18) .mul(top) .div(bot) ); } function earned(address collection, address account) public view returns (uint256) { return collectionToUserToBalances[collection][account] .mul(1e4 + userToBoosterBalance[account].mul(boosterRatio)) .mul( rewardPerToken(collection).sub( collectionToUserToRewardPerTokenPaid[collection][ account ] ) ) .div(1e18) .div(1e4) .add(collectionToUserToRewards[collection][account]); } function getRewardForDuration() external view returns (uint256) { return rewardRate.mul(rewardsDuration); } /* ========== FEE FUNCTIONS ========== */ function setChargePayee(address _payee) public onlyOwner { chargePayee = _payee; } function setStakeFee(IStakeFee _stakeFee) public onlyOwner { stakeFee = _stakeFee; } /* ========== MUTATIVE FUNCTIONS ========== */ function stake(address collection, uint256[] memory ids) external payable nonReentrant whenNotPaused updateReward(collection, msg.sender) { require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.Stake ) * ids.length, "stake fee is not enough" ); require(ids.length > 0, "Cannot stake 0 nft"); require(isAllowedCollection[collection], "Collection is not allowed"); totalStaked[collection] = totalStaked[collection].add(ids.length); collectionToUserToBalances[collection][ msg.sender ] = collectionToUserToBalances[collection][msg.sender].add(ids.length); B[collection] = B[collection].add( ids.length.mul(userToBoosterBalance[msg.sender]) ); for (uint256 i = 0; i < ids.length; i++) { IERC721(collection).safeTransferFrom( msg.sender, address(this), ids[i] ); nftToUser[collection][ids[i]] = msg.sender; } payable(chargePayee).transfer(msg.value); emit Staked(msg.sender, collection, ids.length); } function withdraw(address collection, uint256[] memory ids) public payable nonReentrant updateReward(collection, msg.sender) { require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.Withdraw ) * ids.length, "withdraw fee is not enough" ); require(ids.length > 0, "Cannot withdraw 0 nft"); totalStaked[collection] = totalStaked[collection].sub(ids.length); collectionToUserToBalances[collection][ msg.sender ] = collectionToUserToBalances[collection][msg.sender].sub(ids.length); B[collection] = B[collection].sub( ids.length.mul(userToBoosterBalance[msg.sender]) ); for (uint256 i = 0; i < ids.length; i++) { require(nftToUser[collection][ids[i]] == msg.sender, "not owner"); IERC721(collection).safeTransferFrom( address(this), msg.sender, ids[i] ); } payable(chargePayee).transfer(msg.value); emit Withdrawn(msg.sender, collection, ids.length); } function getReward() public payable nonReentrant { require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.Claim ), "claim fee is not enough" ); for (uint256 i = 0; i < collectionAddresses.length; i++) { _updateReward(collectionAddresses[i], msg.sender); uint256 reward = collectionToUserToRewards[collectionAddresses[i]][ msg.sender ]; if (reward > 0) { rewardsToken.safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, reward); collectionToUserToRewards[collectionAddresses[i]][ msg.sender ] = 0; } } payable(chargePayee).transfer(msg.value); } function addBooster(uint256 id) public payable nonReentrant { require(booster != address(0), "booster is not set"); require(userToBoosterBalance[msg.sender] < 3, "booster limit reached"); require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.AddBooster ), "add booster fee is not enough" ); IERC721(booster).safeTransferFrom(msg.sender, address(this), id); nftToUser[booster][id] = msg.sender; userToBoosterBalance[msg.sender] = userToBoosterBalance[msg.sender].add( 1 ); for (uint256 i = 0; i < collectionAddresses.length; i++) { B[collectionAddresses[i]] = B[collectionAddresses[i]].add( collectionToUserToBalances[collectionAddresses[i]][msg.sender] ); _updateReward(collectionAddresses[i], msg.sender); } } function removeBooster(uint256 id) public payable nonReentrant { require(booster != address(0), "booster is not set"); require(userToBoosterBalance[msg.sender] > 0, "no booster to remove"); require(nftToUser[booster][id] == msg.sender, "not owner"); require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.RemoveBooster ), "remove booster fee is not enough" ); IERC721(booster).safeTransferFrom(address(this), msg.sender, id); userToBoosterBalance[msg.sender] = userToBoosterBalance[msg.sender].sub( 1 ); for (uint256 i = 0; i < collectionAddresses.length; i++) { B[collectionAddresses[i]] = B[collectionAddresses[i]].sub( collectionToUserToBalances[collectionAddresses[i]][msg.sender] ); _updateReward(collectionAddresses[i], msg.sender); } } /* ========== RESTRICTED FUNCTIONS ========== */ function notifyRewardAmount(uint256 reward) external onlyOwner { for (uint256 i = 0; i < collectionAddresses.length; i++) { _updateReward(collectionAddresses[i], address(0)); } if (block.timestamp >= periodFinish) { rewardRate = reward.div(rewardsDuration); } else { uint256 remaining = periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardRate); rewardRate = reward.add(leftover).div(rewardsDuration); } uint256 balance = rewardsToken.balanceOf(address(this)); require( rewardRate <= balance.div(rewardsDuration), "Provided reward too high" ); for (uint256 i = 0; i < collectionAddresses.length; i++) { lastUpdateTime[collectionAddresses[i]] = block.timestamp; } periodFinish = block.timestamp.add(rewardsDuration); emit RewardAdded(reward); } function setRewardsDuration(uint256 _rewardsDuration) external onlyOwner { require( block.timestamp > periodFinish, "Previous rewards period must be complete before changing the duration for the new period" ); rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(rewardsDuration); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function enableBooster(address _booster) external onlyOwner { require(booster == address(0), "booster already set"); booster = _booster; } function setBoosterRatio(uint256 _ratio) external onlyOwner { require(_ratio < 3300, "ratio must be less than 33%"); boosterRatio = _ratio; } /* ========== MODIFIERS ========== */ modifier updateReward(address collection, address account) { _updateReward(collection, account); _; } function _updateReward(address collection, address account) internal { rewardPerTokenStored[collection] = rewardPerToken(collection); lastUpdateTime[collection] = lastTimeRewardApplicable(); if (account != address(0)) { collectionToUserToRewards[collection][account] = earned( collection, account ); collectionToUserToRewardPerTokenPaid[collection][ account ] = rewardPerTokenStored[collection]; } } function onERC721Received( address operator, address from, uint256 tokenId, bytes memory data ) external pure returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } /* ========== EVENTS ========== */ event RewardAdded(uint256 reward); event Staked( address indexed user, address indexed collection, uint256 amount ); event Withdrawn( address indexed user, address indexed collection, uint256 amount ); event RewardPaid(address indexed user, uint256 reward); event RewardsDurationUpdated(uint256 newDuration); }
[{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address[]","name":"_collections","type":"address[]"},{"internalType":"uint256[]","name":"_ratios","type":"uint256[]"},{"internalType":"address","name":"_booster","type":"address"},{"internalType":"uint256","name":"_boosterRatio","type":"uint256"},{"internalType":"contract IStakeFee","name":"_stakeFee","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"B","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"addBooster","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"booster","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boosterRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chargePayee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collectionRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collectionToUserToBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collectionToUserToRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collectionToUserToRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_booster","type":"address"}],"name":"enableBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftToUser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"removeBooster","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ratio","type":"uint256"}],"name":"setBoosterRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payee","type":"address"}],"name":"setChargePayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStakeFee","name":"_stakeFee","type":"address"}],"name":"setStakeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"stakeFee","outputs":[{"internalType":"contract IStakeFee","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userToBoosterBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a0604052600060095562093a80600a556000600b556107d06013553480156200002857600080fd5b5060405162005e6638038062005e6683398181016040528101906200004e919062000788565b60016000819055506000600160006101000a81548160ff0219169083151502179055506200009162000085620002cb60201b60201c565b620002d360201b60201c565b8573ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508460029080519060200190620000dd92919062000396565b5033601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8551811015620002355784818151811062000142576200014162000862565b5b60200260200101516003600088848151811062000164576200016362000862565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160046000888481518110620001c657620001c562000862565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806200022c90620008c0565b91505062000122565b5082601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160138190555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050506200090d565b600033905090565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000412579160200282015b82811115620004115782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620003b7565b5b50905062000421919062000425565b5090565b5b808211156200044057600081600090555060010162000426565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004858262000458565b9050919050565b620004978162000478565b8114620004a357600080fd5b50565b600081519050620004b7816200048c565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050d82620004c2565b810181811067ffffffffffffffff821117156200052f576200052e620004d3565b5b80604052505050565b60006200054462000444565b905062000552828262000502565b919050565b600067ffffffffffffffff821115620005755762000574620004d3565b5b602082029050602081019050919050565b600080fd5b6000620005a26200059c8462000557565b62000538565b90508083825260208201905060208402830185811115620005c857620005c762000586565b5b835b81811015620005f55780620005e08882620004a6565b845260208401935050602081019050620005ca565b5050509392505050565b600082601f830112620006175762000616620004bd565b5b8151620006298482602086016200058b565b91505092915050565b600067ffffffffffffffff82111562000650576200064f620004d3565b5b602082029050602081019050919050565b6000819050919050565b620006768162000661565b81146200068257600080fd5b50565b60008151905062000696816200066b565b92915050565b6000620006b3620006ad8462000632565b62000538565b90508083825260208201905060208402830185811115620006d957620006d862000586565b5b835b81811015620007065780620006f1888262000685565b845260208401935050602081019050620006db565b5050509392505050565b600082601f830112620007285762000727620004bd565b5b81516200073a8482602086016200069c565b91505092915050565b6000620007508262000478565b9050919050565b620007628162000743565b81146200076e57600080fd5b50565b600081519050620007828162000757565b92915050565b60008060008060008060c08789031215620007a857620007a76200044e565b5b6000620007b889828a01620004a6565b965050602087015167ffffffffffffffff811115620007dc57620007db62000453565b5b620007ea89828a01620005ff565b955050604087015167ffffffffffffffff8111156200080e576200080d62000453565b5b6200081c89828a0162000710565b94505060606200082f89828a01620004a6565b93505060806200084289828a0162000685565b92505060a06200085589828a0162000771565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620008cd8262000661565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000902576200090162000891565b5b600182019050919050565b60805161552f62000937600039600081816114ea0152818161192f0152612b03015261552f6000f3fe60806040526004361061025b5760003560e01c80638293744b11610144578063d5d39064116100b6578063f2fde38b1161007a578063f2fde38b146108ff578063f60a038d14610928578063f7888aec14610951578063f7db8ded1461098e578063fc5ba1a4146109cb578063ffd189a7146109f65761025b565b8063d5d3906414610808578063ebe2b12b14610831578063f055cbf51461085c578063f122977714610899578063f1c4db6d146108d65761025b565b80639ce43f90116101085780639ce43f90146106f3578063abae977f14610730578063c6def0761461076d578063c9a3911e14610798578063cc1a378f146107b4578063d1af0c7d146107dd5761025b565b80638293744b1461061b5780638456cb59146106375780638da5cb5b1461064e5780639159b475146106795780639bfd8d61146106b65761025b565b8063386a9525116101dd5780635c975abb116101a15780635c975abb1461051d578063715018a6146105485780637a78b6b71461055f5780637b0a47ee146105885780637f087d49146105b357806380faa57d146105f05761025b565b8063386a95251461046b5780633c6b16ab146104965780633d18b912146104bf5780633f4ba83a146104c95780635207129b146104e05761025b565b80631c1f78eb116102245780631c1f78eb1461037f578063211dc32d146103aa578063221864ba146103e7578063222c9777146104035780632ce9aead1461042e5761025b565b8062c5c5ce1461026057806310accedb1461028b578063134102d6146102c8578063150b7a02146103055780631604b58e14610342575b600080fd5b34801561026c57600080fd5b50610275610a12565b6040516102829190613f6c565b60405180910390f35b34801561029757600080fd5b506102b260048036038101906102ad9190613ff9565b610a18565b6040516102bf9190613f6c565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190613ff9565b610a30565b6040516102fc9190613f6c565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190614198565b610a48565b6040516103399190614256565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613ff9565b610a5c565b604051610376919061428c565b60405180910390f35b34801561038b57600080fd5b50610394610a7c565b6040516103a19190613f6c565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc91906142a7565b610a9a565b6040516103de9190613f6c565b60405180910390f35b61040160048036038101906103fc91906142e7565b610cf7565b005b34801561040f57600080fd5b506104186113a2565b6040516104259190614373565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613ff9565b6113c8565b6040516104629190613f6c565b60405180910390f35b34801561047757600080fd5b506104806113e0565b60405161048d9190613f6c565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906142e7565b6113e6565b005b6104c76116d9565b005b3480156104d557600080fd5b506104de611b0a565b005b3480156104ec57600080fd5b506105076004803603810190610502919061438e565b611b1c565b60405161051491906143dd565b60405180910390f35b34801561052957600080fd5b50610532611b5e565b60405161053f919061428c565b60405180910390f35b34801561055457600080fd5b5061055d611b75565b005b34801561056b57600080fd5b5061058660048036038101906105819190614436565b611b89565b005b34801561059457600080fd5b5061059d611bd5565b6040516105aa9190613f6c565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190613ff9565b611bdb565b6040516105e79190613f6c565b60405180910390f35b3480156105fc57600080fd5b50610605611bf3565b6040516106129190613f6c565b60405180910390f35b6106356004803603810190610630919061452b565b611c0d565b005b34801561064357600080fd5b5061064c6122a3565b005b34801561065a57600080fd5b506106636122b5565b60405161067091906143dd565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b91906142a7565b6122dd565b6040516106ad9190613f6c565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d89190613ff9565b612302565b6040516106ea9190613f6c565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613ff9565b61231a565b6040516107279190613f6c565b60405180910390f35b34801561073c57600080fd5b50610757600480360381019061075291906142e7565b612332565b60405161076491906143dd565b60405180910390f35b34801561077957600080fd5b50610782612371565b60405161078f91906143dd565b60405180910390f35b6107b260048036038101906107ad919061452b565b612397565b005b3480156107c057600080fd5b506107db60048036038101906107d691906142e7565b612a72565b005b3480156107e957600080fd5b506107f2612b01565b6040516107ff91906145a8565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a9190613ff9565b612b25565b005b34801561083d57600080fd5b50610846612c02565b6040516108539190613f6c565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e91906142a7565b612c08565b6040516108909190613f6c565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb9190613ff9565b612c2d565b6040516108cd9190613f6c565b60405180910390f35b3480156108e257600080fd5b506108fd60048036038101906108f891906142e7565b612eea565b005b34801561090b57600080fd5b5061092660048036038101906109219190613ff9565b612f40565b005b34801561093457600080fd5b5061094f600480360381019061094a9190613ff9565b612fc3565b005b34801561095d57600080fd5b50610978600480360381019061097391906142a7565b61300f565b6040516109859190613f6c565b60405180910390f35b34801561099a57600080fd5b506109b560048036038101906109b091906142a7565b613096565b6040516109c29190613f6c565b60405180910390f35b3480156109d757600080fd5b506109e06130bb565b6040516109ed91906143dd565b60405180910390f35b610a106004803603810190610a0b91906142e7565b6130e1565b005b60135481565b60126020528060005260406000206000915090505481565b60036020528060005260406000206000915090505481565b600063150b7a0260e01b9050949350505050565b60046020528060005260406000206000915054906101000a900460ff1681565b6000610a95600a54600b5461373d90919063ffffffff16565b905090565b6000610cef600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ce1612710610cd3670de0b6b3a7640000610cc5610bc8600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bba8c612c2d565b61375390919063ffffffff16565b610cb7610c1f601354601260008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461373d90919063ffffffff16565b612710610c2c91906145f2565b600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461373d90919063ffffffff16565b61373d90919063ffffffff16565b61376990919063ffffffff16565b61376990919063ffffffff16565b61377f90919063ffffffff16565b905092915050565b600260005403610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3390614683565b60405180910390fd5b6002600081905550600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc906146ef565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e9061475b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600e6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906147c7565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360046040518463ffffffff1660e01b8152600401610fb79392919061485e565b602060405180830381865afa158015610fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff891906148aa565b3414611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090614923565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b815260040161109893929190614943565b600060405180830381600087803b1580156110b257600080fd5b505af11580156110c6573d6000803e3d6000fd5b5050505061111d6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b600280549050811015611396576112ba600660006002848154811061118b5761118a61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460146000600285815481106112465761124561497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b60146000600284815481106112d2576112d161497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611383600282815481106113525761135161497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633613795565b808061138e906149a9565b915050611163565b50600160008190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915090505481565b600a5481565b6113ee6139af565b60005b60028054905081101561145a57611447600282815481106114155761141461497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000613795565b8080611452906149a9565b9150506113f1565b50600954421061148457611479600a548261376990919063ffffffff16565b600b819055506114e6565b600061149b4260095461375390919063ffffffff16565b905060006114b4600b548361373d90919063ffffffff16565b90506114dd600a546114cf838661377f90919063ffffffff16565b61376990919063ffffffff16565b600b8190555050505b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161154191906143dd565b602060405180830381865afa15801561155e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158291906148aa565b9050611599600a548261376990919063ffffffff16565b600b5411156115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d490614a3d565b60405180910390fd5b60005b600280549050811015611682574260086000600284815481106116065761160561497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061167a906149a9565b9150506115e0565b50611698600a544261377f90919063ffffffff16565b6009819055507fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d826040516116cd9190613f6c565b60405180910390a15050565b60026000540361171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614683565b60405180910390fd5b6002600081905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360026040518463ffffffff1660e01b81526004016117869392919061485e565b602060405180830381865afa1580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c791906148aa565b3414611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90614aa9565b60405180910390fd5b60005b600280549050811015611a96576118606002828154811061182f5761182e61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633613795565b6000600d60006002848154811061187a5761187961497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611a825761197333827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613a2d9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516119b99190613f6c565b60405180910390a26000600d6000600285815481106119db576119da61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b508080611a8e906149a9565b91505061180b565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611aff573d6000803e3d6000fd5b506001600081905550565b611b126139af565b611b1a613ab3565b565b600e6020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900460ff16905090565b611b7d6139af565b611b876000613b16565b565b611b916139af565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b60146020528060005260406000206000915090505481565b60006009544210611c0657600954611c08565b425b905090565b600260005403611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990614683565b60405180910390fd5b60026000819055508133611c668282613795565b8251600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360016040518463ffffffff1660e01b8152600401611cc89392919061485e565b602060405180830381865afa158015611ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0991906148aa565b611d139190614ac9565b3414611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b90614b57565b60405180910390fd5b6000835111611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614bc3565b60405180910390fd5b611deb8351600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ebe8351600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fe2611f94601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054855161373d90919063ffffffff16565b601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b83518110156121c5573373ffffffffffffffffffffffffffffffffffffffff16600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086848151811061209c5761209b61497a565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906147c7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166342842e0e303387858151811061215a5761215961497a565b5b60200260200101516040518463ffffffff1660e01b815260040161218093929190614943565b600060405180830381600087803b15801561219a57600080fd5b505af11580156121ae573d6000803e3d6000fd5b5050505080806121bd906149a9565b915050612028565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561222e573d6000803e3d6000fd5b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb855160405161228d9190613f6c565b60405180910390a3505060016000819055505050565b6122ab6139af565b6122b3613bd9565b565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c602052816000526040600020602052806000526040600020600091509150505481565b60056020528060005260406000206000915090505481565b60076020528060005260406000206000915090505481565b6002818154811061234257600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002600054036123dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d390614683565b60405180910390fd5b60026000819055506123ec613c3b565b81336123f88282613795565b8251600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360006040518463ffffffff1660e01b815260040161245a9392919061485e565b602060405180830381865afa158015612477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249b91906148aa565b6124a59190614ac9565b34146124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90614c2f565b60405180910390fd5b600083511161252a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252190614c9b565b60405180910390fd5b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad90614d07565b60405180910390fd5b6126098351600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506126dc8351600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506128006127b2601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054855161373d90919063ffffffff16565b601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8351811015612994578473ffffffffffffffffffffffffffffffffffffffff166342842e0e33308785815181106128805761287f61497a565b5b60200260200101516040518463ffffffff1660e01b81526004016128a693929190614943565b600060405180830381600087803b1580156128c057600080fd5b505af11580156128d4573d6000803e3d6000fd5b5050505033600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086848151811061292d5761292c61497a565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061298c906149a9565b915050612846565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156129fd573d6000803e3d6000fd5b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5dac0c1b1112564a045ba943c9d50270893e8e826c49be8e7073adc713ab7bd78551604051612a5c9190613f6c565b60405180910390a3505060016000819055505050565b612a7a6139af565b6009544211612abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab590614dbf565b60405180910390fd5b80600a819055507ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d3600a54604051612af69190613f6c565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b612b2d6139af565b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb590614e2b565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b6006602052816000526040600020602052806000526040600020600091509150505481565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403612cbc57600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612ee5565b6000612d26612710612d18600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b5461373d90919063ffffffff16565b61373d90919063ffffffff16565b90506000612df66064612de8612d86601354601460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461373d90919063ffffffff16565b612dda612710600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461373d90919063ffffffff16565b61377f90919063ffffffff16565b61373d90919063ffffffff16565b9050612ee0612e9282612e8485612e76670de0b6b3a7640000612e68600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e5a611bf3565b61375390919063ffffffff16565b61373d90919063ffffffff16565b61373d90919063ffffffff16565b61376990919063ffffffff16565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b925050505b919050565b612ef26139af565b610ce48110612f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2d90614e97565b60405180910390fd5b8060138190555050565b612f486139af565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae90614f29565b60405180910390fd5b612fc081613b16565b50565b612fcb6139af565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600d602052816000526040600020602052806000526040600020600091509150505481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260005403613126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311d90614683565b60405180910390fd5b6002600081905550600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036131bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b6906146ef565b60405180910390fd5b6003601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410613241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323890614f95565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360036040518463ffffffff1660e01b81526004016132a19392919061485e565b602060405180830381865afa1580156132be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e291906148aa565b3414613323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331a90615001565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330846040518463ffffffff1660e01b815260040161338293929190614943565b600060405180830381600087803b15801561339c57600080fd5b505af11580156133b0573d6000803e3d6000fd5b5050505033600e6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506134b86001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b6002805490508110156137315761365560066000600284815481106135265761352561497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460146000600285815481106135e1576135e061497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b601460006002848154811061366d5761366c61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061371e600282815481106136ed576136ec61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633613795565b8080613729906149a9565b9150506134fe565b50600160008190555050565b6000818361374b9190614ac9565b905092915050565b600081836137619190615021565b905092915050565b600081836137779190615084565b905092915050565b6000818361378d91906145f2565b905092915050565b61379e82612c2d565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137e9611bf3565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146139ab5761386a8282610a9a565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b6139b7613c85565b73ffffffffffffffffffffffffffffffffffffffff166139d56122b5565b73ffffffffffffffffffffffffffffffffffffffff1614613a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2290615101565b60405180910390fd5b565b613aae8363a9059cbb60e01b8484604051602401613a4c929190615121565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c8d565b505050565b613abb613d54565b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613aff613c85565b604051613b0c91906143dd565b60405180910390a1565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613be1613c3b565b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613c24613c85565b604051613c3191906143dd565b60405180910390a1565b613c43611b5e565b15613c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c7a90615196565b60405180910390fd5b565b600033905090565b6000613cef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d9d9092919063ffffffff16565b9050600081511115613d4f5780806020019051810190613d0f91906151e2565b613d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4590615281565b60405180910390fd5b5b505050565b613d5c611b5e565b613d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d92906152ed565b60405180910390fd5b565b6060613dac8484600085613db5565b90509392505050565b606082471015613dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df19061537f565b60405180910390fd5b613e0385613ec9565b613e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e39906153eb565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e6b919061547c565b60006040518083038185875af1925050503d8060008114613ea8576040519150601f19603f3d011682016040523d82523d6000602084013e613ead565b606091505b5091509150613ebd828286613eec565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613efc57829050613f4c565b600083511115613f0f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f4391906154d7565b60405180910390fd5b9392505050565b6000819050919050565b613f6681613f53565b82525050565b6000602082019050613f816000830184613f5d565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fc682613f9b565b9050919050565b613fd681613fbb565b8114613fe157600080fd5b50565b600081359050613ff381613fcd565b92915050565b60006020828403121561400f5761400e613f91565b5b600061401d84828501613fe4565b91505092915050565b61402f81613f53565b811461403a57600080fd5b50565b60008135905061404c81614026565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140a58261405c565b810181811067ffffffffffffffff821117156140c4576140c361406d565b5b80604052505050565b60006140d7613f87565b90506140e3828261409c565b919050565b600067ffffffffffffffff8211156141035761410261406d565b5b61410c8261405c565b9050602081019050919050565b82818337600083830152505050565b600061413b614136846140e8565b6140cd565b90508281526020810184848401111561415757614156614057565b5b614162848285614119565b509392505050565b600082601f83011261417f5761417e614052565b5b813561418f848260208601614128565b91505092915050565b600080600080608085870312156141b2576141b1613f91565b5b60006141c087828801613fe4565b94505060206141d187828801613fe4565b93505060406141e28782880161403d565b925050606085013567ffffffffffffffff81111561420357614202613f96565b5b61420f8782880161416a565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6142508161421b565b82525050565b600060208201905061426b6000830184614247565b92915050565b60008115159050919050565b61428681614271565b82525050565b60006020820190506142a1600083018461427d565b92915050565b600080604083850312156142be576142bd613f91565b5b60006142cc85828601613fe4565b92505060206142dd85828601613fe4565b9150509250929050565b6000602082840312156142fd576142fc613f91565b5b600061430b8482850161403d565b91505092915050565b6000819050919050565b600061433961433461432f84613f9b565b614314565b613f9b565b9050919050565b600061434b8261431e565b9050919050565b600061435d82614340565b9050919050565b61436d81614352565b82525050565b60006020820190506143886000830184614364565b92915050565b600080604083850312156143a5576143a4613f91565b5b60006143b385828601613fe4565b92505060206143c48582860161403d565b9150509250929050565b6143d781613fbb565b82525050565b60006020820190506143f260008301846143ce565b92915050565b600061440382613fbb565b9050919050565b614413816143f8565b811461441e57600080fd5b50565b6000813590506144308161440a565b92915050565b60006020828403121561444c5761444b613f91565b5b600061445a84828501614421565b91505092915050565b600067ffffffffffffffff82111561447e5761447d61406d565b5b602082029050602081019050919050565b600080fd5b60006144a76144a284614463565b6140cd565b905080838252602082019050602084028301858111156144ca576144c961448f565b5b835b818110156144f357806144df888261403d565b8452602084019350506020810190506144cc565b5050509392505050565b600082601f83011261451257614511614052565b5b8135614522848260208601614494565b91505092915050565b6000806040838503121561454257614541613f91565b5b600061455085828601613fe4565b925050602083013567ffffffffffffffff81111561457157614570613f96565b5b61457d858286016144fd565b9150509250929050565b600061459282614340565b9050919050565b6145a281614587565b82525050565b60006020820190506145bd6000830184614599565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145fd82613f53565b915061460883613f53565b92508282019050808211156146205761461f6145c3565b5b92915050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061466d601f83614626565b915061467882614637565b602082019050919050565b6000602082019050818103600083015261469c81614660565b9050919050565b7f626f6f73746572206973206e6f74207365740000000000000000000000000000600082015250565b60006146d9601283614626565b91506146e4826146a3565b602082019050919050565b60006020820190508181036000830152614708816146cc565b9050919050565b7f6e6f20626f6f7374657220746f2072656d6f7665000000000000000000000000600082015250565b6000614745601483614626565b91506147508261470f565b602082019050919050565b6000602082019050818103600083015261477481614738565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006147b1600983614626565b91506147bc8261477b565b602082019050919050565b600060208201905081810360008301526147e0816147a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60058110614827576148266147e7565b5b50565b600081905061483882614816565b919050565b60006148488261482a565b9050919050565b6148588161483d565b82525050565b600060608201905061487360008301866143ce565b61488060208301856143ce565b61488d604083018461484f565b949350505050565b6000815190506148a481614026565b92915050565b6000602082840312156148c0576148bf613f91565b5b60006148ce84828501614895565b91505092915050565b7f72656d6f766520626f6f7374657220666565206973206e6f7420656e6f756768600082015250565b600061490d602083614626565b9150614918826148d7565b602082019050919050565b6000602082019050818103600083015261493c81614900565b9050919050565b600060608201905061495860008301866143ce565b61496560208301856143ce565b6149726040830184613f5d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006149b482613f53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149e6576149e56145c3565b5b600182019050919050565b7f50726f76696465642072657761726420746f6f20686967680000000000000000600082015250565b6000614a27601883614626565b9150614a32826149f1565b602082019050919050565b60006020820190508181036000830152614a5681614a1a565b9050919050565b7f636c61696d20666565206973206e6f7420656e6f756768000000000000000000600082015250565b6000614a93601783614626565b9150614a9e82614a5d565b602082019050919050565b60006020820190508181036000830152614ac281614a86565b9050919050565b6000614ad482613f53565b9150614adf83613f53565b9250828202614aed81613f53565b91508282048414831517614b0457614b036145c3565b5b5092915050565b7f776974686472617720666565206973206e6f7420656e6f756768000000000000600082015250565b6000614b41601a83614626565b9150614b4c82614b0b565b602082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b7f43616e6e6f742077697468647261772030206e66740000000000000000000000600082015250565b6000614bad601583614626565b9150614bb882614b77565b602082019050919050565b60006020820190508181036000830152614bdc81614ba0565b9050919050565b7f7374616b6520666565206973206e6f7420656e6f756768000000000000000000600082015250565b6000614c19601783614626565b9150614c2482614be3565b602082019050919050565b60006020820190508181036000830152614c4881614c0c565b9050919050565b7f43616e6e6f74207374616b652030206e66740000000000000000000000000000600082015250565b6000614c85601283614626565b9150614c9082614c4f565b602082019050919050565b60006020820190508181036000830152614cb481614c78565b9050919050565b7f436f6c6c656374696f6e206973206e6f7420616c6c6f77656400000000000000600082015250565b6000614cf1601983614626565b9150614cfc82614cbb565b602082019050919050565b60006020820190508181036000830152614d2081614ce4565b9050919050565b7f50726576696f7573207265776172647320706572696f64206d7573742062652060008201527f636f6d706c657465206265666f7265206368616e67696e67207468652064757260208201527f6174696f6e20666f7220746865206e657720706572696f640000000000000000604082015250565b6000614da9605883614626565b9150614db482614d27565b606082019050919050565b60006020820190508181036000830152614dd881614d9c565b9050919050565b7f626f6f7374657220616c72656164792073657400000000000000000000000000600082015250565b6000614e15601383614626565b9150614e2082614ddf565b602082019050919050565b60006020820190508181036000830152614e4481614e08565b9050919050565b7f726174696f206d757374206265206c657373207468616e203333250000000000600082015250565b6000614e81601b83614626565b9150614e8c82614e4b565b602082019050919050565b60006020820190508181036000830152614eb081614e74565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614f13602683614626565b9150614f1e82614eb7565b604082019050919050565b60006020820190508181036000830152614f4281614f06565b9050919050565b7f626f6f73746572206c696d697420726561636865640000000000000000000000600082015250565b6000614f7f601583614626565b9150614f8a82614f49565b602082019050919050565b60006020820190508181036000830152614fae81614f72565b9050919050565b7f61646420626f6f7374657220666565206973206e6f7420656e6f756768000000600082015250565b6000614feb601d83614626565b9150614ff682614fb5565b602082019050919050565b6000602082019050818103600083015261501a81614fde565b9050919050565b600061502c82613f53565b915061503783613f53565b925082820390508181111561504f5761504e6145c3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061508f82613f53565b915061509a83613f53565b9250826150aa576150a9615055565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006150eb602083614626565b91506150f6826150b5565b602082019050919050565b6000602082019050818103600083015261511a816150de565b9050919050565b600060408201905061513660008301856143ce565b6151436020830184613f5d565b9392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615180601083614626565b915061518b8261514a565b602082019050919050565b600060208201905081810360008301526151af81615173565b9050919050565b6151bf81614271565b81146151ca57600080fd5b50565b6000815190506151dc816151b6565b92915050565b6000602082840312156151f8576151f7613f91565b5b6000615206848285016151cd565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061526b602a83614626565b91506152768261520f565b604082019050919050565b6000602082019050818103600083015261529a8161525e565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006152d7601483614626565b91506152e2826152a1565b602082019050919050565b60006020820190508181036000830152615306816152ca565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615369602683614626565b91506153748261530d565b604082019050919050565b600060208201905081810360008301526153988161535c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006153d5601d83614626565b91506153e08261539f565b602082019050919050565b60006020820190508181036000830152615404816153c8565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561543f578082015181840152602081019050615424565b60008484015250505050565b60006154568261540b565b6154608185615416565b9350615470818560208601615421565b80840191505092915050565b6000615488828461544b565b915081905092915050565b600081519050919050565b60006154a982615493565b6154b38185614626565b93506154c3818560208601615421565b6154cc8161405c565b840191505092915050565b600060208201905081810360008301526154f1818461549e565b90509291505056fea2646970667358221220a93e160243fb03a4998a1dee55a3c67867ffd8155d224e382f17739f8ab07c1f64736f6c63430008110033000000000000000000000000cc6e924721f75af3a8f8282216569276f3f2a10400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000548c431dbf2165a770dbf7c57cacae8bfdb820b60000000000000000000000000000000000000000000000000000000000000001000000000000000000000000371ea7c19e67559b89ecc6299d6a6feda60e64e900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cc6e924721f75af3a8f8282216569276f3f2a10400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000548c431dbf2165a770dbf7c57cacae8bfdb820b60000000000000000000000000000000000000000000000000000000000000001000000000000000000000000371ea7c19e67559b89ecc6299d6a6feda60e64e900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _rewardsToken (address): 0xcc6e924721f75af3a8f8282216569276f3f2a104
Arg [1] : _collections (address[]): 0x371ea7c19e67559b89ecc6299d6a6feda60e64e9
Arg [2] : _ratios (uint256[]): 100
Arg [3] : _booster (address): 0x0000000000000000000000000000000000000000
Arg [4] : _boosterRatio (uint256): 0
Arg [5] : _stakeFee (address): 0x548c431dbf2165a770dbf7c57cacae8bfdb820b6
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc6e924721f75af3a8f8282216569276f3f2a104
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 000000000000000000000000548c431dbf2165a770dbf7c57cacae8bfdb820b6
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 000000000000000000000000371ea7c19e67559b89ecc6299d6a6feda60e64e9
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed ByteCode Sourcemap
42001:13449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43315:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43253:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42285:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54770:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42342:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45967:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45299:660;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51064:1065;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43141:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42642:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42738:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52193:986;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49086:930;;;:::i;:::-;;53626:67;;;;;;;;;;;;;:::i;:::-;;43056:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8661:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3392:103;;;;;;;;;;;;;:::i;:::-;;46247:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42784:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43383:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44417:155;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47780:1298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53555:63;;;;;;;;;;;;;:::i;:::-;;2744:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42822:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42400:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42552:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42242:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43224:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46407:1365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53187:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42199:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53701:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42700:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42455:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44580:711;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53870:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3650:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46143:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44216:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42958:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43173:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50024:1032;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43315:34;;;;:::o;43253:55::-;;;;;;;;;;;;;;;;;:::o;42285:50::-;;;;;;;;;;;;;;;;;:::o;54770:235::-;54930:6;54956:41;;;54949:48;;54770:235;;;;;;:::o;42342:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;45967:121::-;46022:7;46049:31;46064:15;;46049:10;;:14;;:31;;;;:::i;:::-;46042:38;;45967:121;:::o;45299:660::-;45400:7;45445:506;45904:25;:37;45930:10;45904:37;;;;;;;;;;;;;;;:46;45942:7;45904:46;;;;;;;;;;;;;;;;45445:436;45877:3;45445:409;45849:4;45445:381;45614:193;45671:36;:48;45708:10;45671:48;;;;;;;;;;;;;;;:113;45750:7;45671:113;;;;;;;;;;;;;;;;45614:26;45629:10;45614:14;:26::i;:::-;:30;;:193;;;;:::i;:::-;45445:124;45521:47;45555:12;;45521:20;:29;45542:7;45521:29;;;;;;;;;;;;;;;;:33;;:47;;;;:::i;:::-;45515:3;:53;;;;:::i;:::-;45445:26;:38;45472:10;45445:38;;;;;;;;;;;;;;;:47;45484:7;45445:47;;;;;;;;;;;;;;;;:69;;:124;;;;:::i;:::-;:146;;:381;;;;:::i;:::-;:403;;:409;;;;:::i;:::-;:431;;:436;;;;:::i;:::-;:458;;:506;;;;:::i;:::-;45425:526;;45299:660;;;;:::o;51064:1065::-;6032:1;6630:7;;:19;6622:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6032:1;6763:7;:18;;;;51165:1:::1;51146:21;;:7;;;;;;;;;;;:21;;::::0;51138:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;51244:1;51209:20;:32;51230:10;51209:32;;;;;;;;;;;;;;;;:36;51201:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51315:10;51289:36;;:9;:18;51299:7;;;;;;;;;;;51289:18;;;;;;;;;;;;;;;:22;51308:2;51289:22;;;;;;;;;;;;;;;;;;;;;:36;;;51281:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51402:8;;;;;;;;;;;:16;;;51449:4;51477:10;51510:31;51402:158;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51372:9;:188;51350:270;;;;;;;;;;;;:::i;:::-;;;;;;;;;51641:7;;;;;;;;;;;51633:33;;;51675:4;51682:10;51694:2;51633:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51743:63;51794:1;51743:20;:32;51764:10;51743:32;;;;;;;;;;;;;;;;:36;;:63;;;;:::i;:::-;51708:20;:32;51729:10;51708:32;;;;;;;;;;;;;;;:98;;;;51824:9;51819:303;51843:19;:26;;;;51839:1;:30;51819:303;;;51919:125;51967:26;:50;51994:19;52014:1;51994:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51967:50;;;;;;;;;;;;;;;:62;52018:10;51967:62;;;;;;;;;;;;;;;;51919:1;:25;51921:19;51941:1;51921:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51919:25;;;;;;;;;;;;;;;;:29;;:125;;;;:::i;:::-;51891:1;:25;51893:19;51913:1;51893:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51891:25;;;;;;;;;;;;;;;:153;;;;52061:49;52075:19;52095:1;52075:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52099:10;52061:13;:49::i;:::-;51871:3;;;;;:::i;:::-;;;;51819:303;;;;5988:1:::0;6942:7;:22;;;;51064:1065;:::o;43141:25::-;;;;;;;;;;;;;:::o;42642:49::-;;;;;;;;;;;;;;;;;:::o;42738:39::-;;;;:::o;52193:986::-;2630:13;:11;:13::i;:::-;52272:9:::1;52267:133;52291:19;:26;;;;52287:1;:30;52267:133;;;52339:49;52353:19;52373:1;52353:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52385:1;52339:13;:49::i;:::-;52319:3;;;;;:::i;:::-;;;;52267:133;;;;52433:12;;52414:15;:31;52410:318;;52475:27;52486:15;;52475:6;:10;;:27;;;;:::i;:::-;52462:10;:40;;;;52410:318;;;52535:17;52555:33;52572:15;52555:12;;:16;;:33;;;;:::i;:::-;52535:53;;52603:16;52622:25;52636:10;;52622:9;:13;;:25;;;;:::i;:::-;52603:44;;52675:41;52700:15;;52675:20;52686:8;52675:6;:10;;:20;;;;:::i;:::-;:24;;:41;;;;:::i;:::-;52662:10;:54;;;;52520:208;;52410:318;52740:15;52758:12;:22;;;52789:4;52758:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52740:55;;52842:28;52854:15;;52842:7;:11;;:28;;;;:::i;:::-;52828:10;;:42;;52806:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;52940:9;52935:140;52959:19;:26;;;;52955:1;:30;52935:140;;;53048:15;53007:14;:38;53022:19;53042:1;53022:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53007:38;;;;;;;;;;;;;;;:56;;;;52987:3;;;;;:::i;:::-;;;;52935:140;;;;53100:36;53120:15;;53100;:19;;:36;;;;:::i;:::-;53085:12;:51;;;;53152:19;53164:6;53152:19;;;;;;:::i;:::-;;;;;;;;52256:923;52193:986:::0;:::o;49086:930::-;6032:1;6630:7;;:19;6622:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6032:1;6763:7;:18;;;;49198:8:::1;;;;;;;;;;;:16;;;49245:4;49273:10;49306:23;49198:150;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49168:9;:180;49146:253;;;;;;;;;;;;:::i;:::-;;;;;;;;;49415:9;49410:548;49434:19;:26;;;;49430:1;:30;49410:548;;;49482:49;49496:19;49516:1;49496:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49520:10;49482:13;:49::i;:::-;49546:14;49563:25;:49;49589:19;49609:1;49589:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49563:49;;;;;;;;;;;;;;;:93;49631:10;49563:93;;;;;;;;;;;;;;;;49546:110;;49686:1;49677:6;:10;49673:274;;;49708:45;49734:10;49746:6;49708:12;:25;;;;:45;;;;;:::i;:::-;49788:10;49777:30;;;49800:6;49777:30;;;;;;:::i;:::-;;;;;;;;49930:1;49826:25;:49;49852:19;49872:1;49852:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49826:49;;;;;;;;;;;;;;;:101;49898:10;49826:101;;;;;;;;;;;;;;;:105;;;;49673:274;49467:491;49462:3;;;;;:::i;:::-;;;;49410:548;;;;49976:11;;;;;;;;;;;49968:29;;:40;49998:9;49968:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5988:1:::0;6942:7;:22;;;;49086:930::o;53626:67::-;2630:13;:11;:13::i;:::-;53675:10:::1;:8;:10::i;:::-;53626:67::o:0;43056:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8661:86::-;8708:4;8732:7;;;;;;;;;;;8725:14;;8661:86;:::o;3392:103::-;2630:13;:11;:13::i;:::-;3457:30:::1;3484:1;3457:18;:30::i;:::-;3392:103::o:0;46247:98::-;2630:13;:11;:13::i;:::-;46328:9:::1;46317:8;;:20;;;;;;;;;;;;;;;;;;46247:98:::0;:::o;42784:29::-;;;;:::o;43383:36::-;;;;;;;;;;;;;;;;;:::o;44417:155::-;44474:7;44519:12;;44501:15;:30;:63;;44552:12;;44501:63;;;44534:15;44501:63;44494:70;;44417:155;:::o;47780:1298::-;6032:1;6630:7;;:19;6622:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6032:1;6763:7;:18;;;;47917:10:::1;47929;54157:34;54171:10;54183:7;54157:13;:34::i;:::-;48186:3:::2;:10;48009:8;;;;;;;;;;;:16;;;48056:4;48084:10;48117:26;48009:153;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:187;;;;:::i;:::-;47979:9;:217;47957:293;;;;;;;;;;;;:::i;:::-;;;;;;;;;48282:1;48269:3;:10;:14;48261:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;48348:39;48376:3;:10;48348:11;:23;48360:10;48348:23;;;;;;;;;;;;;;;;:27;;:39;;;;:::i;:::-;48322:11;:23;48334:10;48322:23;;;;;;;;;;;;;;;:65;;;;48475:66;48530:3;:10;48475:26;:38;48502:10;48475:38;;;;;;;;;;;;;;;:50;48514:10;48475:50;;;;;;;;;;;;;;;;:54;;:66;;;;:::i;:::-;48398:26;:38;48425:10;48398:38;;;;;;;;;;;;;;;:74;48451:10;48398:74;;;;;;;;;;;;;;;:143;;;;48570:91;48602:48;48617:20;:32;48638:10;48617:32;;;;;;;;;;;;;;;;48602:3;:10;:14;;:48;;;;:::i;:::-;48570:1;:13;48572:10;48570:13;;;;;;;;;;;;;;;;:17;;:91;;;;:::i;:::-;48554:1;:13;48556:10;48554:13;;;;;;;;;;;;;;;:107;;;;48679:9;48674:285;48698:3;:10;48694:1;:14;48674:285;;;48771:10;48738:43;;:9;:21;48748:10;48738:21;;;;;;;;;;;;;;;:29;48760:3;48764:1;48760:6;;;;;;;;:::i;:::-;;;;;;;;48738:29;;;;;;;;;;;;;;;;;;;;;:43;;;48730:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48818:10;48810:36;;;48873:4;48897:10;48926:3;48930:1;48926:6;;;;;;;;:::i;:::-;;;;;;;;48810:137;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;48710:3;;;;;:::i;:::-;;;;48674:285;;;;48977:11;;;;;;;;;;;48969:29;;:40;48999:9;48969:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;49047:10;49025:45;;49035:10;49025:45;;;49059:3;:10;49025:45;;;;;;:::i;:::-;;;;;;;;6794:1:::1;;5988::::0;6942:7;:22;;;;47780:1298;;:::o;53555:63::-;2630:13;:11;:13::i;:::-;53602:8:::1;:6;:8::i;:::-;53555:63::o:0;2744:87::-;2790:7;2817:6;;;;;;;;;;2810:13;;2744:87;:::o;42822:100::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42400:46::-;;;;;;;;;;;;;;;;;:::o;42552:55::-;;;;;;;;;;;;;;;;;:::o;42242:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43224:22::-;;;;;;;;;;;;;:::o;46407:1365::-;6032:1;6630:7;;:19;6622:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6032:1;6763:7;:18;;;;8266:19:::1;:17;:19::i;:::-;46566:10:::2;46578;54157:34;54171:10;54183:7;54157:13;:34::i;:::-;46832:3:::3;:10;46658:8;;;;;;;;;;;:16;;;46705:4;46733:10;46766:23;46658:150;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:184;;;;:::i;:::-;46628:9;:214;46606:287;;;;;;;;;;;;:::i;:::-;;;;;;;;;46925:1;46912:3;:10;:14;46904:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;46968:19;:31;46988:10;46968:31;;;;;;;;;;;;;;;;;;;;;;;;;46960:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47068:39;47096:3;:10;47068:11;:23;47080:10;47068:23;;;;;;;;;;;;;;;;:27;;:39;;;;:::i;:::-;47042:11;:23;47054:10;47042:23;;;;;;;;;;;;;;;:65;;;;47195:66;47250:3;:10;47195:26;:38;47222:10;47195:38;;;;;;;;;;;;;;;:50;47234:10;47195:50;;;;;;;;;;;;;;;;:54;;:66;;;;:::i;:::-;47118:26;:38;47145:10;47118:38;;;;;;;;;;;;;;;:74;47171:10;47118:74;;;;;;;;;;;;;;;:143;;;;47290:91;47322:48;47337:20;:32;47358:10;47337:32;;;;;;;;;;;;;;;;47322:3;:10;:14;;:48;;;;:::i;:::-;47290:1;:13;47292:10;47290:13;;;;;;;;;;;;;;;;:17;;:91;;;;:::i;:::-;47274:1;:13;47276:10;47274:13;;;;;;;;;;;;;;;:107;;;;47399:9;47394:262;47418:3;:10;47414:1;:14;47394:262;;;47458:10;47450:36;;;47505:10;47542:4;47566:3;47570:1;47566:6;;;;;;;;:::i;:::-;;;;;;;;47450:137;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;47634:10;47602:9;:21;47612:10;47602:21;;;;;;;;;;;;;;;:29;47624:3;47628:1;47624:6;;;;;;;;:::i;:::-;;;;;;;;47602:29;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;47430:3;;;;;:::i;:::-;;;;47394:262;;;;47674:11;;;;;;;;;;;47666:29;;:40;47696:9;47666:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;47741:10;47722:42;;47729:10;47722:42;;;47753:3;:10;47722:42;;;;;;:::i;:::-;;;;;;;;8296:1:::2;;5988::::0;6942:7;:22;;;;46407:1365;;:::o;53187:360::-;2630:13;:11;:13::i;:::-;53311:12:::1;;53293:15;:30;53271:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;53468:16;53450:15;:34;;;;53500:39;53523:15;;53500:39;;;;;;:::i;:::-;;;;;;;;53187:360:::0;:::o;42199:36::-;;;:::o;53701:161::-;2630:13;:11;:13::i;:::-;53799:1:::1;53780:21;;:7;;;;;;;;;;;:21;;;53772:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53846:8;53836:7;;:18;;;;;;;;;;;;;;;;;;53701:161:::0;:::o;42700:31::-;;;;:::o;42455:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44580:711::-;44645:7;44696:1;44669:11;:23;44681:10;44669:23;;;;;;;;;;;;;;;;:28;44665:100;;44721:20;:32;44742:10;44721:32;;;;;;;;;;;;;;;;44714:39;;;;44665:100;44777:11;44791:52;44839:3;44791:43;44806:15;:27;44822:10;44806:27;;;;;;;;;;;;;;;;44791:10;;:14;;:43;;;;:::i;:::-;:47;;:52;;;;:::i;:::-;44777:66;;44854:11;44868:138;45002:3;44883:103;44940:31;44958:12;;44940:1;:13;44942:10;44940:13;;;;;;;;;;;;;;;;:17;;:31;;;;:::i;:::-;44884:32;44912:3;44884:11;:23;44896:10;44884:23;;;;;;;;;;;;;;;;:27;;:32;;;;:::i;:::-;44883:38;;:103;;;;:::i;:::-;44868:133;;:138;;;;:::i;:::-;44854:152;;45039:244;45094:174;45264:3;45094:143;45233:3;45094:112;45201:4;45094:80;45147:14;:26;45162:10;45147:26;;;;;;;;;;;;;;;;45094;:24;:26::i;:::-;:52;;:80;;;;:::i;:::-;:106;;:112;;;;:::i;:::-;:138;;:143;;;;:::i;:::-;:169;;:174;;;;:::i;:::-;45039:20;:32;45060:10;45039:32;;;;;;;;;;;;;;;;:36;;:244;;;;:::i;:::-;45019:264;;;;44580:711;;;;:::o;53870:164::-;2630:13;:11;:13::i;:::-;53958:4:::1;53949:6;:13;53941:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;54020:6;54005:12;:21;;;;53870:164:::0;:::o;3650:201::-;2630:13;:11;:13::i;:::-;3759:1:::1;3739:22;;:8;:22;;::::0;3731:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3815:28;3834:8;3815:18;:28::i;:::-;3650:201:::0;:::o;46143:96::-;2630:13;:11;:13::i;:::-;46225:6:::1;46211:11;;:20;;;;;;;;;;;;;;;;;;46143:96:::0;:::o;44216:193::-;44322:7;44354:26;:38;44381:10;44354:38;;;;;;;;;;;;;;;:47;44393:7;44354:47;;;;;;;;;;;;;;;;44347:54;;44216:193;;;;:::o;42958:89::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43173:26::-;;;;;;;;;;;;;:::o;50024:1032::-;6032:1;6630:7;;:19;6622:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6032:1;6763:7;:18;;;;50122:1:::1;50103:21;;:7;;;;;;;;;;;:21;;::::0;50095:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;50201:1;50166:20;:32;50187:10;50166:32;;;;;;;;;;;;;;;;:36;50158:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50291:8;;;;;;;;;;;:16;;;50338:4;50366:10;50399:28;50291:155;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50261:9;:185;50239:264;;;;;;;;;;;;:::i;:::-;;;;;;;;;50524:7;;;;;;;;;;;50516:33;;;50550:10;50570:4;50577:2;50516:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50616:10;50591:9;:18;50601:7;;;;;;;;;;;50591:18;;;;;;;;;;;;;;;:22;50610:2;50591:22;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;50674:63;50725:1;50674:20;:32;50695:10;50674:32;;;;;;;;;;;;;;;;:36;;:63;;;;:::i;:::-;50639:20;:32;50660:10;50639:32;;;;;;;;;;;;;;;:98;;;;50753:9;50748:301;50772:19;:26;;;;50768:1;:30;50748:301;;;50848:125;50896:26;:50;50923:19;50943:1;50923:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50896:50;;;;;;;;;;;;;;;:62;50947:10;50896:62;;;;;;;;;;;;;;;;50848:1;:25;50850:19;50870:1;50850:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50848:25;;;;;;;;;;;;;;;;:29;;:125;;;;:::i;:::-;50820:1;:25;50822:19;50842:1;50822:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50820:25;;;;;;;;;;;;;;;:153;;;;50988:49;51002:19;51022:1;51002:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51026:10;50988:13;:49::i;:::-;50800:3;;;;;:::i;:::-;;;;50748:301;;;;5988:1:::0;6942:7;:22;;;;50024:1032;:::o;13268:98::-;13326:7;13357:1;13353;:5;;;;:::i;:::-;13346:12;;13268:98;;;;:::o;12911:::-;12969:7;13000:1;12996;:5;;;;:::i;:::-;12989:12;;12911:98;;;;:::o;13667:::-;13725:7;13756:1;13752;:5;;;;:::i;:::-;13745:12;;13667:98;;;;:::o;12530:::-;12588:7;12619:1;12615;:5;;;;:::i;:::-;12608:12;;12530:98;;;;:::o;54219:543::-;54334:26;54349:10;54334:14;:26::i;:::-;54299:20;:32;54320:10;54299:32;;;;;;;;;;;;;;;:61;;;;54400:26;:24;:26::i;:::-;54371:14;:26;54386:10;54371:26;;;;;;;;;;;;;;;:55;;;;54460:1;54441:21;;:7;:21;;;54437:318;;54528:76;54553:10;54582:7;54528:6;:76::i;:::-;54479:25;:37;54505:10;54479:37;;;;;;;;;;;;;;;:46;54517:7;54479:46;;;;;;;;;;;;;;;:125;;;;54711:20;:32;54732:10;54711:32;;;;;;;;;;;;;;;;54619:36;:48;54656:10;54619:48;;;;;;;;;;;;;;;:89;54686:7;54619:89;;;;;;;;;;;;;;;:124;;;;54437:318;54219:543;;:::o;2909:132::-;2984:12;:10;:12::i;:::-;2973:23;;:7;:5;:7::i;:::-;:23;;;2965:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2909:132::o;38124:211::-;38241:86;38261:5;38291:23;;;38316:2;38320:5;38268:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38241:19;:86::i;:::-;38124:211;;;:::o;9516:120::-;8525:16;:14;:16::i;:::-;9585:5:::1;9575:7;;:15;;;;;;;;;;;;;;;;;;9606:22;9615:12;:10;:12::i;:::-;9606:22;;;;;;:::i;:::-;;;;;;;;9516:120::o:0;4011:191::-;4085:16;4104:6;;;;;;;;;;4085:25;;4130:8;4121:6;;:17;;;;;;;;;;;;;;;;;;4185:8;4154:40;;4175:8;4154:40;;;;;;;;;;;;4074:128;4011:191;:::o;9257:118::-;8266:19;:17;:19::i;:::-;9327:4:::1;9317:7:::0;::::1;:14;;;;;;;;;;;;;;;;;;9347:20;9354:12;:10;:12::i;:::-;9347:20;;;;;;:::i;:::-;;;;;;;;9257:118::o:0;8820:108::-;8891:8;:6;:8::i;:::-;8890:9;8882:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;8820:108::o;1286:98::-;1339:7;1366:10;1359:17;;1286:98;:::o;41191:716::-;41615:23;41641:69;41669:4;41641:69;;;;;;;;;;;;;;;;;41649:5;41641:27;;;;:69;;;;;:::i;:::-;41615:95;;41745:1;41725:10;:17;:21;41721:179;;;41822:10;41811:30;;;;;;;;;;;;:::i;:::-;41803:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41721:179;41261:646;41191:716;;:::o;9005:108::-;9072:8;:6;:8::i;:::-;9064:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;9005:108::o;32826:229::-;32963:12;32995:52;33017:6;33025:4;33031:1;33034:12;32995:21;:52::i;:::-;32988:59;;32826:229;;;;;:::o;33946:510::-;34116:12;34174:5;34149:21;:30;;34141:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34241:18;34252:6;34241:10;:18::i;:::-;34233:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;34307:12;34321:23;34348:6;:11;;34367:5;34374:4;34348:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34306:73;;;;34397:51;34414:7;34423:10;34435:12;34397:16;:51::i;:::-;34390:58;;;;33946:510;;;;;;:::o;30081:326::-;30141:4;30398:1;30376:7;:19;;;:23;30369:30;;30081:326;;;:::o;36632:762::-;36782:12;36811:7;36807:580;;;36842:10;36835:17;;;;36807:580;36976:1;36956:10;:17;:21;36952:424;;;37204:10;37198:17;37265:15;37252:10;37248:2;37244:19;37237:44;36952:424;37347:12;37340:20;;;;;;;;;;;:::i;:::-;;;;;;;;36632:762;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:126;806:7;846:42;839:5;835:54;824:65;;769:126;;;:::o;901:96::-;938:7;967:24;985:5;967:24;:::i;:::-;956:35;;901:96;;;:::o;1003:122::-;1076:24;1094:5;1076:24;:::i;:::-;1069:5;1066:35;1056:63;;1115:1;1112;1105:12;1056:63;1003:122;:::o;1131:139::-;1177:5;1215:6;1202:20;1193:29;;1231:33;1258:5;1231:33;:::i;:::-;1131:139;;;;:::o;1276:329::-;1335:6;1384:2;1372:9;1363:7;1359:23;1355:32;1352:119;;;1390:79;;:::i;:::-;1352:119;1510:1;1535:53;1580:7;1571:6;1560:9;1556:22;1535:53;:::i;:::-;1525:63;;1481:117;1276:329;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:117::-;1993:1;1990;1983:12;2007:117;2116:1;2113;2106:12;2130:102;2171:6;2222:2;2218:7;2213:2;2206:5;2202:14;2198:28;2188:38;;2130:102;;;:::o;2238:180::-;2286:77;2283:1;2276:88;2383:4;2380:1;2373:15;2407:4;2404:1;2397:15;2424:281;2507:27;2529:4;2507:27;:::i;:::-;2499:6;2495:40;2637:6;2625:10;2622:22;2601:18;2589:10;2586:34;2583:62;2580:88;;;2648:18;;:::i;:::-;2580:88;2688:10;2684:2;2677:22;2467:238;2424:281;;:::o;2711:129::-;2745:6;2772:20;;:::i;:::-;2762:30;;2801:33;2829:4;2821:6;2801:33;:::i;:::-;2711:129;;;:::o;2846:307::-;2907:4;2997:18;2989:6;2986:30;2983:56;;;3019:18;;:::i;:::-;2983:56;3057:29;3079:6;3057:29;:::i;:::-;3049:37;;3141:4;3135;3131:15;3123:23;;2846:307;;;:::o;3159:146::-;3256:6;3251:3;3246;3233:30;3297:1;3288:6;3283:3;3279:16;3272:27;3159:146;;;:::o;3311:423::-;3388:5;3413:65;3429:48;3470:6;3429:48;:::i;:::-;3413:65;:::i;:::-;3404:74;;3501:6;3494:5;3487:21;3539:4;3532:5;3528:16;3577:3;3568:6;3563:3;3559:16;3556:25;3553:112;;;3584:79;;:::i;:::-;3553:112;3674:54;3721:6;3716:3;3711;3674:54;:::i;:::-;3394:340;3311:423;;;;;:::o;3753:338::-;3808:5;3857:3;3850:4;3842:6;3838:17;3834:27;3824:122;;3865:79;;:::i;:::-;3824:122;3982:6;3969:20;4007:78;4081:3;4073:6;4066:4;4058:6;4054:17;4007:78;:::i;:::-;3998:87;;3814:277;3753:338;;;;:::o;4097:943::-;4192:6;4200;4208;4216;4265:3;4253:9;4244:7;4240:23;4236:33;4233:120;;;4272:79;;:::i;:::-;4233:120;4392:1;4417:53;4462:7;4453:6;4442:9;4438:22;4417:53;:::i;:::-;4407:63;;4363:117;4519:2;4545:53;4590:7;4581:6;4570:9;4566:22;4545:53;:::i;:::-;4535:63;;4490:118;4647:2;4673:53;4718:7;4709:6;4698:9;4694:22;4673:53;:::i;:::-;4663:63;;4618:118;4803:2;4792:9;4788:18;4775:32;4834:18;4826:6;4823:30;4820:117;;;4856:79;;:::i;:::-;4820:117;4961:62;5015:7;5006:6;4995:9;4991:22;4961:62;:::i;:::-;4951:72;;4746:287;4097:943;;;;;;;:::o;5046:149::-;5082:7;5122:66;5115:5;5111:78;5100:89;;5046:149;;;:::o;5201:115::-;5286:23;5303:5;5286:23;:::i;:::-;5281:3;5274:36;5201:115;;:::o;5322:218::-;5413:4;5451:2;5440:9;5436:18;5428:26;;5464:69;5530:1;5519:9;5515:17;5506:6;5464:69;:::i;:::-;5322:218;;;;:::o;5546:90::-;5580:7;5623:5;5616:13;5609:21;5598:32;;5546:90;;;:::o;5642:109::-;5723:21;5738:5;5723:21;:::i;:::-;5718:3;5711:34;5642:109;;:::o;5757:210::-;5844:4;5882:2;5871:9;5867:18;5859:26;;5895:65;5957:1;5946:9;5942:17;5933:6;5895:65;:::i;:::-;5757:210;;;;:::o;5973:474::-;6041:6;6049;6098:2;6086:9;6077:7;6073:23;6069:32;6066:119;;;6104:79;;:::i;:::-;6066:119;6224:1;6249:53;6294:7;6285:6;6274:9;6270:22;6249:53;:::i;:::-;6239:63;;6195:117;6351:2;6377:53;6422:7;6413:6;6402:9;6398:22;6377:53;:::i;:::-;6367:63;;6322:118;5973:474;;;;;:::o;6453:329::-;6512:6;6561:2;6549:9;6540:7;6536:23;6532:32;6529:119;;;6567:79;;:::i;:::-;6529:119;6687:1;6712:53;6757:7;6748:6;6737:9;6733:22;6712:53;:::i;:::-;6702:63;;6658:117;6453:329;;;;:::o;6788:60::-;6816:3;6837:5;6830:12;;6788:60;;;:::o;6854:142::-;6904:9;6937:53;6955:34;6964:24;6982:5;6964:24;:::i;:::-;6955:34;:::i;:::-;6937:53;:::i;:::-;6924:66;;6854:142;;;:::o;7002:126::-;7052:9;7085:37;7116:5;7085:37;:::i;:::-;7072:50;;7002:126;;;:::o;7134:142::-;7200:9;7233:37;7264:5;7233:37;:::i;:::-;7220:50;;7134:142;;;:::o;7282:163::-;7385:53;7432:5;7385:53;:::i;:::-;7380:3;7373:66;7282:163;;:::o;7451:254::-;7560:4;7598:2;7587:9;7583:18;7575:26;;7611:87;7695:1;7684:9;7680:17;7671:6;7611:87;:::i;:::-;7451:254;;;;:::o;7711:474::-;7779:6;7787;7836:2;7824:9;7815:7;7811:23;7807:32;7804:119;;;7842:79;;:::i;:::-;7804:119;7962:1;7987:53;8032:7;8023:6;8012:9;8008:22;7987:53;:::i;:::-;7977:63;;7933:117;8089:2;8115:53;8160:7;8151:6;8140:9;8136:22;8115:53;:::i;:::-;8105:63;;8060:118;7711:474;;;;;:::o;8191:118::-;8278:24;8296:5;8278:24;:::i;:::-;8273:3;8266:37;8191:118;;:::o;8315:222::-;8408:4;8446:2;8435:9;8431:18;8423:26;;8459:71;8527:1;8516:9;8512:17;8503:6;8459:71;:::i;:::-;8315:222;;;;:::o;8543:112::-;8596:7;8625:24;8643:5;8625:24;:::i;:::-;8614:35;;8543:112;;;:::o;8661:154::-;8750:40;8784:5;8750:40;:::i;:::-;8743:5;8740:51;8730:79;;8805:1;8802;8795:12;8730:79;8661:154;:::o;8821:171::-;8883:5;8921:6;8908:20;8899:29;;8937:49;8980:5;8937:49;:::i;:::-;8821:171;;;;:::o;8998:361::-;9073:6;9122:2;9110:9;9101:7;9097:23;9093:32;9090:119;;;9128:79;;:::i;:::-;9090:119;9248:1;9273:69;9334:7;9325:6;9314:9;9310:22;9273:69;:::i;:::-;9263:79;;9219:133;8998:361;;;;:::o;9365:311::-;9442:4;9532:18;9524:6;9521:30;9518:56;;;9554:18;;:::i;:::-;9518:56;9604:4;9596:6;9592:17;9584:25;;9664:4;9658;9654:15;9646:23;;9365:311;;;:::o;9682:117::-;9791:1;9788;9781:12;9822:710;9918:5;9943:81;9959:64;10016:6;9959:64;:::i;:::-;9943:81;:::i;:::-;9934:90;;10044:5;10073:6;10066:5;10059:21;10107:4;10100:5;10096:16;10089:23;;10160:4;10152:6;10148:17;10140:6;10136:30;10189:3;10181:6;10178:15;10175:122;;;10208:79;;:::i;:::-;10175:122;10323:6;10306:220;10340:6;10335:3;10332:15;10306:220;;;10415:3;10444:37;10477:3;10465:10;10444:37;:::i;:::-;10439:3;10432:50;10511:4;10506:3;10502:14;10495:21;;10382:144;10366:4;10361:3;10357:14;10350:21;;10306:220;;;10310:21;9924:608;;9822:710;;;;;:::o;10555:370::-;10626:5;10675:3;10668:4;10660:6;10656:17;10652:27;10642:122;;10683:79;;:::i;:::-;10642:122;10800:6;10787:20;10825:94;10915:3;10907:6;10900:4;10892:6;10888:17;10825:94;:::i;:::-;10816:103;;10632:293;10555:370;;;;:::o;10931:684::-;11024:6;11032;11081:2;11069:9;11060:7;11056:23;11052:32;11049:119;;;11087:79;;:::i;:::-;11049:119;11207:1;11232:53;11277:7;11268:6;11257:9;11253:22;11232:53;:::i;:::-;11222:63;;11178:117;11362:2;11351:9;11347:18;11334:32;11393:18;11385:6;11382:30;11379:117;;;11415:79;;:::i;:::-;11379:117;11520:78;11590:7;11581:6;11570:9;11566:22;11520:78;:::i;:::-;11510:88;;11305:303;10931:684;;;;;:::o;11621:140::-;11685:9;11718:37;11749:5;11718:37;:::i;:::-;11705:50;;11621:140;;;:::o;11767:159::-;11868:51;11913:5;11868:51;:::i;:::-;11863:3;11856:64;11767:159;;:::o;11932:250::-;12039:4;12077:2;12066:9;12062:18;12054:26;;12090:85;12172:1;12161:9;12157:17;12148:6;12090:85;:::i;:::-;11932:250;;;;:::o;12188:180::-;12236:77;12233:1;12226:88;12333:4;12330:1;12323:15;12357:4;12354:1;12347:15;12374:191;12414:3;12433:20;12451:1;12433:20;:::i;:::-;12428:25;;12467:20;12485:1;12467:20;:::i;:::-;12462:25;;12510:1;12507;12503:9;12496:16;;12531:3;12528:1;12525:10;12522:36;;;12538:18;;:::i;:::-;12522:36;12374:191;;;;:::o;12571:169::-;12655:11;12689:6;12684:3;12677:19;12729:4;12724:3;12720:14;12705:29;;12571:169;;;;:::o;12746:181::-;12886:33;12882:1;12874:6;12870:14;12863:57;12746:181;:::o;12933:366::-;13075:3;13096:67;13160:2;13155:3;13096:67;:::i;:::-;13089:74;;13172:93;13261:3;13172:93;:::i;:::-;13290:2;13285:3;13281:12;13274:19;;12933:366;;;:::o;13305:419::-;13471:4;13509:2;13498:9;13494:18;13486:26;;13558:9;13552:4;13548:20;13544:1;13533:9;13529:17;13522:47;13586:131;13712:4;13586:131;:::i;:::-;13578:139;;13305:419;;;:::o;13730:168::-;13870:20;13866:1;13858:6;13854:14;13847:44;13730:168;:::o;13904:366::-;14046:3;14067:67;14131:2;14126:3;14067:67;:::i;:::-;14060:74;;14143:93;14232:3;14143:93;:::i;:::-;14261:2;14256:3;14252:12;14245:19;;13904:366;;;:::o;14276:419::-;14442:4;14480:2;14469:9;14465:18;14457:26;;14529:9;14523:4;14519:20;14515:1;14504:9;14500:17;14493:47;14557:131;14683:4;14557:131;:::i;:::-;14549:139;;14276:419;;;:::o;14701:170::-;14841:22;14837:1;14829:6;14825:14;14818:46;14701:170;:::o;14877:366::-;15019:3;15040:67;15104:2;15099:3;15040:67;:::i;:::-;15033:74;;15116:93;15205:3;15116:93;:::i;:::-;15234:2;15229:3;15225:12;15218:19;;14877:366;;;:::o;15249:419::-;15415:4;15453:2;15442:9;15438:18;15430:26;;15502:9;15496:4;15492:20;15488:1;15477:9;15473:17;15466:47;15530:131;15656:4;15530:131;:::i;:::-;15522:139;;15249:419;;;:::o;15674:159::-;15814:11;15810:1;15802:6;15798:14;15791:35;15674:159;:::o;15839:365::-;15981:3;16002:66;16066:1;16061:3;16002:66;:::i;:::-;15995:73;;16077:93;16166:3;16077:93;:::i;:::-;16195:2;16190:3;16186:12;16179:19;;15839:365;;;:::o;16210:419::-;16376:4;16414:2;16403:9;16399:18;16391:26;;16463:9;16457:4;16453:20;16449:1;16438:9;16434:17;16427:47;16491:131;16617:4;16491:131;:::i;:::-;16483:139;;16210:419;;;:::o;16635:180::-;16683:77;16680:1;16673:88;16780:4;16777:1;16770:15;16804:4;16801:1;16794:15;16821:114;16903:1;16896:5;16893:12;16883:46;;16909:18;;:::i;:::-;16883:46;16821:114;:::o;16941:129::-;16987:7;17016:5;17005:16;;17022:42;17058:5;17022:42;:::i;:::-;16941:129;;;:::o;17076:::-;17133:9;17166:33;17193:5;17166:33;:::i;:::-;17153:46;;17076:129;;;:::o;17211:145::-;17305:44;17343:5;17305:44;:::i;:::-;17300:3;17293:57;17211:145;;:::o;17362:456::-;17518:4;17556:2;17545:9;17541:18;17533:26;;17569:71;17637:1;17626:9;17622:17;17613:6;17569:71;:::i;:::-;17650:72;17718:2;17707:9;17703:18;17694:6;17650:72;:::i;:::-;17732:79;17807:2;17796:9;17792:18;17783:6;17732:79;:::i;:::-;17362:456;;;;;;:::o;17824:143::-;17881:5;17912:6;17906:13;17897:22;;17928:33;17955:5;17928:33;:::i;:::-;17824:143;;;;:::o;17973:351::-;18043:6;18092:2;18080:9;18071:7;18067:23;18063:32;18060:119;;;18098:79;;:::i;:::-;18060:119;18218:1;18243:64;18299:7;18290:6;18279:9;18275:22;18243:64;:::i;:::-;18233:74;;18189:128;17973:351;;;;:::o;18330:182::-;18470:34;18466:1;18458:6;18454:14;18447:58;18330:182;:::o;18518:366::-;18660:3;18681:67;18745:2;18740:3;18681:67;:::i;:::-;18674:74;;18757:93;18846:3;18757:93;:::i;:::-;18875:2;18870:3;18866:12;18859:19;;18518:366;;;:::o;18890:419::-;19056:4;19094:2;19083:9;19079:18;19071:26;;19143:9;19137:4;19133:20;19129:1;19118:9;19114:17;19107:47;19171:131;19297:4;19171:131;:::i;:::-;19163:139;;18890:419;;;:::o;19315:442::-;19464:4;19502:2;19491:9;19487:18;19479:26;;19515:71;19583:1;19572:9;19568:17;19559:6;19515:71;:::i;:::-;19596:72;19664:2;19653:9;19649:18;19640:6;19596:72;:::i;:::-;19678;19746:2;19735:9;19731:18;19722:6;19678:72;:::i;:::-;19315:442;;;;;;:::o;19763:180::-;19811:77;19808:1;19801:88;19908:4;19905:1;19898:15;19932:4;19929:1;19922:15;19949:233;19988:3;20011:24;20029:5;20011:24;:::i;:::-;20002:33;;20057:66;20050:5;20047:77;20044:103;;20127:18;;:::i;:::-;20044:103;20174:1;20167:5;20163:13;20156:20;;19949:233;;;:::o;20188:174::-;20328:26;20324:1;20316:6;20312:14;20305:50;20188:174;:::o;20368:366::-;20510:3;20531:67;20595:2;20590:3;20531:67;:::i;:::-;20524:74;;20607:93;20696:3;20607:93;:::i;:::-;20725:2;20720:3;20716:12;20709:19;;20368:366;;;:::o;20740:419::-;20906:4;20944:2;20933:9;20929:18;20921:26;;20993:9;20987:4;20983:20;20979:1;20968:9;20964:17;20957:47;21021:131;21147:4;21021:131;:::i;:::-;21013:139;;20740:419;;;:::o;21165:173::-;21305:25;21301:1;21293:6;21289:14;21282:49;21165:173;:::o;21344:366::-;21486:3;21507:67;21571:2;21566:3;21507:67;:::i;:::-;21500:74;;21583:93;21672:3;21583:93;:::i;:::-;21701:2;21696:3;21692:12;21685:19;;21344:366;;;:::o;21716:419::-;21882:4;21920:2;21909:9;21905:18;21897:26;;21969:9;21963:4;21959:20;21955:1;21944:9;21940:17;21933:47;21997:131;22123:4;21997:131;:::i;:::-;21989:139;;21716:419;;;:::o;22141:410::-;22181:7;22204:20;22222:1;22204:20;:::i;:::-;22199:25;;22238:20;22256:1;22238:20;:::i;:::-;22233:25;;22293:1;22290;22286:9;22315:30;22333:11;22315:30;:::i;:::-;22304:41;;22494:1;22485:7;22481:15;22478:1;22475:22;22455:1;22448:9;22428:83;22405:139;;22524:18;;:::i;:::-;22405:139;22189:362;22141:410;;;;:::o;22557:176::-;22697:28;22693:1;22685:6;22681:14;22674:52;22557:176;:::o;22739:366::-;22881:3;22902:67;22966:2;22961:3;22902:67;:::i;:::-;22895:74;;22978:93;23067:3;22978:93;:::i;:::-;23096:2;23091:3;23087:12;23080:19;;22739:366;;;:::o;23111:419::-;23277:4;23315:2;23304:9;23300:18;23292:26;;23364:9;23358:4;23354:20;23350:1;23339:9;23335:17;23328:47;23392:131;23518:4;23392:131;:::i;:::-;23384:139;;23111:419;;;:::o;23536:171::-;23676:23;23672:1;23664:6;23660:14;23653:47;23536:171;:::o;23713:366::-;23855:3;23876:67;23940:2;23935:3;23876:67;:::i;:::-;23869:74;;23952:93;24041:3;23952:93;:::i;:::-;24070:2;24065:3;24061:12;24054:19;;23713:366;;;:::o;24085:419::-;24251:4;24289:2;24278:9;24274:18;24266:26;;24338:9;24332:4;24328:20;24324:1;24313:9;24309:17;24302:47;24366:131;24492:4;24366:131;:::i;:::-;24358:139;;24085:419;;;:::o;24510:173::-;24650:25;24646:1;24638:6;24634:14;24627:49;24510:173;:::o;24689:366::-;24831:3;24852:67;24916:2;24911:3;24852:67;:::i;:::-;24845:74;;24928:93;25017:3;24928:93;:::i;:::-;25046:2;25041:3;25037:12;25030:19;;24689:366;;;:::o;25061:419::-;25227:4;25265:2;25254:9;25250:18;25242:26;;25314:9;25308:4;25304:20;25300:1;25289:9;25285:17;25278:47;25342:131;25468:4;25342:131;:::i;:::-;25334:139;;25061:419;;;:::o;25486:168::-;25626:20;25622:1;25614:6;25610:14;25603:44;25486:168;:::o;25660:366::-;25802:3;25823:67;25887:2;25882:3;25823:67;:::i;:::-;25816:74;;25899:93;25988:3;25899:93;:::i;:::-;26017:2;26012:3;26008:12;26001:19;;25660:366;;;:::o;26032:419::-;26198:4;26236:2;26225:9;26221:18;26213:26;;26285:9;26279:4;26275:20;26271:1;26260:9;26256:17;26249:47;26313:131;26439:4;26313:131;:::i;:::-;26305:139;;26032:419;;;:::o;26457:175::-;26597:27;26593:1;26585:6;26581:14;26574:51;26457:175;:::o;26638:366::-;26780:3;26801:67;26865:2;26860:3;26801:67;:::i;:::-;26794:74;;26877:93;26966:3;26877:93;:::i;:::-;26995:2;26990:3;26986:12;26979:19;;26638:366;;;:::o;27010:419::-;27176:4;27214:2;27203:9;27199:18;27191:26;;27263:9;27257:4;27253:20;27249:1;27238:9;27234:17;27227:47;27291:131;27417:4;27291:131;:::i;:::-;27283:139;;27010:419;;;:::o;27435:312::-;27575:34;27571:1;27563:6;27559:14;27552:58;27644:34;27639:2;27631:6;27627:15;27620:59;27713:26;27708:2;27700:6;27696:15;27689:51;27435:312;:::o;27753:366::-;27895:3;27916:67;27980:2;27975:3;27916:67;:::i;:::-;27909:74;;27992:93;28081:3;27992:93;:::i;:::-;28110:2;28105:3;28101:12;28094:19;;27753:366;;;:::o;28125:419::-;28291:4;28329:2;28318:9;28314:18;28306:26;;28378:9;28372:4;28368:20;28364:1;28353:9;28349:17;28342:47;28406:131;28532:4;28406:131;:::i;:::-;28398:139;;28125:419;;;:::o;28550:169::-;28690:21;28686:1;28678:6;28674:14;28667:45;28550:169;:::o;28725:366::-;28867:3;28888:67;28952:2;28947:3;28888:67;:::i;:::-;28881:74;;28964:93;29053:3;28964:93;:::i;:::-;29082:2;29077:3;29073:12;29066:19;;28725:366;;;:::o;29097:419::-;29263:4;29301:2;29290:9;29286:18;29278:26;;29350:9;29344:4;29340:20;29336:1;29325:9;29321:17;29314:47;29378:131;29504:4;29378:131;:::i;:::-;29370:139;;29097:419;;;:::o;29522:177::-;29662:29;29658:1;29650:6;29646:14;29639:53;29522:177;:::o;29705:366::-;29847:3;29868:67;29932:2;29927:3;29868:67;:::i;:::-;29861:74;;29944:93;30033:3;29944:93;:::i;:::-;30062:2;30057:3;30053:12;30046:19;;29705:366;;;:::o;30077:419::-;30243:4;30281:2;30270:9;30266:18;30258:26;;30330:9;30324:4;30320:20;30316:1;30305:9;30301:17;30294:47;30358:131;30484:4;30358:131;:::i;:::-;30350:139;;30077:419;;;:::o;30502:225::-;30642:34;30638:1;30630:6;30626:14;30619:58;30711:8;30706:2;30698:6;30694:15;30687:33;30502:225;:::o;30733:366::-;30875:3;30896:67;30960:2;30955:3;30896:67;:::i;:::-;30889:74;;30972:93;31061:3;30972:93;:::i;:::-;31090:2;31085:3;31081:12;31074:19;;30733:366;;;:::o;31105:419::-;31271:4;31309:2;31298:9;31294:18;31286:26;;31358:9;31352:4;31348:20;31344:1;31333:9;31329:17;31322:47;31386:131;31512:4;31386:131;:::i;:::-;31378:139;;31105:419;;;:::o;31530:171::-;31670:23;31666:1;31658:6;31654:14;31647:47;31530:171;:::o;31707:366::-;31849:3;31870:67;31934:2;31929:3;31870:67;:::i;:::-;31863:74;;31946:93;32035:3;31946:93;:::i;:::-;32064:2;32059:3;32055:12;32048:19;;31707:366;;;:::o;32079:419::-;32245:4;32283:2;32272:9;32268:18;32260:26;;32332:9;32326:4;32322:20;32318:1;32307:9;32303:17;32296:47;32360:131;32486:4;32360:131;:::i;:::-;32352:139;;32079:419;;;:::o;32504:179::-;32644:31;32640:1;32632:6;32628:14;32621:55;32504:179;:::o;32689:366::-;32831:3;32852:67;32916:2;32911:3;32852:67;:::i;:::-;32845:74;;32928:93;33017:3;32928:93;:::i;:::-;33046:2;33041:3;33037:12;33030:19;;32689:366;;;:::o;33061:419::-;33227:4;33265:2;33254:9;33250:18;33242:26;;33314:9;33308:4;33304:20;33300:1;33289:9;33285:17;33278:47;33342:131;33468:4;33342:131;:::i;:::-;33334:139;;33061:419;;;:::o;33486:194::-;33526:4;33546:20;33564:1;33546:20;:::i;:::-;33541:25;;33580:20;33598:1;33580:20;:::i;:::-;33575:25;;33624:1;33621;33617:9;33609:17;;33648:1;33642:4;33639:11;33636:37;;;33653:18;;:::i;:::-;33636:37;33486:194;;;;:::o;33686:180::-;33734:77;33731:1;33724:88;33831:4;33828:1;33821:15;33855:4;33852:1;33845:15;33872:185;33912:1;33929:20;33947:1;33929:20;:::i;:::-;33924:25;;33963:20;33981:1;33963:20;:::i;:::-;33958:25;;34002:1;33992:35;;34007:18;;:::i;:::-;33992:35;34049:1;34046;34042:9;34037:14;;33872:185;;;;:::o;34063:182::-;34203:34;34199:1;34191:6;34187:14;34180:58;34063:182;:::o;34251:366::-;34393:3;34414:67;34478:2;34473:3;34414:67;:::i;:::-;34407:74;;34490:93;34579:3;34490:93;:::i;:::-;34608:2;34603:3;34599:12;34592:19;;34251:366;;;:::o;34623:419::-;34789:4;34827:2;34816:9;34812:18;34804:26;;34876:9;34870:4;34866:20;34862:1;34851:9;34847:17;34840:47;34904:131;35030:4;34904:131;:::i;:::-;34896:139;;34623:419;;;:::o;35048:332::-;35169:4;35207:2;35196:9;35192:18;35184:26;;35220:71;35288:1;35277:9;35273:17;35264:6;35220:71;:::i;:::-;35301:72;35369:2;35358:9;35354:18;35345:6;35301:72;:::i;:::-;35048:332;;;;;:::o;35386:166::-;35526:18;35522:1;35514:6;35510:14;35503:42;35386:166;:::o;35558:366::-;35700:3;35721:67;35785:2;35780:3;35721:67;:::i;:::-;35714:74;;35797:93;35886:3;35797:93;:::i;:::-;35915:2;35910:3;35906:12;35899:19;;35558:366;;;:::o;35930:419::-;36096:4;36134:2;36123:9;36119:18;36111:26;;36183:9;36177:4;36173:20;36169:1;36158:9;36154:17;36147:47;36211:131;36337:4;36211:131;:::i;:::-;36203:139;;35930:419;;;:::o;36355:116::-;36425:21;36440:5;36425:21;:::i;:::-;36418:5;36415:32;36405:60;;36461:1;36458;36451:12;36405:60;36355:116;:::o;36477:137::-;36531:5;36562:6;36556:13;36547:22;;36578:30;36602:5;36578:30;:::i;:::-;36477:137;;;;:::o;36620:345::-;36687:6;36736:2;36724:9;36715:7;36711:23;36707:32;36704:119;;;36742:79;;:::i;:::-;36704:119;36862:1;36887:61;36940:7;36931:6;36920:9;36916:22;36887:61;:::i;:::-;36877:71;;36833:125;36620:345;;;;:::o;36971:229::-;37111:34;37107:1;37099:6;37095:14;37088:58;37180:12;37175:2;37167:6;37163:15;37156:37;36971:229;:::o;37206:366::-;37348:3;37369:67;37433:2;37428:3;37369:67;:::i;:::-;37362:74;;37445:93;37534:3;37445:93;:::i;:::-;37563:2;37558:3;37554:12;37547:19;;37206:366;;;:::o;37578:419::-;37744:4;37782:2;37771:9;37767:18;37759:26;;37831:9;37825:4;37821:20;37817:1;37806:9;37802:17;37795:47;37859:131;37985:4;37859:131;:::i;:::-;37851:139;;37578:419;;;:::o;38003:170::-;38143:22;38139:1;38131:6;38127:14;38120:46;38003:170;:::o;38179:366::-;38321:3;38342:67;38406:2;38401:3;38342:67;:::i;:::-;38335:74;;38418:93;38507:3;38418:93;:::i;:::-;38536:2;38531:3;38527:12;38520:19;;38179:366;;;:::o;38551:419::-;38717:4;38755:2;38744:9;38740:18;38732:26;;38804:9;38798:4;38794:20;38790:1;38779:9;38775:17;38768:47;38832:131;38958:4;38832:131;:::i;:::-;38824:139;;38551:419;;;:::o;38976:225::-;39116:34;39112:1;39104:6;39100:14;39093:58;39185:8;39180:2;39172:6;39168:15;39161:33;38976:225;:::o;39207:366::-;39349:3;39370:67;39434:2;39429:3;39370:67;:::i;:::-;39363:74;;39446:93;39535:3;39446:93;:::i;:::-;39564:2;39559:3;39555:12;39548:19;;39207:366;;;:::o;39579:419::-;39745:4;39783:2;39772:9;39768:18;39760:26;;39832:9;39826:4;39822:20;39818:1;39807:9;39803:17;39796:47;39860:131;39986:4;39860:131;:::i;:::-;39852:139;;39579:419;;;:::o;40004:179::-;40144:31;40140:1;40132:6;40128:14;40121:55;40004:179;:::o;40189:366::-;40331:3;40352:67;40416:2;40411:3;40352:67;:::i;:::-;40345:74;;40428:93;40517:3;40428:93;:::i;:::-;40546:2;40541:3;40537:12;40530:19;;40189:366;;;:::o;40561:419::-;40727:4;40765:2;40754:9;40750:18;40742:26;;40814:9;40808:4;40804:20;40800:1;40789:9;40785:17;40778:47;40842:131;40968:4;40842:131;:::i;:::-;40834:139;;40561:419;;;:::o;40986:98::-;41037:6;41071:5;41065:12;41055:22;;40986:98;;;:::o;41090:147::-;41191:11;41228:3;41213:18;;41090:147;;;;:::o;41243:246::-;41324:1;41334:113;41348:6;41345:1;41342:13;41334:113;;;41433:1;41428:3;41424:11;41418:18;41414:1;41409:3;41405:11;41398:39;41370:2;41367:1;41363:10;41358:15;;41334:113;;;41481:1;41472:6;41467:3;41463:16;41456:27;41305:184;41243:246;;;:::o;41495:386::-;41599:3;41627:38;41659:5;41627:38;:::i;:::-;41681:88;41762:6;41757:3;41681:88;:::i;:::-;41674:95;;41778:65;41836:6;41831:3;41824:4;41817:5;41813:16;41778:65;:::i;:::-;41868:6;41863:3;41859:16;41852:23;;41603:278;41495:386;;;;:::o;41887:271::-;42017:3;42039:93;42128:3;42119:6;42039:93;:::i;:::-;42032:100;;42149:3;42142:10;;41887:271;;;;:::o;42164:99::-;42216:6;42250:5;42244:12;42234:22;;42164:99;;;:::o;42269:377::-;42357:3;42385:39;42418:5;42385:39;:::i;:::-;42440:71;42504:6;42499:3;42440:71;:::i;:::-;42433:78;;42520:65;42578:6;42573:3;42566:4;42559:5;42555:16;42520:65;:::i;:::-;42610:29;42632:6;42610:29;:::i;:::-;42605:3;42601:39;42594:46;;42361:285;42269:377;;;;:::o;42652:313::-;42765:4;42803:2;42792:9;42788:18;42780:26;;42852:9;42846:4;42842:20;42838:1;42827:9;42823:17;42816:47;42880:78;42953:4;42944:6;42880:78;:::i;:::-;42872:86;;42652:313;;;;:::o
Swarm Source
ipfs://a93e160243fb03a4998a1dee55a3c67867ffd8155d224e382f17739f8ab07c1f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.