ETH Price: $2,181.52 (+2.67%)

Token

 

Overview

Max Total Supply

135

Holders

72

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4
0xd2ad893dcd0d58a60ccb3d78f8c44e29c3cb1403
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Staking

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-16
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);

    /**
     * @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);
}


interface IHoneyToken is IERC20 {
	function mint(address _to, uint256 _amount) external;
}


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library CountersUpgradeable {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


/**
 * @dev String operations.
 */
library StringsUpgradeable {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


/**
 * @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 IERC165Upgradeable {
    /**
     * @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);
}


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721Upgradeable is IERC165Upgradeable {
    /**
     * @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`, 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 be 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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 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);

    /**
     * @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;
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721EnumerableUpgradeable is IERC721Upgradeable {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721MetadataUpgradeable is IERC721Upgradeable {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721ReceiverUpgradeable {
    /**
     * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [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 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
 * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() initializer {}
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        // If the contract is initializing we ignore whether _initialized is set in order to support multiple
        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
        // contract may have been reentered.
        require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} modifier, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    function _isConstructor() private view returns (bool) {
        return !AddressUpgradeable.isContract(address(this));
    }
}


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {
    function __ERC165_init() internal onlyInitializing {
    }

    function __ERC165_init_unchained() internal onlyInitializing {
    }
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165Upgradeable).interfaceId;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}


/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
    }

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {
    using AddressUpgradeable for address;
    using StringsUpgradeable for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {
        __ERC721_init_unchained(name_, symbol_);
    }

    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
        return
            interfaceId == type(IERC721Upgradeable).interfaceId ||
            interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721Upgradeable.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721Upgradeable.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721Upgradeable.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721ReceiverUpgradeable.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[44] private __gap;
}


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable {
    function __ERC721Enumerable_init() internal onlyInitializing {
    }

    function __ERC721Enumerable_init_unchained() internal onlyInitializing {
    }
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC721Upgradeable) returns (bool) {
        return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Upgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721EnumerableUpgradeable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721Upgradeable.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721Upgradeable.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[46] private __gap;
}


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}


/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuardUpgradeable is Initializable {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    function __ReentrancyGuard_init() internal onlyInitializing {
        __ReentrancyGuard_init_unchained();
    }

    function __ReentrancyGuard_init_unchained() internal onlyInitializing {
        _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;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}


contract Staking is Initializable, ReentrancyGuardUpgradeable, OwnableUpgradeable, ERC721EnumerableUpgradeable, IERC721ReceiverUpgradeable {

	using CountersUpgradeable for CountersUpgradeable.Counter;
	CountersUpgradeable.Counter private bagIds;

	IERC721Upgradeable public nft;
	IHoneyToken public rewardsToken;

	struct Bag {
		uint256[] nftTokenIds;
		uint256 unclaimedBalance;
		uint256 lastStateChange;
	}

	struct nftTokenId {
		uint256[] ids;
	}

	uint256 public time;

	/// @dev bagId -> Stake info
  	mapping(uint256 => Bag) public bags;

	/// @dev nft token id => bag id
	mapping(uint256 => uint256) public nftBagIds;
	
	mapping(uint => bool) public nftIsInitialised;

    uint256 public RewardDenominator;

	uint256 public doubleRewardNumerator;
	uint256 public tripleRewardNumerator;
    uint256 public quadrupleRewardNumerator;
    uint256 public quintupleRewardNumerator;
	uint256 public DectupleRewardNumerator;
	
	uint256 public nftEarnings;

	string public baseURI;
	string private newName;
	string private newSymbol;

	event Staked(address indexed user, uint256 bagId);
	event UnStaked(address indexed user, uint256 bagId, uint256 reward);
	event Claimed(address indexed user, uint256 bagId, uint256 reward);
	event AddBagInfo(address indexed user, uint256 bagId);

	function initialize(address _nft, address _rewardsToken) initializer public {
		__ERC721_init("Square Bears Staking Contact", "SBS");
		__Ownable_init();

		nft = IERC721Upgradeable(_nft);
		rewardsToken = IHoneyToken(_rewardsToken);

		nftEarnings = 10;

        RewardDenominator = 20;

		doubleRewardNumerator = 20;
		tripleRewardNumerator = 20;
        quadrupleRewardNumerator = 20;
        quintupleRewardNumerator = 24;
        DectupleRewardNumerator = 28;

		time = 24 * 60 * 60;
	}

	function stake(
		Bag[] memory _bags,
		uint256[] memory _bagIds
	) external nonReentrant {
		uint256 totalBags = _bagIds.length;
		require(totalBags == _bags.length);

		for (uint256 i = 0; i < _bags.length; i++) {
			if (_bagIds[i] == 0) {
				_addNewBag( _bags[i].nftTokenIds );
			}
			else {
				_addToBag(_bagIds[i], _bags[i].nftTokenIds);
			}
		}
	}

	function _addNewBag(
		uint256[] memory _nftTokenIds
	) internal {
		uint256 _nftTokenCount = _nftTokenIds.length;
		require(_nftTokenIds.length <= 3, "can't add more than 3");
		
		bagIds.increment();
		uint256 bagId = bagIds.current();
		
		if (_nftTokenCount > 0){
			for (uint256 i = 0; i < _nftTokenCount; i++) {
				require(msg.sender == nft.ownerOf(_nftTokenIds[i]), "not owner of nft");
				require(nftBagIds[_nftTokenIds[i]] == 0, "nft already staked");
				require(nftIsInitialised[_nftTokenIds[i]], "nft not initialised");

				nftBagIds[_nftTokenIds[i]] = bagId;
				nft.safeTransferFrom(msg.sender, address(this), _nftTokenIds[i]);
			}
		}
		
		uint256 _now = block.timestamp;
		bags[bagId] = Bag({
			nftTokenIds: _nftTokenIds,
			unclaimedBalance: 0,
			lastStateChange: _now
		});
		
		_safeMint(msg.sender, bagId);
		emit Staked(msg.sender, bagId);                  
	}

	function _addToBag(
		uint256 _bagId,
		uint256[] memory _nftTokenIds
	) internal {
		
		require(msg.sender == ownerOf(_bagId), "not bag owner");

		uint256 currentNftCount = bags[_bagId].nftTokenIds.length;
		uint256 _nftCount = _nftTokenIds.length;
		
		require((currentNftCount + _nftCount) <= 3, "can't add more than 3 nfts");
		
		uint256 _unclaimed = _calculateStakeReward(_bagId);
		bags[_bagId].unclaimedBalance += _unclaimed;
		
		if (_nftCount > 0){		
			for (uint256 i = 0; i < _nftCount; i++) {
				require(_isValidNftId(_nftTokenIds[i]), "invalid nft token");
				require(nftBagIds[_nftTokenIds[i]] == 0, "nft already staked");
				require(msg.sender == nft.ownerOf(_nftTokenIds[i]), "not nft owner");
				require(nftIsInitialised[_nftTokenIds[i]], "not initialised");
			
				bags[_bagId].nftTokenIds.push(_nftTokenIds[i]);
				nftBagIds[_nftTokenIds[i]] = _bagId;
				nft.safeTransferFrom(msg.sender, address(this), _nftTokenIds[i]);
			}
		}
				
		bags[_bagId].lastStateChange = block.timestamp;
		emit AddBagInfo(msg.sender, _bagId);
	}

	function unstake(
		uint256[] memory _bagIds,
		nftTokenId[] memory _nftTokenIds
	) external {
		uint256 totalBags = _bagIds.length;
		require(totalBags == _nftTokenIds.length);

		for (uint256 i = 0; i < totalBags; i++) {
			uint256 _bagId = _bagIds[i];
			require(msg.sender == ownerOf(_bagId), "not bag owner");
			require(_nftTokenIds[i].ids.length != 0, "nothing to unstake");

			uint256 _unclaimed = _calculateStakeReward(_bagId);
			bags[_bagId].unclaimedBalance += _unclaimed;

			uint256 _nftTokenCount = _nftTokenIds[i].ids.length;
			if (_nftTokenCount != 0) {
				uint256 _count = bags[_bagId].nftTokenIds.length;
				require(_count >= _nftTokenCount, "too many to unstake");
				for (uint256 j = 0; j < _nftTokenCount; j++) {
					require(nftBagIds[_nftTokenIds[i].ids[j]] == _bagId, "nft not found in the bag");
					for (uint256 k = 0; k < _count; k++){
						if (_nftTokenIds[i].ids[j] == bags[_bagId].nftTokenIds[k]) {
							bags[_bagId].nftTokenIds[k] = bags[_bagId].nftTokenIds[_count-1];
							bags[_bagId].nftTokenIds.pop();
							_count--;
							delete nftBagIds[_nftTokenIds[i].ids[j]];
							nft.safeTransferFrom(address(this), msg.sender, _nftTokenIds[i].ids[j]);
						}
					}  
				}
			}

			if (bags[_bagId].nftTokenIds.length == 0) {
				if (bags[_bagId].unclaimedBalance > 0){
					rewardsToken.mint(msg.sender, bags[_bagId].unclaimedBalance);
				}
				delete bags[_bagId];
				_burn(_bagId);
			}
			else {
				bags[_bagId].lastStateChange = block.timestamp;
			}
		}                        
	}

	function claim() external nonReentrant {
		uint256 _totalBags = balanceOf(msg.sender);
		uint256 _totalAmount = 0;
		uint256 _now = block.timestamp;
			
		for (uint256 i = 0; i < _totalBags; i++){
			uint256 bagId = tokenOfOwnerByIndex(msg.sender, i);
			uint256 _unclaimed = _calculateStakeReward(bagId);
			bags[bagId].unclaimedBalance += _unclaimed;

			if (bags[bagId].unclaimedBalance != 0){
				_totalAmount += bags[bagId].unclaimedBalance;
				emit Claimed(msg.sender, bagId, bags[bagId].unclaimedBalance);
				bags[bagId].unclaimedBalance = 0;
				bags[bagId].lastStateChange = _now;
			}
		}
		require(_totalAmount != 0, "nothing to claim");
		rewardsToken.mint(msg.sender, _totalAmount);
	}

	function _calculateStakeReward(uint256 _bagId) internal view returns (uint256) {
		
		uint256 period = ((block.timestamp - bags[_bagId].lastStateChange) / time);
        uint256 _totalBags = balanceOf(msg.sender);
		uint256 nftTokenLen = 0;
		for (uint256 i = 0; i < _totalBags; i++){
			uint256 bagId = tokenOfOwnerByIndex(msg.sender, i);
			nftTokenLen += bags[bagId].nftTokenIds.length;
		}

		if (period == 0 || nftTokenLen == 0){
			return 0;
		}

		uint256 total = 0;
		uint256 baseEarning = 0;
		
		for(uint256 i = 0; i < bags[_bagId].nftTokenIds.length; i++ ) {
			baseEarning += nftEarnings;
		}

		if(nftTokenLen == 1) {
			total = baseEarning * period * 1 ether;
		}
		else if(nftTokenLen == 2) {
			total = (baseEarning * period) * (doubleRewardNumerator * 1 ether) / RewardDenominator;
		}
		else if(nftTokenLen == 3) {
			total = (baseEarning * period) * (tripleRewardNumerator * 1 ether) / RewardDenominator;
		}
        else if(nftTokenLen == 4) {
			total = (baseEarning * period) * (quadrupleRewardNumerator * 1 ether) / RewardDenominator;
		}
        else if(nftTokenLen >= 10) {
			total = (baseEarning * period) * (DectupleRewardNumerator * 1 ether) / RewardDenominator;
		}
        else if(nftTokenLen >= 5) {
			total = (baseEarning * period) * (quintupleRewardNumerator * 1 ether) / RewardDenominator;
		}

		return total;
  	}

	function getNftInBagByIndex (uint256 _bagId, uint256 _index) public view returns (uint256){
		uint256 tokenId = bags[_bagId].nftTokenIds[_index];
		return tokenId;
	}

	function getTotalNftInBag (uint256 bagId) public view returns (uint256){
		uint256 len = bags[bagId].nftTokenIds.length;
		return len;
	}

	function getUnclaimedBalanceSinceLastChange (uint256 bagId) public view returns (uint256) {
		uint256 amount = _calculateStakeReward(bagId);
		return amount;
	}

	function _baseURI() internal view override returns (string memory) {
		return baseURI;
	}

	function setBaseURI(string memory _uri) public onlyOwner {
		baseURI = _uri;
	}

	function modifyName(string memory _name) public onlyOwner {
		newName = _name;
	}

	function modifySymbol(string memory _symbol) public onlyOwner {
		newSymbol = _symbol;
	}

	function name() public view virtual override returns (string memory) {
		return newName;
	}

	function symbol() public view virtual override returns (string memory) {
		return newSymbol;
	}

	function setNftInitialize(uint256[] memory nftInfo) external {
		for (uint256 i = 0; i < nftInfo.length; i++){
            require(msg.sender == nft.ownerOf(nftInfo[i]), "not owner of nft");
			nftIsInitialised[nftInfo[i]] = true;
		}
	}

	function editNftBagIds(uint256 _tokenId, uint256 _bagId) external onlyOwner {
		nftBagIds[_tokenId] = _bagId;
	}

	function modifyBagInfo(
		uint256 _bagId,
		uint256[] memory _nftIds,
		uint256 _unclaimedBalance,
		uint256 _lastStateChange
	) external onlyOwner {
		bags[_bagId].nftTokenIds = _nftIds;
		bags[_bagId].unclaimedBalance = _unclaimedBalance;
		bags[_bagId].lastStateChange = _lastStateChange;
	} 

	function modifyMultipleNftBonus(uint256[] memory _vals) external onlyOwner {
        RewardDenominator = _vals[0];
		doubleRewardNumerator = _vals[1];
		tripleRewardNumerator = _vals[2];
        quadrupleRewardNumerator = _vals[3];
        quintupleRewardNumerator = _vals[4];
        DectupleRewardNumerator = _vals[5];
	}

	function modifyNftEarnings(uint256 _rate) external onlyOwner {
		nftEarnings = _rate;
	}

	function modifyTime(uint256 _time) external onlyOwner {
		time = _time;
	}

	function _isValidNftId(uint256 id) internal pure returns(bool) {
		bool isValid = (id < 1162 ? true : false);
		return isValid;
	}

	function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
		return this.onERC721Received.selector;
	}
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"bagId","type":"uint256"}],"name":"AddBagInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"bagId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"bagId","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"bagId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"UnStaked","type":"event"},{"inputs":[],"name":"DectupleRewardNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RewardDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bags","outputs":[{"internalType":"uint256","name":"unclaimedBalance","type":"uint256"},{"internalType":"uint256","name":"lastStateChange","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"doubleRewardNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_bagId","type":"uint256"}],"name":"editNftBagIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bagId","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getNftInBagByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bagId","type":"uint256"}],"name":"getTotalNftInBag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bagId","type":"uint256"}],"name":"getUnclaimedBalanceSinceLastChange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bagId","type":"uint256"},{"internalType":"uint256[]","name":"_nftIds","type":"uint256[]"},{"internalType":"uint256","name":"_unclaimedBalance","type":"uint256"},{"internalType":"uint256","name":"_lastStateChange","type":"uint256"}],"name":"modifyBagInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_vals","type":"uint256[]"}],"name":"modifyMultipleNftBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"modifyName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"modifyNftEarnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"modifySymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"modifyTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract IERC721Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftBagIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIsInitialised","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quadrupleRewardNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quintupleRewardNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IHoneyToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nftInfo","type":"uint256[]"}],"name":"setNftInitialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256[]","name":"nftTokenIds","type":"uint256[]"},{"internalType":"uint256","name":"unclaimedBalance","type":"uint256"},{"internalType":"uint256","name":"lastStateChange","type":"uint256"}],"internalType":"struct Staking.Bag[]","name":"_bags","type":"tuple[]"},{"internalType":"uint256[]","name":"_bagIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tripleRewardNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_bagIds","type":"uint256[]"},{"components":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"internalType":"struct Staking.nftTokenId[]","name":"_nftTokenIds","type":"tuple[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50613f1a806100206000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c8063715018a611610182578063c449f2f6116100e9578063dd9b0bde116100a2578063f2fde38b1161007c578063f2fde38b14610699578063f4127b93146106ac578063f62b747d146106bf578063f7b4f027146106c957600080fd5b8063dd9b0bde1461060a578063dda4df4e1461061d578063e985e9c51461065d57600080fd5b8063c449f2f614610592578063c47494ad146105b3578063c87b56dd146105c6578063ca1096c5146105d9578063cb6acab7146105e3578063d1af0c7d146105f657600080fd5b80638e94363d1161013b5780638e94363d1461053457806395d89b4114610547578063a22cb4651461054f578063a22ed37114610562578063b88d4fde14610575578063c34143ad1461058857600080fd5b8063715018a6146104d8578063757d5139146104e057806376c66b2d146104f35780637c68931b146105065780638cfe2f4e146105105780638da5cb5b1461052357600080fd5b8063466256bd1161024157806353bf682d116101fa5780636a2783f0116101d45780636a2783f0146104925780636be62fd41461049c5780636c0360eb146104bd57806370a08231146104c557600080fd5b806353bf682d1461045957806355f804b31461046c5780636352211e1461047f57600080fd5b8063466256bd146103fa57806347ccca0214610404578063485cc955146104185780634e71d92d1461042b5780634f6ccce71461043357806353079c9f1461044657600080fd5b806318160ddd1161029357806318160ddd1461039c57806323b872dd146103a45780632ac58b04146103b75780632f745c59146103ca57806335bfbcdb146103dd57806342842e0e146103e757600080fd5b806301ffc9a7146102db57806306fdde0314610303578063081812fc14610318578063095ea7b314610343578063150b7a021461035857806316ada54714610384575b600080fd5b6102ee6102e9366004613520565b6106ed565b60405190151581526020015b60405180910390f35b61030b610718565b6040516102fa9190613595565b61032b6103263660046135a8565b6107ab565b6040516001600160a01b0390911681526020016102fa565b6103566103513660046135d6565b610845565b005b61036b6103663660046136ed565b61095b565b6040516001600160e01b031990911681526020016102fa565b61038e6101305481565b6040519081526020016102fa565b60fd5461038e565b6103566103b236600461376d565b61096c565b6103566103c536600461383d565b61099d565b61038e6103d83660046135d6565b610ab9565b61038e6101355481565b6103566103f536600461376d565b610b4f565b61038e61013a5481565b61012e5461032b906001600160a01b031681565b610356610426366004613958565b610b6a565b610356610cea565b61038e6104413660046135a8565b610f0a565b610356610454366004613991565b610f9d565b61038e6104673660046135a8565b610fdf565b61035661047a366004613991565b610ff2565b61032b61048d3660046135a8565b611030565b61038e6101365481565b61038e6104aa3660046135a8565b6000908152610131602052604090205490565b61030b6110a7565b61038e6104d33660046139da565b611136565b6103566111bd565b6103566104ee3660046135a8565b6111f3565b61038e6105013660046139f7565b611223565b61038e6101345481565b61035661051e3660046135a8565b61125b565b6065546001600160a01b031661032b565b610356610542366004613a19565b61128b565b61030b6113d4565b61035661055d366004613a4e565b6113e4565b6103566105703660046139f7565b6113ef565b6103566105833660046136ed565b61142c565b61038e6101385481565b61038e6105a03660046135a8565b6101326020526000908152604090205481565b6103566105c1366004613991565b611464565b61030b6105d43660046135a8565b6114a2565b61038e6101375481565b6103566105f1366004613a19565b61157c565b61012f5461032b906001600160a01b031681565b610356610618366004613a81565b611675565b61064861062b3660046135a8565b610131602052600090815260409020600181015460029091015482565b604080519283526020830191909152016102fa565b6102ee61066b366004613958565b6001600160a01b03918216600090815260ce6020908152604080832093909416825291909152205460ff1690565b6103566106a73660046139da565b611c37565b6103566106ba366004613b89565b611cd2565b61038e6101395481565b6102ee6106d73660046135a8565b6101336020526000908152604090205460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610712575061071282611d3f565b92915050565b606061013c805461072890613be0565b80601f016020809104026020016040519081016040528092919081815260200182805461075490613be0565b80156107a15780601f10610776576101008083540402835291602001916107a1565b820191906000526020600020905b81548152906001019060200180831161078457829003601f168201915b5050505050905090565b600081815260cb60205260408120546001600160a01b03166108295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b50600090815260cd60205260409020546001600160a01b031690565b600061085082611030565b9050806001600160a01b0316836001600160a01b031614156108be5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610820565b336001600160a01b03821614806108da57506108da813361066b565b61094c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610820565b6109568383611d8f565b505050565b630a85bd0160e11b5b949350505050565b6109763382611dfd565b6109925760405162461bcd60e51b815260040161082090613c1b565b610956838383611ef0565b600260015414156109f05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610820565b6002600155805182518114610a0457600080fd5b60005b8351811015610aaf57828181518110610a2257610a22613c6c565b602002602001015160001415610a5d57610a58848281518110610a4757610a47613c6c565b602002602001015160000151612097565b610a9d565b610a9d838281518110610a7257610a72613c6c565b6020026020010151858381518110610a8c57610a8c613c6c565b60200260200101516000015161246a565b80610aa781613c98565b915050610a07565b5050600180555050565b6000610ac483611136565b8210610b265760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610820565b506001600160a01b0391909116600090815260fb60209081526040808320938352929052205490565b6109568383836040518060200160405280600081525061142c565b600054610100900460ff16610b855760005460ff1615610b89565b303b155b610bec5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610820565b600054610100900460ff16158015610c0e576000805461ffff19166101011790555b610c686040518060400160405280601c81526020017f537175617265204265617273205374616b696e6720436f6e74616374000000008152506040518060400160405280600381526020016253425360e81b815250612931565b610c70612962565b61012e80546001600160a01b038086166001600160a01b03199283161790925561012f805492851692909116919091179055600a61013a55601461013481905561013581905561013681905561013755601861013855601c6101395562015180610130558015610956576000805461ff0019169055505050565b60026001541415610d3d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610820565b60026001556000610d4d33611136565b9050600042815b83811015610e5b576000610d683383610ab9565b90506000610d7582612991565b90508061013160008481526020019081526020016000206001016000828254610d9e9190613cb3565b90915550506000828152610131602052604090206001015415610e465760008281526101316020526040902060010154610dd89086613cb3565b600083815261013160209081526040918290206001015482518681529182015291965033917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a260008281526101316020526040812060018101919091556002018490555b50508080610e5390613c98565b915050610d54565b5081610e9c5760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b6044820152606401610820565b61012f546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610ee957600080fd5b505af1158015610efd573d6000803e3d6000fd5b5050600180555050505050565b6000610f1560fd5490565b8210610f785760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610820565b60fd8281548110610f8b57610f8b613c6c565b90600052602060002001549050919050565b6065546001600160a01b03163314610fc75760405162461bcd60e51b815260040161082090613ccb565b8051610fdb9061013c906020840190613419565b5050565b600080610feb83612991565b9392505050565b6065546001600160a01b0316331461101c5760405162461bcd60e51b815260040161082090613ccb565b8051610fdb9061013b906020840190613419565b600081815260cb60205260408120546001600160a01b0316806107125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610820565b61013b80546110b590613be0565b80601f01602080910402602001604051908101604052809291908181526020018280546110e190613be0565b801561112e5780601f106111035761010080835404028352916020019161112e565b820191906000526020600020905b81548152906001019060200180831161111157829003601f168201915b505050505081565b60006001600160a01b0382166111a15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610820565b506001600160a01b0316600090815260cc602052604090205490565b6065546001600160a01b031633146111e75760405162461bcd60e51b815260040161082090613ccb565b6111f16000612b98565b565b6065546001600160a01b0316331461121d5760405162461bcd60e51b815260040161082090613ccb565b61013a55565b60008281526101316020526040812080548291908490811061124757611247613c6c565b600091825260209091200154949350505050565b6065546001600160a01b031633146112855760405162461bcd60e51b815260040161082090613ccb565b61013055565b60005b8151811015610fdb5761012e5482516001600160a01b0390911690636352211e908490849081106112c1576112c1613c6c565b60200260200101516040518263ffffffff1660e01b81526004016112e791815260200190565b602060405180830381865afa158015611304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113289190613d00565b6001600160a01b0316336001600160a01b03161461137b5760405162461bcd60e51b815260206004820152601060248201526f1b9bdd081bdddb995c881bd9881b999d60821b6044820152606401610820565b6001610133600084848151811061139457611394613c6c565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113cc90613c98565b91505061128e565b606061013d805461072890613be0565b610fdb338383612bea565b6065546001600160a01b031633146114195760405162461bcd60e51b815260040161082090613ccb565b6000918252610132602052604090912055565b6114363383611dfd565b6114525760405162461bcd60e51b815260040161082090613c1b565b61145e84848484612cb9565b50505050565b6065546001600160a01b0316331461148e5760405162461bcd60e51b815260040161082090613ccb565b8051610fdb9061013d906020840190613419565b600081815260cb60205260409020546060906001600160a01b03166115215760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610820565b600061152b612cec565b9050600081511161154b5760405180602001604052806000815250610feb565b8061155584612cfc565b604051602001611566929190613d1d565b6040516020818303038152906040529392505050565b6065546001600160a01b031633146115a65760405162461bcd60e51b815260040161082090613ccb565b806000815181106115b9576115b9613c6c565b602002602001015161013481905550806001815181106115db576115db613c6c565b602002602001015161013581905550806002815181106115fd576115fd613c6c565b6020026020010151610136819055508060038151811061161f5761161f613c6c565b6020026020010151610137819055508060048151811061164157611641613c6c565b6020026020010151610138819055508060058151811061166357611663613c6c565b60200260200101516101398190555050565b81518151811461168457600080fd5b60005b8181101561145e5760008482815181106116a3576116a3613c6c565b602002602001015190506116b681611030565b6001600160a01b0316336001600160a01b0316146117065760405162461bcd60e51b815260206004820152600d60248201526c3737ba103130b39037bbb732b960991b6044820152606401610820565b83828151811061171857611718613c6c565b602002602001015160000151516000141561176a5760405162461bcd60e51b81526020600482015260126024820152716e6f7468696e6720746f20756e7374616b6560701b6044820152606401610820565b600061177582612991565b9050806101316000848152602001908152602001600020600101600082825461179e9190613cb3565b9250508190555060008584815181106117b9576117b9613c6c565b60200260200101516000015151905080600014611b2b5760008381526101316020526040902054818110156118265760405162461bcd60e51b8152602060048201526013602482015272746f6f206d616e7920746f20756e7374616b6560681b6044820152606401610820565b60005b82811015611b28578461013260008a898151811061184957611849613c6c565b602002602001015160000151848151811061186657611866613c6c565b6020026020010151815260200190815260200160002054146118ca5760405162461bcd60e51b815260206004820152601860248201527f6e6674206e6f7420666f756e6420696e207468652062616700000000000000006044820152606401610820565b60005b82811015611b15576000868152610131602052604090208054829081106118f6576118f6613c6c565b906000526020600020015489888151811061191357611913613c6c565b602002602001015160000151838151811061193057611930613c6c565b60200260200101511415611b0357600086815261013160205260409020611958600185613d4c565b8154811061196857611968613c6c565b90600052602060002001546101316000888152602001908152602001600020600001828154811061199b5761199b613c6c565b6000918252602080832090910192909255878152610131909152604090208054806119c8576119c8613d63565b6001900381819060005260206000200160009055905582806119e990613d79565b93505061013260008a8981518110611a0357611a03613c6c565b6020026020010151600001518481518110611a2057611a20613c6c565b602002602001015181526020019081526020016000206000905561012e60009054906101000a90046001600160a01b03166001600160a01b03166342842e0e30338c8b81518110611a7357611a73613c6c565b6020026020010151600001518681518110611a9057611a90613c6c565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611aea57600080fd5b505af1158015611afe573d6000803e3d6000fd5b505050505b80611b0d81613c98565b9150506118cd565b5080611b2081613c98565b915050611829565b50505b60008381526101316020526040902054611c0a576000838152610131602052604090206001015415611bd25761012f5460008481526101316020526040908190206001015490516340c10f1960e01b815233600482015260248101919091526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611bb957600080fd5b505af1158015611bcd573d6000803e3d6000fd5b505050505b60008381526101316020526040812090611bec828261349d565b50600060018201819055600290910155611c0583612dfa565b611c21565b600083815261013160205260409020426002909101555b5050508080611c2f90613c98565b915050611687565b6065546001600160a01b03163314611c615760405162461bcd60e51b815260040161082090613ccb565b6001600160a01b038116611cc65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610820565b611ccf81612b98565b50565b6065546001600160a01b03163314611cfc5760405162461bcd60e51b815260040161082090613ccb565b6000848152610131602090815260409091208451611d1c928601906134bb565b506000938452610131602052604090932060018101919091556002019190915550565b60006001600160e01b031982166380ac58cd60e01b1480611d7057506001600160e01b03198216635b5e139f60e01b145b8061071257506301ffc9a760e01b6001600160e01b0319831614610712565b600081815260cd6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dc482611030565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815260cb60205260408120546001600160a01b0316611e765760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610820565b6000611e8183611030565b9050806001600160a01b0316846001600160a01b03161480611ebc5750836001600160a01b0316611eb1846107ab565b6001600160a01b0316145b8061096457506001600160a01b03808216600090815260ce602090815260408083209388168352929052205460ff16610964565b826001600160a01b0316611f0382611030565b6001600160a01b031614611f675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610820565b6001600160a01b038216611fc95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610820565b611fd4838383612ea1565b611fdf600082611d8f565b6001600160a01b038316600090815260cc60205260408120805460019290612008908490613d4c565b90915550506001600160a01b038216600090815260cc60205260408120805460019290612036908490613cb3565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b805160038111156120e25760405162461bcd60e51b815260206004820152601560248201527463616e277420616464206d6f7265207468616e203360581b6044820152606401610820565b6120f161012d80546001019055565b60006120fd61012d5490565b905081156123cf5760005b828110156123cd5761012e5484516001600160a01b0390911690636352211e9086908490811061213a5761213a613c6c565b60200260200101516040518263ffffffff1660e01b815260040161216091815260200190565b602060405180830381865afa15801561217d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a19190613d00565b6001600160a01b0316336001600160a01b0316146121f45760405162461bcd60e51b815260206004820152601060248201526f1b9bdd081bdddb995c881bd9881b999d60821b6044820152606401610820565b610132600085838151811061220b5761220b613c6c565b60200260200101518152602001908152602001600020546000146122665760405162461bcd60e51b81526020600482015260126024820152711b999d08185b1c9958591e481cdd185ad95960721b6044820152606401610820565b610133600085838151811061227d5761227d613c6c565b60209081029190910181015182528101919091526040016000205460ff166122dd5760405162461bcd60e51b81526020600482015260136024820152721b999d081b9bdd081a5b9a5d1a585b1a5cd959606a1b6044820152606401610820565b8161013260008684815181106122f5576122f5613c6c565b602002602001015181526020019081526020016000208190555061012e60009054906101000a90046001600160a01b03166001600160a01b03166342842e0e333087858151811061234857612348613c6c565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156123a257600080fd5b505af11580156123b6573d6000803e3d6000fd5b5050505080806123c590613c98565b915050612108565b505b60408051606081018252848152600060208083018290524283850181905285835261013182529390912082518051919261240e928492909101906134bb565b506020820151600182015560409091015160029091015561242f3383612f59565b60405182815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a250505050565b61247382611030565b6001600160a01b0316336001600160a01b0316146124c35760405162461bcd60e51b815260206004820152600d60248201526c3737ba103130b39037bbb732b960991b6044820152606401610820565b60008281526101316020526040902054815160036124e18284613cb3565b111561252f5760405162461bcd60e51b815260206004820152601a60248201527f63616e277420616464206d6f7265207468616e2033206e6674730000000000006044820152606401610820565b600061253a85612991565b905080610131600087815260200190815260200160002060010160008282546125639190613cb3565b909155505081156128d85760005b828110156128d65761259b85828151811061258e5761258e613c6c565b6020026020010151612f73565b6125db5760405162461bcd60e51b815260206004820152601160248201527034b73b30b634b21037333a103a37b5b2b760791b6044820152606401610820565b61013260008683815181106125f2576125f2613c6c565b602002602001015181526020019081526020016000205460001461264d5760405162461bcd60e51b81526020600482015260126024820152711b999d08185b1c9958591e481cdd185ad95960721b6044820152606401610820565b61012e5485516001600160a01b0390911690636352211e9087908490811061267757612677613c6c565b60200260200101516040518263ffffffff1660e01b815260040161269d91815260200190565b602060405180830381865afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190613d00565b6001600160a01b0316336001600160a01b03161461272e5760405162461bcd60e51b815260206004820152600d60248201526c3737ba1037333a1037bbb732b960991b6044820152606401610820565b610133600086838151811061274557612745613c6c565b60209081029190910181015182528101919091526040016000205460ff166127a15760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b9a5d1a585b1a5cd959608a1b6044820152606401610820565b60008681526101316020526040902085518690839081106127c4576127c4613c6c565b602090810291909101810151825460018101845560009384529183209091015585518791610132918890859081106127fe576127fe613c6c565b602002602001015181526020019081526020016000208190555061012e60009054906101000a90046001600160a01b03166001600160a01b03166342842e0e333088858151811061285157612851613c6c565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156128ab57600080fd5b505af11580156128bf573d6000803e3d6000fd5b5050505080806128ce90613c98565b915050612571565b505b6000858152610131602052604090819020426002909101555133907f5a418caadeea679bf95a28206324ba20f381eb5a0c7b9cc0daf4348286135b91906129229088815260200190565b60405180910390a25050505050565b600054610100900460ff166129585760405162461bcd60e51b815260040161082090613d90565b610fdb8282612f8f565b600054610100900460ff166129895760405162461bcd60e51b815260040161082090613d90565b6111f1612fdd565b6101305460008281526101316020526040812060020154909182916129b69042613d4c565b6129c09190613df1565b905060006129cd33611136565b90506000805b82811015612a1a5760006129e73383610ab9565b60008181526101316020526040902054909150612a049084613cb3565b9250508080612a1290613c98565b9150506129d3565b50821580612a26575080155b15612a3657506000949350505050565b60008060005b60008881526101316020526040902054811015612a755761013a54612a619083613cb3565b915080612a6d81613c98565b915050612a3c565b508260011415612aa257612a898582613e05565b612a9b90670de0b6b3a7640000613e05565b9150612b8e565b8260021415612ae3576101345461013554612ac590670de0b6b3a7640000613e05565b612acf8784613e05565b612ad99190613e05565b612a9b9190613df1565b8260031415612b06576101345461013654612ac590670de0b6b3a7640000613e05565b8260041415612b29576101345461013754612ac590670de0b6b3a7640000613e05565b600a8310612b4b576101345461013954612ac590670de0b6b3a7640000613e05565b60058310612b8e576101345461013854612b6d90670de0b6b3a7640000613e05565b612b778784613e05565b612b819190613e05565b612b8b9190613df1565b91505b5095945050505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612c4c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610820565b6001600160a01b03838116600081815260ce6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612cc4848484611ef0565b612cd08484848461300d565b61145e5760405162461bcd60e51b815260040161082090613e24565b606061013b805461072890613be0565b606081612d205750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612d4a5780612d3481613c98565b9150612d439050600a83613df1565b9150612d24565b60008167ffffffffffffffff811115612d6557612d65613602565b6040519080825280601f01601f191660200182016040528015612d8f576020820181803683370190505b5090505b841561096457612da4600183613d4c565b9150612db1600a86613e76565b612dbc906030613cb3565b60f81b818381518110612dd157612dd1613c6c565b60200101906001600160f81b031916908160001a905350612df3600a86613df1565b9450612d93565b6000612e0582611030565b9050612e1381600084612ea1565b612e1e600083611d8f565b6001600160a01b038116600090815260cc60205260408120805460019290612e47908490613d4c565b9091555050600082815260cb602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038316612efc57612ef78160fd8054600083815260fe60205260408120829055600182018355919091527f9346ac6dd7de6b96975fec380d4d994c4c12e6a8897544f22915316cc6cca2800155565b612f1f565b816001600160a01b0316836001600160a01b031614612f1f57612f1f8382613108565b6001600160a01b038216612f3657610956816131a5565b826001600160a01b0316826001600160a01b031614610956576109568282613254565b610fdb828260405180602001604052806000815250613298565b60008061048a8310612f86576000610feb565b60019392505050565b600054610100900460ff16612fb65760405162461bcd60e51b815260040161082090613d90565b8151612fc99060c9906020850190613419565b5080516109569060ca906020840190613419565b600054610100900460ff166130045760405162461bcd60e51b815260040161082090613d90565b6111f133612b98565b60006001600160a01b0384163b1561310057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613051903390899088908890600401613e8a565b6020604051808303816000875af192505050801561308c575060408051601f3d908101601f1916820190925261308991810190613ec7565b60015b6130e6573d8080156130ba576040519150601f19603f3d011682016040523d82523d6000602084013e6130bf565b606091505b5080516130de5760405162461bcd60e51b815260040161082090613e24565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610964565b506001610964565b6000600161311584611136565b61311f9190613d4c565b600083815260fc6020526040902054909150808214613172576001600160a01b038416600090815260fb60209081526040808320858452825280832054848452818420819055835260fc90915290208190555b50600091825260fc602090815260408084208490556001600160a01b03909416835260fb81528383209183525290812055565b60fd546000906131b790600190613d4c565b600083815260fe602052604081205460fd80549394509092849081106131df576131df613c6c565b906000526020600020015490508060fd838154811061320057613200613c6c565b600091825260208083209091019290925582815260fe909152604080822084905585825281205560fd80548061323857613238613d63565b6001900381819060005260206000200160009055905550505050565b600061325f83611136565b6001600160a01b03909316600090815260fb60209081526040808320868452825280832085905593825260fc9052919091209190915550565b6132a283836132cb565b6132af600084848461300d565b6109565760405162461bcd60e51b815260040161082090613e24565b6001600160a01b0382166133215760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610820565b600081815260cb60205260409020546001600160a01b0316156133865760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610820565b61339260008383612ea1565b6001600160a01b038216600090815260cc602052604081208054600192906133bb908490613cb3565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461342590613be0565b90600052602060002090601f016020900481019282613447576000855561348d565b82601f1061346057805160ff191683800117855561348d565b8280016001018555821561348d579182015b8281111561348d578251825591602001919060010190613472565b506134999291506134f5565b5090565b5080546000825590600052602060002090810190611ccf91906134f5565b82805482825590600052602060002090810192821561348d579160200282018281111561348d578251825591602001919060010190613472565b5b8082111561349957600081556001016134f6565b6001600160e01b031981168114611ccf57600080fd5b60006020828403121561353257600080fd5b8135610feb8161350a565b60005b83811015613558578181015183820152602001613540565b8381111561145e5750506000910152565b6000815180845261358181602086016020860161353d565b601f01601f19169290920160200192915050565b602081526000610feb6020830184613569565b6000602082840312156135ba57600080fd5b5035919050565b6001600160a01b0381168114611ccf57600080fd5b600080604083850312156135e957600080fd5b82356135f4816135c1565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561363b5761363b613602565b60405290565b6040516020810167ffffffffffffffff8111828210171561363b5761363b613602565b604051601f8201601f1916810167ffffffffffffffff8111828210171561368d5761368d613602565b604052919050565b600067ffffffffffffffff8311156136af576136af613602565b6136c2601f8401601f1916602001613664565b90508281528383830111156136d657600080fd5b828260208301376000602084830101529392505050565b6000806000806080858703121561370357600080fd5b843561370e816135c1565b9350602085013561371e816135c1565b925060408501359150606085013567ffffffffffffffff81111561374157600080fd5b8501601f8101871361375257600080fd5b61376187823560208401613695565b91505092959194509250565b60008060006060848603121561378257600080fd5b833561378d816135c1565b9250602084013561379d816135c1565b929592945050506040919091013590565b600067ffffffffffffffff8211156137c8576137c8613602565b5060051b60200190565b600082601f8301126137e357600080fd5b813560206137f86137f3836137ae565b613664565b82815260059290921b8401810191818101908684111561381757600080fd5b8286015b84811015613832578035835291830191830161381b565b509695505050505050565b6000806040838503121561385057600080fd5b823567ffffffffffffffff8082111561386857600080fd5b818501915085601f83011261387c57600080fd5b8135602061388c6137f3836137ae565b82815260059290921b840181019181810190898411156138ab57600080fd5b8286015b8481101561392a578035868111156138c75760008081fd5b87016060818d03601f19018113156138df5760008081fd5b6138e7613618565b86830135898111156138f95760008081fd5b6139078f89838701016137d2565b8252506040838101358883015291909201359082015283529183019183016138af565b509650508601359250508082111561394157600080fd5b5061394e858286016137d2565b9150509250929050565b6000806040838503121561396b57600080fd5b8235613976816135c1565b91506020830135613986816135c1565b809150509250929050565b6000602082840312156139a357600080fd5b813567ffffffffffffffff8111156139ba57600080fd5b8201601f810184136139cb57600080fd5b61096484823560208401613695565b6000602082840312156139ec57600080fd5b8135610feb816135c1565b60008060408385031215613a0a57600080fd5b50508035926020909101359150565b600060208284031215613a2b57600080fd5b813567ffffffffffffffff811115613a4257600080fd5b610964848285016137d2565b60008060408385031215613a6157600080fd5b8235613a6c816135c1565b91506020830135801515811461398657600080fd5b60008060408385031215613a9457600080fd5b823567ffffffffffffffff80821115613aac57600080fd5b613ab8868387016137d2565b9350602091508185013581811115613acf57600080fd5b8501601f81018713613ae057600080fd5b8035613aee6137f3826137ae565b81815260059190911b82018401908481019089831115613b0d57600080fd5b8584015b83811015613b7857803586811115613b295760008081fd5b8501808c03601f1901881315613b3f5760008081fd5b613b47613641565b8882013588811115613b595760008081fd5b613b678e8b838601016137d2565b825250845250918601918601613b11565b508096505050505050509250929050565b60008060008060808587031215613b9f57600080fd5b84359350602085013567ffffffffffffffff811115613bbd57600080fd5b613bc9878288016137d2565b949794965050505060408301359260600135919050565b600181811c90821680613bf457607f821691505b60208210811415613c1557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613cac57613cac613c82565b5060010190565b60008219821115613cc657613cc6613c82565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613d1257600080fd5b8151610feb816135c1565b60008351613d2f81846020880161353d565b835190830190613d4381836020880161353d565b01949350505050565b600082821015613d5e57613d5e613c82565b500390565b634e487b7160e01b600052603160045260246000fd5b600081613d8857613d88613c82565b506000190190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082613e0057613e00613ddb565b500490565b6000816000190483118215151615613e1f57613e1f613c82565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613e8557613e85613ddb565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ebd90830184613569565b9695505050505050565b600060208284031215613ed957600080fd5b8151610feb8161350a56fea2646970667358221220e990947a07c1b47e9a32bcf060fd0213b9b033fe1cfcc16e4edfc8e70cc9d95964736f6c634300080c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102d65760003560e01c8063715018a611610182578063c449f2f6116100e9578063dd9b0bde116100a2578063f2fde38b1161007c578063f2fde38b14610699578063f4127b93146106ac578063f62b747d146106bf578063f7b4f027146106c957600080fd5b8063dd9b0bde1461060a578063dda4df4e1461061d578063e985e9c51461065d57600080fd5b8063c449f2f614610592578063c47494ad146105b3578063c87b56dd146105c6578063ca1096c5146105d9578063cb6acab7146105e3578063d1af0c7d146105f657600080fd5b80638e94363d1161013b5780638e94363d1461053457806395d89b4114610547578063a22cb4651461054f578063a22ed37114610562578063b88d4fde14610575578063c34143ad1461058857600080fd5b8063715018a6146104d8578063757d5139146104e057806376c66b2d146104f35780637c68931b146105065780638cfe2f4e146105105780638da5cb5b1461052357600080fd5b8063466256bd1161024157806353bf682d116101fa5780636a2783f0116101d45780636a2783f0146104925780636be62fd41461049c5780636c0360eb146104bd57806370a08231146104c557600080fd5b806353bf682d1461045957806355f804b31461046c5780636352211e1461047f57600080fd5b8063466256bd146103fa57806347ccca0214610404578063485cc955146104185780634e71d92d1461042b5780634f6ccce71461043357806353079c9f1461044657600080fd5b806318160ddd1161029357806318160ddd1461039c57806323b872dd146103a45780632ac58b04146103b75780632f745c59146103ca57806335bfbcdb146103dd57806342842e0e146103e757600080fd5b806301ffc9a7146102db57806306fdde0314610303578063081812fc14610318578063095ea7b314610343578063150b7a021461035857806316ada54714610384575b600080fd5b6102ee6102e9366004613520565b6106ed565b60405190151581526020015b60405180910390f35b61030b610718565b6040516102fa9190613595565b61032b6103263660046135a8565b6107ab565b6040516001600160a01b0390911681526020016102fa565b6103566103513660046135d6565b610845565b005b61036b6103663660046136ed565b61095b565b6040516001600160e01b031990911681526020016102fa565b61038e6101305481565b6040519081526020016102fa565b60fd5461038e565b6103566103b236600461376d565b61096c565b6103566103c536600461383d565b61099d565b61038e6103d83660046135d6565b610ab9565b61038e6101355481565b6103566103f536600461376d565b610b4f565b61038e61013a5481565b61012e5461032b906001600160a01b031681565b610356610426366004613958565b610b6a565b610356610cea565b61038e6104413660046135a8565b610f0a565b610356610454366004613991565b610f9d565b61038e6104673660046135a8565b610fdf565b61035661047a366004613991565b610ff2565b61032b61048d3660046135a8565b611030565b61038e6101365481565b61038e6104aa3660046135a8565b6000908152610131602052604090205490565b61030b6110a7565b61038e6104d33660046139da565b611136565b6103566111bd565b6103566104ee3660046135a8565b6111f3565b61038e6105013660046139f7565b611223565b61038e6101345481565b61035661051e3660046135a8565b61125b565b6065546001600160a01b031661032b565b610356610542366004613a19565b61128b565b61030b6113d4565b61035661055d366004613a4e565b6113e4565b6103566105703660046139f7565b6113ef565b6103566105833660046136ed565b61142c565b61038e6101385481565b61038e6105a03660046135a8565b6101326020526000908152604090205481565b6103566105c1366004613991565b611464565b61030b6105d43660046135a8565b6114a2565b61038e6101375481565b6103566105f1366004613a19565b61157c565b61012f5461032b906001600160a01b031681565b610356610618366004613a81565b611675565b61064861062b3660046135a8565b610131602052600090815260409020600181015460029091015482565b604080519283526020830191909152016102fa565b6102ee61066b366004613958565b6001600160a01b03918216600090815260ce6020908152604080832093909416825291909152205460ff1690565b6103566106a73660046139da565b611c37565b6103566106ba366004613b89565b611cd2565b61038e6101395481565b6102ee6106d73660046135a8565b6101336020526000908152604090205460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610712575061071282611d3f565b92915050565b606061013c805461072890613be0565b80601f016020809104026020016040519081016040528092919081815260200182805461075490613be0565b80156107a15780601f10610776576101008083540402835291602001916107a1565b820191906000526020600020905b81548152906001019060200180831161078457829003601f168201915b5050505050905090565b600081815260cb60205260408120546001600160a01b03166108295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b50600090815260cd60205260409020546001600160a01b031690565b600061085082611030565b9050806001600160a01b0316836001600160a01b031614156108be5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610820565b336001600160a01b03821614806108da57506108da813361066b565b61094c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610820565b6109568383611d8f565b505050565b630a85bd0160e11b5b949350505050565b6109763382611dfd565b6109925760405162461bcd60e51b815260040161082090613c1b565b610956838383611ef0565b600260015414156109f05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610820565b6002600155805182518114610a0457600080fd5b60005b8351811015610aaf57828181518110610a2257610a22613c6c565b602002602001015160001415610a5d57610a58848281518110610a4757610a47613c6c565b602002602001015160000151612097565b610a9d565b610a9d838281518110610a7257610a72613c6c565b6020026020010151858381518110610a8c57610a8c613c6c565b60200260200101516000015161246a565b80610aa781613c98565b915050610a07565b5050600180555050565b6000610ac483611136565b8210610b265760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610820565b506001600160a01b0391909116600090815260fb60209081526040808320938352929052205490565b6109568383836040518060200160405280600081525061142c565b600054610100900460ff16610b855760005460ff1615610b89565b303b155b610bec5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610820565b600054610100900460ff16158015610c0e576000805461ffff19166101011790555b610c686040518060400160405280601c81526020017f537175617265204265617273205374616b696e6720436f6e74616374000000008152506040518060400160405280600381526020016253425360e81b815250612931565b610c70612962565b61012e80546001600160a01b038086166001600160a01b03199283161790925561012f805492851692909116919091179055600a61013a55601461013481905561013581905561013681905561013755601861013855601c6101395562015180610130558015610956576000805461ff0019169055505050565b60026001541415610d3d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610820565b60026001556000610d4d33611136565b9050600042815b83811015610e5b576000610d683383610ab9565b90506000610d7582612991565b90508061013160008481526020019081526020016000206001016000828254610d9e9190613cb3565b90915550506000828152610131602052604090206001015415610e465760008281526101316020526040902060010154610dd89086613cb3565b600083815261013160209081526040918290206001015482518681529182015291965033917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a260008281526101316020526040812060018101919091556002018490555b50508080610e5390613c98565b915050610d54565b5081610e9c5760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b6044820152606401610820565b61012f546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610ee957600080fd5b505af1158015610efd573d6000803e3d6000fd5b5050600180555050505050565b6000610f1560fd5490565b8210610f785760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610820565b60fd8281548110610f8b57610f8b613c6c565b90600052602060002001549050919050565b6065546001600160a01b03163314610fc75760405162461bcd60e51b815260040161082090613ccb565b8051610fdb9061013c906020840190613419565b5050565b600080610feb83612991565b9392505050565b6065546001600160a01b0316331461101c5760405162461bcd60e51b815260040161082090613ccb565b8051610fdb9061013b906020840190613419565b600081815260cb60205260408120546001600160a01b0316806107125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610820565b61013b80546110b590613be0565b80601f01602080910402602001604051908101604052809291908181526020018280546110e190613be0565b801561112e5780601f106111035761010080835404028352916020019161112e565b820191906000526020600020905b81548152906001019060200180831161111157829003601f168201915b505050505081565b60006001600160a01b0382166111a15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610820565b506001600160a01b0316600090815260cc602052604090205490565b6065546001600160a01b031633146111e75760405162461bcd60e51b815260040161082090613ccb565b6111f16000612b98565b565b6065546001600160a01b0316331461121d5760405162461bcd60e51b815260040161082090613ccb565b61013a55565b60008281526101316020526040812080548291908490811061124757611247613c6c565b600091825260209091200154949350505050565b6065546001600160a01b031633146112855760405162461bcd60e51b815260040161082090613ccb565b61013055565b60005b8151811015610fdb5761012e5482516001600160a01b0390911690636352211e908490849081106112c1576112c1613c6c565b60200260200101516040518263ffffffff1660e01b81526004016112e791815260200190565b602060405180830381865afa158015611304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113289190613d00565b6001600160a01b0316336001600160a01b03161461137b5760405162461bcd60e51b815260206004820152601060248201526f1b9bdd081bdddb995c881bd9881b999d60821b6044820152606401610820565b6001610133600084848151811061139457611394613c6c565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113cc90613c98565b91505061128e565b606061013d805461072890613be0565b610fdb338383612bea565b6065546001600160a01b031633146114195760405162461bcd60e51b815260040161082090613ccb565b6000918252610132602052604090912055565b6114363383611dfd565b6114525760405162461bcd60e51b815260040161082090613c1b565b61145e84848484612cb9565b50505050565b6065546001600160a01b0316331461148e5760405162461bcd60e51b815260040161082090613ccb565b8051610fdb9061013d906020840190613419565b600081815260cb60205260409020546060906001600160a01b03166115215760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610820565b600061152b612cec565b9050600081511161154b5760405180602001604052806000815250610feb565b8061155584612cfc565b604051602001611566929190613d1d565b6040516020818303038152906040529392505050565b6065546001600160a01b031633146115a65760405162461bcd60e51b815260040161082090613ccb565b806000815181106115b9576115b9613c6c565b602002602001015161013481905550806001815181106115db576115db613c6c565b602002602001015161013581905550806002815181106115fd576115fd613c6c565b6020026020010151610136819055508060038151811061161f5761161f613c6c565b6020026020010151610137819055508060048151811061164157611641613c6c565b6020026020010151610138819055508060058151811061166357611663613c6c565b60200260200101516101398190555050565b81518151811461168457600080fd5b60005b8181101561145e5760008482815181106116a3576116a3613c6c565b602002602001015190506116b681611030565b6001600160a01b0316336001600160a01b0316146117065760405162461bcd60e51b815260206004820152600d60248201526c3737ba103130b39037bbb732b960991b6044820152606401610820565b83828151811061171857611718613c6c565b602002602001015160000151516000141561176a5760405162461bcd60e51b81526020600482015260126024820152716e6f7468696e6720746f20756e7374616b6560701b6044820152606401610820565b600061177582612991565b9050806101316000848152602001908152602001600020600101600082825461179e9190613cb3565b9250508190555060008584815181106117b9576117b9613c6c565b60200260200101516000015151905080600014611b2b5760008381526101316020526040902054818110156118265760405162461bcd60e51b8152602060048201526013602482015272746f6f206d616e7920746f20756e7374616b6560681b6044820152606401610820565b60005b82811015611b28578461013260008a898151811061184957611849613c6c565b602002602001015160000151848151811061186657611866613c6c565b6020026020010151815260200190815260200160002054146118ca5760405162461bcd60e51b815260206004820152601860248201527f6e6674206e6f7420666f756e6420696e207468652062616700000000000000006044820152606401610820565b60005b82811015611b15576000868152610131602052604090208054829081106118f6576118f6613c6c565b906000526020600020015489888151811061191357611913613c6c565b602002602001015160000151838151811061193057611930613c6c565b60200260200101511415611b0357600086815261013160205260409020611958600185613d4c565b8154811061196857611968613c6c565b90600052602060002001546101316000888152602001908152602001600020600001828154811061199b5761199b613c6c565b6000918252602080832090910192909255878152610131909152604090208054806119c8576119c8613d63565b6001900381819060005260206000200160009055905582806119e990613d79565b93505061013260008a8981518110611a0357611a03613c6c565b6020026020010151600001518481518110611a2057611a20613c6c565b602002602001015181526020019081526020016000206000905561012e60009054906101000a90046001600160a01b03166001600160a01b03166342842e0e30338c8b81518110611a7357611a73613c6c565b6020026020010151600001518681518110611a9057611a90613c6c565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611aea57600080fd5b505af1158015611afe573d6000803e3d6000fd5b505050505b80611b0d81613c98565b9150506118cd565b5080611b2081613c98565b915050611829565b50505b60008381526101316020526040902054611c0a576000838152610131602052604090206001015415611bd25761012f5460008481526101316020526040908190206001015490516340c10f1960e01b815233600482015260248101919091526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611bb957600080fd5b505af1158015611bcd573d6000803e3d6000fd5b505050505b60008381526101316020526040812090611bec828261349d565b50600060018201819055600290910155611c0583612dfa565b611c21565b600083815261013160205260409020426002909101555b5050508080611c2f90613c98565b915050611687565b6065546001600160a01b03163314611c615760405162461bcd60e51b815260040161082090613ccb565b6001600160a01b038116611cc65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610820565b611ccf81612b98565b50565b6065546001600160a01b03163314611cfc5760405162461bcd60e51b815260040161082090613ccb565b6000848152610131602090815260409091208451611d1c928601906134bb565b506000938452610131602052604090932060018101919091556002019190915550565b60006001600160e01b031982166380ac58cd60e01b1480611d7057506001600160e01b03198216635b5e139f60e01b145b8061071257506301ffc9a760e01b6001600160e01b0319831614610712565b600081815260cd6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dc482611030565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815260cb60205260408120546001600160a01b0316611e765760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610820565b6000611e8183611030565b9050806001600160a01b0316846001600160a01b03161480611ebc5750836001600160a01b0316611eb1846107ab565b6001600160a01b0316145b8061096457506001600160a01b03808216600090815260ce602090815260408083209388168352929052205460ff16610964565b826001600160a01b0316611f0382611030565b6001600160a01b031614611f675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610820565b6001600160a01b038216611fc95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610820565b611fd4838383612ea1565b611fdf600082611d8f565b6001600160a01b038316600090815260cc60205260408120805460019290612008908490613d4c565b90915550506001600160a01b038216600090815260cc60205260408120805460019290612036908490613cb3565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b805160038111156120e25760405162461bcd60e51b815260206004820152601560248201527463616e277420616464206d6f7265207468616e203360581b6044820152606401610820565b6120f161012d80546001019055565b60006120fd61012d5490565b905081156123cf5760005b828110156123cd5761012e5484516001600160a01b0390911690636352211e9086908490811061213a5761213a613c6c565b60200260200101516040518263ffffffff1660e01b815260040161216091815260200190565b602060405180830381865afa15801561217d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a19190613d00565b6001600160a01b0316336001600160a01b0316146121f45760405162461bcd60e51b815260206004820152601060248201526f1b9bdd081bdddb995c881bd9881b999d60821b6044820152606401610820565b610132600085838151811061220b5761220b613c6c565b60200260200101518152602001908152602001600020546000146122665760405162461bcd60e51b81526020600482015260126024820152711b999d08185b1c9958591e481cdd185ad95960721b6044820152606401610820565b610133600085838151811061227d5761227d613c6c565b60209081029190910181015182528101919091526040016000205460ff166122dd5760405162461bcd60e51b81526020600482015260136024820152721b999d081b9bdd081a5b9a5d1a585b1a5cd959606a1b6044820152606401610820565b8161013260008684815181106122f5576122f5613c6c565b602002602001015181526020019081526020016000208190555061012e60009054906101000a90046001600160a01b03166001600160a01b03166342842e0e333087858151811061234857612348613c6c565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156123a257600080fd5b505af11580156123b6573d6000803e3d6000fd5b5050505080806123c590613c98565b915050612108565b505b60408051606081018252848152600060208083018290524283850181905285835261013182529390912082518051919261240e928492909101906134bb565b506020820151600182015560409091015160029091015561242f3383612f59565b60405182815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a250505050565b61247382611030565b6001600160a01b0316336001600160a01b0316146124c35760405162461bcd60e51b815260206004820152600d60248201526c3737ba103130b39037bbb732b960991b6044820152606401610820565b60008281526101316020526040902054815160036124e18284613cb3565b111561252f5760405162461bcd60e51b815260206004820152601a60248201527f63616e277420616464206d6f7265207468616e2033206e6674730000000000006044820152606401610820565b600061253a85612991565b905080610131600087815260200190815260200160002060010160008282546125639190613cb3565b909155505081156128d85760005b828110156128d65761259b85828151811061258e5761258e613c6c565b6020026020010151612f73565b6125db5760405162461bcd60e51b815260206004820152601160248201527034b73b30b634b21037333a103a37b5b2b760791b6044820152606401610820565b61013260008683815181106125f2576125f2613c6c565b602002602001015181526020019081526020016000205460001461264d5760405162461bcd60e51b81526020600482015260126024820152711b999d08185b1c9958591e481cdd185ad95960721b6044820152606401610820565b61012e5485516001600160a01b0390911690636352211e9087908490811061267757612677613c6c565b60200260200101516040518263ffffffff1660e01b815260040161269d91815260200190565b602060405180830381865afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190613d00565b6001600160a01b0316336001600160a01b03161461272e5760405162461bcd60e51b815260206004820152600d60248201526c3737ba1037333a1037bbb732b960991b6044820152606401610820565b610133600086838151811061274557612745613c6c565b60209081029190910181015182528101919091526040016000205460ff166127a15760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b9a5d1a585b1a5cd959608a1b6044820152606401610820565b60008681526101316020526040902085518690839081106127c4576127c4613c6c565b602090810291909101810151825460018101845560009384529183209091015585518791610132918890859081106127fe576127fe613c6c565b602002602001015181526020019081526020016000208190555061012e60009054906101000a90046001600160a01b03166001600160a01b03166342842e0e333088858151811061285157612851613c6c565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156128ab57600080fd5b505af11580156128bf573d6000803e3d6000fd5b5050505080806128ce90613c98565b915050612571565b505b6000858152610131602052604090819020426002909101555133907f5a418caadeea679bf95a28206324ba20f381eb5a0c7b9cc0daf4348286135b91906129229088815260200190565b60405180910390a25050505050565b600054610100900460ff166129585760405162461bcd60e51b815260040161082090613d90565b610fdb8282612f8f565b600054610100900460ff166129895760405162461bcd60e51b815260040161082090613d90565b6111f1612fdd565b6101305460008281526101316020526040812060020154909182916129b69042613d4c565b6129c09190613df1565b905060006129cd33611136565b90506000805b82811015612a1a5760006129e73383610ab9565b60008181526101316020526040902054909150612a049084613cb3565b9250508080612a1290613c98565b9150506129d3565b50821580612a26575080155b15612a3657506000949350505050565b60008060005b60008881526101316020526040902054811015612a755761013a54612a619083613cb3565b915080612a6d81613c98565b915050612a3c565b508260011415612aa257612a898582613e05565b612a9b90670de0b6b3a7640000613e05565b9150612b8e565b8260021415612ae3576101345461013554612ac590670de0b6b3a7640000613e05565b612acf8784613e05565b612ad99190613e05565b612a9b9190613df1565b8260031415612b06576101345461013654612ac590670de0b6b3a7640000613e05565b8260041415612b29576101345461013754612ac590670de0b6b3a7640000613e05565b600a8310612b4b576101345461013954612ac590670de0b6b3a7640000613e05565b60058310612b8e576101345461013854612b6d90670de0b6b3a7640000613e05565b612b778784613e05565b612b819190613e05565b612b8b9190613df1565b91505b5095945050505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612c4c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610820565b6001600160a01b03838116600081815260ce6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612cc4848484611ef0565b612cd08484848461300d565b61145e5760405162461bcd60e51b815260040161082090613e24565b606061013b805461072890613be0565b606081612d205750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612d4a5780612d3481613c98565b9150612d439050600a83613df1565b9150612d24565b60008167ffffffffffffffff811115612d6557612d65613602565b6040519080825280601f01601f191660200182016040528015612d8f576020820181803683370190505b5090505b841561096457612da4600183613d4c565b9150612db1600a86613e76565b612dbc906030613cb3565b60f81b818381518110612dd157612dd1613c6c565b60200101906001600160f81b031916908160001a905350612df3600a86613df1565b9450612d93565b6000612e0582611030565b9050612e1381600084612ea1565b612e1e600083611d8f565b6001600160a01b038116600090815260cc60205260408120805460019290612e47908490613d4c565b9091555050600082815260cb602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038316612efc57612ef78160fd8054600083815260fe60205260408120829055600182018355919091527f9346ac6dd7de6b96975fec380d4d994c4c12e6a8897544f22915316cc6cca2800155565b612f1f565b816001600160a01b0316836001600160a01b031614612f1f57612f1f8382613108565b6001600160a01b038216612f3657610956816131a5565b826001600160a01b0316826001600160a01b031614610956576109568282613254565b610fdb828260405180602001604052806000815250613298565b60008061048a8310612f86576000610feb565b60019392505050565b600054610100900460ff16612fb65760405162461bcd60e51b815260040161082090613d90565b8151612fc99060c9906020850190613419565b5080516109569060ca906020840190613419565b600054610100900460ff166130045760405162461bcd60e51b815260040161082090613d90565b6111f133612b98565b60006001600160a01b0384163b1561310057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613051903390899088908890600401613e8a565b6020604051808303816000875af192505050801561308c575060408051601f3d908101601f1916820190925261308991810190613ec7565b60015b6130e6573d8080156130ba576040519150601f19603f3d011682016040523d82523d6000602084013e6130bf565b606091505b5080516130de5760405162461bcd60e51b815260040161082090613e24565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610964565b506001610964565b6000600161311584611136565b61311f9190613d4c565b600083815260fc6020526040902054909150808214613172576001600160a01b038416600090815260fb60209081526040808320858452825280832054848452818420819055835260fc90915290208190555b50600091825260fc602090815260408084208490556001600160a01b03909416835260fb81528383209183525290812055565b60fd546000906131b790600190613d4c565b600083815260fe602052604081205460fd80549394509092849081106131df576131df613c6c565b906000526020600020015490508060fd838154811061320057613200613c6c565b600091825260208083209091019290925582815260fe909152604080822084905585825281205560fd80548061323857613238613d63565b6001900381819060005260206000200160009055905550505050565b600061325f83611136565b6001600160a01b03909316600090815260fb60209081526040808320868452825280832085905593825260fc9052919091209190915550565b6132a283836132cb565b6132af600084848461300d565b6109565760405162461bcd60e51b815260040161082090613e24565b6001600160a01b0382166133215760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610820565b600081815260cb60205260409020546001600160a01b0316156133865760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610820565b61339260008383612ea1565b6001600160a01b038216600090815260cc602052604081208054600192906133bb908490613cb3565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461342590613be0565b90600052602060002090601f016020900481019282613447576000855561348d565b82601f1061346057805160ff191683800117855561348d565b8280016001018555821561348d579182015b8281111561348d578251825591602001919060010190613472565b506134999291506134f5565b5090565b5080546000825590600052602060002090810190611ccf91906134f5565b82805482825590600052602060002090810192821561348d579160200282018281111561348d578251825591602001919060010190613472565b5b8082111561349957600081556001016134f6565b6001600160e01b031981168114611ccf57600080fd5b60006020828403121561353257600080fd5b8135610feb8161350a565b60005b83811015613558578181015183820152602001613540565b8381111561145e5750506000910152565b6000815180845261358181602086016020860161353d565b601f01601f19169290920160200192915050565b602081526000610feb6020830184613569565b6000602082840312156135ba57600080fd5b5035919050565b6001600160a01b0381168114611ccf57600080fd5b600080604083850312156135e957600080fd5b82356135f4816135c1565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561363b5761363b613602565b60405290565b6040516020810167ffffffffffffffff8111828210171561363b5761363b613602565b604051601f8201601f1916810167ffffffffffffffff8111828210171561368d5761368d613602565b604052919050565b600067ffffffffffffffff8311156136af576136af613602565b6136c2601f8401601f1916602001613664565b90508281528383830111156136d657600080fd5b828260208301376000602084830101529392505050565b6000806000806080858703121561370357600080fd5b843561370e816135c1565b9350602085013561371e816135c1565b925060408501359150606085013567ffffffffffffffff81111561374157600080fd5b8501601f8101871361375257600080fd5b61376187823560208401613695565b91505092959194509250565b60008060006060848603121561378257600080fd5b833561378d816135c1565b9250602084013561379d816135c1565b929592945050506040919091013590565b600067ffffffffffffffff8211156137c8576137c8613602565b5060051b60200190565b600082601f8301126137e357600080fd5b813560206137f86137f3836137ae565b613664565b82815260059290921b8401810191818101908684111561381757600080fd5b8286015b84811015613832578035835291830191830161381b565b509695505050505050565b6000806040838503121561385057600080fd5b823567ffffffffffffffff8082111561386857600080fd5b818501915085601f83011261387c57600080fd5b8135602061388c6137f3836137ae565b82815260059290921b840181019181810190898411156138ab57600080fd5b8286015b8481101561392a578035868111156138c75760008081fd5b87016060818d03601f19018113156138df5760008081fd5b6138e7613618565b86830135898111156138f95760008081fd5b6139078f89838701016137d2565b8252506040838101358883015291909201359082015283529183019183016138af565b509650508601359250508082111561394157600080fd5b5061394e858286016137d2565b9150509250929050565b6000806040838503121561396b57600080fd5b8235613976816135c1565b91506020830135613986816135c1565b809150509250929050565b6000602082840312156139a357600080fd5b813567ffffffffffffffff8111156139ba57600080fd5b8201601f810184136139cb57600080fd5b61096484823560208401613695565b6000602082840312156139ec57600080fd5b8135610feb816135c1565b60008060408385031215613a0a57600080fd5b50508035926020909101359150565b600060208284031215613a2b57600080fd5b813567ffffffffffffffff811115613a4257600080fd5b610964848285016137d2565b60008060408385031215613a6157600080fd5b8235613a6c816135c1565b91506020830135801515811461398657600080fd5b60008060408385031215613a9457600080fd5b823567ffffffffffffffff80821115613aac57600080fd5b613ab8868387016137d2565b9350602091508185013581811115613acf57600080fd5b8501601f81018713613ae057600080fd5b8035613aee6137f3826137ae565b81815260059190911b82018401908481019089831115613b0d57600080fd5b8584015b83811015613b7857803586811115613b295760008081fd5b8501808c03601f1901881315613b3f5760008081fd5b613b47613641565b8882013588811115613b595760008081fd5b613b678e8b838601016137d2565b825250845250918601918601613b11565b508096505050505050509250929050565b60008060008060808587031215613b9f57600080fd5b84359350602085013567ffffffffffffffff811115613bbd57600080fd5b613bc9878288016137d2565b949794965050505060408301359260600135919050565b600181811c90821680613bf457607f821691505b60208210811415613c1557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613cac57613cac613c82565b5060010190565b60008219821115613cc657613cc6613c82565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613d1257600080fd5b8151610feb816135c1565b60008351613d2f81846020880161353d565b835190830190613d4381836020880161353d565b01949350505050565b600082821015613d5e57613d5e613c82565b500390565b634e487b7160e01b600052603160045260246000fd5b600081613d8857613d88613c82565b506000190190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082613e0057613e00613ddb565b500490565b6000816000190483118215151615613e1f57613e1f613c82565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613e8557613e85613ddb565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ebd90830184613569565b9695505050505050565b600060208284031215613ed957600080fd5b8151610feb8161350a56fea2646970667358221220e990947a07c1b47e9a32bcf060fd0213b9b033fe1cfcc16e4edfc8e70cc9d95964736f6c634300080c0033

Deployed Bytecode Sourcemap

57718:10473:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45213:257;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;45213:257:0;;;;;;;;66509:93;;;:::i;:::-;;;;;;;:::i;33213:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;33213:221:0;1528:203:1;32725:422:0;;;;;;:::i;:::-;;:::i;:::-;;68033:155;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;4490:33:1;;;4472:52;;4460:2;4445:18;68033:155:0;4328:202:1;58192:19:0;;;;;;;;;4681:25:1;;;4669:2;4654:18;58192:19:0;4535:177:1;45897:113:0;45985:10;:17;45897:113;;33963:339;;;;;;:::i;:::-;;:::i;59565:372::-;;;;;;:::i;:::-;;:::i;45554:267::-;;;;;;:::i;:::-;;:::i;58468:36::-;;;;;;34373:185;;;;;;:::i;:::-;;:::i;58685:26::-;;;;;;57972:29;;;;;-1:-1:-1;;;;;57972:29:0;;;59051:509;;;;;;:::i;:::-;;:::i;63535:719::-;;;:::i;46087:244::-;;;;;;:::i;:::-;;:::i;66325:83::-;;;;;;:::i;:::-;;:::i;65975:163::-;;;;;;:::i;:::-;;:::i;66239:81::-;;;;;;:::i;:::-;;:::i;31337:239::-;;;;;;:::i;:::-;;:::i;58508:36::-;;;;;;65830:140;;;;;;:::i;:::-;65893:7;65920:11;;;:4;:11;;;;;:30;;65830:140;58717:21;;;:::i;31067:208::-;;;;;;:::i;:::-;;:::i;53498:103::-;;;:::i;67719:90::-;;;;;;:::i;:::-;;:::i;65656:169::-;;;;;;:::i;:::-;;:::i;58430:32::-;;;;;;67814:76;;;;;;:::i;:::-;;:::i;52847:87::-;52920:6;;-1:-1:-1;;;;;52920:6:0;52847:87;;66709:242;;;;;;:::i;:::-;;:::i;66607:97::-;;;:::i;33506:155::-;;;;;;:::i;:::-;;:::i;66956:114::-;;;;;;:::i;:::-;;:::i;34629:328::-;;;;;;:::i;:::-;;:::i;58597:39::-;;;;;;58325:44;;;;;;:::i;:::-;;;;;;;;;;;;;;66413:91;;;;;;:::i;:::-;;:::i;31987:334::-;;;;;;:::i;:::-;;:::i;58551:39::-;;;;;;67384:330;;;;;;:::i;:::-;;:::i;58005:31::-;;;;;-1:-1:-1;;;;;58005:31:0;;;61952:1578;;;;;;:::i;:::-;;:::i;58250:35::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;12611:25:1;;;12667:2;12652:18;;12645:34;;;;12584:18;58250:35:0;12437:248:1;33732:164:0;;;;;;:::i;:::-;-1:-1:-1;;;;;33853:25:0;;;33829:4;33853:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33732:164;53756:201;;;;;;:::i;:::-;;:::i;67075:303::-;;;;;;:::i;:::-;;:::i;58640:38::-;;;;;;58376:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45213:257;45337:4;-1:-1:-1;;;;;;45361:61:0;;-1:-1:-1;;;45361:61:0;;:101;;;45426:36;45450:11;45426:23;:36::i;:::-;45354:108;45213:257;-1:-1:-1;;45213:257:0:o;66509:93::-;66563:13;66590:7;66583:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66509:93;:::o;33213:221::-;33289:7;36556:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36556:16:0;33309:73;;;;-1:-1:-1;;;33309:73:0;;13835:2:1;33309:73:0;;;13817:21:1;13874:2;13854:18;;;13847:30;13913:34;13893:18;;;13886:62;-1:-1:-1;;;13964:18:1;;;13957:42;14016:19;;33309:73:0;;;;;;;;;-1:-1:-1;33402:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33402:24:0;;33213:221::o;32725:422::-;32806:13;32822:34;32848:7;32822:25;:34::i;:::-;32806:50;;32881:5;-1:-1:-1;;;;;32875:11:0;:2;-1:-1:-1;;;;;32875:11:0;;;32867:57;;;;-1:-1:-1;;;32867:57:0;;14248:2:1;32867:57:0;;;14230:21:1;14287:2;14267:18;;;14260:30;14326:34;14306:18;;;14299:62;-1:-1:-1;;;14377:18:1;;;14370:31;14418:19;;32867:57:0;14046:397:1;32867:57:0;28695:10;-1:-1:-1;;;;;32959:21:0;;;;:62;;-1:-1:-1;32984:37:0;33001:5;28695:10;33732:164;:::i;32984:37::-;32937:168;;;;-1:-1:-1;;;32937:168:0;;14650:2:1;32937:168:0;;;14632:21:1;14689:2;14669:18;;;14662:30;14728:34;14708:18;;;14701:62;14799:26;14779:18;;;14772:54;14843:19;;32937:168:0;14448:420:1;32937:168:0;33118:21;33127:2;33131:7;33118:8;:21::i;:::-;32795:352;32725:422;;:::o;68033:155::-;-1:-1:-1;;;68033:155:0;;;;;;;:::o;33963:339::-;34158:41;28695:10;34191:7;34158:18;:41::i;:::-;34150:103;;;;-1:-1:-1;;;34150:103:0;;;;;;;:::i;:::-;34266:28;34276:4;34282:2;34286:7;34266:9;:28::i;59565:372::-;56294:1;57069:7;;:19;;57061:63;;;;-1:-1:-1;;;57061:63:0;;15493:2:1;57061:63:0;;;15475:21:1;15532:2;15512:18;;;15505:30;15571:33;15551:18;;;15544:61;15622:18;;57061:63:0;15291:355:1;57061:63:0;56294:1;57202:7;:18;59683:14;;59723:12;;59710:25;::::1;59702:34;;;::::0;::::1;;59748:9;59743:190;59767:5;:12;59763:1;:16;59743:190;;;59796:7;59804:1;59796:10;;;;;;;;:::i;:::-;;;;;;;59810:1;59796:15;59792:136;;;59820:34;59832:5;59838:1;59832:8;;;;;;;;:::i;:::-;;;;;;;:20;;;59820:10;:34::i;:::-;59792:136;;;59878:43;59888:7;59896:1;59888:10;;;;;;;;:::i;:::-;;;;;;;59900:5;59906:1;59900:8;;;;;;;;:::i;:::-;;;;;;;:20;;;59878:9;:43::i;:::-;59781:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59743:190;;;-1:-1:-1::0;;56250:1:0;57381:22;;-1:-1:-1;;59565:372:0:o;45554:267::-;45651:7;45687:34;45715:5;45687:27;:34::i;:::-;45679:5;:42;45671:98;;;;-1:-1:-1;;;45671:98:0;;16257:2:1;45671:98:0;;;16239:21:1;16296:2;16276:18;;;16269:30;16335:34;16315:18;;;16308:62;-1:-1:-1;;;16386:18:1;;;16379:41;16437:19;;45671:98:0;16055:407:1;45671:98:0;-1:-1:-1;;;;;;45787:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;45554:267::o;34373:185::-;34511:39;34528:4;34534:2;34538:7;34511:39;;;;;;;;;;;;:16;:39::i;59051:509::-;25725:13;;;;;;;:48;;25761:12;;;;25760:13;25725:48;;;26528:4;17495:19;:23;25741:16;25717:107;;;;-1:-1:-1;;;25717:107:0;;16669:2:1;25717:107:0;;;16651:21:1;16708:2;16688:18;;;16681:30;16747:34;16727:18;;;16720:62;-1:-1:-1;;;16798:18:1;;;16791:44;16852:19;;25717:107:0;16467:410:1;25717:107:0;25837:19;25860:13;;;;;;25859:14;25884:101;;;;25919:13;:20;;-1:-1:-1;;25954:19:0;;;;;25884:101;59132:52:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;59132:52:0::1;;::::0;:13:::1;:52::i;:::-;59189:16;:14;:16::i;:::-;59212:3;:30:::0;;-1:-1:-1;;;;;59212:30:0;;::::1;-1:-1:-1::0;;;;;;59212:30:0;;::::1;;::::0;;;59247:12:::1;:41:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;59309:2:::1;59295:11;:16:::0;59344:2:::1;59324:17;:22:::0;;;59353:21:::1;:26:::0;;;59384:21:::1;:26:::0;;;59421:24:::1;:29:::0;59488:2:::1;59461:24;:29:::0;59527:2:::1;59501:23;:28:::0;59543:12:::1;59536:4;:19:::0;26011:68;;;;26062:5;26046:21;;-1:-1:-1;;26046:21:0;;;25432:654;59051:509;;:::o;63535:719::-;56294:1;57069:7;;:19;;57061:63;;;;-1:-1:-1;;;57061:63:0;;15493:2:1;57061:63:0;;;15475:21:1;15532:2;15512:18;;;15505:30;15571:33;15551:18;;;15544:61;15622:18;;57061:63:0;15291:355:1;57061:63:0;56294:1;57202:7;:18;63579::::1;63600:21;63610:10;63600:9;:21::i;:::-;63579:42:::0;-1:-1:-1;63626:20:0::1;63670:15;63626:20:::0;63695:456:::1;63719:10;63715:1;:14;63695:456;;;63741:13;63757:34;63777:10;63789:1;63757:19;:34::i;:::-;63741:50;;63797:18;63818:28;63840:5;63818:21;:28::i;:::-;63797:49;;63884:10;63852:4;:11;63857:5;63852:11;;;;;;;;;;;:28;;;:42;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;63906:11:0::1;::::0;;;:4:::1;:11;::::0;;;;:28:::1;;::::0;:33;63902:244:::1;;63963:11;::::0;;;:4:::1;:11;::::0;;;;:28:::1;;::::0;63947:44:::1;::::0;;::::1;:::i;:::-;64030:11;::::0;;;:4:::1;:11;::::0;;;;;;;;:28:::1;;::::0;64003:56;;12611:25:1;;;12652:18;;;12645:34;63947:44:0;;-1:-1:-1;64011:10:0::1;::::0;64003:56:::1;::::0;12584:18:1;64003:56:0::1;;;;;;;64097:1;64066:11:::0;;;:4:::1;:11;::::0;;;;:28:::1;::::0;::::1;:32:::0;;;;64105:27:::1;;:34:::0;;;63902:244:::1;63735:416;;63731:3;;;;;:::i;:::-;;;;63695:456;;;-1:-1:-1::0;64163:17:0;64155:46:::1;;;::::0;-1:-1:-1;;;64155:46:0;;17217:2:1;64155:46:0::1;::::0;::::1;17199:21:1::0;17256:2;17236:18;;;17229:30;-1:-1:-1;;;17275:18:1;;;17268:46;17331:18;;64155:46:0::1;17015:340:1::0;64155:46:0::1;64206:12;::::0;:43:::1;::::0;-1:-1:-1;;;64206:43:0;;64224:10:::1;64206:43;::::0;::::1;17534:51:1::0;17601:18;;;17594:34;;;-1:-1:-1;;;;;64206:12:0;;::::1;::::0;:17:::1;::::0;17507:18:1;;64206:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56250:1:0;57381:22;;-1:-1:-1;;;;;63535:719:0:o;46087:244::-;46162:7;46198:41;45985:10;:17;;45897:113;46198:41;46190:5;:49;46182:106;;;;-1:-1:-1;;;46182:106:0;;17841:2:1;46182:106:0;;;17823:21:1;17880:2;17860:18;;;17853:30;17919:34;17899:18;;;17892:62;-1:-1:-1;;;17970:18:1;;;17963:42;18022:19;;46182:106:0;17639:408:1;46182:106:0;46306:10;46317:5;46306:17;;;;;;;;:::i;:::-;;;;;;;;;46299:24;;46087:244;;;:::o;66325:83::-;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;66388:15;;::::1;::::0;:7:::1;::::0;:15:::1;::::0;::::1;::::0;::::1;:::i;:::-;;66325:83:::0;:::o;65975:163::-;66056:7;66070:14;66087:28;66109:5;66087:21;:28::i;:::-;66070:45;65975:163;-1:-1:-1;;;65975:163:0:o;66239:81::-;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;66301:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;31337:239::-:0;31409:7;31445:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31445:16:0;31480:19;31472:73;;;;-1:-1:-1;;;31472:73:0;;18615:2:1;31472:73:0;;;18597:21:1;18654:2;18634:18;;;18627:30;18693:34;18673:18;;;18666:62;-1:-1:-1;;;18744:18:1;;;18737:39;18793:19;;31472:73:0;18413:405:1;58717:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31067:208::-;31139:7;-1:-1:-1;;;;;31167:19:0;;31159:74;;;;-1:-1:-1;;;31159:74:0;;19025:2:1;31159:74:0;;;19007:21:1;19064:2;19044:18;;;19037:30;19103:34;19083:18;;;19076:62;-1:-1:-1;;;19154:18:1;;;19147:40;19204:19;;31159:74:0;18823:406:1;31159:74:0;-1:-1:-1;;;;;;31251:16:0;;;;;:9;:16;;;;;;;31067:208::o;53498:103::-;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;53563:30:::1;53590:1;53563:18;:30::i;:::-;53498:103::o:0;67719:90::-;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;67785:11:::1;:19:::0;67719:90::o;65656:169::-;65738:7;65769:12;;;:4;:12;;;;;:32;;65738:7;;65769:12;65794:6;;65769:32;;;;;;:::i;:::-;;;;;;;;;;;;65656:169;-1:-1:-1;;;;65656:169:0:o;67814:76::-;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;67873:4:::1;:12:::0;67814:76::o;66709:242::-;66780:9;66775:172;66799:7;:14;66795:1;:18;66775:172;;;66856:3;;66868:10;;-1:-1:-1;;;;;66856:3:0;;;;:11;;66868:7;;66876:1;;66868:10;;;;;;:::i;:::-;;;;;;;66856:23;;;;;;;;;;;;;4681:25:1;;4669:2;4654:18;;4535:177;66856:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;66842:37:0;:10;-1:-1:-1;;;;;66842:37:0;;66834:66;;;;-1:-1:-1;;;66834:66:0;;19692:2:1;66834:66:0;;;19674:21:1;19731:2;19711:18;;;19704:30;-1:-1:-1;;;19750:18:1;;;19743:46;19806:18;;66834:66:0;19490:340:1;66834:66:0;66937:4;66906:16;:28;66923:7;66931:1;66923:10;;;;;;;;:::i;:::-;;;;;;;66906:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;66815:3;;;;;:::i;:::-;;;;66775:172;;66607:97;66663:13;66690:9;66683:16;;;;;:::i;33506:155::-;33601:52;28695:10;33634:8;33644;33601:18;:52::i;66956:114::-;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;67037:19:::1;::::0;;;:9:::1;:19;::::0;;;;;:28;66956:114::o;34629:328::-;34804:41;28695:10;34837:7;34804:18;:41::i;:::-;34796:103;;;;-1:-1:-1;;;34796:103:0;;;;;;;:::i;:::-;34910:39;34924:4;34930:2;34934:7;34943:5;34910:13;:39::i;:::-;34629:328;;;;:::o;66413:91::-;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;66480:19;;::::1;::::0;:9:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;31987:334::-:0;36532:4;36556:16;;;:7;:16;;;;;;32060:13;;-1:-1:-1;;;;;36556:16:0;32086:76;;;;-1:-1:-1;;;32086:76:0;;20037:2:1;32086:76:0;;;20019:21:1;20076:2;20056:18;;;20049:30;20115:34;20095:18;;;20088:62;-1:-1:-1;;;20166:18:1;;;20159:45;20221:19;;32086:76:0;19835:411:1;32086:76:0;32175:21;32199:10;:8;:10::i;:::-;32175:34;;32251:1;32233:7;32227:21;:25;:86;;;;;;;;;;;;;;;;;32279:7;32288:18;:7;:16;:18::i;:::-;32262:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32220:93;31987:334;-1:-1:-1;;;31987:334:0:o;67384:330::-;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;67490:5:::1;67496:1;67490:8;;;;;;;;:::i;:::-;;;;;;;67470:17;:28;;;;67527:5;67533:1;67527:8;;;;;;;;:::i;:::-;;;;;;;67503:21;:32;;;;67564:5;67570:1;67564:8;;;;;;;;:::i;:::-;;;;;;;67540:21;:32;;;;67610:5;67616:1;67610:8;;;;;;;;:::i;:::-;;;;;;;67583:24;:35;;;;67656:5;67662:1;67656:8;;;;;;;;:::i;:::-;;;;;;;67629:24;:35;;;;67701:5;67707:1;67701:8;;;;;;;;:::i;:::-;;;;;;;67675:23;:34;;;;67384:330:::0;:::o;61952:1578::-;62073:14;;62113:19;;62100:32;;62092:41;;;;;;62145:9;62140:1362;62164:9;62160:1;:13;62140:1362;;;62186:14;62203:7;62211:1;62203:10;;;;;;;;:::i;:::-;;;;;;;62186:27;;62241:15;62249:6;62241:7;:15::i;:::-;-1:-1:-1;;;;;62227:29:0;:10;-1:-1:-1;;;;;62227:29:0;;62219:55;;;;-1:-1:-1;;;62219:55:0;;20928:2:1;62219:55:0;;;20910:21:1;20967:2;20947:18;;;20940:30;-1:-1:-1;;;20986:18:1;;;20979:43;21039:18;;62219:55:0;20726:337:1;62219:55:0;62288:12;62301:1;62288:15;;;;;;;;:::i;:::-;;;;;;;:19;;;:26;62318:1;62288:31;;62280:62;;;;-1:-1:-1;;;62280:62:0;;21270:2:1;62280:62:0;;;21252:21:1;21309:2;21289:18;;;21282:30;-1:-1:-1;;;21328:18:1;;;21321:48;21386:18;;62280:62:0;21068:342:1;62280:62:0;62350:18;62371:29;62393:6;62371:21;:29::i;:::-;62350:50;;62439:10;62406:4;:12;62411:6;62406:12;;;;;;;;;;;:29;;;:43;;;;;;;:::i;:::-;;;;;;;;62457:22;62482:12;62495:1;62482:15;;;;;;;;:::i;:::-;;;;;;;:19;;;:26;62457:51;;62518:14;62536:1;62518:19;62514:691;;62546:14;62563:12;;;:4;:12;;;;;:31;62609:24;;;;62601:56;;;;-1:-1:-1;;;62601:56:0;;21617:2:1;62601:56:0;;;21599:21:1;21656:2;21636:18;;;21629:30;-1:-1:-1;;;21675:18:1;;;21668:49;21734:18;;62601:56:0;21415:343:1;62601:56:0;62669:9;62664:535;62688:14;62684:1;:18;62664:535;;;62762:6;62725:9;:33;62735:12;62748:1;62735:15;;;;;;;;:::i;:::-;;;;;;;:19;;;62755:1;62735:22;;;;;;;;:::i;:::-;;;;;;;62725:33;;;;;;;;;;;;:43;62717:80;;;;-1:-1:-1;;;62717:80:0;;21965:2:1;62717:80:0;;;21947:21:1;22004:2;21984:18;;;21977:30;22043:26;22023:18;;;22016:54;22087:18;;62717:80:0;21763:348:1;62717:80:0;62810:9;62805:385;62829:6;62825:1;:10;62805:385;;;62880:12;;;;:4;:12;;;;;:27;;62905:1;;62880:27;;;;;;:::i;:::-;;;;;;;;;62854:12;62867:1;62854:15;;;;;;;;:::i;:::-;;;;;;;:19;;;62874:1;62854:22;;;;;;;;:::i;:::-;;;;;;;:53;62850:332;;;62949:12;;;;:4;:12;;;;;62974:8;62981:1;62974:6;:8;:::i;:::-;62949:34;;;;;;;;:::i;:::-;;;;;;;;;62919:4;:12;62924:6;62919:12;;;;;;;;;;;:24;;62944:1;62919:27;;;;;;;;:::i;:::-;;;;;;;;;;;;:64;;;;62993:12;;;:4;:12;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;63033:8;;;;;:::i;:::-;;;;63058:9;:33;63068:12;63081:1;63068:15;;;;;;;;:::i;:::-;;;;;;;:19;;;63088:1;63068:22;;;;;;;;:::i;:::-;;;;;;;63058:33;;;;;;;;;;;63051:40;;;63101:3;;;;;;;;;-1:-1:-1;;;;;63101:3:0;-1:-1:-1;;;;;63101:20:0;;63130:4;63137:10;63149:12;63162:1;63149:15;;;;;;;;:::i;:::-;;;;;;;:19;;;63169:1;63149:22;;;;;;;;:::i;:::-;;;;;;;;;;;63101:71;;-1:-1:-1;;;;;;63101:71:0;;;;;;;-1:-1:-1;;;;;22777:15:1;;;63101:71:0;;;22759:34:1;22829:15;;;;22809:18;;;22802:43;22861:18;;;22854:34;22694:18;;63101:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62850:332;62837:3;;;;:::i;:::-;;;;62805:385;;;-1:-1:-1;62704:3:0;;;;:::i;:::-;;;;62664:535;;;;62539:666;62514:691;63216:12;;;;:4;:12;;;;;:31;63212:285;;63297:1;63265:12;;;:4;:12;;;;;:29;;;:33;63261:114;;63307:12;;;63337;;;:4;:12;;;;;;;63307;63337:29;;63307:60;;-1:-1:-1;;;63307:60:0;;63325:10;63307:60;;;17534:51:1;17601:18;;;17594:34;;;;-1:-1:-1;;;;;63307:12:0;;;;:17;;17507:18:1;;63307:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63261:114;63388:12;;;;:4;:12;;;;;;63381:19;63388:12;;63381:19;:::i;:::-;-1:-1:-1;63381:19:0;;;;;;;;;;;;63407:13;63413:6;63407:5;:13::i;:::-;63212:285;;;63444:12;;;;:4;:12;;;;;63475:15;63444:28;;;;:46;63212:285;62180:1322;;;62175:3;;;;;:::i;:::-;;;;62140:1362;;53756:201;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53845:22:0;::::1;53837:73;;;::::0;-1:-1:-1;;;53837:73:0;;23101:2:1;53837:73:0::1;::::0;::::1;23083:21:1::0;23140:2;23120:18;;;23113:30;23179:34;23159:18;;;23152:62;-1:-1:-1;;;23230:18:1;;;23223:36;23276:19;;53837:73:0::1;22899:402:1::0;53837:73:0::1;53921:28;53940:8;53921:18;:28::i;:::-;53756:201:::0;:::o;67075:303::-;52920:6;;-1:-1:-1;;;;;52920:6:0;28695:10;53067:23;53059:68;;;;-1:-1:-1;;;53059:68:0;;;;;;;:::i;:::-;67233:12:::1;::::0;;;:4:::1;:12;::::0;;;;;;;:34;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;67272:12:0::1;::::0;;;:4:::1;:12;::::0;;;;;:29:::1;::::0;::::1;:49:::0;;;;67326:28:::1;;:47:::0;;;;-1:-1:-1;67075:303:0:o;30654:349::-;30778:4;-1:-1:-1;;;;;;30815:51:0;;-1:-1:-1;;;30815:51:0;;:127;;-1:-1:-1;;;;;;;30883:59:0;;-1:-1:-1;;;30883:59:0;30815:127;:180;;;-1:-1:-1;;;;;;;;;;27537:51:0;;;30959:36;27428:168;40646:185;40721:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40721:29:0;-1:-1:-1;;;;;40721:29:0;;;;;;;;:24;;40775:34;40721:24;40775:25;:34::i;:::-;-1:-1:-1;;;;;40766:57:0;;;;;;;;;;;40646:185;;:::o;36761:359::-;36854:4;36556:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36556:16:0;36871:73;;;;-1:-1:-1;;;36871:73:0;;23508:2:1;36871:73:0;;;23490:21:1;23547:2;23527:18;;;23520:30;23586:34;23566:18;;;23559:62;-1:-1:-1;;;23637:18:1;;;23630:42;23689:19;;36871:73:0;23306:408:1;36871:73:0;36955:13;36971:34;36997:7;36971:25;:34::i;:::-;36955:50;;37035:5;-1:-1:-1;;;;;37024:16:0;:7;-1:-1:-1;;;;;37024:16:0;;:51;;;;37068:7;-1:-1:-1;;;;;37044:31:0;:20;37056:7;37044:11;:20::i;:::-;-1:-1:-1;;;;;37044:31:0;;37024:51;:87;;;-1:-1:-1;;;;;;33853:25:0;;;33829:4;33853:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37079:32;33732:164;39892:636;40062:4;-1:-1:-1;;;;;40024:42:0;:34;40050:7;40024:25;:34::i;:::-;-1:-1:-1;;;;;40024:42:0;;40016:92;;;;-1:-1:-1;;;40016:92:0;;23921:2:1;40016:92:0;;;23903:21:1;23960:2;23940:18;;;23933:30;23999:34;23979:18;;;23972:62;-1:-1:-1;;;24050:18:1;;;24043:35;24095:19;;40016:92:0;23719:401:1;40016:92:0;-1:-1:-1;;;;;40127:16:0;;40119:65;;;;-1:-1:-1;;;40119:65:0;;24327:2:1;40119:65:0;;;24309:21:1;24366:2;24346:18;;;24339:30;24405:34;24385:18;;;24378:62;-1:-1:-1;;;24456:18:1;;;24449:34;24500:19;;40119:65:0;24125:400:1;40119:65:0;40197:39;40218:4;40224:2;40228:7;40197:20;:39::i;:::-;40301:29;40318:1;40322:7;40301:8;:29::i;:::-;-1:-1:-1;;;;;40343:15:0;;;;;;:9;:15;;;;;:20;;40362:1;;40343:15;:20;;40362:1;;40343:20;:::i;:::-;;;;-1:-1:-1;;;;;;;40374:13:0;;;;;;:9;:13;;;;;:18;;40391:1;;40374:13;:18;;40391:1;;40374:18;:::i;:::-;;;;-1:-1:-1;;40403:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40403:21:0;-1:-1:-1;;;;;40403:21:0;;;;;;;;;40442:27;;40403:16;;40442:27;;;;;;;32795:352;32725:422;;:::o;59942:916::-;60039:19;;60094:1;60071:24;;;60063:58;;;;-1:-1:-1;;;60063:58:0;;24732:2:1;60063:58:0;;;24714:21:1;24771:2;24751:18;;;24744:30;-1:-1:-1;;;24790:18:1;;;24783:51;24851:18;;60063:58:0;24530:345:1;60063:58:0;60130:18;:6;5823:19;;5841:1;5823:19;;;5734:127;60130:18;60153:13;60169:16;:6;5704:14;;5612:114;60169:16;60153:32;-1:-1:-1;60198:18:0;;60194:419;;60228:9;60223:385;60247:14;60243:1;:18;60223:385;;;60297:3;;60309:15;;-1:-1:-1;;;;;60297:3:0;;;;:11;;60309:12;;60322:1;;60309:15;;;;;;:::i;:::-;;;;;;;60297:28;;;;;;;;;;;;;4681:25:1;;4669:2;4654:18;;4535:177;60297:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;60283:42:0;:10;-1:-1:-1;;;;;60283:42:0;;60275:71;;;;-1:-1:-1;;;60275:71:0;;19692:2:1;60275:71:0;;;19674:21:1;19731:2;19711:18;;;19704:30;-1:-1:-1;;;19750:18:1;;;19743:46;19806:18;;60275:71:0;19490:340:1;60275:71:0;60361:9;:26;60371:12;60384:1;60371:15;;;;;;;;:::i;:::-;;;;;;;60361:26;;;;;;;;;;;;60391:1;60361:31;60353:62;;;;-1:-1:-1;;;60353:62:0;;25082:2:1;60353:62:0;;;25064:21:1;25121:2;25101:18;;;25094:30;-1:-1:-1;;;25140:18:1;;;25133:48;25198:18;;60353:62:0;24880:342:1;60353:62:0;60430:16;:33;60447:12;60460:1;60447:15;;;;;;;;:::i;:::-;;;;;;;;;;;;60430:33;;;;;;;;;;-1:-1:-1;60430:33:0;;;;60422:65;;;;-1:-1:-1;;;60422:65:0;;25429:2:1;60422:65:0;;;25411:21:1;25468:2;25448:18;;;25441:30;-1:-1:-1;;;25487:18:1;;;25480:49;25546:18;;60422:65:0;25227:343:1;60422:65:0;60525:5;60496:9;:26;60506:12;60519:1;60506:15;;;;;;;;:::i;:::-;;;;;;;60496:26;;;;;;;;;;;:34;;;;60537:3;;;;;;;;;-1:-1:-1;;;;;60537:3:0;-1:-1:-1;;;;;60537:20:0;;60558:10;60578:4;60585:12;60598:1;60585:15;;;;;;;;:::i;:::-;;;;;;;;;;;60537:64;;-1:-1:-1;;;;;;60537:64:0;;;;;;;-1:-1:-1;;;;;22777:15:1;;;60537:64:0;;;22759:34:1;22829:15;;;;22809:18;;;22802:43;22861:18;;;22854:34;22694:18;;60537:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60263:3;;;;;:::i;:::-;;;;60223:385;;;;60194:419;60670:93;;;;;;;;;;;60621:12;60670:93;;;;;;;60636:15;60670:93;;;;;;60656:11;;;:4;:11;;;;;;:107;;;;:11;;:107;;:11;;:107;;;;;:::i;:::-;-1:-1:-1;60656:107:0;;;;;;;;;;;;;;;;;;60772:28;60782:10;60794:5;60772:9;:28::i;:::-;60810:25;;4681::1;;;60817:10:0;;60810:25;;4669:2:1;4654:18;60810:25:0;;;;;;;60009:849;;;59942:916;:::o;60863:1084::-;60979:15;60987:6;60979:7;:15::i;:::-;-1:-1:-1;;;;;60965:29:0;:10;-1:-1:-1;;;;;60965:29:0;;60957:55;;;;-1:-1:-1;;;60957:55:0;;20928:2:1;60957:55:0;;;20910:21:1;20967:2;20947:18;;;20940:30;-1:-1:-1;;;20986:18:1;;;20979:43;21039:18;;60957:55:0;20726:337:1;60957:55:0;61019:23;61045:12;;;:4;:12;;;;;:31;61101:19;;61170:1;61138:27;61101:19;61045:31;61138:27;:::i;:::-;61137:34;;61129:73;;;;-1:-1:-1;;;61129:73:0;;25777:2:1;61129:73:0;;;25759:21:1;25816:2;25796:18;;;25789:30;25855:28;25835:18;;;25828:56;25901:18;;61129:73:0;25575:350:1;61129:73:0;61211:18;61232:29;61254:6;61232:21;:29::i;:::-;61211:50;;61299:10;61266:4;:12;61271:6;61266:12;;;;;;;;;;;:29;;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;61322:13:0;;61318:528;;61349:9;61344:497;61368:9;61364:1;:13;61344:497;;;61399:30;61413:12;61426:1;61413:15;;;;;;;;:::i;:::-;;;;;;;61399:13;:30::i;:::-;61391:60;;;;-1:-1:-1;;;61391:60:0;;26132:2:1;61391:60:0;;;26114:21:1;26171:2;26151:18;;;26144:30;-1:-1:-1;;;26190:18:1;;;26183:47;26247:18;;61391:60:0;25930:341:1;61391:60:0;61466:9;:26;61476:12;61489:1;61476:15;;;;;;;;:::i;:::-;;;;;;;61466:26;;;;;;;;;;;;61496:1;61466:31;61458:62;;;;-1:-1:-1;;;61458:62:0;;25082:2:1;61458:62:0;;;25064:21:1;25121:2;25101:18;;;25094:30;-1:-1:-1;;;25140:18:1;;;25133:48;25198:18;;61458:62:0;24880:342:1;61458:62:0;61549:3;;61561:15;;-1:-1:-1;;;;;61549:3:0;;;;:11;;61561:12;;61574:1;;61561:15;;;;;;:::i;:::-;;;;;;;61549:28;;;;;;;;;;;;;4681:25:1;;4669:2;4654:18;;4535:177;61549:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61535:42:0;:10;-1:-1:-1;;;;;61535:42:0;;61527:68;;;;-1:-1:-1;;;61527:68:0;;26478:2:1;61527:68:0;;;26460:21:1;26517:2;26497:18;;;26490:30;-1:-1:-1;;;26536:18:1;;;26529:43;26589:18;;61527:68:0;26276:337:1;61527:68:0;61610:16;:33;61627:12;61640:1;61627:15;;;;;;;;:::i;:::-;;;;;;;;;;;;61610:33;;;;;;;;;;-1:-1:-1;61610:33:0;;;;61602:61;;;;-1:-1:-1;;;61602:61:0;;26820:2:1;61602:61:0;;;26802:21:1;26859:2;26839:18;;;26832:30;-1:-1:-1;;;26878:18:1;;;26871:45;26933:18;;61602:61:0;26618:339:1;61602:61:0;61675:12;;;;:4;:12;;;;;61705:15;;:12;;61718:1;;61705:15;;;;;;:::i;:::-;;;;;;;;;;;;61675:46;;;;;;;-1:-1:-1;61675:46:0;;;;;;;;;;61738:15;;61757:6;;61728:9;;61738:12;;61751:1;;61738:15;;;;;;:::i;:::-;;;;;;;61728:26;;;;;;;;;;;:35;;;;61770:3;;;;;;;;;-1:-1:-1;;;;;61770:3:0;-1:-1:-1;;;;;61770:20:0;;61791:10;61811:4;61818:12;61831:1;61818:15;;;;;;;;:::i;:::-;;;;;;;;;;;61770:64;;-1:-1:-1;;;;;;61770:64:0;;;;;;;-1:-1:-1;;;;;22777:15:1;;;61770:64:0;;;22759:34:1;22829:15;;;;22809:18;;;22802:43;22861:18;;;22854:34;22694:18;;61770:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61379:3;;;;;:::i;:::-;;;;61344:497;;;;61318:528;61856:12;;;;:4;:12;;;;;;;61887:15;61856:28;;;;:46;61912:30;61923:10;;61912:30;;;;61861:6;4681:25:1;;4669:2;4654:18;;4535:177;61912:30:0;;;;;;;;60948:999;;;60863:1084;;:::o;30260:151::-;26328:13;;;;;;;26320:69;;;;-1:-1:-1;;;26320:69:0;;;;;;;:::i;:::-;30364:39:::1;30388:5;30395:7;30364:23;:39::i;52548:97::-:0;26328:13;;;;;;;26320:69;;;;-1:-1:-1;;;26320:69:0;;;;;;;:::i;:::-;52611:26:::1;:24;:26::i;64259:1392::-:0;64416:4;;64329:7;64384:12;;;:4;:12;;;;;:28;;;64329:7;;;;64366:46;;:15;:46;:::i;:::-;64365:55;;;;:::i;:::-;64347:74;;64432:18;64453:21;64463:10;64453:9;:21::i;:::-;64432:42;;64479:19;64512:9;64507:153;64531:10;64527:1;:14;64507:153;;;64553:13;64569:34;64589:10;64601:1;64569:19;:34::i;:::-;64624:11;;;;:4;:11;;;;;:30;64553:50;;-1:-1:-1;64609:45:0;;;;:::i;:::-;;;64547:113;64543:3;;;;;:::i;:::-;;;;64507:153;;;-1:-1:-1;64670:11:0;;;:31;;-1:-1:-1;64685:16:0;;64670:31;64666:56;;;-1:-1:-1;64715:1:0;;64259:1392;-1:-1:-1;;;;64259:1392:0:o;64666:56::-;64728:13;64750:19;64786:9;64782:100;64805:12;;;;:4;:12;;;;;:31;64801:35;;64782:100;;;64865:11;;64850:26;;;;:::i;:::-;;-1:-1:-1;64838:3:0;;;;:::i;:::-;;;;64782:100;;;;64891:11;64906:1;64891:16;64888:738;;;64923:20;64937:6;64923:11;:20;:::i;:::-;:30;;64946:7;64923:30;:::i;:::-;64915:38;;64888:738;;;64971:11;64986:1;64971:16;64968:658;;;65064:17;;65029:21;;:31;;65053:7;65029:31;:::i;:::-;65004:20;65018:6;65004:11;:20;:::i;:::-;65003:58;;;;:::i;:::-;:78;;;;:::i;64968:658::-;65099:11;65114:1;65099:16;65096:530;;;65192:17;;65157:21;;:31;;65181:7;65157:31;:::i;65096:530::-;65233:11;65248:1;65233:16;65230:396;;;65329:17;;65291:24;;:34;;65318:7;65291:34;:::i;65230:396::-;65385:2;65370:11;:17;65367:259;;65466:17;;65429:23;;:33;;65455:7;65429:33;:::i;65367:259::-;65522:1;65507:11;:16;65504:122;;65603:17;;65565:24;;:34;;65592:7;65565:34;:::i;:::-;65540:20;65554:6;65540:11;:20;:::i;:::-;65539:61;;;;:::i;:::-;:81;;;;:::i;:::-;65531:89;;65504:122;-1:-1:-1;65639:5:0;64259:1392;-1:-1:-1;;;;;64259:1392:0:o;54117:191::-;54210:6;;;-1:-1:-1;;;;;54227:17:0;;;-1:-1:-1;;;;;;54227:17:0;;;;;;;54260:40;;54210:6;;;54227:17;54210:6;;54260:40;;54191:16;;54260:40;54180:128;54117:191;:::o;40973:315::-;41128:8;-1:-1:-1;;;;;41119:17:0;:5;-1:-1:-1;;;;;41119:17:0;;;41111:55;;;;-1:-1:-1;;;41111:55:0;;28006:2:1;41111:55:0;;;27988:21:1;28045:2;28025:18;;;28018:30;28084:27;28064:18;;;28057:55;28129:18;;41111:55:0;27804:349:1;41111:55:0;-1:-1:-1;;;;;41177:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41177:46:0;;;;;;;;;;41239:41;;540::1;;;41239::0;;513:18:1;41239:41:0;;;;;;;40973:315;;;:::o;35839:::-;35996:28;36006:4;36012:2;36016:7;35996:9;:28::i;:::-;36043:48;36066:4;36072:2;36076:7;36085:5;36043:22;:48::i;:::-;36035:111;;;;-1:-1:-1;;;36035:111:0;;;;;;;:::i;66143:91::-;66195:13;66222:7;66215:14;;;;;:::i;6444:723::-;6500:13;6721:10;6717:53;;-1:-1:-1;;6748:10:0;;;;;;;;;;;;-1:-1:-1;;;6748:10:0;;;;;6444:723::o;6717:53::-;6795:5;6780:12;6836:78;6843:9;;6836:78;;6869:8;;;;:::i;:::-;;-1:-1:-1;6892:10:0;;-1:-1:-1;6900:2:0;6892:10;;:::i;:::-;;;6836:78;;;6924:19;6956:6;6946:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6946:17:0;;6924:39;;6974:154;6981:10;;6974:154;;7008:11;7018:1;7008:11;;:::i;:::-;;-1:-1:-1;7077:10:0;7085:2;7077:5;:10;:::i;:::-;7064:24;;:2;:24;:::i;:::-;7051:39;;7034:6;7041;7034:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7034:56:0;;;;;;;;-1:-1:-1;7105:11:0;7114:2;7105:11;;:::i;:::-;;;6974:154;;39124:431;39184:13;39200:34;39226:7;39200:25;:34::i;:::-;39184:50;;39247:48;39268:5;39283:1;39287:7;39247:20;:48::i;:::-;39336:29;39353:1;39357:7;39336:8;:29::i;:::-;-1:-1:-1;;;;;39378:16:0;;;;;;:9;:16;;;;;:21;;39398:1;;39378:16;:21;;39398:1;;39378:21;:::i;:::-;;;;-1:-1:-1;;39417:16:0;;;;:7;:16;;;;;;39410:23;;-1:-1:-1;;;;;;39410:23:0;;;39451:36;39425:7;;39417:16;-1:-1:-1;;;;;39451:36:0;;;;;39417:16;;39451:36;66388:15:::1;66325:83:::0;:::o;46944:589::-;-1:-1:-1;;;;;47150:18:0;;47146:187;;47185:40;47217:7;48371:10;:17;;48344:24;;;;:15;:24;;;;;:44;;;48399:24;;;;;;;;;;;;48267:164;47185:40;47146:187;;;47255:2;-1:-1:-1;;;;;47247:10:0;:4;-1:-1:-1;;;;;47247:10:0;;47243:90;;47274:47;47307:4;47313:7;47274:32;:47::i;:::-;-1:-1:-1;;;;;47347:16:0;;47343:183;;47380:45;47417:7;47380:36;:45::i;47343:183::-;47453:4;-1:-1:-1;;;;;47447:10:0;:2;-1:-1:-1;;;;;47447:10:0;;47443:83;;47474:40;47502:2;47506:7;47474:27;:40::i;37462:110::-;37538:26;37548:2;37552:7;37538:26;;;;;;;;;;;;:9;:26::i;67895:133::-;67952:4;67963:12;67984:4;67979:2;:9;:24;;67998:5;67979:24;;;67991:4;67963:41;67895:133;-1:-1:-1;;;67895:133:0:o;30419:163::-;26328:13;;;;;;;26320:69;;;;-1:-1:-1;;;26320:69:0;;;;;;;:::i;:::-;30533:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;30557:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;52653:113::-:0;26328:13;;;;;;;26320:69;;;;-1:-1:-1;;;26320:69:0;;;;;;;:::i;:::-;52726:32:::1;28695:10:::0;52726:18:::1;:32::i;41853:821::-:0;42008:4;-1:-1:-1;;;;;42029:13:0;;17495:19;:23;42025:642;;42065:83;;-1:-1:-1;;;42065:83:0;;-1:-1:-1;;;;;42065:47:0;;;;;:83;;28695:10;;42127:4;;42133:7;;42142:5;;42065:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42065:83:0;;;;;;;;-1:-1:-1;;42065:83:0;;;;;;;;;;;;:::i;:::-;;;42061:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42329:13:0;;42325:272;;42372:60;;-1:-1:-1;;;42372:60:0;;;;;;;:::i;42325:272::-;42547:6;42541:13;42532:6;42528:2;42524:15;42517:38;42061:551;-1:-1:-1;;;;;;42199:62:0;-1:-1:-1;;;42199:62:0;;-1:-1:-1;42192:69:0;;42025:642;-1:-1:-1;42651:4:0;42644:11;;49058:999;49324:22;49385:1;49349:33;49377:4;49349:27;:33::i;:::-;:37;;;;:::i;:::-;49397:18;49418:26;;;:17;:26;;;;;;49324:62;;-1:-1:-1;49551:28:0;;;49547:328;;-1:-1:-1;;;;;49618:18:0;;49596:19;49618:18;;;:12;:18;;;;;;;;:34;;;;;;;;;49669:30;;;;;;:44;;;49786:30;;:17;:30;;;;;:43;;;49547:328;-1:-1:-1;49971:26:0;;;;:17;:26;;;;;;;;49964:33;;;-1:-1:-1;;;;;50015:18:0;;;;;:12;:18;;;;;:34;;;;;;;50008:41;49058:999::o;50352:1079::-;50630:10;:17;50605:22;;50630:21;;50650:1;;50630:21;:::i;:::-;50662:18;50683:24;;;:15;:24;;;;;;51056:10;:26;;50605:46;;-1:-1:-1;50683:24:0;;50605:46;;51056:26;;;;;;:::i;:::-;;;;;;;;;51034:48;;51120:11;51095:10;51106;51095:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;51200:28;;;:15;:28;;;;;;;:41;;;51372:24;;;;;51365:31;51407:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;50423:1008;;;50352:1079;:::o;47834:232::-;47919:14;47936:31;47964:2;47936:27;:31::i;:::-;-1:-1:-1;;;;;47978:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;48023:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;47834:232:0:o;37799:321::-;37929:18;37935:2;37939:7;37929:5;:18::i;:::-;37980:54;38011:1;38015:2;38019:7;38028:5;37980:22;:54::i;:::-;37958:154;;;;-1:-1:-1;;;37958:154:0;;;;;;;:::i;38456:439::-;-1:-1:-1;;;;;38536:16:0;;38528:61;;;;-1:-1:-1;;;38528:61:0;;29644:2:1;38528:61:0;;;29626:21:1;;;29663:18;;;29656:30;29722:34;29702:18;;;29695:62;29774:18;;38528:61:0;29442:356:1;38528:61:0;36532:4;36556:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36556:16:0;:30;38600:58;;;;-1:-1:-1;;;38600:58:0;;30005:2:1;38600:58:0;;;29987:21:1;30044:2;30024:18;;;30017:30;30083;30063:18;;;30056:58;30131:18;;38600:58:0;29803:352:1;38600:58:0;38671:45;38700:1;38704:2;38708:7;38671:20;:45::i;:::-;-1:-1:-1;;;;;38729:13:0;;;;;;:9;:13;;;;;:18;;38746:1;;38729:13;:18;;38746:1;;38729:18;:::i;:::-;;;;-1:-1:-1;;38758:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38758:21:0;-1:-1:-1;;;;;38758:21:0;;;;;;;;38797:33;;38758:16;;;38797:33;;38758:16;;38797:33;66388:15:::1;66325:83:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2192:127::-;2253:10;2248:3;2244:20;2241:1;2234:31;2284:4;2281:1;2274:15;2308:4;2305:1;2298:15;2324:253;2396:2;2390:9;2438:4;2426:17;;2473:18;2458:34;;2494:22;;;2455:62;2452:88;;;2520:18;;:::i;:::-;2556:2;2549:22;2324:253;:::o;2582:251::-;2654:2;2648:9;2696:2;2684:15;;2729:18;2714:34;;2750:22;;;2711:62;2708:88;;;2776:18;;:::i;2838:275::-;2909:2;2903:9;2974:2;2955:13;;-1:-1:-1;;2951:27:1;2939:40;;3009:18;2994:34;;3030:22;;;2991:62;2988:88;;;3056:18;;:::i;:::-;3092:2;3085:22;2838:275;;-1:-1:-1;2838:275:1:o;3118:406::-;3182:5;3216:18;3208:6;3205:30;3202:56;;;3238:18;;:::i;:::-;3276:57;3321:2;3300:15;;-1:-1:-1;;3296:29:1;3327:4;3292:40;3276:57;:::i;:::-;3267:66;;3356:6;3349:5;3342:21;3396:3;3387:6;3382:3;3378:16;3375:25;3372:45;;;3413:1;3410;3403:12;3372:45;3462:6;3457:3;3450:4;3443:5;3439:16;3426:43;3516:1;3509:4;3500:6;3493:5;3489:18;3485:29;3478:40;3118:406;;;;;:::o;3529:794::-;3624:6;3632;3640;3648;3701:3;3689:9;3680:7;3676:23;3672:33;3669:53;;;3718:1;3715;3708:12;3669:53;3757:9;3744:23;3776:31;3801:5;3776:31;:::i;:::-;3826:5;-1:-1:-1;3883:2:1;3868:18;;3855:32;3896:33;3855:32;3896:33;:::i;:::-;3948:7;-1:-1:-1;4002:2:1;3987:18;;3974:32;;-1:-1:-1;4057:2:1;4042:18;;4029:32;4084:18;4073:30;;4070:50;;;4116:1;4113;4106:12;4070:50;4139:22;;4192:4;4184:13;;4180:27;-1:-1:-1;4170:55:1;;4221:1;4218;4211:12;4170:55;4244:73;4309:7;4304:2;4291:16;4286:2;4282;4278:11;4244:73;:::i;:::-;4234:83;;;3529:794;;;;;;;:::o;4717:456::-;4794:6;4802;4810;4863:2;4851:9;4842:7;4838:23;4834:32;4831:52;;;4879:1;4876;4869:12;4831:52;4918:9;4905:23;4937:31;4962:5;4937:31;:::i;:::-;4987:5;-1:-1:-1;5044:2:1;5029:18;;5016:32;5057:33;5016:32;5057:33;:::i;:::-;4717:456;;5109:7;;-1:-1:-1;;;5163:2:1;5148:18;;;;5135:32;;4717:456::o;5178:186::-;5241:4;5274:18;5266:6;5263:30;5260:56;;;5296:18;;:::i;:::-;-1:-1:-1;5341:1:1;5337:14;5353:4;5333:25;;5178:186::o;5369:665::-;5423:5;5476:3;5469:4;5461:6;5457:17;5453:27;5443:55;;5494:1;5491;5484:12;5443:55;5530:6;5517:20;5556:4;5580:63;5596:46;5639:2;5596:46;:::i;:::-;5580:63;:::i;:::-;5677:15;;;5763:1;5759:10;;;;5747:23;;5743:32;;;5708:12;;;;5787:15;;;5784:35;;;5815:1;5812;5805:12;5784:35;5851:2;5843:6;5839:15;5863:142;5879:6;5874:3;5871:15;5863:142;;;5945:17;;5933:30;;5983:12;;;;5896;;5863:142;;;-1:-1:-1;6023:5:1;5369:665;-1:-1:-1;;;;;;5369:665:1:o;6039:1973::-;6178:6;6186;6239:2;6227:9;6218:7;6214:23;6210:32;6207:52;;;6255:1;6252;6245:12;6207:52;6295:9;6282:23;6324:18;6365:2;6357:6;6354:14;6351:34;;;6381:1;6378;6371:12;6351:34;6419:6;6408:9;6404:22;6394:32;;6464:7;6457:4;6453:2;6449:13;6445:27;6435:55;;6486:1;6483;6476:12;6435:55;6522:2;6509:16;6544:4;6568:63;6584:46;6627:2;6584:46;:::i;6568:63::-;6665:15;;;6747:1;6743:10;;;;6735:19;;6731:28;;;6696:12;;;;6771:19;;;6768:39;;;6803:1;6800;6793:12;6768:39;6835:2;6831;6827:11;6847:951;6863:6;6858:3;6855:15;6847:951;;;6949:3;6936:17;6985:2;6972:11;6969:19;6966:109;;;7029:1;7058:2;7054;7047:14;6966:109;7098:20;;7141:4;7169:16;;;-1:-1:-1;;7165:30:1;7161:39;-1:-1:-1;7158:129:1;;;7241:1;7270:2;7266;7259:14;7158:129;7313:22;;:::i;:::-;7385:2;7381;7377:11;7364:25;7418:2;7408:8;7405:16;7402:106;;;7462:1;7491:2;7487;7480:14;7402:106;7535:65;7592:7;7587:2;7576:8;7572:2;7568:17;7564:26;7535:65;:::i;:::-;7521:80;;-1:-1:-1;7658:2:1;7650:11;;;7637:25;7621:14;;;7614:49;7712:11;;;;7699:25;7683:14;;;7676:49;7738:18;;7776:12;;;;6880;;6847:951;;;-1:-1:-1;7817:5:1;-1:-1:-1;;7860:18:1;;7847:32;;-1:-1:-1;;7891:16:1;;;7888:36;;;7920:1;7917;7910:12;7888:36;;7943:63;7998:7;7987:8;7976:9;7972:24;7943:63;:::i;:::-;7933:73;;;6039:1973;;;;;:::o;8251:388::-;8319:6;8327;8380:2;8368:9;8359:7;8355:23;8351:32;8348:52;;;8396:1;8393;8386:12;8348:52;8435:9;8422:23;8454:31;8479:5;8454:31;:::i;:::-;8504:5;-1:-1:-1;8561:2:1;8546:18;;8533:32;8574:33;8533:32;8574:33;:::i;:::-;8626:7;8616:17;;;8251:388;;;;;:::o;8644:450::-;8713:6;8766:2;8754:9;8745:7;8741:23;8737:32;8734:52;;;8782:1;8779;8772:12;8734:52;8822:9;8809:23;8855:18;8847:6;8844:30;8841:50;;;8887:1;8884;8877:12;8841:50;8910:22;;8963:4;8955:13;;8951:27;-1:-1:-1;8941:55:1;;8992:1;8989;8982:12;8941:55;9015:73;9080:7;9075:2;9062:16;9057:2;9053;9049:11;9015:73;:::i;9099:247::-;9158:6;9211:2;9199:9;9190:7;9186:23;9182:32;9179:52;;;9227:1;9224;9217:12;9179:52;9266:9;9253:23;9285:31;9310:5;9285:31;:::i;9351:248::-;9419:6;9427;9480:2;9468:9;9459:7;9455:23;9451:32;9448:52;;;9496:1;9493;9486:12;9448:52;-1:-1:-1;;9519:23:1;;;9589:2;9574:18;;;9561:32;;-1:-1:-1;9351:248:1:o;9604:348::-;9688:6;9741:2;9729:9;9720:7;9716:23;9712:32;9709:52;;;9757:1;9754;9747:12;9709:52;9797:9;9784:23;9830:18;9822:6;9819:30;9816:50;;;9862:1;9859;9852:12;9816:50;9885:61;9938:7;9929:6;9918:9;9914:22;9885:61;:::i;9957:416::-;10022:6;10030;10083:2;10071:9;10062:7;10058:23;10054:32;10051:52;;;10099:1;10096;10089:12;10051:52;10138:9;10125:23;10157:31;10182:5;10157:31;:::i;:::-;10207:5;-1:-1:-1;10264:2:1;10249:18;;10236:32;10306:15;;10299:23;10287:36;;10277:64;;10337:1;10334;10327:12;10605:1827;10751:6;10759;10812:2;10800:9;10791:7;10787:23;10783:32;10780:52;;;10828:1;10825;10818:12;10780:52;10868:9;10855:23;10897:18;10938:2;10930:6;10927:14;10924:34;;;10954:1;10951;10944:12;10924:34;10977:61;11030:7;11021:6;11010:9;11006:22;10977:61;:::i;:::-;10967:71;;11057:2;11047:12;;11112:2;11101:9;11097:18;11084:32;11141:2;11131:8;11128:16;11125:36;;;11157:1;11154;11147:12;11125:36;11180:24;;11235:4;11227:13;;11223:27;-1:-1:-1;11213:55:1;;11264:1;11261;11254:12;11213:55;11300:2;11287:16;11323:63;11339:46;11382:2;11339:46;:::i;11323:63::-;11420:15;;;11502:1;11498:10;;;;11490:19;;11486:28;;;11451:12;;;;11526:19;;;11523:39;;;11558:1;11555;11548:12;11523:39;11590:2;11586;11582:11;11602:800;11618:6;11613:3;11610:15;11602:800;;;11704:3;11691:17;11740:2;11727:11;11724:19;11721:109;;;11784:1;11813:2;11809;11802:14;11721:109;11853:20;;11897:16;;;-1:-1:-1;;11893:30:1;11889:39;-1:-1:-1;11886:129:1;;;11969:1;11998:2;11994;11987:14;11886:129;12041:22;;:::i;:::-;12113:2;12109;12105:11;12092:25;12146:2;12136:8;12133:16;12130:106;;;12190:1;12219:2;12215;12208:14;12130:106;12263:65;12320:7;12315:2;12304:8;12300:2;12296:17;12292:26;12263:65;:::i;:::-;12249:80;;-1:-1:-1;12342:18:1;;-1:-1:-1;12380:12:1;;;;11635;;11602:800;;;11606:3;12421:5;12411:15;;;;;;;;10605:1827;;;;;:::o;12690:553::-;12801:6;12809;12817;12825;12878:3;12866:9;12857:7;12853:23;12849:33;12846:53;;;12895:1;12892;12885:12;12846:53;12931:9;12918:23;12908:33;;12992:2;12981:9;12977:18;12964:32;13019:18;13011:6;13008:30;13005:50;;;13051:1;13048;13041:12;13005:50;13074:61;13127:7;13118:6;13107:9;13103:22;13074:61;:::i;:::-;12690:553;;13064:71;;-1:-1:-1;;;;13182:2:1;13167:18;;13154:32;;13233:2;13218:18;13205:32;;12690:553;-1:-1:-1;12690:553:1:o;13248:380::-;13327:1;13323:12;;;;13370;;;13391:61;;13445:4;13437:6;13433:17;13423:27;;13391:61;13498:2;13490:6;13487:14;13467:18;13464:38;13461:161;;;13544:10;13539:3;13535:20;13532:1;13525:31;13579:4;13576:1;13569:15;13607:4;13604:1;13597:15;13461:161;;13248:380;;;:::o;14873:413::-;15075:2;15057:21;;;15114:2;15094:18;;;15087:30;15153:34;15148:2;15133:18;;15126:62;-1:-1:-1;;;15219:2:1;15204:18;;15197:47;15276:3;15261:19;;14873:413::o;15651:127::-;15712:10;15707:3;15703:20;15700:1;15693:31;15743:4;15740:1;15733:15;15767:4;15764:1;15757:15;15783:127;15844:10;15839:3;15835:20;15832:1;15825:31;15875:4;15872:1;15865:15;15899:4;15896:1;15889:15;15915:135;15954:3;-1:-1:-1;;15975:17:1;;15972:43;;;15995:18;;:::i;:::-;-1:-1:-1;16042:1:1;16031:13;;15915:135::o;16882:128::-;16922:3;16953:1;16949:6;16946:1;16943:13;16940:39;;;16959:18;;:::i;:::-;-1:-1:-1;16995:9:1;;16882:128::o;18052:356::-;18254:2;18236:21;;;18273:18;;;18266:30;18332:34;18327:2;18312:18;;18305:62;18399:2;18384:18;;18052:356::o;19234:251::-;19304:6;19357:2;19345:9;19336:7;19332:23;19328:32;19325:52;;;19373:1;19370;19363:12;19325:52;19405:9;19399:16;19424:31;19449:5;19424:31;:::i;20251:470::-;20430:3;20468:6;20462:13;20484:53;20530:6;20525:3;20518:4;20510:6;20506:17;20484:53;:::i;:::-;20600:13;;20559:16;;;;20622:57;20600:13;20559:16;20656:4;20644:17;;20622:57;:::i;:::-;20695:20;;20251:470;-1:-1:-1;;;;20251:470:1:o;22116:125::-;22156:4;22184:1;22181;22178:8;22175:34;;;22189:18;;:::i;:::-;-1:-1:-1;22226:9:1;;22116:125::o;22246:127::-;22307:10;22302:3;22298:20;22295:1;22288:31;22338:4;22335:1;22328:15;22362:4;22359:1;22352:15;22378:136;22417:3;22445:5;22435:39;;22454:18;;:::i;:::-;-1:-1:-1;;;22490:18:1;;22378:136::o;26962:407::-;27164:2;27146:21;;;27203:2;27183:18;;;27176:30;27242:34;27237:2;27222:18;;27215:62;-1:-1:-1;;;27308:2:1;27293:18;;27286:41;27359:3;27344:19;;26962:407::o;27374:127::-;27435:10;27430:3;27426:20;27423:1;27416:31;27466:4;27463:1;27456:15;27490:4;27487:1;27480:15;27506:120;27546:1;27572;27562:35;;27577:18;;:::i;:::-;-1:-1:-1;27611:9:1;;27506:120::o;27631:168::-;27671:7;27737:1;27733;27729:6;27725:14;27722:1;27719:21;27714:1;27707:9;27700:17;27696:45;27693:71;;;27744:18;;:::i;:::-;-1:-1:-1;27784:9:1;;27631:168::o;28158:414::-;28360:2;28342:21;;;28399:2;28379:18;;;28372:30;28438:34;28433:2;28418:18;;28411:62;-1:-1:-1;;;28504:2:1;28489:18;;28482:48;28562:3;28547:19;;28158:414::o;28577:112::-;28609:1;28635;28625:35;;28640:18;;:::i;:::-;-1:-1:-1;28674:9:1;;28577:112::o;28694:489::-;-1:-1:-1;;;;;28963:15:1;;;28945:34;;29015:15;;29010:2;28995:18;;28988:43;29062:2;29047:18;;29040:34;;;29110:3;29105:2;29090:18;;29083:31;;;28888:4;;29131:46;;29157:19;;29149:6;29131:46;:::i;:::-;29123:54;28694:489;-1:-1:-1;;;;;;28694:489:1:o;29188:249::-;29257:6;29310:2;29298:9;29289:7;29285:23;29281:32;29278:52;;;29326:1;29323;29316:12;29278:52;29358:9;29352:16;29377:30;29401:5;29377:30;:::i

Swarm Source

ipfs://e990947a07c1b47e9a32bcf060fd0213b9b033fe1cfcc16e4edfc8e70cc9d959
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.