ETH Price: $3,490.95 (+1.09%)

Yokai Kingdom (YOKAI)
 

Overview

TokenID

2235

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Yokai Kingdom is a web3 game universe, built on the Ethereum blockchain and inspired by rich, ancient Japanese mythology.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
YokaiKingdom

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-14
*/

pragma solidity ^0.8.10;

// SPDX-License-Identifier: GPL-3.0

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

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



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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}



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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}



/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}



/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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 IERC721Enumerable is IERC721 {
    /**
     * @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 tokenId);

    /**
     * @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 ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}




/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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




/**
 * @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 ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


abstract contract ERC721P is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
        interfaceId == type(IERC721).interfaceId ||
        interfaceId == type(IERC721Metadata).interfaceId ||
        super.supportsInterface(interfaceId);
    }
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
            if( owner == _owners[i] ){
                ++count;
            }
        }
        delete length;
        return count;
    }
    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;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721P.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);
    }
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    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);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    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);
    }
    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");
    }
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721P.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
    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"
        );
    }
    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);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721P.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721P.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721P.ownerOf(tokenId), to, tokenId);
    }
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.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;
        }
    }
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}



abstract contract ERC721Enum is ERC721P, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721P) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}

contract YokaiKingdom is ERC721Enum, Ownable, ReentrancyGuard {
    using Strings for uint256;

    // sale settings
    // set aside 30 for team mint
    // mint out first index to display and edit store front
    uint256 private MAX_SUPPLY = 8859;
    uint256 private TEAM_SUPPLY = 29;
    uint256 private MAX_PRESALE_MINT = 2;
    uint256 private PRICE = 0.0888 ether;
    uint256 private MAX_SALE_MINT = 2;

    bool public isPresaleActive = false;
    bool public isSaleActive = false;

    //presale settings
    //mapping(address => bool) public presaleWhitelist;
    mapping(address => uint8) public presaleWhitelistMints;

    bytes32 merkleRoot;

    string private baseURI;

    constructor() ERC721P('Yokai Kingdom', 'YOKAI') {}

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

    function _publicSupply() internal view virtual returns (uint256) {
        return MAX_SUPPLY;
    }

    // external
    function isWhitelisted (bytes32[] calldata _merkleProof) external view returns (bool) {
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        return verify(node, _merkleProof);
    }

    function setMerkleRoot(bytes32 _merkle) public onlyOwner {
        merkleRoot = _merkle;
    }

    function flipPresaleState() external onlyOwner {
        isPresaleActive = !isPresaleActive;
    }

    function flipSaleState() external onlyOwner {
        isSaleActive = !isSaleActive;
    }

    function mintAsOwner(uint256 _mintAmount) external onlyOwner {
        require(_mintAmount > 0, "Minted amount should be positive" );
        uint256 totalSupply = totalSupply();

        require(totalSupply + _mintAmount <= (_publicSupply() + TEAM_SUPPLY), "The requested amount exceeds the remaining supply" );

        for (uint256 i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
    }

    function mint(uint256 _mintAmount) external payable nonReentrant {
        require(isSaleActive, "Sale is not active");
        require(_mintAmount > 0, "Minted amount should be positive" );
        require(_mintAmount <= MAX_SALE_MINT, "Minted amount exceeds sale limit" );

        uint256 totalSupply = totalSupply();

        require(totalSupply + _mintAmount <= _publicSupply(), "The requested amount exceeds the remaining supply" );
        require(msg.value >= PRICE * _mintAmount , "Wrong msg.value");

        for (uint256 i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
    }

    function mintPresale(uint256 _mintAmount, bytes32[] calldata _merkleProof) external payable nonReentrant {
        require(isPresaleActive, "Presale is not active");
        //require(presaleWhitelist[msg.sender], "Caller is not whitelisted");
        // Verify the merkle proof
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(verify(node, _merkleProof), "Incorrect merkle");

        uint256 totalSupply = totalSupply();
        uint256 availableMints = MAX_PRESALE_MINT - presaleWhitelistMints[msg.sender];

        require(_mintAmount <= availableMints, "Too many mints requested");
        require(totalSupply + _mintAmount <= _publicSupply(), "The requested amount exceeds the remaining supply");
        require(msg.value >= PRICE * _mintAmount , "Wrong msg.value provided");

        presaleWhitelistMints[msg.sender] += uint8(_mintAmount);

        for(uint256 i = 0; i < _mintAmount; i++){
            _safeMint(msg.sender, totalSupply + i);
        }
    }

    function verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) {
      bytes32 computedHash = leaf;

      for (uint256 i = 0; i < proof.length; i++) {
        bytes32 proofElement = proof[i];

        if (computedHash <= proofElement) {
          // Hash(current computed hash + current element of the proof)
          computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
        } else {
          // Hash(current element of the proof + current computed hash)
          computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
        }
      }

      // Check if the computed hash (root) is equal to the provided root
      return computedHash == merkleRoot;
    }

    function withdraw() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        PRICE = _newPrice;
    }

    function setMaxMintAmount(uint256 _newMaxMintAmount) external onlyOwner {
        MAX_SALE_MINT = _newMaxMintAmount;
    }

    function setMaxTeamMintAmount(uint256 _newMaxMintAmount) external onlyOwner {
        TEAM_SUPPLY = _newMaxMintAmount;
    }

    function setMaxSupply(uint256 _maxSupply) external onlyOwner {
        MAX_SUPPLY = _maxSupply;
    }

    function setMaxPresaleMint(uint256 _maxPresaleMint) external onlyOwner {
        MAX_PRESALE_MINT = _maxPresaleMint;
    }

    function tokenURI(uint256 _tokenId) external view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: Nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0	? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json")) : "";
    }

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

    function transferFrom(address _from, address _to, uint256 _tokenId) public override {
        ERC721P.transferFrom(_from, _to, _tokenId);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public override {
        ERC721P.safeTransferFrom(_from, _to, _tokenId, _data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintAsOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWhitelistMints","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPresaleMint","type":"uint256"}],"name":"setMaxPresaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxTeamMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkle","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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":[{"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":"tokenId","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261229b600755601d6008556002600981905567013b7b21280e0000600a55600b55600c805461ffff191690553480156200003d57600080fd5b50604080518082018252600d81526c596f6b6169204b696e67646f6d60981b602080830191825283518085019094526005845264594f4b414960d81b908401528151919291620000909160009162000124565b508051620000a690600190602084019062000124565b505050620000c3620000bd620000ce60201b60201c565b620000d2565b600160065562000207565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013290620001ca565b90600052602060002090601f016020900481019282620001565760008555620001a1565b82601f106200017157805160ff1916838001178555620001a1565b82800160010185558215620001a1579182015b82811115620001a157825182559160200191906001019062000184565b50620001af929150620001b3565b5090565b5b80821115620001af5760008155600101620001b4565b600181811c90821680620001df57607f821691505b602082108114156200020157634e487b7160e01b600052602260045260246000fd5b50919050565b6130b680620002176000396000f3fe60806040526004361061026a5760003560e01c8063564566a81161015357806391b7f5ed116100cb578063b88d4fde1161007f578063e985e9c511610064578063e985e9c5146106bf578063f2fde38b14610708578063f81227d41461072857600080fd5b8063b88d4fde1461067f578063c87b56dd1461069f57600080fd5b8063a0712d68116100b0578063a0712d681461062c578063a22cb4651461063f578063b28a2c571461065f57600080fd5b806391b7f5ed146105f757806395d89b411461061757600080fd5b806370a08231116101225780637cb64759116101075780637cb647591461058c5780638462151c146105ac5780638da5cb5b146105d957600080fd5b806370a0823114610557578063715018a61461057757600080fd5b8063564566a8146104de57806360d938dc146104fd5780636352211e146105175780636f8b44b01461053757600080fd5b80632f745c59116101e65780634192b207116101b55780634f6ccce71161019a5780634f6ccce71461045c57806355105e9e1461047c57806355f804b3146104be57600080fd5b80634192b2071461041c57806342842e0e1461043c57600080fd5b80632f745c59146103b25780633425f90c146103d257806334918dfd146103f25780633ccfd60b1461040757600080fd5b8063088a4ed01161023d5780630c0a6b5e116102225780630c0a6b5e1461036057806318160ddd1461037357806323b872dd1461039257600080fd5b8063088a4ed01461031e578063095ea7b31461034057600080fd5b806301ffc9a71461026f578063069824fb146102a457806306fdde03146102c4578063081812fc146102e6575b600080fd5b34801561027b57600080fd5b5061028f61028a3660046129c8565b61073d565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5061028f6102bf366004612a31565b610799565b3480156102d057600080fd5b506102d961082c565b60405161029b9190612acb565b3480156102f257600080fd5b50610306610301366004612ade565b6108be565b6040516001600160a01b03909116815260200161029b565b34801561032a57600080fd5b5061033e610339366004612ade565b61095c565b005b34801561034c57600080fd5b5061033e61035b366004612b13565b6109bb565b61033e61036e366004612b3d565b610aed565b34801561037f57600080fd5b506002545b60405190815260200161029b565b34801561039e57600080fd5b5061033e6103ad366004612b89565b610e44565b3480156103be57600080fd5b506103846103cd366004612b13565b610e4f565b3480156103de57600080fd5b5061033e6103ed366004612ade565b610f5e565b3480156103fe57600080fd5b5061033e610fbd565b34801561041357600080fd5b5061033e611051565b34801561042857600080fd5b5061033e610437366004612ade565b6110d1565b34801561044857600080fd5b5061033e610457366004612b89565b611130565b34801561046857600080fd5b50610384610477366004612ade565b61114b565b34801561048857600080fd5b506104ac610497366004612bc5565b600d6020526000908152604090205460ff1681565b60405160ff909116815260200161029b565b3480156104ca57600080fd5b5061033e6104d9366004612c85565b6111a8565b3480156104ea57600080fd5b50600c5461028f90610100900460ff1681565b34801561050957600080fd5b50600c5461028f9060ff1681565b34801561052357600080fd5b50610306610532366004612ade565b611219565b34801561054357600080fd5b5061033e610552366004612ade565b6112b9565b34801561056357600080fd5b50610384610572366004612bc5565b611318565b34801561058357600080fd5b5061033e6113fd565b34801561059857600080fd5b5061033e6105a7366004612ade565b611461565b3480156105b857600080fd5b506105cc6105c7366004612bc5565b6114c0565b60405161029b9190612cce565b3480156105e557600080fd5b506005546001600160a01b0316610306565b34801561060357600080fd5b5061033e610612366004612ade565b6115ba565b34801561062357600080fd5b506102d9611619565b61033e61063a366004612ade565b611628565b34801561064b57600080fd5b5061033e61065a366004612d12565b61189f565b34801561066b57600080fd5b5061033e61067a366004612ade565b611982565b34801561068b57600080fd5b5061033e61069a366004612d4e565b611af8565b3480156106ab57600080fd5b506102d96106ba366004612ade565b611b0a565b3480156106cb57600080fd5b5061028f6106da366004612dca565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561071457600080fd5b5061033e610723366004612bc5565b611be3565b34801561073457600080fd5b5061033e611cc5565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610793575061079382611d51565b92915050565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152600090819060340160405160208183030381529060405280519060200120905061082481858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611e3492505050565b949350505050565b60606000805461083b90612dfd565b80601f016020809104026020016040519081016040528092919081815260200182805461086790612dfd565b80156108b45780601f10610889576101008083540402835291602001916108b4565b820191906000526020600020905b81548152906001019060200180831161089757829003601f168201915b5050505050905090565b60006108c982611ee4565b6109405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b6005546001600160a01b031633146109b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600b55565b60006109c682611219565b9050806001600160a01b0316836001600160a01b03161415610a505760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610937565b336001600160a01b0382161480610a6c5750610a6c81336106da565b610ade5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610937565b610ae88383611f2e565b505050565b60026006541415610b405760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610937565b6002600655600c5460ff16610b975760405162461bcd60e51b815260206004820152601560248201527f50726573616c65206973206e6f742061637469766500000000000000000000006044820152606401610937565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152600090603401604051602081830303815290604052805190602001209050610c2081848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611e3492505050565b610c6c5760405162461bcd60e51b815260206004820152601060248201527f496e636f7272656374206d65726b6c65000000000000000000000000000000006044820152606401610937565b6000610c7760025490565b336000908152600d60205260408120546009549293509091610c9c9160ff1690612e80565b905080861115610cee5760405162461bcd60e51b815260206004820152601860248201527f546f6f206d616e79206d696e74732072657175657374656400000000000000006044820152606401610937565b600754610cfb8784612e97565b1115610d6f5760405162461bcd60e51b815260206004820152603160248201527f5468652072657175657374656420616d6f756e7420657863656564732074686560448201527f2072656d61696e696e6720737570706c790000000000000000000000000000006064820152608401610937565b85600a54610d7d9190612eaf565b341015610dcc5760405162461bcd60e51b815260206004820152601860248201527f57726f6e67206d73672e76616c75652070726f766964656400000000000000006044820152606401610937565b336000908152600d602052604081208054889290610dee90849060ff16612eec565b92506101000a81548160ff021916908360ff16021790555060005b86811015610e3657610e2433610e1f8386612e97565b611fb4565b80610e2e81612f11565b915050610e09565b505060016006555050505050565b610ae8838383611fce565b6000610e5a83611318565b8210610ea85760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610937565b6000805b600254811015610f155760028181548110610ec957610ec9612f4a565b6000918252602090912001546001600160a01b0386811691161415610f055783821415610ef95791506107939050565b610f0282612f11565b91505b610f0e81612f11565b9050610eac565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610937565b6005546001600160a01b03163314610fb85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600955565b6005546001600160a01b031633146110175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b6005546001600160a01b031633146110ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b60405133904780156108fc02916000818181858888f193505050506110cf57600080fd5b565b6005546001600160a01b0316331461112b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600855565b610ae883838360405180602001604052806000815250611af8565b600061115660025490565b82106111a45760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610937565b5090565b6005546001600160a01b031633146112025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b805161121590600f90602084019061290a565b5050565b6000806002838154811061122f5761122f612f4a565b6000918252602090912001546001600160a01b03169050806107935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610937565b6005546001600160a01b031633146113135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600755565b60006001600160a01b0382166113965760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610937565b600254600090815b818110156113f457600281815481106113b9576113b9612f4a565b6000918252602090912001546001600160a01b03868116911614156113e4576113e183612f11565b92505b6113ed81612f11565b905061139e565b50909392505050565b6005546001600160a01b031633146114575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b6110cf6000612055565b6005546001600160a01b031633146114bb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600e55565b60606114cb82611318565b60001061151a5760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610937565b600061152583611318565b905060008167ffffffffffffffff81111561154257611542612be0565b60405190808252806020026020018201604052801561156b578160200160208202803683370190505b50905060005b828110156115b2576115838582610e4f565b82828151811061159557611595612f4a565b6020908102919091010152806115aa81612f11565b915050611571565b509392505050565b6005546001600160a01b031633146116145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600a55565b60606001805461083b90612dfd565b6002600654141561167b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610937565b6002600655600c54610100900460ff166116d75760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742061637469766500000000000000000000000000006044820152606401610937565b600081116117275760405162461bcd60e51b815260206004820181905260248201527f4d696e74656420616d6f756e742073686f756c6420626520706f7369746976656044820152606401610937565b600b548111156117795760405162461bcd60e51b815260206004820181905260248201527f4d696e74656420616d6f756e7420657863656564732073616c65206c696d69746044820152606401610937565b600061178460025490565b905061178f60075490565b6117998383612e97565b111561180d5760405162461bcd60e51b815260206004820152603160248201527f5468652072657175657374656420616d6f756e7420657863656564732074686560448201527f2072656d61696e696e6720737570706c790000000000000000000000000000006064820152608401610937565b81600a5461181b9190612eaf565b34101561186a5760405162461bcd60e51b815260206004820152600f60248201527f57726f6e67206d73672e76616c756500000000000000000000000000000000006044820152606401610937565b60005b828110156118955761188333610e1f8385612e97565b8061188d81612f11565b91505061186d565b5050600160065550565b6001600160a01b0382163314156118f85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610937565b3360008181526004602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6005546001600160a01b031633146119dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b60008111611a2c5760405162461bcd60e51b815260206004820181905260248201527f4d696e74656420616d6f756e742073686f756c6420626520706f7369746976656044820152606401610937565b6000611a3760025490565b9050600854611a4560075490565b611a4f9190612e97565b611a598383612e97565b1115611acd5760405162461bcd60e51b815260206004820152603160248201527f5468652072657175657374656420616d6f756e7420657863656564732074686560448201527f2072656d61696e696e6720737570706c790000000000000000000000000000006064820152608401610937565b60005b82811015610ae857611ae633610e1f8385612e97565b80611af081612f11565b915050611ad0565b611b04848484846120bf565b50505050565b6060611b1582611ee4565b611b875760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560448201527f6e000000000000000000000000000000000000000000000000000000000000006064820152608401610937565b6000611b91612147565b90506000815111611bb15760405180602001604052806000815250611bdc565b80611bbb84612156565b604051602001611bcc929190612f79565b6040516020818303038152906040525b9392505050565b6005546001600160a01b03163314611c3d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b6001600160a01b038116611cb95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610937565b611cc281612055565b50565b6005546001600160a01b03163314611d1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611de457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061079357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610793565b600082815b8351811015611ed8576000848281518110611e5657611e56612f4a565b60200260200101519050808311611e98576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611ec5565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611ed081612f11565b915050611e39565b50600e54149392505050565b60025460009082108015610793575060006001600160a01b031660028381548110611f1157611f11612f4a565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611f7b82611219565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611215828260405180602001604052806000815250612288565b611fd83382612311565b61204a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610937565b610ae8838383612408565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120c93383612311565b61213b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610937565b611b04848484846125a3565b6060600f805461083b90612dfd565b60608161219657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156121c057806121aa81612f11565b91506121b99050600a83612fff565b915061219a565b60008167ffffffffffffffff8111156121db576121db612be0565b6040519080825280601f01601f191660200182016040528015612205576020820181803683370190505b5090505b84156108245761221a600183612e80565b9150612227600a86613013565b612232906030612e97565b60f81b81838151811061224757612247612f4a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612281600a86612fff565b9450612209565b612292838361262c565b61229f600084848461276c565b610ae85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610937565b600061231c82611ee4565b61238e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610937565b600061239983611219565b9050806001600160a01b0316846001600160a01b031614806123d45750836001600160a01b03166123c9846108be565b6001600160a01b0316145b8061082457506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff16610824565b826001600160a01b031661241b82611219565b6001600160a01b0316146124975760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610937565b6001600160a01b0382166125125760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610937565b61251d600082611f2e565b816002828154811061253157612531612f4a565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6125ae848484612408565b6125ba8484848461276c565b611b045760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610937565b6001600160a01b0382166126825760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610937565b61268b81611ee4565b156126d85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610937565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156128ff576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906127c9903390899088908890600401613027565b6020604051808303816000875af1925050508015612804575060408051601f3d908101601f1916820190925261280191810190613063565b60015b6128b4573d808015612832576040519150601f19603f3d011682016040523d82523d6000602084013e612837565b606091505b5080516128ac5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610937565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610824565b506001949350505050565b82805461291690612dfd565b90600052602060002090601f016020900481019282612938576000855561297e565b82601f1061295157805160ff191683800117855561297e565b8280016001018555821561297e579182015b8281111561297e578251825591602001919060010190612963565b506111a49291505b808211156111a45760008155600101612986565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611cc257600080fd5b6000602082840312156129da57600080fd5b8135611bdc8161299a565b60008083601f8401126129f757600080fd5b50813567ffffffffffffffff811115612a0f57600080fd5b6020830191508360208260051b8501011115612a2a57600080fd5b9250929050565b60008060208385031215612a4457600080fd5b823567ffffffffffffffff811115612a5b57600080fd5b612a67858286016129e5565b90969095509350505050565b60005b83811015612a8e578181015183820152602001612a76565b83811115611b045750506000910152565b60008151808452612ab7816020860160208601612a73565b601f01601f19169290920160200192915050565b602081526000611bdc6020830184612a9f565b600060208284031215612af057600080fd5b5035919050565b80356001600160a01b0381168114612b0e57600080fd5b919050565b60008060408385031215612b2657600080fd5b612b2f83612af7565b946020939093013593505050565b600080600060408486031215612b5257600080fd5b83359250602084013567ffffffffffffffff811115612b7057600080fd5b612b7c868287016129e5565b9497909650939450505050565b600080600060608486031215612b9e57600080fd5b612ba784612af7565b9250612bb560208501612af7565b9150604084013590509250925092565b600060208284031215612bd757600080fd5b611bdc82612af7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115612c2a57612c2a612be0565b604051601f8501601f19908116603f01168101908282118183101715612c5257612c52612be0565b81604052809350858152868686011115612c6b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c9757600080fd5b813567ffffffffffffffff811115612cae57600080fd5b8201601f81018413612cbf57600080fd5b61082484823560208401612c0f565b6020808252825182820181905260009190848201906040850190845b81811015612d0657835183529284019291840191600101612cea565b50909695505050505050565b60008060408385031215612d2557600080fd5b612d2e83612af7565b915060208301358015158114612d4357600080fd5b809150509250929050565b60008060008060808587031215612d6457600080fd5b612d6d85612af7565b9350612d7b60208601612af7565b925060408501359150606085013567ffffffffffffffff811115612d9e57600080fd5b8501601f81018713612daf57600080fd5b612dbe87823560208401612c0f565b91505092959194509250565b60008060408385031215612ddd57600080fd5b612de683612af7565b9150612df460208401612af7565b90509250929050565b600181811c90821680612e1157607f821691505b60208210811415612e4b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612e9257612e92612e51565b500390565b60008219821115612eaa57612eaa612e51565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ee757612ee7612e51565b500290565b600060ff821660ff84168060ff03821115612f0957612f09612e51565b019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f4357612f43612e51565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008351612f8b818460208801612a73565b835190830190612f9f818360208801612a73565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261300e5761300e612fd0565b500490565b60008261302257613022612fd0565b500690565b60006001600160a01b038087168352808616602084015250836040830152608060608301526130596080830184612a9f565b9695505050505050565b60006020828403121561307557600080fd5b8151611bdc8161299a56fea2646970667358221220fb5d30d64e6c3aa71ea0a5ed6ea2a1ca05c5e808a3276ebf2e8d1cea8bdb95b264736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061026a5760003560e01c8063564566a81161015357806391b7f5ed116100cb578063b88d4fde1161007f578063e985e9c511610064578063e985e9c5146106bf578063f2fde38b14610708578063f81227d41461072857600080fd5b8063b88d4fde1461067f578063c87b56dd1461069f57600080fd5b8063a0712d68116100b0578063a0712d681461062c578063a22cb4651461063f578063b28a2c571461065f57600080fd5b806391b7f5ed146105f757806395d89b411461061757600080fd5b806370a08231116101225780637cb64759116101075780637cb647591461058c5780638462151c146105ac5780638da5cb5b146105d957600080fd5b806370a0823114610557578063715018a61461057757600080fd5b8063564566a8146104de57806360d938dc146104fd5780636352211e146105175780636f8b44b01461053757600080fd5b80632f745c59116101e65780634192b207116101b55780634f6ccce71161019a5780634f6ccce71461045c57806355105e9e1461047c57806355f804b3146104be57600080fd5b80634192b2071461041c57806342842e0e1461043c57600080fd5b80632f745c59146103b25780633425f90c146103d257806334918dfd146103f25780633ccfd60b1461040757600080fd5b8063088a4ed01161023d5780630c0a6b5e116102225780630c0a6b5e1461036057806318160ddd1461037357806323b872dd1461039257600080fd5b8063088a4ed01461031e578063095ea7b31461034057600080fd5b806301ffc9a71461026f578063069824fb146102a457806306fdde03146102c4578063081812fc146102e6575b600080fd5b34801561027b57600080fd5b5061028f61028a3660046129c8565b61073d565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5061028f6102bf366004612a31565b610799565b3480156102d057600080fd5b506102d961082c565b60405161029b9190612acb565b3480156102f257600080fd5b50610306610301366004612ade565b6108be565b6040516001600160a01b03909116815260200161029b565b34801561032a57600080fd5b5061033e610339366004612ade565b61095c565b005b34801561034c57600080fd5b5061033e61035b366004612b13565b6109bb565b61033e61036e366004612b3d565b610aed565b34801561037f57600080fd5b506002545b60405190815260200161029b565b34801561039e57600080fd5b5061033e6103ad366004612b89565b610e44565b3480156103be57600080fd5b506103846103cd366004612b13565b610e4f565b3480156103de57600080fd5b5061033e6103ed366004612ade565b610f5e565b3480156103fe57600080fd5b5061033e610fbd565b34801561041357600080fd5b5061033e611051565b34801561042857600080fd5b5061033e610437366004612ade565b6110d1565b34801561044857600080fd5b5061033e610457366004612b89565b611130565b34801561046857600080fd5b50610384610477366004612ade565b61114b565b34801561048857600080fd5b506104ac610497366004612bc5565b600d6020526000908152604090205460ff1681565b60405160ff909116815260200161029b565b3480156104ca57600080fd5b5061033e6104d9366004612c85565b6111a8565b3480156104ea57600080fd5b50600c5461028f90610100900460ff1681565b34801561050957600080fd5b50600c5461028f9060ff1681565b34801561052357600080fd5b50610306610532366004612ade565b611219565b34801561054357600080fd5b5061033e610552366004612ade565b6112b9565b34801561056357600080fd5b50610384610572366004612bc5565b611318565b34801561058357600080fd5b5061033e6113fd565b34801561059857600080fd5b5061033e6105a7366004612ade565b611461565b3480156105b857600080fd5b506105cc6105c7366004612bc5565b6114c0565b60405161029b9190612cce565b3480156105e557600080fd5b506005546001600160a01b0316610306565b34801561060357600080fd5b5061033e610612366004612ade565b6115ba565b34801561062357600080fd5b506102d9611619565b61033e61063a366004612ade565b611628565b34801561064b57600080fd5b5061033e61065a366004612d12565b61189f565b34801561066b57600080fd5b5061033e61067a366004612ade565b611982565b34801561068b57600080fd5b5061033e61069a366004612d4e565b611af8565b3480156106ab57600080fd5b506102d96106ba366004612ade565b611b0a565b3480156106cb57600080fd5b5061028f6106da366004612dca565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561071457600080fd5b5061033e610723366004612bc5565b611be3565b34801561073457600080fd5b5061033e611cc5565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610793575061079382611d51565b92915050565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152600090819060340160405160208183030381529060405280519060200120905061082481858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611e3492505050565b949350505050565b60606000805461083b90612dfd565b80601f016020809104026020016040519081016040528092919081815260200182805461086790612dfd565b80156108b45780601f10610889576101008083540402835291602001916108b4565b820191906000526020600020905b81548152906001019060200180831161089757829003601f168201915b5050505050905090565b60006108c982611ee4565b6109405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b6005546001600160a01b031633146109b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600b55565b60006109c682611219565b9050806001600160a01b0316836001600160a01b03161415610a505760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610937565b336001600160a01b0382161480610a6c5750610a6c81336106da565b610ade5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610937565b610ae88383611f2e565b505050565b60026006541415610b405760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610937565b6002600655600c5460ff16610b975760405162461bcd60e51b815260206004820152601560248201527f50726573616c65206973206e6f742061637469766500000000000000000000006044820152606401610937565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152600090603401604051602081830303815290604052805190602001209050610c2081848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611e3492505050565b610c6c5760405162461bcd60e51b815260206004820152601060248201527f496e636f7272656374206d65726b6c65000000000000000000000000000000006044820152606401610937565b6000610c7760025490565b336000908152600d60205260408120546009549293509091610c9c9160ff1690612e80565b905080861115610cee5760405162461bcd60e51b815260206004820152601860248201527f546f6f206d616e79206d696e74732072657175657374656400000000000000006044820152606401610937565b600754610cfb8784612e97565b1115610d6f5760405162461bcd60e51b815260206004820152603160248201527f5468652072657175657374656420616d6f756e7420657863656564732074686560448201527f2072656d61696e696e6720737570706c790000000000000000000000000000006064820152608401610937565b85600a54610d7d9190612eaf565b341015610dcc5760405162461bcd60e51b815260206004820152601860248201527f57726f6e67206d73672e76616c75652070726f766964656400000000000000006044820152606401610937565b336000908152600d602052604081208054889290610dee90849060ff16612eec565b92506101000a81548160ff021916908360ff16021790555060005b86811015610e3657610e2433610e1f8386612e97565b611fb4565b80610e2e81612f11565b915050610e09565b505060016006555050505050565b610ae8838383611fce565b6000610e5a83611318565b8210610ea85760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610937565b6000805b600254811015610f155760028181548110610ec957610ec9612f4a565b6000918252602090912001546001600160a01b0386811691161415610f055783821415610ef95791506107939050565b610f0282612f11565b91505b610f0e81612f11565b9050610eac565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610937565b6005546001600160a01b03163314610fb85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600955565b6005546001600160a01b031633146110175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b6005546001600160a01b031633146110ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b60405133904780156108fc02916000818181858888f193505050506110cf57600080fd5b565b6005546001600160a01b0316331461112b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600855565b610ae883838360405180602001604052806000815250611af8565b600061115660025490565b82106111a45760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610937565b5090565b6005546001600160a01b031633146112025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b805161121590600f90602084019061290a565b5050565b6000806002838154811061122f5761122f612f4a565b6000918252602090912001546001600160a01b03169050806107935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610937565b6005546001600160a01b031633146113135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600755565b60006001600160a01b0382166113965760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610937565b600254600090815b818110156113f457600281815481106113b9576113b9612f4a565b6000918252602090912001546001600160a01b03868116911614156113e4576113e183612f11565b92505b6113ed81612f11565b905061139e565b50909392505050565b6005546001600160a01b031633146114575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b6110cf6000612055565b6005546001600160a01b031633146114bb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600e55565b60606114cb82611318565b60001061151a5760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610937565b600061152583611318565b905060008167ffffffffffffffff81111561154257611542612be0565b60405190808252806020026020018201604052801561156b578160200160208202803683370190505b50905060005b828110156115b2576115838582610e4f565b82828151811061159557611595612f4a565b6020908102919091010152806115aa81612f11565b915050611571565b509392505050565b6005546001600160a01b031633146116145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600a55565b60606001805461083b90612dfd565b6002600654141561167b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610937565b6002600655600c54610100900460ff166116d75760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742061637469766500000000000000000000000000006044820152606401610937565b600081116117275760405162461bcd60e51b815260206004820181905260248201527f4d696e74656420616d6f756e742073686f756c6420626520706f7369746976656044820152606401610937565b600b548111156117795760405162461bcd60e51b815260206004820181905260248201527f4d696e74656420616d6f756e7420657863656564732073616c65206c696d69746044820152606401610937565b600061178460025490565b905061178f60075490565b6117998383612e97565b111561180d5760405162461bcd60e51b815260206004820152603160248201527f5468652072657175657374656420616d6f756e7420657863656564732074686560448201527f2072656d61696e696e6720737570706c790000000000000000000000000000006064820152608401610937565b81600a5461181b9190612eaf565b34101561186a5760405162461bcd60e51b815260206004820152600f60248201527f57726f6e67206d73672e76616c756500000000000000000000000000000000006044820152606401610937565b60005b828110156118955761188333610e1f8385612e97565b8061188d81612f11565b91505061186d565b5050600160065550565b6001600160a01b0382163314156118f85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610937565b3360008181526004602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6005546001600160a01b031633146119dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b60008111611a2c5760405162461bcd60e51b815260206004820181905260248201527f4d696e74656420616d6f756e742073686f756c6420626520706f7369746976656044820152606401610937565b6000611a3760025490565b9050600854611a4560075490565b611a4f9190612e97565b611a598383612e97565b1115611acd5760405162461bcd60e51b815260206004820152603160248201527f5468652072657175657374656420616d6f756e7420657863656564732074686560448201527f2072656d61696e696e6720737570706c790000000000000000000000000000006064820152608401610937565b60005b82811015610ae857611ae633610e1f8385612e97565b80611af081612f11565b915050611ad0565b611b04848484846120bf565b50505050565b6060611b1582611ee4565b611b875760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560448201527f6e000000000000000000000000000000000000000000000000000000000000006064820152608401610937565b6000611b91612147565b90506000815111611bb15760405180602001604052806000815250611bdc565b80611bbb84612156565b604051602001611bcc929190612f79565b6040516020818303038152906040525b9392505050565b6005546001600160a01b03163314611c3d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b6001600160a01b038116611cb95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610937565b611cc281612055565b50565b6005546001600160a01b03163314611d1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611de457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061079357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610793565b600082815b8351811015611ed8576000848281518110611e5657611e56612f4a565b60200260200101519050808311611e98576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611ec5565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611ed081612f11565b915050611e39565b50600e54149392505050565b60025460009082108015610793575060006001600160a01b031660028381548110611f1157611f11612f4a565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611f7b82611219565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611215828260405180602001604052806000815250612288565b611fd83382612311565b61204a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610937565b610ae8838383612408565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120c93383612311565b61213b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610937565b611b04848484846125a3565b6060600f805461083b90612dfd565b60608161219657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156121c057806121aa81612f11565b91506121b99050600a83612fff565b915061219a565b60008167ffffffffffffffff8111156121db576121db612be0565b6040519080825280601f01601f191660200182016040528015612205576020820181803683370190505b5090505b84156108245761221a600183612e80565b9150612227600a86613013565b612232906030612e97565b60f81b81838151811061224757612247612f4a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612281600a86612fff565b9450612209565b612292838361262c565b61229f600084848461276c565b610ae85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610937565b600061231c82611ee4565b61238e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610937565b600061239983611219565b9050806001600160a01b0316846001600160a01b031614806123d45750836001600160a01b03166123c9846108be565b6001600160a01b0316145b8061082457506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff16610824565b826001600160a01b031661241b82611219565b6001600160a01b0316146124975760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610937565b6001600160a01b0382166125125760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610937565b61251d600082611f2e565b816002828154811061253157612531612f4a565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6125ae848484612408565b6125ba8484848461276c565b611b045760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610937565b6001600160a01b0382166126825760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610937565b61268b81611ee4565b156126d85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610937565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156128ff576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906127c9903390899088908890600401613027565b6020604051808303816000875af1925050508015612804575060408051601f3d908101601f1916820190925261280191810190613063565b60015b6128b4573d808015612832576040519150601f19603f3d011682016040523d82523d6000602084013e612837565b606091505b5080516128ac5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610937565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610824565b506001949350505050565b82805461291690612dfd565b90600052602060002090601f016020900481019282612938576000855561297e565b82601f1061295157805160ff191683800117855561297e565b8280016001018555821561297e579182015b8281111561297e578251825591602001919060010190612963565b506111a49291505b808211156111a45760008155600101612986565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611cc257600080fd5b6000602082840312156129da57600080fd5b8135611bdc8161299a565b60008083601f8401126129f757600080fd5b50813567ffffffffffffffff811115612a0f57600080fd5b6020830191508360208260051b8501011115612a2a57600080fd5b9250929050565b60008060208385031215612a4457600080fd5b823567ffffffffffffffff811115612a5b57600080fd5b612a67858286016129e5565b90969095509350505050565b60005b83811015612a8e578181015183820152602001612a76565b83811115611b045750506000910152565b60008151808452612ab7816020860160208601612a73565b601f01601f19169290920160200192915050565b602081526000611bdc6020830184612a9f565b600060208284031215612af057600080fd5b5035919050565b80356001600160a01b0381168114612b0e57600080fd5b919050565b60008060408385031215612b2657600080fd5b612b2f83612af7565b946020939093013593505050565b600080600060408486031215612b5257600080fd5b83359250602084013567ffffffffffffffff811115612b7057600080fd5b612b7c868287016129e5565b9497909650939450505050565b600080600060608486031215612b9e57600080fd5b612ba784612af7565b9250612bb560208501612af7565b9150604084013590509250925092565b600060208284031215612bd757600080fd5b611bdc82612af7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115612c2a57612c2a612be0565b604051601f8501601f19908116603f01168101908282118183101715612c5257612c52612be0565b81604052809350858152868686011115612c6b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c9757600080fd5b813567ffffffffffffffff811115612cae57600080fd5b8201601f81018413612cbf57600080fd5b61082484823560208401612c0f565b6020808252825182820181905260009190848201906040850190845b81811015612d0657835183529284019291840191600101612cea565b50909695505050505050565b60008060408385031215612d2557600080fd5b612d2e83612af7565b915060208301358015158114612d4357600080fd5b809150509250929050565b60008060008060808587031215612d6457600080fd5b612d6d85612af7565b9350612d7b60208601612af7565b925060408501359150606085013567ffffffffffffffff811115612d9e57600080fd5b8501601f81018713612daf57600080fd5b612dbe87823560208401612c0f565b91505092959194509250565b60008060408385031215612ddd57600080fd5b612de683612af7565b9150612df460208401612af7565b90509250929050565b600181811c90821680612e1157607f821691505b60208210811415612e4b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612e9257612e92612e51565b500390565b60008219821115612eaa57612eaa612e51565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ee757612ee7612e51565b500290565b600060ff821660ff84168060ff03821115612f0957612f09612e51565b019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f4357612f43612e51565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008351612f8b818460208801612a73565b835190830190612f9f818360208801612a73565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261300e5761300e612fd0565b500490565b60008261302257613022612fd0565b500690565b60006001600160a01b038087168352808616602084015250836040830152608060608301526130596080830184612a9f565b9695505050505050565b60006020828403121561307557600080fd5b8151611bdc8161299a56fea2646970667358221220fb5d30d64e6c3aa71ea0a5ed6ea2a1ca05c5e808a3276ebf2e8d1cea8bdb95b264736f6c634300080a0033

Deployed Bytecode Sourcemap

33121:5955:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31643:225;;;;;;;;;;-1:-1:-1;31643:225:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;31643:225:0;;;;;;;;34142:203;;;;;;;;;;-1:-1:-1;34142:203:0;;;;;:::i;:::-;;:::i;25758:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26392:221::-;;;;;;;;;;-1:-1:-1;26392:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2611:55:1;;;2593:74;;2581:2;2566:18;26392:221:0;2447:226:1;37758:124:0;;;;;;;;;;-1:-1:-1;37758:124:0;;;;;:::i;:::-;;:::i;:::-;;25974:412;;;;;;;;;;-1:-1:-1;25974:412:0;;;;;:::i;:::-;;:::i;35765:1017::-;;;;;;:::i;:::-;;:::i;32804:110::-;;;;;;;;;;-1:-1:-1;32892:7:0;:14;32804:110;;;3794:25:1;;;3782:2;3767:18;32804:110:0;3648:177:1;38740:145:0;;;;;;;;;;-1:-1:-1;38740:145:0;;;;;:::i;:::-;;:::i;31874:500::-;;;;;;;;;;-1:-1:-1;31874:500:0;;;;;:::i;:::-;;:::i;38135:124::-;;;;;;;;;;-1:-1:-1;38135:124:0;;;;;:::i;:::-;;:::i;34565:91::-;;;;;;;;;;;;;:::i;37536:114::-;;;;;;;;;;;;;:::i;37890:126::-;;;;;;;;;;-1:-1:-1;37890:126:0;;;;;:::i;:::-;;:::i;27435:185::-;;;;;;;;;;-1:-1:-1;27435:185:0;;;;;:::i;:::-;;:::i;32920:194::-;;;;;;;;;;-1:-1:-1;32920:194:0;;;;;:::i;:::-;;:::i;33713:54::-;;;;;;;;;;-1:-1:-1;33713:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4526:4:1;4514:17;;;4496:36;;4484:2;4469:18;33713:54:0;4354:184:1;38628:104:0;;;;;;;;;;-1:-1:-1;38628:104:0;;;;;:::i;:::-;;:::i;33591:32::-;;;;;;;;;;-1:-1:-1;33591:32:0;;;;;;;;;;;33549:35;;;;;;;;;;-1:-1:-1;33549:35:0;;;;;;;;25513:239;;;;;;;;;;-1:-1:-1;25513:239:0;;;;;:::i;:::-;;:::i;38024:103::-;;;;;;;;;;-1:-1:-1;38024:103:0;;;;;:::i;:::-;;:::i;25085:422::-;;;;;;;;;;-1:-1:-1;25085:422:0;;;;;:::i;:::-;;:::i;2386:94::-;;;;;;;;;;;;;:::i;34353:96::-;;;;;;;;;;-1:-1:-1;34353:96:0;;;;;:::i;:::-;;:::i;32380:418::-;;;;;;;;;;-1:-1:-1;32380:418:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1735:87::-;;;;;;;;;;-1:-1:-1;1808:6:0;;-1:-1:-1;;;;;1808:6:0;1735:87;;37658:92;;;;;;;;;;-1:-1:-1;37658:92:0;;;;;:::i;:::-;;:::i;25864:104::-;;;;;;;;;;;;;:::i;35114:643::-;;;;;;:::i;:::-;;:::i;26619:295::-;;;;;;;;;;-1:-1:-1;26619:295:0;;;;;:::i;:::-;;:::i;34664:442::-;;;;;;;;;;-1:-1:-1;34664:442:0;;;;;:::i;:::-;;:::i;38893:180::-;;;;;;;;;;-1:-1:-1;38893:180:0;;;;;:::i;:::-;;:::i;38267:353::-;;;;;;;;;;-1:-1:-1;38267:353:0;;;;;:::i;:::-;;:::i;26920:164::-;;;;;;;;;;-1:-1:-1;26920:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27041:25:0;;;27017:4;27041:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26920:164;2635:192;;;;;;;;;;-1:-1:-1;2635:192:0;;;;;:::i;:::-;;:::i;34457:100::-;;;;;;;;;;;;;:::i;31643:225::-;31746:4;31770:50;;;31785:35;31770:50;;:90;;;31824:36;31848:11;31824:23;:36::i;:::-;31763:97;31643:225;-1:-1:-1;;31643:225:0:o;34142:203::-;34264:28;;8157:66:1;34281:10:0;8144:2:1;8140:15;8136:88;34264:28:0;;;8124:101:1;34222:4:0;;;;8241:12:1;;34264:28:0;;;;;;;;;;;;34254:39;;;;;;34239:54;;34311:26;34318:4;34324:12;;34311:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34311:6:0;;-1:-1:-1;;;34311:26:0:i;:::-;34304:33;34142:203;-1:-1:-1;;;;34142:203:0:o;25758:100::-;25812:13;25845:5;25838:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25758:100;:::o;26392:221::-;26468:7;26496:16;26504:7;26496;:16::i;:::-;26488:73;;;;-1:-1:-1;;;26488:73:0;;8908:2:1;26488:73:0;;;8890:21:1;8947:2;8927:18;;;8920:30;8986:34;8966:18;;;8959:62;9057:14;9037:18;;;9030:42;9089:19;;26488:73:0;;;;;;;;;-1:-1:-1;26581:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26581:24:0;;26392:221::o;37758:124::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;37841:13:::1;:33:::0;37758:124::o;25974:412::-;26055:13;26071:24;26087:7;26071:15;:24::i;:::-;26055:40;;26120:5;-1:-1:-1;;;;;26114:11:0;:2;-1:-1:-1;;;;;26114:11:0;;;26106:57;;;;-1:-1:-1;;;26106:57:0;;9682:2:1;26106:57:0;;;9664:21:1;9721:2;9701:18;;;9694:30;9760:34;9740:18;;;9733:62;9831:3;9811:18;;;9804:31;9852:19;;26106:57:0;9480:397:1;26106:57:0;687:10;-1:-1:-1;;;;;26198:21:0;;;;:62;;-1:-1:-1;26223:37:0;26240:5;687:10;26920:164;:::i;26223:37::-;26176:168;;;;-1:-1:-1;;;26176:168:0;;10084:2:1;26176:168:0;;;10066:21:1;10123:2;10103:18;;;10096:30;10162:34;10142:18;;;10135:62;10233:26;10213:18;;;10206:54;10277:19;;26176:168:0;9882:420:1;26176:168:0;26357:21;26366:2;26370:7;26357:8;:21::i;:::-;26044:342;25974:412;;:::o;35765:1017::-;6659:1;7255:7;;:19;;7247:63;;;;-1:-1:-1;;;7247:63:0;;10509:2:1;7247:63:0;;;10491:21:1;10548:2;10528:18;;;10521:30;10587:33;10567:18;;;10560:61;10638:18;;7247:63:0;10307:355:1;7247:63:0;6659:1;7388:7;:18;35889:15:::1;::::0;::::1;;35881:49;;;::::0;-1:-1:-1;;;35881:49:0;;10869:2:1;35881:49:0::1;::::0;::::1;10851:21:1::0;10908:2;10888:18;;;10881:30;10947:23;10927:18;;;10920:51;10988:18;;35881:49:0::1;10667:345:1::0;35881:49:0::1;36081:28;::::0;8157:66:1;36098:10:0::1;8144:2:1::0;8140:15;8136:88;36081:28:0::1;::::0;::::1;8124:101:1::0;36056:12:0::1;::::0;8241::1;;36081:28:0::1;;;;;;;;;;;;36071:39;;;;;;36056:54;;36129:26;36136:4;36142:12;;36129:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36129:6:0::1;::::0;-1:-1:-1;;;36129:26:0:i:1;:::-;36121:55;;;::::0;-1:-1:-1;;;36121:55:0;;11219:2:1;36121:55:0::1;::::0;::::1;11201:21:1::0;11258:2;11238:18;;;11231:30;11297:18;11277;;;11270:46;11333:18;;36121:55:0::1;11017:340:1::0;36121:55:0::1;36189:19;36211:13;32892:7:::0;:14;;32804:110;36211:13:::1;36301:10;36235:22;36279:33:::0;;;:21:::1;:33;::::0;;;;;36260:16:::1;::::0;36189:35;;-1:-1:-1;36235:22:0;;36260:52:::1;::::0;36279:33:::1;;::::0;36260:52:::1;:::i;:::-;36235:77;;36348:14;36333:11;:29;;36325:66;;;::::0;-1:-1:-1;;;36325:66:0;;11883:2:1;36325:66:0::1;::::0;::::1;11865:21:1::0;11922:2;11902:18;;;11895:30;11961:26;11941:18;;;11934:54;12005:18;;36325:66:0::1;11681:348:1::0;36325:66:0::1;34099:10:::0;;36410:25:::1;36424:11:::0;36410;:25:::1;:::i;:::-;:44;;36402:106;;;::::0;-1:-1:-1;;;36402:106:0;;12369:2:1;36402:106:0::1;::::0;::::1;12351:21:1::0;12408:2;12388:18;;;12381:30;12447:34;12427:18;;;12420:62;12518:19;12498:18;;;12491:47;12555:19;;36402:106:0::1;12167:413:1::0;36402:106:0::1;36548:11;36540:5;;:19;;;;:::i;:::-;36527:9;:32;;36519:70;;;::::0;-1:-1:-1;;;36519:70:0;;13020:2:1;36519:70:0::1;::::0;::::1;13002:21:1::0;13059:2;13039:18;;;13032:30;13098:26;13078:18;;;13071:54;13142:18;;36519:70:0::1;12818:348:1::0;36519:70:0::1;36624:10;36602:33;::::0;;;:21:::1;:33;::::0;;;;:55;;36645:11;;36602:33;:55:::1;::::0;36645:11;;36602:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36674:9;36670:105;36693:11;36689:1;:15;36670:105;;;36725:38;36735:10;36747:15;36761:1:::0;36747:11;:15:::1;:::i;:::-;36725:9;:38::i;:::-;36706:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36670:105;;;-1:-1:-1::0;;6615:1:0;7567:7;:22;-1:-1:-1;;;;;35765:1017:0:o;38740:145::-;38835:42;38856:5;38863:3;38868:8;38835:20;:42::i;31874:500::-;31963:15;32007:24;32025:5;32007:17;:24::i;:::-;31999:5;:32;31991:67;;;;-1:-1:-1;;;31991:67:0;;13782:2:1;31991:67:0;;;13764:21:1;13821:2;13801:18;;;13794:30;13860:24;13840:18;;;13833:52;13902:18;;31991:67:0;13580:346:1;31991:67:0;32069:10;32095:6;32090:226;32107:7;:14;32103:18;;32090:226;;;32156:7;32164:1;32156:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;32147:19:0;;;32156:10;;32147:19;32143:162;;;32200:5;32191;:14;32187:102;;;32236:1;-1:-1:-1;32229:8:0;;-1:-1:-1;32229:8:0;32187:102;32282:7;;;:::i;:::-;;;32187:102;32123:3;;;:::i;:::-;;;32090:226;;;-1:-1:-1;32326:40:0;;-1:-1:-1;;;32326:40:0;;13782:2:1;32326:40:0;;;13764:21:1;13821:2;13801:18;;;13794:30;13860:24;13840:18;;;13833:52;13902:18;;32326:40:0;13580:346:1;38135:124:0;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;38217:16:::1;:34:::0;38135:124::o;34565:91::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;34636:12:::1;::::0;;34620:28;;::::1;34636:12;::::0;;;::::1;;;34635:13;34620:28:::0;;::::1;;::::0;;34565:91::o;37536:114::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;37594:47:::1;::::0;37602:10:::1;::::0;37619:21:::1;37594:47:::0;::::1;;;::::0;::::1;::::0;;;37619:21;37602:10;37594:47;::::1;;;;;;37586:56;;;::::0;::::1;;37536:114::o:0;37890:126::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;37977:11:::1;:31:::0;37890:126::o;27435:185::-;27573:39;27590:4;27596:2;27600:7;27573:39;;;;;;;;;;;;:16;:39::i;32920:194::-;32995:7;33031:24;32892:7;:14;;32804:110;33031:24;33023:5;:32;33015:68;;;;-1:-1:-1;;;33015:68:0;;14322:2:1;33015:68:0;;;14304:21:1;14361:2;14341:18;;;14334:30;14400:25;14380:18;;;14373:53;14443:18;;33015:68:0;14120:347:1;33015:68:0;-1:-1:-1;33101:5:0;32920:194::o;38628:104::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;38703:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;38628:104:::0;:::o;25513:239::-;25585:7;25605:13;25621:7;25629;25621:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;25621:16:0;;-1:-1:-1;25656:19:0;25648:73;;;;-1:-1:-1;;;25648:73:0;;14674:2:1;25648:73:0;;;14656:21:1;14713:2;14693:18;;;14686:30;14752:34;14732:18;;;14725:62;14823:11;14803:18;;;14796:39;14852:19;;25648:73:0;14472:405:1;38024:103:0;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;38096:10:::1;:23:::0;38024:103::o;25085:422::-;25157:7;-1:-1:-1;;;;;25185:19:0;;25177:74;;;;-1:-1:-1;;;25177:74:0;;15084:2:1;25177:74:0;;;15066:21:1;15123:2;15103:18;;;15096:30;15162:34;15142:18;;;15135:62;15233:12;15213:18;;;15206:40;15263:19;;25177:74:0;14882:406:1;25177:74:0;25301:7;:14;25262:10;;;25326:127;25347:6;25343:1;:10;25326:127;;;25388:7;25396:1;25388:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;25379:19:0;;;25388:10;;25379:19;25375:67;;;25419:7;;;:::i;:::-;;;25375:67;25355:3;;;:::i;:::-;;;25326:127;;;-1:-1:-1;25494:5:0;;25085:422;-1:-1:-1;;;25085:422:0:o;2386:94::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;2451:21:::1;2469:1;2451:9;:21::i;34353:96::-:0;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;34421:10:::1;:20:::0;34353:96::o;32380:418::-;32439:16;32480:24;32498:5;32480:17;:24::i;:::-;32476:1;:28;32468:63;;;;-1:-1:-1;;;32468:63:0;;13782:2:1;32468:63:0;;;13764:21:1;13821:2;13801:18;;;13794:30;13860:24;13840:18;;;13833:52;13902:18;;32468:63:0;13580:346:1;32468:63:0;32542:18;32563:16;32573:5;32563:9;:16::i;:::-;32542:37;;32590:25;32632:10;32618:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32618:25:0;;32590:53;;32659:9;32654:111;32678:10;32674:1;:14;32654:111;;;32724:29;32744:5;32751:1;32724:19;:29::i;:::-;32710:8;32719:1;32710:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;32690:3;;;;:::i;:::-;;;;32654:111;;;-1:-1:-1;32782:8:0;32380:418;-1:-1:-1;;;32380:418:0:o;37658:92::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;37725:5:::1;:17:::0;37658:92::o;25864:104::-;25920:13;25953:7;25946:14;;;;;:::i;35114:643::-;6659:1;7255:7;;:19;;7247:63;;;;-1:-1:-1;;;7247:63:0;;10509:2:1;7247:63:0;;;10491:21:1;10548:2;10528:18;;;10521:30;10587:33;10567:18;;;10560:61;10638:18;;7247:63:0;10307:355:1;7247:63:0;6659:1;7388:7;:18;35198:12:::1;::::0;::::1;::::0;::::1;;;35190:43;;;::::0;-1:-1:-1;;;35190:43:0;;15495:2:1;35190:43:0::1;::::0;::::1;15477:21:1::0;15534:2;15514:18;;;15507:30;15573:20;15553:18;;;15546:48;15611:18;;35190:43:0::1;15293:342:1::0;35190:43:0::1;35266:1;35252:11;:15;35244:61;;;::::0;-1:-1:-1;;;35244:61:0;;15842:2:1;35244:61:0::1;::::0;::::1;15824:21:1::0;;;15861:18;;;15854:30;15920:34;15900:18;;;15893:62;15972:18;;35244:61:0::1;15640:356:1::0;35244:61:0::1;35339:13;;35324:11;:28;;35316:74;;;::::0;-1:-1:-1;;;35316:74:0;;16203:2:1;35316:74:0::1;::::0;::::1;16185:21:1::0;;;16222:18;;;16215:30;16281:34;16261:18;;;16254:62;16333:18;;35316:74:0::1;16001:356:1::0;35316:74:0::1;35403:19;35425:13;32892:7:::0;:14;;32804:110;35425:13:::1;35403:35;;35488:15;34099:10:::0;;;34016:101;35488:15:::1;35459:25;35473:11:::0;35459;:25:::1;:::i;:::-;:44;;35451:107;;;::::0;-1:-1:-1;;;35451:107:0;;12369:2:1;35451:107:0::1;::::0;::::1;12351:21:1::0;12408:2;12388:18;;;12381:30;12447:34;12427:18;;;12420:62;12518:19;12498:18;;;12491:47;12555:19;;35451:107:0::1;12167:413:1::0;35451:107:0::1;35598:11;35590:5;;:19;;;;:::i;:::-;35577:9;:32;;35569:61;;;::::0;-1:-1:-1;;;35569:61:0;;16564:2:1;35569:61:0::1;::::0;::::1;16546:21:1::0;16603:2;16583:18;;;16576:30;16642:17;16622:18;;;16615:45;16677:18;;35569:61:0::1;16362:339:1::0;35569:61:0::1;35648:9;35643:107;35667:11;35663:1;:15;35643:107;;;35700:38;35710:10;35722:15;35736:1:::0;35722:11;:15:::1;:::i;35700:38::-;35680:3:::0;::::1;::::0;::::1;:::i;:::-;;;;35643:107;;;-1:-1:-1::0;;6615:1:0;7567:7;:22;-1:-1:-1;35114:643:0:o;26619:295::-;-1:-1:-1;;;;;26722:24:0;;687:10;26722:24;;26714:62;;;;-1:-1:-1;;;26714:62:0;;16908:2:1;26714:62:0;;;16890:21:1;16947:2;16927:18;;;16920:30;16986:27;16966:18;;;16959:55;17031:18;;26714:62:0;16706:349:1;26714:62:0;687:10;26789:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26789:42:0;;;;;;;;;;;;:53;;;;;;;;;;;;;26858:48;;586:41:1;;;26789:42:0;;687:10;26858:48;;559:18:1;26858:48:0;;;;;;;26619:295;;:::o;34664:442::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;34758:1:::1;34744:11;:15;34736:61;;;::::0;-1:-1:-1;;;34736:61:0;;15842:2:1;34736:61:0::1;::::0;::::1;15824:21:1::0;;;15861:18;;;15854:30;15920:34;15900:18;;;15893:62;15972:18;;34736:61:0::1;15640:356:1::0;34736:61:0::1;34808:19;34830:13;32892:7:::0;:14;;32804:110;34830:13:::1;34808:35;;34912:11;;34894:15;34099:10:::0;;;34016:101;34894:15:::1;:29;;;;:::i;:::-;34864:25;34878:11:::0;34864;:25:::1;:::i;:::-;:60;;34856:123;;;::::0;-1:-1:-1;;;34856:123:0;;12369:2:1;34856:123:0::1;::::0;::::1;12351:21:1::0;12408:2;12388:18;;;12381:30;12447:34;12427:18;;;12420:62;12518:19;12498:18;;;12491:47;12555:19;;34856:123:0::1;12167:413:1::0;34856:123:0::1;34997:9;34992:107;35016:11;35012:1;:15;34992:107;;;35049:38;35059:10;35071:15;35085:1:::0;35071:11;:15:::1;:::i;35049:38::-;35029:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34992:107;;38893:180:::0;39012:53;39037:5;39044:3;39049:8;39059:5;39012:24;:53::i;:::-;38893:180;;;;:::o;38267:353::-;38343:13;38377:17;38385:8;38377:7;:17::i;:::-;38369:63;;;;-1:-1:-1;;;38369:63:0;;17262:2:1;38369:63:0;;;17244:21:1;17301:2;17281:18;;;17274:30;17340:34;17320:18;;;17313:62;17411:3;17391:18;;;17384:31;17432:19;;38369:63:0;17060:397:1;38369:63:0;38443:28;38474:10;:8;:10::i;:::-;38443:41;;38533:1;38508:14;38502:28;:32;:110;;;;;;;;;;;;;;;;;38561:14;38577:19;:8;:17;:19::i;:::-;38544:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38502:110;38495:117;38267:353;-1:-1:-1;;;38267:353:0:o;2635:192::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;-1:-1:-1;;;;;2724:22:0;::::1;2716:73;;;::::0;-1:-1:-1;;;2716:73:0;;18306:2:1;2716:73:0::1;::::0;::::1;18288:21:1::0;18345:2;18325:18;;;18318:30;18384:34;18364:18;;;18357:62;18455:8;18435:18;;;18428:36;18481:19;;2716:73:0::1;18104:402:1::0;2716:73:0::1;2800:19;2810:8;2800:9;:19::i;:::-;2635:192:::0;:::o;34457:100::-;1808:6;;-1:-1:-1;;;;;1808:6:0;687:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;9321:2:1;1947:68:0;;;9303:21:1;;;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9451:18;;1947:68:0;9119:356:1;1947:68:0;34534:15:::1;::::0;;34515:34;;::::1;34534:15;::::0;;::::1;34533:16;34515:34;::::0;;34457:100::o;24786:293::-;24888:4;24921:40;;;24936:25;24921:40;;:101;;-1:-1:-1;24974:48:0;;;24989:33;24974:48;24921:101;:150;;;-1:-1:-1;24287:25:0;24272:40;;;;25035:36;24163:157;36790:738;36867:4;36905;36867;36920:483;36944:5;:12;36940:1;:16;36920:483;;;36974:20;36997:5;37003:1;36997:8;;;;;;;;:::i;:::-;;;;;;;36974:31;;37038:12;37022;:28;37018:376;;37163:44;;;;;;18668:19:1;;;18703:12;;;18696:28;;;18740:12;;37163:44:0;;;;;;;;;;;;37153:55;;;;;;37138:70;;37018:376;;;37337:44;;;;;;18668:19:1;;;18703:12;;;18696:28;;;18740:12;;37337:44:0;;;;;;;;;;;;37327:55;;;;;;37312:70;;37018:376;-1:-1:-1;36958:3:0;;;;:::i;:::-;;;;36920:483;;;-1:-1:-1;37510:10:0;;37494:26;;36790:738;-1:-1:-1;;;36790:738:0:o;28281:155::-;28380:7;:14;28346:4;;28370:24;;:58;;;;;28426:1;-1:-1:-1;;;;;28398:30:0;:7;28406;28398:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28398:16:0;:30;;28363:65;28281:155;-1:-1:-1;;28281:155:0:o;30454:175::-;30529:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;30529:29:0;;;;;;;;:24;;30583;30529;30583:15;:24::i;:::-;-1:-1:-1;;;;;30574:47:0;;;;;;;;;;;30454:175;;:::o;28797:110::-;28873:26;28883:2;28887:7;28873:26;;;;;;;;;;;;:9;:26::i;27090:339::-;27285:41;687:10;27318:7;27285:18;:41::i;:::-;27277:103;;;;-1:-1:-1;;;27277:103:0;;18965:2:1;27277:103:0;;;18947:21:1;19004:2;18984:18;;;18977:30;19043:34;19023:18;;;19016:62;19114:19;19094:18;;;19087:47;19151:19;;27277:103:0;18763:413:1;27277:103:0;27393:28;27403:4;27409:2;27413:7;27393:9;:28::i;2835:173::-;2910:6;;;-1:-1:-1;;;;;2927:17:0;;;;;;;;;;;2960:40;;2910:6;;;2927:17;2910:6;;2960:40;;2891:16;;2960:40;2880:128;2835:173;:::o;27626:328::-;27801:41;687:10;27834:7;27801:18;:41::i;:::-;27793:103;;;;-1:-1:-1;;;27793:103:0;;18965:2:1;27793:103:0;;;18947:21:1;19004:2;18984:18;;;18977:30;19043:34;19023:18;;;19016:62;19114:19;19094:18;;;19087:47;19151:19;;27793:103:0;18763:413:1;27793:103:0;27907:39;27921:4;27927:2;27931:7;27940:5;27907:13;:39::i;33909:99::-;33960:13;33993:7;33986:14;;;;;:::i;3245:723::-;3301:13;3522:10;3518:53;;-1:-1:-1;;3549:10:0;;;;;;;;;;;;;;;;;;3245:723::o;3518:53::-;3596:5;3581:12;3637:78;3644:9;;3637:78;;3670:8;;;;:::i;:::-;;-1:-1:-1;3693:10:0;;-1:-1:-1;3701:2:0;3693:10;;:::i;:::-;;;3637:78;;;3725:19;3757:6;3747:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3747:17:0;;3725:39;;3775:154;3782:10;;3775:154;;3809:11;3819:1;3809:11;;:::i;:::-;;-1:-1:-1;3878:10:0;3886:2;3878:5;:10;:::i;:::-;3865:24;;:2;:24;:::i;:::-;3852:39;;3835:6;3842;3835:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3906:11:0;3915:2;3906:11;;:::i;:::-;;;3775:154;;28913:321;29043:18;29049:2;29053:7;29043:5;:18::i;:::-;29094:54;29125:1;29129:2;29133:7;29142:5;29094:22;:54::i;:::-;29072:154;;;;-1:-1:-1;;;29072:154:0;;19814:2:1;29072:154:0;;;19796:21:1;19853:2;19833:18;;;19826:30;19892:34;19872:18;;;19865:62;19963:20;19943:18;;;19936:48;20001:19;;29072:154:0;19612:414:1;28442:349:0;28535:4;28560:16;28568:7;28560;:16::i;:::-;28552:73;;;;-1:-1:-1;;;28552:73:0;;20233:2:1;28552:73:0;;;20215:21:1;20272:2;20252:18;;;20245:30;20311:34;20291:18;;;20284:62;20382:14;20362:18;;;20355:42;20414:19;;28552:73:0;20031:408:1;28552:73:0;28636:13;28652:24;28668:7;28652:15;:24::i;:::-;28636:40;;28706:5;-1:-1:-1;;;;;28695:16:0;:7;-1:-1:-1;;;;;28695:16:0;;:51;;;;28739:7;-1:-1:-1;;;;;28715:31:0;:20;28727:7;28715:11;:20::i;:::-;-1:-1:-1;;;;;28715:31:0;;28695:51;:87;;;-1:-1:-1;;;;;;27041:25:0;;;27017:4;27041:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28750:32;26920:164;29931:517;30091:4;-1:-1:-1;;;;;30063:32:0;:24;30079:7;30063:15;:24::i;:::-;-1:-1:-1;;;;;30063:32:0;;30055:86;;;;-1:-1:-1;;;30055:86:0;;20646:2:1;30055:86:0;;;20628:21:1;20685:2;20665:18;;;20658:30;20724:34;20704:18;;;20697:62;20795:11;20775:18;;;20768:39;20824:19;;30055:86:0;20444:405:1;30055:86:0;-1:-1:-1;;;;;30160:16:0;;30152:65;;;;-1:-1:-1;;;30152:65:0;;21056:2:1;30152:65:0;;;21038:21:1;21095:2;21075:18;;;21068:30;21134:34;21114:18;;;21107:62;21205:6;21185:18;;;21178:34;21229:19;;30152:65:0;20854:400:1;30152:65:0;30334:29;30351:1;30355:7;30334:8;:29::i;:::-;30393:2;30374:7;30382;30374:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;-1:-1:-1;;;;;30374:21:0;;;;;;30413:27;;30432:7;;30413:27;;;;;;;;;;30374:16;30413:27;29931:517;;;:::o;27960:315::-;28117:28;28127:4;28133:2;28137:7;28117:9;:28::i;:::-;28164:48;28187:4;28193:2;28197:7;28206:5;28164:22;:48::i;:::-;28156:111;;;;-1:-1:-1;;;28156:111:0;;19814:2:1;28156:111:0;;;19796:21:1;19853:2;19833:18;;;19826:30;19892:34;19872:18;;;19865:62;19963:20;19943:18;;;19936:48;20001:19;;28156:111:0;19612:414:1;29240:346:0;-1:-1:-1;;;;;29320:16:0;;29312:61;;;;-1:-1:-1;;;29312:61:0;;21461:2:1;29312:61:0;;;21443:21:1;;;21480:18;;;21473:30;21539:34;21519:18;;;21512:62;21591:18;;29312:61:0;21259:356:1;29312:61:0;29393:16;29401:7;29393;:16::i;:::-;29392:17;29384:58;;;;-1:-1:-1;;;29384:58:0;;21822:2:1;29384:58:0;;;21804:21:1;21861:2;21841:18;;;21834:30;21900;21880:18;;;21873:58;21948:18;;29384:58:0;21620:352:1;29384:58:0;29511:7;:16;;;;;;;-1:-1:-1;29511:16:0;;;;;;;;;-1:-1:-1;;;;;29511:16:0;;;;;;;;29545:33;;29570:7;;-1:-1:-1;29545:33:0;;-1:-1:-1;;29545:33:0;29240:346;;:::o;30635:799::-;30790:4;-1:-1:-1;;;;;30811:13:0;;16451:20;16499:8;30807:620;;30847:72;;;;;-1:-1:-1;;;;;30847:36:0;;;;;:72;;687:10;;30898:4;;30904:7;;30913:5;;30847:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30847:72:0;;;;;;;;-1:-1:-1;;30847:72:0;;;;;;;;;;;;:::i;:::-;;;30843:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31089:13:0;;31085:272;;31132:60;;-1:-1:-1;;;31132:60:0;;19814:2:1;31132:60:0;;;19796:21:1;19853:2;19833:18;;;19826:30;19892:34;19872:18;;;19865:62;19963:20;19943:18;;;19936:48;20001:19;;31132:60:0;19612:414:1;31085:272:0;31307:6;31301:13;31292:6;31288:2;31284:15;31277:38;30843:529;30970:51;;30980:41;30970:51;;-1:-1:-1;30963:58:0;;30807:620;-1:-1:-1;31411:4:0;30635:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:367::-;701:8;711:6;765:3;758:4;750:6;746:17;742:27;732:55;;783:1;780;773:12;732:55;-1:-1:-1;806:20:1;;849:18;838:30;;835:50;;;881:1;878;871:12;835:50;918:4;910:6;906:17;894:29;;978:3;971:4;961:6;958:1;954:14;946:6;942:27;938:38;935:47;932:67;;;995:1;992;985:12;932:67;638:367;;;;;:::o;1010:437::-;1096:6;1104;1157:2;1145:9;1136:7;1132:23;1128:32;1125:52;;;1173:1;1170;1163:12;1125:52;1213:9;1200:23;1246:18;1238:6;1235:30;1232:50;;;1278:1;1275;1268:12;1232:50;1317:70;1379:7;1370:6;1359:9;1355:22;1317:70;:::i;:::-;1406:8;;1291:96;;-1:-1:-1;1010:437:1;-1:-1:-1;;;;1010:437:1:o;1452:258::-;1524:1;1534:113;1548:6;1545:1;1542:13;1534:113;;;1624:11;;;1618:18;1605:11;;;1598:39;1570:2;1563:10;1534:113;;;1665:6;1662:1;1659:13;1656:48;;;-1:-1:-1;;1700:1:1;1682:16;;1675:27;1452:258::o;1715:317::-;1757:3;1795:5;1789:12;1822:6;1817:3;1810:19;1838:63;1894:6;1887:4;1882:3;1878:14;1871:4;1864:5;1860:16;1838:63;:::i;:::-;1946:2;1934:15;-1:-1:-1;;1930:88:1;1921:98;;;;2021:4;1917:109;;1715:317;-1:-1:-1;;1715:317:1:o;2037:220::-;2186:2;2175:9;2168:21;2149:4;2206:45;2247:2;2236:9;2232:18;2224:6;2206:45;:::i;2262:180::-;2321:6;2374:2;2362:9;2353:7;2349:23;2345:32;2342:52;;;2390:1;2387;2380:12;2342:52;-1:-1:-1;2413:23:1;;2262:180;-1:-1:-1;2262:180:1:o;2678:196::-;2746:20;;-1:-1:-1;;;;;2795:54:1;;2785:65;;2775:93;;2864:1;2861;2854:12;2775:93;2678:196;;;:::o;2879:254::-;2947:6;2955;3008:2;2996:9;2987:7;2983:23;2979:32;2976:52;;;3024:1;3021;3014:12;2976:52;3047:29;3066:9;3047:29;:::i;:::-;3037:39;3123:2;3108:18;;;;3095:32;;-1:-1:-1;;;2879:254:1:o;3138:505::-;3233:6;3241;3249;3302:2;3290:9;3281:7;3277:23;3273:32;3270:52;;;3318:1;3315;3308:12;3270:52;3354:9;3341:23;3331:33;;3415:2;3404:9;3400:18;3387:32;3442:18;3434:6;3431:30;3428:50;;;3474:1;3471;3464:12;3428:50;3513:70;3575:7;3566:6;3555:9;3551:22;3513:70;:::i;:::-;3138:505;;3602:8;;-1:-1:-1;3487:96:1;;-1:-1:-1;;;;3138:505:1:o;3830:328::-;3907:6;3915;3923;3976:2;3964:9;3955:7;3951:23;3947:32;3944:52;;;3992:1;3989;3982:12;3944:52;4015:29;4034:9;4015:29;:::i;:::-;4005:39;;4063:38;4097:2;4086:9;4082:18;4063:38;:::i;:::-;4053:48;;4148:2;4137:9;4133:18;4120:32;4110:42;;3830:328;;;;;:::o;4163:186::-;4222:6;4275:2;4263:9;4254:7;4250:23;4246:32;4243:52;;;4291:1;4288;4281:12;4243:52;4314:29;4333:9;4314:29;:::i;4543:184::-;4595:77;4592:1;4585:88;4692:4;4689:1;4682:15;4716:4;4713:1;4706:15;4732:691;4797:5;4827:18;4868:2;4860:6;4857:14;4854:40;;;4874:18;;:::i;:::-;5008:2;5002:9;5074:2;5062:15;;-1:-1:-1;;5058:24:1;;;5084:2;5054:33;5050:42;5038:55;;;5108:18;;;5128:22;;;5105:46;5102:72;;;5154:18;;:::i;:::-;5194:10;5190:2;5183:22;5223:6;5214:15;;5253:6;5245;5238:22;5293:3;5284:6;5279:3;5275:16;5272:25;5269:45;;;5310:1;5307;5300:12;5269:45;5360:6;5355:3;5348:4;5340:6;5336:17;5323:44;5415:1;5408:4;5399:6;5391;5387:19;5383:30;5376:41;;;;4732:691;;;;;:::o;5428:451::-;5497:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:52;;;5566:1;5563;5556:12;5518:52;5606:9;5593:23;5639:18;5631:6;5628:30;5625:50;;;5671:1;5668;5661:12;5625:50;5694:22;;5747:4;5739:13;;5735:27;-1:-1:-1;5725:55:1;;5776:1;5773;5766:12;5725:55;5799:74;5865:7;5860:2;5847:16;5842:2;5838;5834:11;5799:74;:::i;6069:632::-;6240:2;6292:21;;;6362:13;;6265:18;;;6384:22;;;6211:4;;6240:2;6463:15;;;;6437:2;6422:18;;;6211:4;6506:169;6520:6;6517:1;6514:13;6506:169;;;6581:13;;6569:26;;6650:15;;;;6615:12;;;;6542:1;6535:9;6506:169;;;-1:-1:-1;6692:3:1;;6069:632;-1:-1:-1;;;;;;6069:632:1:o;6706:347::-;6771:6;6779;6832:2;6820:9;6811:7;6807:23;6803:32;6800:52;;;6848:1;6845;6838:12;6800:52;6871:29;6890:9;6871:29;:::i;:::-;6861:39;;6950:2;6939:9;6935:18;6922:32;6997:5;6990:13;6983:21;6976:5;6973:32;6963:60;;7019:1;7016;7009:12;6963:60;7042:5;7032:15;;;6706:347;;;;;:::o;7058:667::-;7153:6;7161;7169;7177;7230:3;7218:9;7209:7;7205:23;7201:33;7198:53;;;7247:1;7244;7237:12;7198:53;7270:29;7289:9;7270:29;:::i;:::-;7260:39;;7318:38;7352:2;7341:9;7337:18;7318:38;:::i;:::-;7308:48;;7403:2;7392:9;7388:18;7375:32;7365:42;;7458:2;7447:9;7443:18;7430:32;7485:18;7477:6;7474:30;7471:50;;;7517:1;7514;7507:12;7471:50;7540:22;;7593:4;7585:13;;7581:27;-1:-1:-1;7571:55:1;;7622:1;7619;7612:12;7571:55;7645:74;7711:7;7706:2;7693:16;7688:2;7684;7680:11;7645:74;:::i;:::-;7635:84;;;7058:667;;;;;;;:::o;7730:260::-;7798:6;7806;7859:2;7847:9;7838:7;7834:23;7830:32;7827:52;;;7875:1;7872;7865:12;7827:52;7898:29;7917:9;7898:29;:::i;:::-;7888:39;;7946:38;7980:2;7969:9;7965:18;7946:38;:::i;:::-;7936:48;;7730:260;;;;;:::o;8264:437::-;8343:1;8339:12;;;;8386;;;8407:61;;8461:4;8453:6;8449:17;8439:27;;8407:61;8514:2;8506:6;8503:14;8483:18;8480:38;8477:218;;;8551:77;8548:1;8541:88;8652:4;8649:1;8642:15;8680:4;8677:1;8670:15;8477:218;;8264:437;;;:::o;11362:184::-;11414:77;11411:1;11404:88;11511:4;11508:1;11501:15;11535:4;11532:1;11525:15;11551:125;11591:4;11619:1;11616;11613:8;11610:34;;;11624:18;;:::i;:::-;-1:-1:-1;11661:9:1;;11551:125::o;12034:128::-;12074:3;12105:1;12101:6;12098:1;12095:13;12092:39;;;12111:18;;:::i;:::-;-1:-1:-1;12147:9:1;;12034:128::o;12585:228::-;12625:7;12751:1;12683:66;12679:74;12676:1;12673:81;12668:1;12661:9;12654:17;12650:105;12647:131;;;12758:18;;:::i;:::-;-1:-1:-1;12798:9:1;;12585:228::o;13171:204::-;13209:3;13245:4;13242:1;13238:12;13277:4;13274:1;13270:12;13312:3;13306:4;13302:14;13297:3;13294:23;13291:49;;;13320:18;;:::i;:::-;13356:13;;13171:204;-1:-1:-1;;;13171:204:1:o;13380:195::-;13419:3;13450:66;13443:5;13440:77;13437:103;;;13520:18;;:::i;:::-;-1:-1:-1;13567:1:1;13556:13;;13380:195::o;13931:184::-;13983:77;13980:1;13973:88;14080:4;14077:1;14070:15;14104:4;14101:1;14094:15;17462:637;17742:3;17780:6;17774:13;17796:53;17842:6;17837:3;17830:4;17822:6;17818:17;17796:53;:::i;:::-;17912:13;;17871:16;;;;17934:57;17912:13;17871:16;17968:4;17956:17;;17934:57;:::i;:::-;18056:7;18013:20;;18042:22;;;18091:1;18080:13;;17462:637;-1:-1:-1;;;;17462:637:1:o;19181:184::-;19233:77;19230:1;19223:88;19330:4;19327:1;19320:15;19354:4;19351:1;19344:15;19370:120;19410:1;19436;19426:35;;19441:18;;:::i;:::-;-1:-1:-1;19475:9:1;;19370:120::o;19495:112::-;19527:1;19553;19543:35;;19558:18;;:::i;:::-;-1:-1:-1;19592:9:1;;19495:112::o;21977:512::-;22171:4;-1:-1:-1;;;;;22281:2:1;22273:6;22269:15;22258:9;22251:34;22333:2;22325:6;22321:15;22316:2;22305:9;22301:18;22294:43;;22373:6;22368:2;22357:9;22353:18;22346:34;22416:3;22411:2;22400:9;22396:18;22389:31;22437:46;22478:3;22467:9;22463:19;22455:6;22437:46;:::i;:::-;22429:54;21977:512;-1:-1:-1;;;;;;21977:512:1:o;22494:249::-;22563:6;22616:2;22604:9;22595:7;22591:23;22587:32;22584:52;;;22632:1;22629;22622:12;22584:52;22664:9;22658:16;22683:30;22707:5;22683:30;:::i

Swarm Source

ipfs://fb5d30d64e6c3aa71ea0a5ed6ea2a1ca05c5e808a3276ebf2e8d1cea8bdb95b2
Loading...
Loading
Loading...
Loading
[ 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.