ETH Price: $3,479.44 (+1.64%)
Gas: 12 Gwei

Token

DOI (Dragons Of Island)
 

Overview

Max Total Supply

805 Dragons Of Island

Holders

359

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
pablopa.eth
Balance
2 Dragons Of Island
0x158cb8db071f8565794c1ac689ad8f13b9b7e744
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Collection

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-19
*/

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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);
}

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;
}

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);
}

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);
}

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);
}

interface Token is IERC20 {
    function burn(address account, uint256 amount) external returns (bool);
}

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;
        // solhint-disable-next-line no-inline-assembly
        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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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);
    }
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string internal _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _tokenBaseURI;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

    function _setBaseURI(string memory baseURI_) internal virtual {
        _tokenBaseURI = baseURI_;
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.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);

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

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                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;
        }
    }

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

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract Collection is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public constant EGG = 1;
    uint256 public constant BABY = 2;
    uint256 public constant DRAGON = 3;

    uint256 public constant HATCH_REQ = 2;
    mapping(uint256 => uint256) public genesisType;
    mapping(uint256 => bool) public isHatched;

    uint256 public constant TOTAL_EGGS = 1420;
    uint256 public constant TOTAL_LIMIT = 4420;

    uint256 public constant BATCH_LIMIT = 2;
    uint256 public constant WHITELIST_WINDOW = 1 days;

    mapping(address => bool) public isWhitelisted;
    mapping(address => uint256) public isRestricted;
    mapping(address => uint256) public dragonsCount;

    uint256 public hatchEggPrice;
    uint256 public hatchDragonPrice;

    uint256 public activatedAt;
    bool public activatedEggs;
    bool public activatedDragons;

    //contract address of the ape only island yield token
    address public tokenAddress = 0x260428e36989ee6c6829F8a6E361cba99C7a8447;

    event ActivatedEggs(address indexed account, uint256 timestamp);
    event ActivatedDragons(address indexed account, uint256 timestamp);
    event DeactivatedEggs(address indexed account, uint256 timestamp);
    event Changed(address indexed account, uint256 id);

    event NewEgg(uint256 id);
    event NewDragon(uint256 id);

    constructor() ERC721("DOI", "Dragons Of Island") {
        _setBaseURI("https://doti.apeonlyisland.com/");
        hatchEggPrice = 50 ether;
        hatchDragonPrice = 50 ether;
    }

    function setWhitelist(address account) external onlyOwner returns (bool) {
        isWhitelisted[account] = true;
        return true;
    }

    function setWhitelistBatch(address[] calldata accounts)
        external
        onlyOwner
        returns (bool)
    {
        uint256 counter = accounts.length;
        for (uint256 i = 0; i < counter; i++) {
            isWhitelisted[accounts[i]] = true;
        }
        return true;
    }

    function setHatchDragonPrice(uint256 newPrice)
        external
        onlyOwner
        returns (bool)
    {
        hatchDragonPrice = newPrice;
        return true;
    }

    function setTokenAddress(address tokenAddressArg)
        external
        onlyOwner
        returns (bool)
    {
        tokenAddress = tokenAddressArg;
        return true;
    }

    function setBaseURI(string memory newURI)
        external
        onlyOwner
        returns (bool)
    {
        _setBaseURI(newURI);
        return true;
    }

    function activateEggs() external onlyOwner returns (bool) {
        require(!activatedEggs, "Collection: minting must be deactivated");

        activatedAt = block.timestamp;
        activatedEggs = true;

        emit ActivatedEggs(_msgSender(), block.timestamp);
        return true;
    }

    function deactivateEggs() external onlyOwner returns (bool) {
        require(activatedEggs, "Collection: minting must be activated");

        activatedEggs = false;

        emit DeactivatedEggs(_msgSender(), block.timestamp);
        return true;
    }

    function activateDragons() external onlyOwner returns (bool) {
        require(!activatedDragons, "Collection: minting must be deactivated");

        activatedDragons = true;

        emit ActivatedDragons(_msgSender(), block.timestamp);
        return true;
    }

    function whitelistMint(uint256 amount) external returns (bool) {
        require(
            activatedEggs,
            "Collection: minting must be not be deactivated"
        );

        require(
            block.timestamp < activatedAt + WHITELIST_WINDOW,
            "Collection: public minting have started"
        );

        address account = _msgSender();

        require(
            isWhitelisted[account],
            "Collection: account must be whitelisted"
        );

        require(
            isRestricted[account] + amount <= BATCH_LIMIT,
            "Collection: minted amount must not exceed limit"
        );

        require(
            amount <= BATCH_LIMIT,
            "Collection: minted amount must not exceed batch limit"
        );

        uint256 next = totalSupply() + 1;
        isRestricted[account] += amount;

        for (uint256 i = 0; i < amount; i++) {
            if (next <= TOTAL_EGGS) {
                _mint(account, next);
                genesisType[next] = EGG;
                emit NewEgg(next);
                next++;
            }
        }

        return true;
    }

    function publicMint(uint256 amount) external returns (bool) {
        require(activatedEggs, "Collection: minting must be activated");

        require(
            block.timestamp >= activatedAt + WHITELIST_WINDOW,
            "Collection: public minting not started"
        );

        require(
            amount <= BATCH_LIMIT,
            "Collection: minted amount must not exceed batch limit"
        );

        address account = _msgSender();

        require(
            isRestricted[account] + amount <= BATCH_LIMIT,
            "Collection: minted amount must not exceed limit"
        );

        uint256 current = totalSupply();

        require(
            current + amount <= TOTAL_EGGS,
            "Collection: supply must be available for minting"
        );

        isRestricted[account] += amount;

        for (uint256 i = 1; i <= amount; i++) {
            uint256 next = current + i;

            if (next <= TOTAL_EGGS) {
                genesisType[next] = EGG;
                _mint(account, next);
                emit NewEgg(next);
            }
        }

        return true;
    }

    function hatchEgg(uint256 tokenId) external returns (bool) {
        require(tokenAddress != address(0), "Collection: Shilling not enabled");

        require(
            !isHatched[tokenId],
            "Collection: egg must not be hatched already"
        );

        require(genesisType[tokenId] == EGG, "Collection: must be an egg");

        address account = _msgSender();

        uint256 _hatchEggPrice = hatchEggPrice;
        require(
            Token(tokenAddress).balanceOf(account) >= _hatchEggPrice,
            "Collection: not enough shilling"
        );

        Token(tokenAddress).burn(account, _hatchEggPrice);

        require(
            ownerOf(tokenId) == account,
            "Collection: account must be owner of token"
        );

        require(
            totalSupply() < TOTAL_LIMIT,
            "Collection: must not exceed the total supply"
        );

        uint256 next = totalSupply() + 1;
        _mint(account, next);
        isHatched[tokenId] = true;
        genesisType[next] = DRAGON;
        dragonsCount[account] += 1;
        emit NewDragon(next);

        return true;
    }

    function hatchDragon() external returns (bool) {
        require(
            activatedDragons,
            "Collection: minting must be not be deactivated"
        );

        require(tokenAddress != address(0), "Collection: Shilling not enabled");

        address account = _msgSender();

        uint256 _hatchDragonPrice = hatchDragonPrice;
        require(
            Token(tokenAddress).balanceOf(account) >= _hatchDragonPrice,
            "Collection: not enough shilling"
        );

        Token(tokenAddress).burn(account, _hatchDragonPrice);

        require(
            dragonsCount[account] >= HATCH_REQ,
            "Collection: must own 2 adult dragons to mint a baby dragon"
        );

        require(
            totalSupply() < TOTAL_LIMIT,
            "Collection: must not exceed the total supply"
        );

        uint256 next = totalSupply() + 1;
        _mint(account, next);
        genesisType[next] = BABY;
        emit NewDragon(next);

        return true;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override {
        super._beforeTokenTransfer(from, to, tokenId);
        if (genesisType[tokenId] == DRAGON) {
            dragonsCount[from] -= 1;
            dragonsCount[to] += 1;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ActivatedDragons","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ActivatedEggs","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Changed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DeactivatedEggs","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"NewDragon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"NewEgg","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":[],"name":"BABY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BATCH_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DRAGON","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EGG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HATCH_REQ","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_EGGS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_WINDOW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateDragons","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activateEggs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activatedDragons","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activatedEggs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deactivateEggs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dragonsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"genesisType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hatchDragon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hatchDragonPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hatchEgg","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hatchEggPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isHatched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRestricted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setHatchDragonPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddressArg","type":"address"}],"name":"setTokenAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"setWhitelistBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526014805462010000600160b01b03191675260428e36989ee6c6829f8a6e361cba99c7a844700001790553480156200003b57600080fd5b506040805180820182526003815262444f4960e81b602080830191825283518085019094526011845270111c9859dbdb9cc813d988125cdb185b99607a1b908401528151919291620000909160009162000189565b508051620000a690600190602084019062000189565b505050620000c3620000bd6200011a60201b60201c565b6200011e565b60408051808201909152601f81527f68747470733a2f2f646f74692e6170656f6e6c7969736c616e642e636f6d2f006020820152620001029062000170565b6802b5e3af16b188000060118190556012556200026c565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516200018590600290602084019062000189565b5050565b82805462000197906200022f565b90600052602060002090601f016020900481019282620001bb576000855562000206565b82601f10620001d657805160ff191683800117855562000206565b8280016001018555821562000206579182015b8281111562000206578251825591602001919060010190620001e9565b506200021492915062000218565b5090565b5b8082111562000214576000815560010162000219565b600181811c908216806200024457607f821691505b602082108114156200026657634e487b7160e01b600052602260045260246000fd5b50919050565b613025806200027c6000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c806389f7e88611610182578063b361c21c116100e9578063dec2d438116100a2578063eca17e041161007c578063eca17e041461063f578063f2fde38b14610648578063f4148ee51461065b578063fe22dd851461050157600080fd5b8063dec2d43814610501578063e26e9a5f146105fb578063e985e9c51461060357600080fd5b8063b361c21c14610577578063b88d4fde1461057f578063c01bc98214610592578063c87b56dd146105b2578063ced3e3f1146105c5578063dd4bee4e146105e857600080fd5b80639d76ea581161013b5780639d76ea581461051a5780639d9a55d014610533578063a22cb4651461053d578063a9b97a0214610550578063ae2af4e31461055d578063afea86d71461056f57600080fd5b806389f7e886146104df5780638d289c18146104e85780638da5cb5b146104f05780639559c0bd1461050157806395d89b41146105095780639972923b1461051157600080fd5b80633af32abf11610241578063597be6d1116101fa57806370a08231116101d457806370a082311461049e578063715018a6146104b1578063854cff2f146104b9578063868ff4a2146104cc57600080fd5b8063597be6d1146104625780636352211e1461046b5780636ed9c44e1461047e57600080fd5b80633af32abf146103f6578063419973901461041957806342842e0e14610421578063482c3f7a146104345780634f6ccce71461043c57806355f804b31461044f57600080fd5b80631f55c9bc116102935780631f55c9bc1461038e5780632385554c1461039757806323b872dd146103aa57806326a4e8d2146103bd5780632db11544146103d05780632f745c59146103e357600080fd5b806301ffc9a7146102db57806306fdde0314610303578063081812fc146103185780630843629e14610343578063095ea7b31461037157806318160ddd14610386575b600080fd5b6102ee6102e9366004612a82565b61066e565b60405190151581526020015b60405180910390f35b61030b610699565b6040516102fa9190612bcf565b61032b610326366004612b05565b61072b565b6040516001600160a01b0390911681526020016102fa565b610363610351366004612889565b60106020526000908152604090205481565b6040519081526020016102fa565b61038461037f3660046129c6565b6107c5565b005b600954610363565b61036360115481565b6102ee6103a5366004612b05565b6108db565b6103846103b83660046128d7565b610cd3565b6102ee6103cb366004612889565b610d04565b6102ee6103de366004612b05565b610d5c565b6103636103f13660046129c6565b610f8b565b6102ee610404366004612889565b600e6020526000908152604090205460ff1681565b6102ee611021565b61038461042f3660046128d7565b6110b6565b6102ee6110d1565b61036361044a366004612b05565b611173565b6102ee61045d366004612abc565b611206565b61036360135481565b61032b610479366004612b05565b611244565b61036361048c366004612b05565b600c6020526000908152604090205481565b6103636104ac366004612889565b6112bb565b610384611342565b6102ee6104c7366004612889565b611378565b6102ee6104da366004612b05565b6113ce565b61036360125481565b6102ee61160a565b600b546001600160a01b031661032b565b610363600281565b61030b61192d565b61036361058c81565b60145461032b906201000090046001600160a01b031681565b6103636201518081565b61038461054b36600461298f565b61193c565b6014546102ee9060ff1681565b6014546102ee90610100900460ff1681565b610363600381565b6102ee61194b565b61038461058d366004612913565b6119f0565b6103636105a0366004612889565b600f6020526000908152604090205481565b61030b6105c0366004612b05565b611a28565b6102ee6105d3366004612b05565b600d6020526000908152604090205460ff1681565b6102ee6105f6366004612b05565b611b03565b610363600181565b6102ee6106113660046128a4565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61036361114481565b610384610656366004612889565b611b39565b6102ee6106693660046129f0565b611bd4565b60006001600160e01b0319821663780e9d6360e01b1480610693575061069382611c74565b92915050565b6060600080546106a890612ef3565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490612ef3565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166107a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006107d082611244565b9050806001600160a01b0316836001600160a01b0316141561083e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107a0565b336001600160a01b038216148061085a575061085a8133610611565b6108cc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107a0565b6108d68383611cc4565b505050565b6014546000906201000090046001600160a01b031661093c5760405162461bcd60e51b815260206004820181905260248201527f436f6c6c656374696f6e3a205368696c6c696e67206e6f7420656e61626c656460448201526064016107a0565b6000828152600d602052604090205460ff16156109af5760405162461bcd60e51b815260206004820152602b60248201527f436f6c6c656374696f6e3a20656767206d757374206e6f74206265206861746360448201526a68656420616c726561647960a81b60648201526084016107a0565b6000828152600c6020526040902054600114610a0d5760405162461bcd60e51b815260206004820152601a60248201527f436f6c6c656374696f6e3a206d75737420626520616e2065676700000000000060448201526064016107a0565b6000336011546014546040516370a0823160e01b81526001600160a01b038085166004830152939450919283926201000090920416906370a082319060240160206040518083038186803b158015610a6457600080fd5b505afa158015610a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9c9190612b1e565b1015610aea5760405162461bcd60e51b815260206004820152601f60248201527f436f6c6c656374696f6e3a206e6f7420656e6f756768207368696c6c696e670060448201526064016107a0565b601454604051632770a7eb60e21b81526001600160a01b038481166004830152602482018490526201000090920490911690639dc29fac90604401602060405180830381600087803b158015610b3f57600080fd5b505af1158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b779190612a65565b50816001600160a01b0316610b8b85611244565b6001600160a01b031614610bf45760405162461bcd60e51b815260206004820152602a60248201527f436f6c6c656374696f6e3a206163636f756e74206d757374206265206f776e65604482015269391037b3103a37b5b2b760b11b60648201526084016107a0565b611144610c0060095490565b10610c1d5760405162461bcd60e51b81526004016107a090612d0c565b6000610c2860095490565b610c33906001612e84565b9050610c3f8382611d32565b6000858152600d60209081526040808320805460ff19166001908117909155848452600c8352818420600390556001600160a01b038716845260109092528220805491929091610c90908490612e84565b90915550506040518181527f0c845ba78ab6a3b23bee713c5e5fb80d323487c9117354fd97e3cc5de73549949060200160405180910390a1506001949350505050565b610cdd3382611e80565b610cf95760405162461bcd60e51b81526004016107a090612da7565b6108d6838383611f77565b600b546000906001600160a01b03163314610d315760405162461bcd60e51b81526004016107a090612c89565b506014805462010000600160b01b031916620100006001600160a01b0384160217905560015b919050565b60145460009060ff16610d815760405162461bcd60e51b81526004016107a090612e3f565b62015180601354610d929190612e84565b421015610df05760405162461bcd60e51b815260206004820152602660248201527f436f6c6c656374696f6e3a207075626c6963206d696e74696e67206e6f7420736044820152651d185c9d195960d21b60648201526084016107a0565b6002821115610e115760405162461bcd60e51b81526004016107a090612c34565b336000818152600f6020526040902054600290610e2f908590612e84565b1115610e4d5760405162461bcd60e51b81526004016107a090612d58565b6000610e5860095490565b905061058c610e678583612e84565b1115610ece5760405162461bcd60e51b815260206004820152603060248201527f436f6c6c656374696f6e3a20737570706c79206d75737420626520617661696c60448201526f61626c6520666f72206d696e74696e6760801b60648201526084016107a0565b6001600160a01b0382166000908152600f602052604081208054869290610ef6908490612e84565b90915550600190505b848111610f80576000610f128284612e84565b905061058c8111610f6d576000818152600c6020526040902060019055610f398482611d32565b6040518181527f779dd44873917856823315b17cf30cf871834877ad11ffe2e3cf87711ab724279060200160405180910390a15b5080610f7881612f2e565b915050610eff565b506001949350505050565b6000610f96836112bb565b8210610ff85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107a0565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600b546000906001600160a01b0316331461104e5760405162461bcd60e51b81526004016107a090612c89565b60145460ff166110705760405162461bcd60e51b81526004016107a090612e3f565b6014805460ff1916905560405142815233907f363cc24f67682de95b5cac47c3522d03b5548743e0ea23d56ee15240d1c7d69f906020015b60405180910390a250600190565b6108d6838383604051806020016040528060008152506119f0565b600b546000906001600160a01b031633146110fe5760405162461bcd60e51b81526004016107a090612c89565b60145460ff16156111215760405162461bcd60e51b81526004016107a090612df8565b426013556014805460ff191660011790556111393390565b6001600160a01b03167fcecb2d28e744503a7a03dcbe6202f5e71cc2271193a6dbbfc8d2b2a79d3f9652426040516110a891815260200190565b600061117e60095490565b82106111e15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107a0565b600982815481106111f4576111f4612f9f565b90600052602060002001549050919050565b600b546000906001600160a01b031633146112335760405162461bcd60e51b81526004016107a090612c89565b61123c82612122565b506001919050565b6000818152600360205260408120546001600160a01b0316806106935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107a0565b60006001600160a01b0382166113265760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107a0565b506001600160a01b031660009081526004602052604090205490565b600b546001600160a01b0316331461136c5760405162461bcd60e51b81526004016107a090612c89565b6113766000612135565b565b600b546000906001600160a01b031633146113a55760405162461bcd60e51b81526004016107a090612c89565b506001600160a01b03166000908152600e60205260409020805460ff1916600190811790915590565b60145460009060ff166113f35760405162461bcd60e51b81526004016107a090612cbe565b620151806013546114049190612e84565b42106114625760405162461bcd60e51b815260206004820152602760248201527f436f6c6c656374696f6e3a207075626c6963206d696e74696e672068617665206044820152661cdd185c9d195960ca1b60648201526084016107a0565b336000818152600e602052604090205460ff166114d15760405162461bcd60e51b815260206004820152602760248201527f436f6c6c656374696f6e3a206163636f756e74206d7573742062652077686974604482015266195b1a5cdd195960ca1b60648201526084016107a0565b6001600160a01b0381166000908152600f60205260409020546002906114f8908590612e84565b11156115165760405162461bcd60e51b81526004016107a090612d58565b60028311156115375760405162461bcd60e51b81526004016107a090612c34565b600061154260095490565b61154d906001612e84565b6001600160a01b0383166000908152600f602052604081208054929350869290919061157a908490612e84565b90915550600090505b84811015610f805761058c82116115f85761159e8383611d32565b6000828152600c60205260409081902060019055517f779dd44873917856823315b17cf30cf871834877ad11ffe2e3cf87711ab72427906115e29084815260200190565b60405180910390a1816115f481612f2e565b9250505b8061160281612f2e565b915050611583565b601454600090610100900460ff166116345760405162461bcd60e51b81526004016107a090612cbe565b6014546201000090046001600160a01b03166116925760405162461bcd60e51b815260206004820181905260248201527f436f6c6c656374696f6e3a205368696c6c696e67206e6f7420656e61626c656460448201526064016107a0565b6000336012546014546040516370a0823160e01b81526001600160a01b038085166004830152939450919283926201000090920416906370a082319060240160206040518083038186803b1580156116e957600080fd5b505afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117219190612b1e565b101561176f5760405162461bcd60e51b815260206004820152601f60248201527f436f6c6c656374696f6e3a206e6f7420656e6f756768207368696c6c696e670060448201526064016107a0565b601454604051632770a7eb60e21b81526001600160a01b038481166004830152602482018490526201000090920490911690639dc29fac90604401602060405180830381600087803b1580156117c457600080fd5b505af11580156117d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fc9190612a65565b506001600160a01b0382166000908152601060205260409020546002111561188c5760405162461bcd60e51b815260206004820152603a60248201527f436f6c6c656374696f6e3a206d757374206f776e2032206164756c742064726160448201527f676f6e7320746f206d696e742061206261627920647261676f6e00000000000060648201526084016107a0565b61114461189860095490565b106118b55760405162461bcd60e51b81526004016107a090612d0c565b60006118c060095490565b6118cb906001612e84565b90506118d78382611d32565b6000818152600c60205260409081902060029055517f0c845ba78ab6a3b23bee713c5e5fb80d323487c9117354fd97e3cc5de73549949061191b9083815260200190565b60405180910390a16001935050505090565b6060600180546106a890612ef3565b611947338383612187565b5050565b600b546000906001600160a01b031633146119785760405162461bcd60e51b81526004016107a090612c89565b601454610100900460ff16156119a05760405162461bcd60e51b81526004016107a090612df8565b6014805461ff0019166101001790556119b63390565b6001600160a01b03167f2d3784bfc0919e5b9d23dd74c75d1607e8be7571ed09f352a552e25f0d73794f426040516110a891815260200190565b6119fa3383611e80565b611a165760405162461bcd60e51b81526004016107a090612da7565b611a2284848484612256565b50505050565b6000818152600360205260409020546060906001600160a01b0316611aa75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a0565b6000611ab1612289565b90506000815111611ad15760405180602001604052806000815250611afc565b80611adb84612298565b604051602001611aec929190612b63565b6040516020818303038152906040525b9392505050565b600b546000906001600160a01b03163314611b305760405162461bcd60e51b81526004016107a090612c89565b50601255600190565b600b546001600160a01b03163314611b635760405162461bcd60e51b81526004016107a090612c89565b6001600160a01b038116611bc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a0565b611bd181612135565b50565b600b546000906001600160a01b03163314611c015760405162461bcd60e51b81526004016107a090612c89565b8160005b81811015610f80576001600e6000878785818110611c2557611c25612f9f565b9050602002016020810190611c3a9190612889565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611c6c81612f2e565b915050611c05565b60006001600160e01b031982166380ac58cd60e01b1480611ca557506001600160e01b03198216635b5e139f60e01b145b8061069357506301ffc9a760e01b6001600160e01b0319831614610693565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cf982611244565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b038216611d885760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107a0565b6000818152600360205260409020546001600160a01b031615611ded5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107a0565b611df960008383612396565b6001600160a01b0382166000908152600460205260408120805460019290611e22908490612e84565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600360205260408120546001600160a01b0316611ef95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a0565b6000611f0483611244565b9050806001600160a01b0316846001600160a01b03161480611f3f5750836001600160a01b0316611f348461072b565b6001600160a01b0316145b80611f6f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f8a82611244565b6001600160a01b031614611ff25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107a0565b6001600160a01b0382166120545760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107a0565b61205f838383612396565b61206a600082611cc4565b6001600160a01b0383166000908152600460205260408120805460019290612093908490612eb0565b90915550506001600160a01b03821660009081526004602052604081208054600192906120c1908490612e84565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8051611947906002906020840190612763565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156121e95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107a0565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612261848484611f77565b61226d84848484612419565b611a225760405162461bcd60e51b81526004016107a090612be2565b6060600280546106a890612ef3565b6060816122bc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122e657806122d081612f2e565b91506122df9050600a83612e9c565b91506122c0565b60008167ffffffffffffffff81111561230157612301612fb5565b6040519080825280601f01601f19166020018201604052801561232b576020820181803683370190505b5090505b8415611f6f57612340600183612eb0565b915061234d600a86612f49565b612358906030612e84565b60f81b81838151811061236d5761236d612f9f565b60200101906001600160f81b031916908160001a90535061238f600a86612e9c565b945061232f565b6123a183838361251b565b6000818152600c6020526040902054600314156108d6576001600160a01b03831660009081526010602052604081208054600192906123e1908490612eb0565b90915550506001600160a01b038216600090815260106020526040812080546001929061240f908490612e84565b9091555050505050565b60006001600160a01b0384163b15610f8057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061245d903390899088908890600401612b92565b602060405180830381600087803b15801561247757600080fd5b505af19250505080156124a7575060408051601f3d908101601f191682019092526124a491810190612a9f565b60015b612501573d8080156124d5576040519150601f19603f3d011682016040523d82523d6000602084013e6124da565b606091505b5080516124f95760405162461bcd60e51b81526004016107a090612be2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f6f565b6001600160a01b0383166125765761257181600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612599565b816001600160a01b0316836001600160a01b0316146125995761259983826125d3565b6001600160a01b0382166125b0576108d681612670565b826001600160a01b0316826001600160a01b0316146108d6576108d6828261271f565b600060016125e0846112bb565b6125ea9190612eb0565b60008381526008602052604090205490915080821461263d576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061268290600190612eb0565b6000838152600a6020526040812054600980549394509092849081106126aa576126aa612f9f565b9060005260206000200154905080600983815481106126cb576126cb612f9f565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061270357612703612f89565b6001900381819060005260206000200160009055905550505050565b600061272a836112bb565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b82805461276f90612ef3565b90600052602060002090601f01602090048101928261279157600085556127d7565b82601f106127aa57805160ff19168380011785556127d7565b828001600101855582156127d7579182015b828111156127d75782518255916020019190600101906127bc565b506127e39291506127e7565b5090565b5b808211156127e357600081556001016127e8565b600067ffffffffffffffff8084111561281757612817612fb5565b604051601f8501601f19908116603f0116810190828211818310171561283f5761283f612fb5565b8160405280935085815286868601111561285857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610d5757600080fd5b60006020828403121561289b57600080fd5b611afc82612872565b600080604083850312156128b757600080fd5b6128c083612872565b91506128ce60208401612872565b90509250929050565b6000806000606084860312156128ec57600080fd5b6128f584612872565b925061290360208501612872565b9150604084013590509250925092565b6000806000806080858703121561292957600080fd5b61293285612872565b935061294060208601612872565b925060408501359150606085013567ffffffffffffffff81111561296357600080fd5b8501601f8101871361297457600080fd5b612983878235602084016127fc565b91505092959194509250565b600080604083850312156129a257600080fd5b6129ab83612872565b915060208301356129bb81612fcb565b809150509250929050565b600080604083850312156129d957600080fd5b6129e283612872565b946020939093013593505050565b60008060208385031215612a0357600080fd5b823567ffffffffffffffff80821115612a1b57600080fd5b818501915085601f830112612a2f57600080fd5b813581811115612a3e57600080fd5b8660208260051b8501011115612a5357600080fd5b60209290920196919550909350505050565b600060208284031215612a7757600080fd5b8151611afc81612fcb565b600060208284031215612a9457600080fd5b8135611afc81612fd9565b600060208284031215612ab157600080fd5b8151611afc81612fd9565b600060208284031215612ace57600080fd5b813567ffffffffffffffff811115612ae557600080fd5b8201601f81018413612af657600080fd5b611f6f848235602084016127fc565b600060208284031215612b1757600080fd5b5035919050565b600060208284031215612b3057600080fd5b5051919050565b60008151808452612b4f816020860160208601612ec7565b601f01601f19169290920160200192915050565b60008351612b75818460208801612ec7565b835190830190612b89818360208801612ec7565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc590830184612b37565b9695505050505050565b602081526000611afc6020830184612b37565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526035908201527f436f6c6c656374696f6e3a206d696e74656420616d6f756e74206d757374206e6040820152741bdd08195e18d959590818985d18da081b1a5b5a5d605a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6c6c656374696f6e3a206d696e74696e67206d757374206265206e6f742060408201526d18994819195858dd1a5d985d195960921b606082015260800190565b6020808252602c908201527f436f6c6c656374696f6e3a206d757374206e6f7420657863656564207468652060408201526b746f74616c20737570706c7960a01b606082015260800190565b6020808252602f908201527f436f6c6c656374696f6e3a206d696e74656420616d6f756e74206d757374206e60408201526e1bdd08195e18d95959081b1a5b5a5d608a1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f436f6c6c656374696f6e3a206d696e74696e67206d75737420626520646561636040820152661d1a5d985d195960ca1b606082015260800190565b60208082526025908201527f436f6c6c656374696f6e3a206d696e74696e67206d75737420626520616374696040820152641d985d195960da1b606082015260800190565b60008219821115612e9757612e97612f5d565b500190565b600082612eab57612eab612f73565b500490565b600082821015612ec257612ec2612f5d565b500390565b60005b83811015612ee2578181015183820152602001612eca565b83811115611a225750506000910152565b600181811c90821680612f0757607f821691505b60208210811415612f2857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f4257612f42612f5d565b5060010190565b600082612f5857612f58612f73565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611bd157600080fd5b6001600160e01b031981168114611bd157600080fdfea2646970667358221220ceffa63e1e34b2aeafc86765cf39bf58cb0eb8f9e1ea23f26ac9bd2d4789605964736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102d65760003560e01c806389f7e88611610182578063b361c21c116100e9578063dec2d438116100a2578063eca17e041161007c578063eca17e041461063f578063f2fde38b14610648578063f4148ee51461065b578063fe22dd851461050157600080fd5b8063dec2d43814610501578063e26e9a5f146105fb578063e985e9c51461060357600080fd5b8063b361c21c14610577578063b88d4fde1461057f578063c01bc98214610592578063c87b56dd146105b2578063ced3e3f1146105c5578063dd4bee4e146105e857600080fd5b80639d76ea581161013b5780639d76ea581461051a5780639d9a55d014610533578063a22cb4651461053d578063a9b97a0214610550578063ae2af4e31461055d578063afea86d71461056f57600080fd5b806389f7e886146104df5780638d289c18146104e85780638da5cb5b146104f05780639559c0bd1461050157806395d89b41146105095780639972923b1461051157600080fd5b80633af32abf11610241578063597be6d1116101fa57806370a08231116101d457806370a082311461049e578063715018a6146104b1578063854cff2f146104b9578063868ff4a2146104cc57600080fd5b8063597be6d1146104625780636352211e1461046b5780636ed9c44e1461047e57600080fd5b80633af32abf146103f6578063419973901461041957806342842e0e14610421578063482c3f7a146104345780634f6ccce71461043c57806355f804b31461044f57600080fd5b80631f55c9bc116102935780631f55c9bc1461038e5780632385554c1461039757806323b872dd146103aa57806326a4e8d2146103bd5780632db11544146103d05780632f745c59146103e357600080fd5b806301ffc9a7146102db57806306fdde0314610303578063081812fc146103185780630843629e14610343578063095ea7b31461037157806318160ddd14610386575b600080fd5b6102ee6102e9366004612a82565b61066e565b60405190151581526020015b60405180910390f35b61030b610699565b6040516102fa9190612bcf565b61032b610326366004612b05565b61072b565b6040516001600160a01b0390911681526020016102fa565b610363610351366004612889565b60106020526000908152604090205481565b6040519081526020016102fa565b61038461037f3660046129c6565b6107c5565b005b600954610363565b61036360115481565b6102ee6103a5366004612b05565b6108db565b6103846103b83660046128d7565b610cd3565b6102ee6103cb366004612889565b610d04565b6102ee6103de366004612b05565b610d5c565b6103636103f13660046129c6565b610f8b565b6102ee610404366004612889565b600e6020526000908152604090205460ff1681565b6102ee611021565b61038461042f3660046128d7565b6110b6565b6102ee6110d1565b61036361044a366004612b05565b611173565b6102ee61045d366004612abc565b611206565b61036360135481565b61032b610479366004612b05565b611244565b61036361048c366004612b05565b600c6020526000908152604090205481565b6103636104ac366004612889565b6112bb565b610384611342565b6102ee6104c7366004612889565b611378565b6102ee6104da366004612b05565b6113ce565b61036360125481565b6102ee61160a565b600b546001600160a01b031661032b565b610363600281565b61030b61192d565b61036361058c81565b60145461032b906201000090046001600160a01b031681565b6103636201518081565b61038461054b36600461298f565b61193c565b6014546102ee9060ff1681565b6014546102ee90610100900460ff1681565b610363600381565b6102ee61194b565b61038461058d366004612913565b6119f0565b6103636105a0366004612889565b600f6020526000908152604090205481565b61030b6105c0366004612b05565b611a28565b6102ee6105d3366004612b05565b600d6020526000908152604090205460ff1681565b6102ee6105f6366004612b05565b611b03565b610363600181565b6102ee6106113660046128a4565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61036361114481565b610384610656366004612889565b611b39565b6102ee6106693660046129f0565b611bd4565b60006001600160e01b0319821663780e9d6360e01b1480610693575061069382611c74565b92915050565b6060600080546106a890612ef3565b80601f01602080910402602001604051908101604052809291908181526020018280546106d490612ef3565b80156107215780601f106106f657610100808354040283529160200191610721565b820191906000526020600020905b81548152906001019060200180831161070457829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166107a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006107d082611244565b9050806001600160a01b0316836001600160a01b0316141561083e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107a0565b336001600160a01b038216148061085a575061085a8133610611565b6108cc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107a0565b6108d68383611cc4565b505050565b6014546000906201000090046001600160a01b031661093c5760405162461bcd60e51b815260206004820181905260248201527f436f6c6c656374696f6e3a205368696c6c696e67206e6f7420656e61626c656460448201526064016107a0565b6000828152600d602052604090205460ff16156109af5760405162461bcd60e51b815260206004820152602b60248201527f436f6c6c656374696f6e3a20656767206d757374206e6f74206265206861746360448201526a68656420616c726561647960a81b60648201526084016107a0565b6000828152600c6020526040902054600114610a0d5760405162461bcd60e51b815260206004820152601a60248201527f436f6c6c656374696f6e3a206d75737420626520616e2065676700000000000060448201526064016107a0565b6000336011546014546040516370a0823160e01b81526001600160a01b038085166004830152939450919283926201000090920416906370a082319060240160206040518083038186803b158015610a6457600080fd5b505afa158015610a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9c9190612b1e565b1015610aea5760405162461bcd60e51b815260206004820152601f60248201527f436f6c6c656374696f6e3a206e6f7420656e6f756768207368696c6c696e670060448201526064016107a0565b601454604051632770a7eb60e21b81526001600160a01b038481166004830152602482018490526201000090920490911690639dc29fac90604401602060405180830381600087803b158015610b3f57600080fd5b505af1158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b779190612a65565b50816001600160a01b0316610b8b85611244565b6001600160a01b031614610bf45760405162461bcd60e51b815260206004820152602a60248201527f436f6c6c656374696f6e3a206163636f756e74206d757374206265206f776e65604482015269391037b3103a37b5b2b760b11b60648201526084016107a0565b611144610c0060095490565b10610c1d5760405162461bcd60e51b81526004016107a090612d0c565b6000610c2860095490565b610c33906001612e84565b9050610c3f8382611d32565b6000858152600d60209081526040808320805460ff19166001908117909155848452600c8352818420600390556001600160a01b038716845260109092528220805491929091610c90908490612e84565b90915550506040518181527f0c845ba78ab6a3b23bee713c5e5fb80d323487c9117354fd97e3cc5de73549949060200160405180910390a1506001949350505050565b610cdd3382611e80565b610cf95760405162461bcd60e51b81526004016107a090612da7565b6108d6838383611f77565b600b546000906001600160a01b03163314610d315760405162461bcd60e51b81526004016107a090612c89565b506014805462010000600160b01b031916620100006001600160a01b0384160217905560015b919050565b60145460009060ff16610d815760405162461bcd60e51b81526004016107a090612e3f565b62015180601354610d929190612e84565b421015610df05760405162461bcd60e51b815260206004820152602660248201527f436f6c6c656374696f6e3a207075626c6963206d696e74696e67206e6f7420736044820152651d185c9d195960d21b60648201526084016107a0565b6002821115610e115760405162461bcd60e51b81526004016107a090612c34565b336000818152600f6020526040902054600290610e2f908590612e84565b1115610e4d5760405162461bcd60e51b81526004016107a090612d58565b6000610e5860095490565b905061058c610e678583612e84565b1115610ece5760405162461bcd60e51b815260206004820152603060248201527f436f6c6c656374696f6e3a20737570706c79206d75737420626520617661696c60448201526f61626c6520666f72206d696e74696e6760801b60648201526084016107a0565b6001600160a01b0382166000908152600f602052604081208054869290610ef6908490612e84565b90915550600190505b848111610f80576000610f128284612e84565b905061058c8111610f6d576000818152600c6020526040902060019055610f398482611d32565b6040518181527f779dd44873917856823315b17cf30cf871834877ad11ffe2e3cf87711ab724279060200160405180910390a15b5080610f7881612f2e565b915050610eff565b506001949350505050565b6000610f96836112bb565b8210610ff85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107a0565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600b546000906001600160a01b0316331461104e5760405162461bcd60e51b81526004016107a090612c89565b60145460ff166110705760405162461bcd60e51b81526004016107a090612e3f565b6014805460ff1916905560405142815233907f363cc24f67682de95b5cac47c3522d03b5548743e0ea23d56ee15240d1c7d69f906020015b60405180910390a250600190565b6108d6838383604051806020016040528060008152506119f0565b600b546000906001600160a01b031633146110fe5760405162461bcd60e51b81526004016107a090612c89565b60145460ff16156111215760405162461bcd60e51b81526004016107a090612df8565b426013556014805460ff191660011790556111393390565b6001600160a01b03167fcecb2d28e744503a7a03dcbe6202f5e71cc2271193a6dbbfc8d2b2a79d3f9652426040516110a891815260200190565b600061117e60095490565b82106111e15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107a0565b600982815481106111f4576111f4612f9f565b90600052602060002001549050919050565b600b546000906001600160a01b031633146112335760405162461bcd60e51b81526004016107a090612c89565b61123c82612122565b506001919050565b6000818152600360205260408120546001600160a01b0316806106935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107a0565b60006001600160a01b0382166113265760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107a0565b506001600160a01b031660009081526004602052604090205490565b600b546001600160a01b0316331461136c5760405162461bcd60e51b81526004016107a090612c89565b6113766000612135565b565b600b546000906001600160a01b031633146113a55760405162461bcd60e51b81526004016107a090612c89565b506001600160a01b03166000908152600e60205260409020805460ff1916600190811790915590565b60145460009060ff166113f35760405162461bcd60e51b81526004016107a090612cbe565b620151806013546114049190612e84565b42106114625760405162461bcd60e51b815260206004820152602760248201527f436f6c6c656374696f6e3a207075626c6963206d696e74696e672068617665206044820152661cdd185c9d195960ca1b60648201526084016107a0565b336000818152600e602052604090205460ff166114d15760405162461bcd60e51b815260206004820152602760248201527f436f6c6c656374696f6e3a206163636f756e74206d7573742062652077686974604482015266195b1a5cdd195960ca1b60648201526084016107a0565b6001600160a01b0381166000908152600f60205260409020546002906114f8908590612e84565b11156115165760405162461bcd60e51b81526004016107a090612d58565b60028311156115375760405162461bcd60e51b81526004016107a090612c34565b600061154260095490565b61154d906001612e84565b6001600160a01b0383166000908152600f602052604081208054929350869290919061157a908490612e84565b90915550600090505b84811015610f805761058c82116115f85761159e8383611d32565b6000828152600c60205260409081902060019055517f779dd44873917856823315b17cf30cf871834877ad11ffe2e3cf87711ab72427906115e29084815260200190565b60405180910390a1816115f481612f2e565b9250505b8061160281612f2e565b915050611583565b601454600090610100900460ff166116345760405162461bcd60e51b81526004016107a090612cbe565b6014546201000090046001600160a01b03166116925760405162461bcd60e51b815260206004820181905260248201527f436f6c6c656374696f6e3a205368696c6c696e67206e6f7420656e61626c656460448201526064016107a0565b6000336012546014546040516370a0823160e01b81526001600160a01b038085166004830152939450919283926201000090920416906370a082319060240160206040518083038186803b1580156116e957600080fd5b505afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117219190612b1e565b101561176f5760405162461bcd60e51b815260206004820152601f60248201527f436f6c6c656374696f6e3a206e6f7420656e6f756768207368696c6c696e670060448201526064016107a0565b601454604051632770a7eb60e21b81526001600160a01b038481166004830152602482018490526201000090920490911690639dc29fac90604401602060405180830381600087803b1580156117c457600080fd5b505af11580156117d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fc9190612a65565b506001600160a01b0382166000908152601060205260409020546002111561188c5760405162461bcd60e51b815260206004820152603a60248201527f436f6c6c656374696f6e3a206d757374206f776e2032206164756c742064726160448201527f676f6e7320746f206d696e742061206261627920647261676f6e00000000000060648201526084016107a0565b61114461189860095490565b106118b55760405162461bcd60e51b81526004016107a090612d0c565b60006118c060095490565b6118cb906001612e84565b90506118d78382611d32565b6000818152600c60205260409081902060029055517f0c845ba78ab6a3b23bee713c5e5fb80d323487c9117354fd97e3cc5de73549949061191b9083815260200190565b60405180910390a16001935050505090565b6060600180546106a890612ef3565b611947338383612187565b5050565b600b546000906001600160a01b031633146119785760405162461bcd60e51b81526004016107a090612c89565b601454610100900460ff16156119a05760405162461bcd60e51b81526004016107a090612df8565b6014805461ff0019166101001790556119b63390565b6001600160a01b03167f2d3784bfc0919e5b9d23dd74c75d1607e8be7571ed09f352a552e25f0d73794f426040516110a891815260200190565b6119fa3383611e80565b611a165760405162461bcd60e51b81526004016107a090612da7565b611a2284848484612256565b50505050565b6000818152600360205260409020546060906001600160a01b0316611aa75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a0565b6000611ab1612289565b90506000815111611ad15760405180602001604052806000815250611afc565b80611adb84612298565b604051602001611aec929190612b63565b6040516020818303038152906040525b9392505050565b600b546000906001600160a01b03163314611b305760405162461bcd60e51b81526004016107a090612c89565b50601255600190565b600b546001600160a01b03163314611b635760405162461bcd60e51b81526004016107a090612c89565b6001600160a01b038116611bc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a0565b611bd181612135565b50565b600b546000906001600160a01b03163314611c015760405162461bcd60e51b81526004016107a090612c89565b8160005b81811015610f80576001600e6000878785818110611c2557611c25612f9f565b9050602002016020810190611c3a9190612889565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611c6c81612f2e565b915050611c05565b60006001600160e01b031982166380ac58cd60e01b1480611ca557506001600160e01b03198216635b5e139f60e01b145b8061069357506301ffc9a760e01b6001600160e01b0319831614610693565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cf982611244565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b038216611d885760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107a0565b6000818152600360205260409020546001600160a01b031615611ded5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107a0565b611df960008383612396565b6001600160a01b0382166000908152600460205260408120805460019290611e22908490612e84565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600360205260408120546001600160a01b0316611ef95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a0565b6000611f0483611244565b9050806001600160a01b0316846001600160a01b03161480611f3f5750836001600160a01b0316611f348461072b565b6001600160a01b0316145b80611f6f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f8a82611244565b6001600160a01b031614611ff25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107a0565b6001600160a01b0382166120545760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107a0565b61205f838383612396565b61206a600082611cc4565b6001600160a01b0383166000908152600460205260408120805460019290612093908490612eb0565b90915550506001600160a01b03821660009081526004602052604081208054600192906120c1908490612e84565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8051611947906002906020840190612763565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156121e95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107a0565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612261848484611f77565b61226d84848484612419565b611a225760405162461bcd60e51b81526004016107a090612be2565b6060600280546106a890612ef3565b6060816122bc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122e657806122d081612f2e565b91506122df9050600a83612e9c565b91506122c0565b60008167ffffffffffffffff81111561230157612301612fb5565b6040519080825280601f01601f19166020018201604052801561232b576020820181803683370190505b5090505b8415611f6f57612340600183612eb0565b915061234d600a86612f49565b612358906030612e84565b60f81b81838151811061236d5761236d612f9f565b60200101906001600160f81b031916908160001a90535061238f600a86612e9c565b945061232f565b6123a183838361251b565b6000818152600c6020526040902054600314156108d6576001600160a01b03831660009081526010602052604081208054600192906123e1908490612eb0565b90915550506001600160a01b038216600090815260106020526040812080546001929061240f908490612e84565b9091555050505050565b60006001600160a01b0384163b15610f8057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061245d903390899088908890600401612b92565b602060405180830381600087803b15801561247757600080fd5b505af19250505080156124a7575060408051601f3d908101601f191682019092526124a491810190612a9f565b60015b612501573d8080156124d5576040519150601f19603f3d011682016040523d82523d6000602084013e6124da565b606091505b5080516124f95760405162461bcd60e51b81526004016107a090612be2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f6f565b6001600160a01b0383166125765761257181600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612599565b816001600160a01b0316836001600160a01b0316146125995761259983826125d3565b6001600160a01b0382166125b0576108d681612670565b826001600160a01b0316826001600160a01b0316146108d6576108d6828261271f565b600060016125e0846112bb565b6125ea9190612eb0565b60008381526008602052604090205490915080821461263d576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061268290600190612eb0565b6000838152600a6020526040812054600980549394509092849081106126aa576126aa612f9f565b9060005260206000200154905080600983815481106126cb576126cb612f9f565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061270357612703612f89565b6001900381819060005260206000200160009055905550505050565b600061272a836112bb565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b82805461276f90612ef3565b90600052602060002090601f01602090048101928261279157600085556127d7565b82601f106127aa57805160ff19168380011785556127d7565b828001600101855582156127d7579182015b828111156127d75782518255916020019190600101906127bc565b506127e39291506127e7565b5090565b5b808211156127e357600081556001016127e8565b600067ffffffffffffffff8084111561281757612817612fb5565b604051601f8501601f19908116603f0116810190828211818310171561283f5761283f612fb5565b8160405280935085815286868601111561285857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610d5757600080fd5b60006020828403121561289b57600080fd5b611afc82612872565b600080604083850312156128b757600080fd5b6128c083612872565b91506128ce60208401612872565b90509250929050565b6000806000606084860312156128ec57600080fd5b6128f584612872565b925061290360208501612872565b9150604084013590509250925092565b6000806000806080858703121561292957600080fd5b61293285612872565b935061294060208601612872565b925060408501359150606085013567ffffffffffffffff81111561296357600080fd5b8501601f8101871361297457600080fd5b612983878235602084016127fc565b91505092959194509250565b600080604083850312156129a257600080fd5b6129ab83612872565b915060208301356129bb81612fcb565b809150509250929050565b600080604083850312156129d957600080fd5b6129e283612872565b946020939093013593505050565b60008060208385031215612a0357600080fd5b823567ffffffffffffffff80821115612a1b57600080fd5b818501915085601f830112612a2f57600080fd5b813581811115612a3e57600080fd5b8660208260051b8501011115612a5357600080fd5b60209290920196919550909350505050565b600060208284031215612a7757600080fd5b8151611afc81612fcb565b600060208284031215612a9457600080fd5b8135611afc81612fd9565b600060208284031215612ab157600080fd5b8151611afc81612fd9565b600060208284031215612ace57600080fd5b813567ffffffffffffffff811115612ae557600080fd5b8201601f81018413612af657600080fd5b611f6f848235602084016127fc565b600060208284031215612b1757600080fd5b5035919050565b600060208284031215612b3057600080fd5b5051919050565b60008151808452612b4f816020860160208601612ec7565b601f01601f19169290920160200192915050565b60008351612b75818460208801612ec7565b835190830190612b89818360208801612ec7565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc590830184612b37565b9695505050505050565b602081526000611afc6020830184612b37565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526035908201527f436f6c6c656374696f6e3a206d696e74656420616d6f756e74206d757374206e6040820152741bdd08195e18d959590818985d18da081b1a5b5a5d605a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6c6c656374696f6e3a206d696e74696e67206d757374206265206e6f742060408201526d18994819195858dd1a5d985d195960921b606082015260800190565b6020808252602c908201527f436f6c6c656374696f6e3a206d757374206e6f7420657863656564207468652060408201526b746f74616c20737570706c7960a01b606082015260800190565b6020808252602f908201527f436f6c6c656374696f6e3a206d696e74656420616d6f756e74206d757374206e60408201526e1bdd08195e18d95959081b1a5b5a5d608a1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f436f6c6c656374696f6e3a206d696e74696e67206d75737420626520646561636040820152661d1a5d985d195960ca1b606082015260800190565b60208082526025908201527f436f6c6c656374696f6e3a206d696e74696e67206d75737420626520616374696040820152641d985d195960da1b606082015260800190565b60008219821115612e9757612e97612f5d565b500190565b600082612eab57612eab612f73565b500490565b600082821015612ec257612ec2612f5d565b500390565b60005b83811015612ee2578181015183820152602001612eca565b83811115611a225750506000910152565b600181811c90821680612f0757607f821691505b60208210811415612f2857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f4257612f42612f5d565b5060010190565b600082612f5857612f58612f73565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611bd157600080fd5b6001600160e01b031981168114611bd157600080fdfea2646970667358221220ceffa63e1e34b2aeafc86765cf39bf58cb0eb8f9e1ea23f26ac9bd2d4789605964736f6c63430008070033

Deployed Bytecode Sourcemap

43839:8333:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37427:300;;;;;;:::i;:::-;;:::i;:::-;;;6952:14:1;;6945:22;6927:41;;6915:2;6900:18;37427:300:0;;;;;;;;24463:100;;;:::i;:::-;;;;;;;:::i;26280:308::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5971:32:1;;;5953:51;;5941:2;5926:18;26280:308:0;5807:203:1;44505:47:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;21002:25:1;;;20990:2;20975:18;44505:47:0;20856:177:1;25803:411:0;;;;;;:::i;:::-;;:::i;:::-;;38230:113;38318:10;:17;38230:113;;44561:28;;;;;;49635:1164;;;;;;:::i;:::-;;:::i;27199:376::-;;;;;;:::i;:::-;;:::i;46066:187::-;;;;;;:::i;:::-;;:::i;48471:1156::-;;;;;;:::i;:::-;;:::i;37811:343::-;;;;;;:::i;:::-;;:::i;44399:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;46745:262;;;:::i;27646:185::-;;;;;;:::i;:::-;;:::i;46437:300::-;;;:::i;38420:320::-;;;;;;:::i;:::-;;:::i;46261:168::-;;;;;;:::i;:::-;;:::i;44636:26::-;;;;;;24070:326;;;;;;:::i;:::-;;:::i;44093:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;23713:295;;;;;;:::i;:::-;;:::i;21277:94::-;;;:::i;45414:143::-;;;;;;:::i;:::-;;:::i;47295:1168::-;;;;;;:::i;:::-;;:::i;44596:31::-;;;;;;50807:1033;;;:::i;20626:87::-;20699:6;;-1:-1:-1;;;;;20699:6:0;20626:87;;44295:39;;44333:1;44295:39;;24632:104;;;:::i;44196:41::-;;44233:4;44196:41;;44797:72;;;;;;;;-1:-1:-1;;;;;44797:72:0;;;44341:49;;44384:6;44341:49;;26660:187;;;;;;:::i;:::-;;:::i;44669:25::-;;;;;;;;;44701:28;;;;;;;;;;;;44006:34;;44039:1;44006:34;;47015:272;;;:::i;27902:365::-;;;;;;:::i;:::-;;:::i;44451:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;24807:468;;;;;;:::i;:::-;;:::i;44146:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45877:181;;;;;;:::i;:::-;;:::i;43929:31::-;;43959:1;43929:31;;26918:214;;;;;;:::i;:::-;-1:-1:-1;;;;;27089:25:0;;;27060:4;27089:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26918:214;44244:42;;44282:4;44244:42;;21526:229;;;;;;:::i;:::-;;:::i;45565:304::-;;;;;;:::i;:::-;;:::i;37427:300::-;37574:4;-1:-1:-1;;;;;;37616:50:0;;-1:-1:-1;;;37616:50:0;;:103;;;37683:36;37707:11;37683:23;:36::i;:::-;37596:123;37427:300;-1:-1:-1;;37427:300:0:o;24463:100::-;24517:13;24550:5;24543:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24463:100;:::o;26280:308::-;26401:7;29903:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29903:16:0;26426:110;;;;-1:-1:-1;;;26426:110:0;;13783:2:1;26426:110:0;;;13765:21:1;13822:2;13802:18;;;13795:30;13861:34;13841:18;;;13834:62;-1:-1:-1;;;13912:18:1;;;13905:42;13964:19;;26426:110:0;;;;;;;;;-1:-1:-1;26556:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26556:24:0;;26280:308::o;25803:411::-;25884:13;25900:23;25915:7;25900:14;:23::i;:::-;25884:39;;25948:5;-1:-1:-1;;;;;25942:11:0;:2;-1:-1:-1;;;;;25942:11:0;;;25934:57;;;;-1:-1:-1;;;25934:57:0;;17399:2:1;25934:57:0;;;17381:21:1;17438:2;17418:18;;;17411:30;17477:34;17457:18;;;17450:62;-1:-1:-1;;;17528:18:1;;;17521:31;17569:19;;25934:57:0;17197:397:1;25934:57:0;20049:10;-1:-1:-1;;;;;26026:21:0;;;;:62;;-1:-1:-1;26051:37:0;26068:5;20049:10;26918:214;:::i;26051:37::-;26004:168;;;;-1:-1:-1;;;26004:168:0;;11754:2:1;26004:168:0;;;11736:21:1;11793:2;11773:18;;;11766:30;11832:34;11812:18;;;11805:62;11903:26;11883:18;;;11876:54;11947:19;;26004:168:0;11552:420:1;26004:168:0;26185:21;26194:2;26198:7;26185:8;:21::i;:::-;25873:341;25803:411;;:::o;49635:1164::-;49713:12;;49688:4;;49713:12;;;-1:-1:-1;;;;;49713:12:0;49705:71;;;;-1:-1:-1;;;49705:71:0;;19864:2:1;49705:71:0;;;19846:21:1;;;19883:18;;;19876:30;19942:34;19922:18;;;19915:62;19994:18;;49705:71:0;19662:356:1;49705:71:0;49812:18;;;;:9;:18;;;;;;;;49811:19;49789:112;;;;-1:-1:-1;;;49789:112:0;;16571:2:1;49789:112:0;;;16553:21:1;16610:2;16590:18;;;16583:30;16649:34;16629:18;;;16622:62;-1:-1:-1;;;16700:18:1;;;16693:41;16751:19;;49789:112:0;16369:407:1;49789:112:0;49922:20;;;;:11;:20;;;;;;43959:1;49922:27;49914:66;;;;-1:-1:-1;;;49914:66:0;;7813:2:1;49914:66:0;;;7795:21:1;7852:2;7832:18;;;7825:30;7891:28;7871:18;;;7864:56;7937:18;;49914:66:0;7611:350:1;49914:66:0;49993:15;20049:10;50061:13;;50113:12;;50107:38;;-1:-1:-1;;;50107:38:0;;-1:-1:-1;;;;;5971:32:1;;;50107:38:0;;;5953:51:1;49993:30:0;;-1:-1:-1;50061:13:0;;;;50113:12;;;;;;50107:29;;5926:18:1;;50107:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;50085:137;;;;-1:-1:-1;;;50085:137:0;;14196:2:1;50085:137:0;;;14178:21:1;14235:2;14215:18;;;14208:30;14274:33;14254:18;;;14247:61;14325:18;;50085:137:0;13994:355:1;50085:137:0;50241:12;;50235:49;;-1:-1:-1;;;50235:49:0;;-1:-1:-1;;;;;6700:32:1;;;50235:49:0;;;6682:51:1;6749:18;;;6742:34;;;50241:12:0;;;;;;;;50235:24;;6655:18:1;;50235:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50339:7;-1:-1:-1;;;;;50319:27:0;:16;50327:7;50319;:16::i;:::-;-1:-1:-1;;;;;50319:27:0;;50297:119;;;;-1:-1:-1;;;50297:119:0;;10171:2:1;50297:119:0;;;10153:21:1;10210:2;10190:18;;;10183:30;10249:34;10229:18;;;10222:62;-1:-1:-1;;;10300:18:1;;;10293:40;10350:19;;50297:119:0;9969:406:1;50297:119:0;44282:4;50451:13;38318:10;:17;;38230:113;50451:13;:27;50429:121;;;;-1:-1:-1;;;50429:121:0;;;;;;;:::i;:::-;50563:12;50578:13;38318:10;:17;;38230:113;50578:13;:17;;50594:1;50578:17;:::i;:::-;50563:32;;50606:20;50612:7;50621:4;50606:5;:20::i;:::-;50637:18;;;;:9;:18;;;;;;;;:25;;-1:-1:-1;;50637:25:0;50658:4;50637:25;;;;;;50673:17;;;:11;:17;;;;;44039:1;50673:26;;-1:-1:-1;;;;;50710:21:0;;;;:12;:21;;;;;:26;;50658:4;;50710:21;;:26;;50658:4;;50710:26;:::i;:::-;;;;-1:-1:-1;;50752:15:0;;21002:25:1;;;50752:15:0;;20990:2:1;20975:18;50752:15:0;;;;;;;-1:-1:-1;50787:4:0;;49635:1164;-1:-1:-1;;;;49635:1164:0:o;27199:376::-;27408:41;20049:10;27441:7;27408:18;:41::i;:::-;27386:140;;;;-1:-1:-1;;;27386:140:0;;;;;;;:::i;:::-;27539:28;27549:4;27555:2;27559:7;27539:9;:28::i;46066:187::-;20699:6;;46171:4;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;-1:-1:-1;46193:12:0::1;:30:::0;;-1:-1:-1;;;;;;46193:30:0::1;::::0;-1:-1:-1;;;;;46193:30:0;::::1;;;::::0;;-1:-1:-1;20917:1:0::1;46066:187:::0;;;:::o;48471:1156::-;48550:13;;48525:4;;48550:13;;48542:63;;;;-1:-1:-1;;;48542:63:0;;;;;;;:::i;:::-;44384:6;48659:11;;:30;;;;:::i;:::-;48640:15;:49;;48618:137;;;;-1:-1:-1;;;48618:137:0;;17801:2:1;48618:137:0;;;17783:21:1;17840:2;17820:18;;;17813:30;17879:34;17859:18;;;17852:62;-1:-1:-1;;;17930:18:1;;;17923:36;17976:19;;48618:137:0;17599:402:1;48618:137:0;44333:1;48790:6;:21;;48768:124;;;;-1:-1:-1;;;48768:124:0;;;;;;;:::i;:::-;20049:10;48905:15;48970:21;;;:12;:21;;;;;;44333:1;;48970:30;;48994:6;;48970:30;:::i;:::-;:45;;48948:142;;;;-1:-1:-1;;;48948:142:0;;;;;;;:::i;:::-;49103:15;49121:13;38318:10;:17;;38230:113;49121:13;49103:31;-1:-1:-1;44233:4:0;49169:16;49179:6;49103:31;49169:16;:::i;:::-;:30;;49147:128;;;;-1:-1:-1;;;49147:128:0;;19447:2:1;49147:128:0;;;19429:21:1;19486:2;19466:18;;;19459:30;19525:34;19505:18;;;19498:62;-1:-1:-1;;;19576:18:1;;;19569:46;19632:19;;49147:128:0;19245:412:1;49147:128:0;-1:-1:-1;;;;;49288:21:0;;;;;;:12;:21;;;;;:31;;49313:6;;49288:21;:31;;49313:6;;49288:31;:::i;:::-;;;;-1:-1:-1;49349:1:0;;-1:-1:-1;49332:264:0;49357:6;49352:1;:11;49332:264;;49385:12;49400:11;49410:1;49400:7;:11;:::i;:::-;49385:26;;44233:4;49432;:18;49428:157;;49471:17;;;;:11;:17;;;;;43959:1;49471:23;;49513:20;49519:7;49483:4;49513:5;:20::i;:::-;49557:12;;21002:25:1;;;49557:12:0;;20990:2:1;20975:18;49557:12:0;;;;;;;49428:157;-1:-1:-1;49365:3:0;;;;:::i;:::-;;;;49332:264;;;-1:-1:-1;49615:4:0;;48471:1156;-1:-1:-1;;;;48471:1156:0:o;37811:343::-;37953:7;38008:23;38025:5;38008:16;:23::i;:::-;38000:5;:31;37978:124;;;;-1:-1:-1;;;37978:124:0;;8576:2:1;37978:124:0;;;8558:21:1;8615:2;8595:18;;;8588:30;8654:34;8634:18;;;8627:62;-1:-1:-1;;;8705:18:1;;;8698:41;8756:19;;37978:124:0;8374:407:1;37978:124:0;-1:-1:-1;;;;;;38120:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37811:343::o;46745:262::-;20699:6;;46799:4;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;46824:13:::1;::::0;::::1;;46816:63;;;;-1:-1:-1::0;;;46816:63:0::1;;;;;;;:::i;:::-;46892:13;:21:::0;;-1:-1:-1;;46892:21:0::1;::::0;;46931:46:::1;::::0;46961:15:::1;21002:25:1::0;;20049:10:0;;46931:46:::1;::::0;20990:2:1;20975:18;46931:46:0::1;;;;;;;;-1:-1:-1::0;46995:4:0::1;46745:262:::0;:::o;27646:185::-;27784:39;27801:4;27807:2;27811:7;27784:39;;;;;;;;;;;;:16;:39::i;46437:300::-;20699:6;;46489:4;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;46515:13:::1;::::0;::::1;;46514:14;46506:66;;;;-1:-1:-1::0;;;46506:66:0::1;;;;;;;:::i;:::-;46599:15;46585:11;:29:::0;46625:13:::1;:20:::0;;-1:-1:-1;;46625:20:0::1;46641:4;46625:20;::::0;;46677:12:::1;20049:10:::0;;19969:98;46677:12:::1;-1:-1:-1::0;;;;;46663:44:0::1;;46691:15;46663:44;;;;21002:25:1::0;;20990:2;20975:18;;20856:177;38420:320:0;38540:7;38595:30;38318:10;:17;;38230:113;38595:30;38587:5;:38;38565:132;;;;-1:-1:-1;;;38565:132:0;;19034:2:1;38565:132:0;;;19016:21:1;19073:2;19053:18;;;19046:30;19112:34;19092:18;;;19085:62;-1:-1:-1;;;19163:18:1;;;19156:42;19215:19;;38565:132:0;18832:408:1;38565:132:0;38715:10;38726:5;38715:17;;;;;;;;:::i;:::-;;;;;;;;;38708:24;;38420:320;;;:::o;46261:168::-;20699:6;;46358:4;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;46380:19:::1;46392:6;46380:11;:19::i;:::-;-1:-1:-1::0;46417:4:0::1;46261:168:::0;;;:::o;24070:326::-;24187:7;24228:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24228:16:0;24277:19;24255:110;;;;-1:-1:-1;;;24255:110:0;;12590:2:1;24255:110:0;;;12572:21:1;12629:2;12609:18;;;12602:30;12668:34;12648:18;;;12641:62;-1:-1:-1;;;12719:18:1;;;12712:39;12768:19;;24255:110:0;12388:405:1;23713:295:0;23830:7;-1:-1:-1;;;;;23877:19:0;;23855:111;;;;-1:-1:-1;;;23855:111:0;;12179:2:1;23855:111:0;;;12161:21:1;12218:2;12198:18;;;12191:30;12257:34;12237:18;;;12230:62;-1:-1:-1;;;12308:18:1;;;12301:40;12358:19;;23855:111:0;11977:406:1;23855:111:0;-1:-1:-1;;;;;;23984:16:0;;;;;:9;:16;;;;;;;23713:295::o;21277:94::-;20699:6;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;21342:21:::1;21360:1;21342:9;:21::i;:::-;21277:94::o:0;45414:143::-;20699:6;;45481:4;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;45498:22:0::1;;::::0;;;:13:::1;:22;::::0;;;;:29;;-1:-1:-1;;45498:29:0::1;45523:4;45498:29:::0;;::::1;::::0;;;45523:4;45414:143::o;47295:1168::-;47391:13;;47352:4;;47391:13;;47369:109;;;;-1:-1:-1;;;47369:109:0;;;;;;;:::i;:::-;44384:6;47531:11;;:30;;;;:::i;:::-;47513:15;:48;47491:137;;;;-1:-1:-1;;;47491:137:0;;7405:2:1;47491:137:0;;;7387:21:1;7444:2;7424:18;;;7417:30;7483:34;7463:18;;;7456:62;-1:-1:-1;;;7534:18:1;;;7527:37;7581:19;;47491:137:0;7203:403:1;47491:137:0;20049:10;47641:15;47706:22;;;:13;:22;;;;;;;;47684:111;;;;-1:-1:-1;;;47684:111:0;;8168:2:1;47684:111:0;;;8150:21:1;8207:2;8187:18;;;8180:30;8246:34;8226:18;;;8219:62;-1:-1:-1;;;8297:18:1;;;8290:37;8344:19;;47684:111:0;7966:403:1;47684:111:0;-1:-1:-1;;;;;47830:21:0;;;;;;:12;:21;;;;;;44333:1;;47830:30;;47854:6;;47830:30;:::i;:::-;:45;;47808:142;;;;-1:-1:-1;;;47808:142:0;;;;;;;:::i;:::-;44333:1;47985:6;:21;;47963:124;;;;-1:-1:-1;;;47963:124:0;;;;;;;:::i;:::-;48100:12;48115:13;38318:10;:17;;38230:113;48115:13;:17;;48131:1;48115:17;:::i;:::-;-1:-1:-1;;;;;48143:21:0;;;;;;:12;:21;;;;;:31;;48100:32;;-1:-1:-1;48168:6:0;;48143:21;;;:31;;48168:6;;48143:31;:::i;:::-;;;;-1:-1:-1;48192:9:0;;-1:-1:-1;48187:245:0;48211:6;48207:1;:10;48187:245;;;44233:4;48243;:18;48239:182;;48282:20;48288:7;48297:4;48282:5;:20::i;:::-;48321:17;;;;:11;:17;;;;;;;43959:1;48321:23;;48368:12;;;;;48333:4;21002:25:1;;20990:2;20975:18;;20856:177;48368:12:0;;;;;;;;48399:6;;;;:::i;:::-;;;;48239:182;48219:3;;;;:::i;:::-;;;;48187:245;;50807:1033;50887:16;;50848:4;;50887:16;;;;;50865:112;;;;-1:-1:-1;;;50865:112:0;;;;;;;:::i;:::-;50998:12;;;;;-1:-1:-1;;;;;50998:12:0;50990:71;;;;-1:-1:-1;;;50990:71:0;;19864:2:1;50990:71:0;;;19846:21:1;;;19883:18;;;19876:30;19942:34;19922:18;;;19915:62;19994:18;;50990:71:0;19662:356:1;50990:71:0;51074:15;20049:10;51145:16;;51200:12;;51194:38;;-1:-1:-1;;;51194:38:0;;-1:-1:-1;;;;;5971:32:1;;;51194:38:0;;;5953:51:1;51074:30:0;;-1:-1:-1;51145:16:0;;;;51200:12;;;;;;51194:29;;5926:18:1;;51194:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;51172:140;;;;-1:-1:-1;;;51172:140:0;;14196:2:1;51172:140:0;;;14178:21:1;14235:2;14215:18;;;14208:30;14274:33;14254:18;;;14247:61;14325:18;;51172:140:0;13994:355:1;51172:140:0;51331:12;;51325:52;;-1:-1:-1;;;51325:52:0;;-1:-1:-1;;;;;6700:32:1;;;51325:52:0;;;6682:51:1;6749:18;;;6742:34;;;51331:12:0;;;;;;;;51325:24;;6655:18:1;;51325:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;51412:21:0;;;;;;:12;:21;;;;;;44085:1;-1:-1:-1;51412:34:0;51390:142;;;;-1:-1:-1;;;51390:142:0;;20225:2:1;51390:142:0;;;20207:21:1;20264:2;20244:18;;;20237:30;20303:34;20283:18;;;20276:62;20374:28;20354:18;;;20347:56;20420:19;;51390:142:0;20023:422:1;51390:142:0;44282:4;51567:13;38318:10;:17;;38230:113;51567:13;:27;51545:121;;;;-1:-1:-1;;;51545:121:0;;;;;;;:::i;:::-;51679:12;51694:13;38318:10;:17;;38230:113;51694:13;:17;;51710:1;51694:17;:::i;:::-;51679:32;;51722:20;51728:7;51737:4;51722:5;:20::i;:::-;51753:17;;;;:11;:17;;;;;;;43998:1;51753:24;;51793:15;;;;;51765:4;21002:25:1;;20990:2;20975:18;;20856:177;51793:15:0;;;;;;;;51828:4;51821:11;;;;;50807:1033;:::o;24632:104::-;24688:13;24721:7;24714:14;;;;;:::i;26660:187::-;26787:52;20049:10;26820:8;26830;26787:18;:52::i;:::-;26660:187;;:::o;47015:272::-;20699:6;;47070:4;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;47096:16:::1;::::0;::::1;::::0;::::1;;;47095:17;47087:69;;;;-1:-1:-1::0;;;47087:69:0::1;;;;;;;:::i;:::-;47169:16;:23:::0;;-1:-1:-1;;47169:23:0::1;;;::::0;;47227:12:::1;20049:10:::0;;19969:98;47227:12:::1;-1:-1:-1::0;;;;;47210:47:0::1;;47241:15;47210:47;;;;21002:25:1::0;;20990:2;20975:18;;20856:177;27902:365:0;28091:41;20049:10;28124:7;28091:18;:41::i;:::-;28069:140;;;;-1:-1:-1;;;28069:140:0;;;;;;;:::i;:::-;28220:39;28234:4;28240:2;28244:7;28253:5;28220:13;:39::i;:::-;27902:365;;;;:::o;24807:468::-;29879:4;29903:16;;;:7;:16;;;;;;24925:13;;-1:-1:-1;;;;;29903:16:0;24956:113;;;;-1:-1:-1;;;24956:113:0;;15742:2:1;24956:113:0;;;15724:21:1;15781:2;15761:18;;;15754:30;15820:34;15800:18;;;15793:62;-1:-1:-1;;;15871:18:1;;;15864:45;15926:19;;24956:113:0;15540:411:1;24956:113:0;25082:21;25106:10;:8;:10::i;:::-;25082:34;;25171:1;25153:7;25147:21;:25;:120;;;;;;;;;;;;;;;;;25216:7;25225:18;:7;:16;:18::i;:::-;25199:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25147:120;25127:140;24807:468;-1:-1:-1;;;24807:468:0:o;45877:181::-;20699:6;;45979:4;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;-1:-1:-1;46001:16:0::1;:27:::0;46046:4:::1;::::0;45877:181::o;21526:229::-;20699:6;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21629:22:0;::::1;21607:110;;;::::0;-1:-1:-1;;;21607:110:0;;9407:2:1;21607:110:0::1;::::0;::::1;9389:21:1::0;9446:2;9426:18;;;9419:30;9485:34;9465:18;;;9458:62;-1:-1:-1;;;9536:18:1;;;9529:36;9582:19;;21607:110:0::1;9205:402:1::0;21607:110:0::1;21728:19;21738:8;21728:9;:19::i;:::-;21526:229:::0;:::o;45565:304::-;20699:6;;45676:4;;-1:-1:-1;;;;;20699:6:0;20049:10;20846:23;20838:68;;;;-1:-1:-1;;;20838:68:0;;;;;;;:::i;:::-;45716:8;45698:15:::1;45742:98;45766:7;45762:1;:11;45742:98;;;45824:4;45795:13;:26;45809:8;;45818:1;45809:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45795:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;45795:26:0;:33;;-1:-1:-1;;45795:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45775:3;::::1;::::0;::::1;:::i;:::-;;;;45742:98;;23294:355:::0;23441:4;-1:-1:-1;;;;;;23483:40:0;;-1:-1:-1;;;23483:40:0;;:105;;-1:-1:-1;;;;;;;23540:48:0;;-1:-1:-1;;;23540:48:0;23483:105;:158;;;-1:-1:-1;;;;;;;;;;22209:40:0;;;23605:36;22050:207;33937:174;34012:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34012:29:0;-1:-1:-1;;;;;34012:29:0;;;;;;;;:24;;34066:23;34012:24;34066:14;:23::i;:::-;-1:-1:-1;;;;;34057:46:0;;;;;;;;;;;33937:174;;:::o;31896:382::-;-1:-1:-1;;;;;31976:16:0;;31968:61;;;;-1:-1:-1;;;31968:61:0;;13422:2:1;31968:61:0;;;13404:21:1;;;13441:18;;;13434:30;13500:34;13480:18;;;13473:62;13552:18;;31968:61:0;13220:356:1;31968:61:0;29879:4;29903:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29903:16:0;:30;32040:58;;;;-1:-1:-1;;;32040:58:0;;9814:2:1;32040:58:0;;;9796:21:1;9853:2;9833:18;;;9826:30;9892;9872:18;;;9865:58;9940:18;;32040:58:0;9612:352:1;32040:58:0;32111:45;32140:1;32144:2;32148:7;32111:20;:45::i;:::-;-1:-1:-1;;;;;32169:13:0;;;;;;:9;:13;;;;;:18;;32186:1;;32169:13;:18;;32186:1;;32169:18;:::i;:::-;;;;-1:-1:-1;;32198:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32198:21:0;-1:-1:-1;;;;;32198:21:0;;;;;;;;32237:33;;32198:16;;;32237:33;;32198:16;;32237:33;31896:382;;:::o;30108:452::-;30237:4;29903:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29903:16:0;30259:110;;;;-1:-1:-1;;;30259:110:0;;11341:2:1;30259:110:0;;;11323:21:1;11380:2;11360:18;;;11353:30;11419:34;11399:18;;;11392:62;-1:-1:-1;;;11470:18:1;;;11463:42;11522:19;;30259:110:0;11139:408:1;30259:110:0;30380:13;30396:23;30411:7;30396:14;:23::i;:::-;30380:39;;30449:5;-1:-1:-1;;;;;30438:16:0;:7;-1:-1:-1;;;;;30438:16:0;;:64;;;;30495:7;-1:-1:-1;;;;;30471:31:0;:20;30483:7;30471:11;:20::i;:::-;-1:-1:-1;;;;;30471:31:0;;30438:64;:113;;;-1:-1:-1;;;;;;27089:25:0;;;27060:4;27089:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30519:32;30430:122;30108:452;-1:-1:-1;;;;30108:452:0:o;33204:615::-;33377:4;-1:-1:-1;;;;;33350:31:0;:23;33365:7;33350:14;:23::i;:::-;-1:-1:-1;;;;;33350:31:0;;33328:122;;;;-1:-1:-1;;;33328:122:0;;15332:2:1;33328:122:0;;;15314:21:1;15371:2;15351:18;;;15344:30;15410:34;15390:18;;;15383:62;-1:-1:-1;;;15461:18:1;;;15454:39;15510:19;;33328:122:0;15130:405:1;33328:122:0;-1:-1:-1;;;;;33469:16:0;;33461:65;;;;-1:-1:-1;;;33461:65:0;;10582:2:1;33461:65:0;;;10564:21:1;10621:2;10601:18;;;10594:30;10660:34;10640:18;;;10633:62;-1:-1:-1;;;10711:18:1;;;10704:34;10755:19;;33461:65:0;10380:400:1;33461:65:0;33539:39;33560:4;33566:2;33570:7;33539:20;:39::i;:::-;33643:29;33660:1;33664:7;33643:8;:29::i;:::-;-1:-1:-1;;;;;33685:15:0;;;;;;:9;:15;;;;;:20;;33704:1;;33685:15;:20;;33704:1;;33685:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33716:13:0;;;;;;:9;:13;;;;;:18;;33733:1;;33716:13;:18;;33733:1;;33716:18;:::i;:::-;;;;-1:-1:-1;;33745:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33745:21:0;-1:-1:-1;;;;;33745:21:0;;;;;;;;;33784:27;;33745:16;;33784:27;;;;;;;33204:615;;;:::o;25636:105::-;25709:24;;;;:13;;:24;;;;;:::i;21763:173::-;21838:6;;;-1:-1:-1;;;;;21855:17:0;;;-1:-1:-1;;;;;;21855:17:0;;;;;;;21888:40;;21838:6;;;21855:17;21838:6;;21888:40;;21819:16;;21888:40;21808:128;21763:173;:::o;34253:315::-;34408:8;-1:-1:-1;;;;;34399:17:0;:5;-1:-1:-1;;;;;34399:17:0;;;34391:55;;;;-1:-1:-1;;;34391:55:0;;10987:2:1;34391:55:0;;;10969:21:1;11026:2;11006:18;;;10999:30;11065:27;11045:18;;;11038:55;11110:18;;34391:55:0;10785:349:1;34391:55:0;-1:-1:-1;;;;;34457:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;34457:46:0;;;;;;;;;;34519:41;;6927::1;;;34519::0;;6900:18:1;34519:41:0;;;;;;;34253:315;;;:::o;29149:352::-;29306:28;29316:4;29322:2;29326:7;29306:9;:28::i;:::-;29367:48;29390:4;29396:2;29400:7;29409:5;29367:22;:48::i;:::-;29345:148;;;;-1:-1:-1;;;29345:148:0;;;;;;;:::i;25523:105::-;25574:13;25607;25600:20;;;;;:::i;19206:723::-;19262:13;19483:10;19479:53;;-1:-1:-1;;19510:10:0;;;;;;;;;;;;-1:-1:-1;;;19510:10:0;;;;;19206:723::o;19479:53::-;19557:5;19542:12;19598:78;19605:9;;19598:78;;19631:8;;;;:::i;:::-;;-1:-1:-1;19654:10:0;;-1:-1:-1;19662:2:0;19654:10;;:::i;:::-;;;19598:78;;;19686:19;19718:6;19708:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19708:17:0;;19686:39;;19736:154;19743:10;;19736:154;;19770:11;19780:1;19770:11;;:::i;:::-;;-1:-1:-1;19839:10:0;19847:2;19839:5;:10;:::i;:::-;19826:24;;:2;:24;:::i;:::-;19813:39;;19796:6;19803;19796:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19796:56:0;;;;;;;;-1:-1:-1;19867:11:0;19876:2;19867:11;;:::i;:::-;;;19736:154;;51848:321;51984:45;52011:4;52017:2;52021:7;51984:26;:45::i;:::-;52044:20;;;;:11;:20;;;;;;44039:1;52044:30;52040:122;;;-1:-1:-1;;;;;52091:18:0;;;;;;:12;:18;;;;;:23;;52113:1;;52091:18;:23;;52113:1;;52091:23;:::i;:::-;;;;-1:-1:-1;;;;;;;52129:16:0;;;;;;:12;:16;;;;;:21;;52149:1;;52129:16;:21;;52149:1;;52129:21;:::i;:::-;;;;-1:-1:-1;;51848:321:0;;;:::o;35133:980::-;35288:4;-1:-1:-1;;;;;35309:13:0;;11505:20;11553:8;35305:801;;35362:175;;-1:-1:-1;;;35362:175:0;;-1:-1:-1;;;;;35362:36:0;;;;;:175;;20049:10;;35456:4;;35483:7;;35513:5;;35362:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35362:175:0;;;;;;;;-1:-1:-1;;35362:175:0;;;;;;;;;;;;:::i;:::-;;;35341:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35720:13:0;;35716:320;;35763:108;;-1:-1:-1;;;35763:108:0;;;;;;;:::i;35716:320::-;35986:6;35980:13;35971:6;35967:2;35963:15;35956:38;35341:710;-1:-1:-1;;;;;;35601:51:0;-1:-1:-1;;;35601:51:0;;-1:-1:-1;35594:58:0;;39353:589;-1:-1:-1;;;;;39559:18:0;;39555:187;;39594:40;39626:7;40769:10;:17;;40742:24;;;;:15;:24;;;;;:44;;;40797:24;;;;;;;;;;;;40665:164;39594:40;39555:187;;;39664:2;-1:-1:-1;;;;;39656:10:0;:4;-1:-1:-1;;;;;39656:10:0;;39652:90;;39683:47;39716:4;39722:7;39683:32;:47::i;:::-;-1:-1:-1;;;;;39756:16:0;;39752:183;;39789:45;39826:7;39789:36;:45::i;39752:183::-;39862:4;-1:-1:-1;;;;;39856:10:0;:2;-1:-1:-1;;;;;39856:10:0;;39852:83;;39883:40;39911:2;39915:7;39883:27;:40::i;41456:1002::-;41736:22;41786:1;41761:22;41778:4;41761:16;:22::i;:::-;:26;;;;:::i;:::-;41798:18;41819:26;;;:17;:26;;;;;;41736:51;;-1:-1:-1;41952:28:0;;;41948:328;;-1:-1:-1;;;;;42019:18:0;;41997:19;42019:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42070:30;;;;;;:44;;;42187:30;;:17;:30;;;;;:43;;;41948:328;-1:-1:-1;42372:26:0;;;;:17;:26;;;;;;;;42365:33;;;-1:-1:-1;;;;;42416:18:0;;;;;:12;:18;;;;;:34;;;;;;;42409:41;41456:1002::o;42753:1079::-;43031:10;:17;43006:22;;43031:21;;43051:1;;43031:21;:::i;:::-;43063:18;43084:24;;;:15;:24;;;;;;43457:10;:26;;43006:46;;-1:-1:-1;43084:24:0;;43006:46;;43457:26;;;;;;:::i;:::-;;;;;;;;;43435:48;;43521:11;43496:10;43507;43496:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43601:28;;;:15;:28;;;;;;;:41;;;43773:24;;;;;43766:31;43808:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42824:1008;;;42753:1079;:::o;40243:221::-;40328:14;40345:20;40362:2;40345:16;:20::i;:::-;-1:-1:-1;;;;;40376:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40421:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40243:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;828:186;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:55:1;;2181:1;2178;2171:12;2130:55;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1617:666;;;;;;;:::o;2288:315::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2545:28;2567:5;2545:28;:::i;:::-;2592:5;2582:15;;;2288:315;;;;;:::o;2608:254::-;2676:6;2684;2737:2;2725:9;2716:7;2712:23;2708:32;2705:52;;;2753:1;2750;2743:12;2705:52;2776:29;2795:9;2776:29;:::i;:::-;2766:39;2852:2;2837:18;;;;2824:32;;-1:-1:-1;;;2608:254:1:o;2867:615::-;2953:6;2961;3014:2;3002:9;2993:7;2989:23;2985:32;2982:52;;;3030:1;3027;3020:12;2982:52;3070:9;3057:23;3099:18;3140:2;3132:6;3129:14;3126:34;;;3156:1;3153;3146:12;3126:34;3194:6;3183:9;3179:22;3169:32;;3239:7;3232:4;3228:2;3224:13;3220:27;3210:55;;3261:1;3258;3251:12;3210:55;3301:2;3288:16;3327:2;3319:6;3316:14;3313:34;;;3343:1;3340;3333:12;3313:34;3396:7;3391:2;3381:6;3378:1;3374:14;3370:2;3366:23;3362:32;3359:45;3356:65;;;3417:1;3414;3407:12;3356:65;3448:2;3440:11;;;;;3470:6;;-1:-1:-1;2867:615:1;;-1:-1:-1;;;;2867:615:1:o;3487:245::-;3554:6;3607:2;3595:9;3586:7;3582:23;3578:32;3575:52;;;3623:1;3620;3613:12;3575:52;3655:9;3649:16;3674:28;3696:5;3674:28;:::i;3737:245::-;3795:6;3848:2;3836:9;3827:7;3823:23;3819:32;3816:52;;;3864:1;3861;3854:12;3816:52;3903:9;3890:23;3922:30;3946:5;3922:30;:::i;3987:249::-;4056:6;4109:2;4097:9;4088:7;4084:23;4080:32;4077:52;;;4125:1;4122;4115:12;4077:52;4157:9;4151:16;4176:30;4200:5;4176:30;:::i;4241:450::-;4310:6;4363:2;4351:9;4342:7;4338:23;4334:32;4331:52;;;4379:1;4376;4369:12;4331:52;4419:9;4406:23;4452:18;4444:6;4441:30;4438:50;;;4484:1;4481;4474:12;4438:50;4507:22;;4560:4;4552:13;;4548:27;-1:-1:-1;4538:55:1;;4589:1;4586;4579:12;4538:55;4612:73;4677:7;4672:2;4659:16;4654:2;4650;4646:11;4612:73;:::i;4696:180::-;4755:6;4808:2;4796:9;4787:7;4783:23;4779:32;4776:52;;;4824:1;4821;4814:12;4776:52;-1:-1:-1;4847:23:1;;4696:180;-1:-1:-1;4696:180:1:o;4881:184::-;4951:6;5004:2;4992:9;4983:7;4979:23;4975:32;4972:52;;;5020:1;5017;5010:12;4972:52;-1:-1:-1;5043:16:1;;4881:184;-1:-1:-1;4881:184:1:o;5070:257::-;5111:3;5149:5;5143:12;5176:6;5171:3;5164:19;5192:63;5248:6;5241:4;5236:3;5232:14;5225:4;5218:5;5214:16;5192:63;:::i;:::-;5309:2;5288:15;-1:-1:-1;;5284:29:1;5275:39;;;;5316:4;5271:50;;5070:257;-1:-1:-1;;5070:257:1:o;5332:470::-;5511:3;5549:6;5543:13;5565:53;5611:6;5606:3;5599:4;5591:6;5587:17;5565:53;:::i;:::-;5681:13;;5640:16;;;;5703:57;5681:13;5640:16;5737:4;5725:17;;5703:57;:::i;:::-;5776:20;;5332:470;-1:-1:-1;;;;5332:470:1:o;6015:488::-;-1:-1:-1;;;;;6284:15:1;;;6266:34;;6336:15;;6331:2;6316:18;;6309:43;6383:2;6368:18;;6361:34;;;6431:3;6426:2;6411:18;;6404:31;;;6209:4;;6452:45;;6477:19;;6469:6;6452:45;:::i;:::-;6444:53;6015:488;-1:-1:-1;;;;;;6015:488:1:o;6979:219::-;7128:2;7117:9;7110:21;7091:4;7148:44;7188:2;7177:9;7173:18;7165:6;7148:44;:::i;8786:414::-;8988:2;8970:21;;;9027:2;9007:18;;;9000:30;9066:34;9061:2;9046:18;;9039:62;-1:-1:-1;;;9132:2:1;9117:18;;9110:48;9190:3;9175:19;;8786:414::o;12798:417::-;13000:2;12982:21;;;13039:2;13019:18;;;13012:30;13078:34;13073:2;13058:18;;13051:62;-1:-1:-1;;;13144:2:1;13129:18;;13122:51;13205:3;13190:19;;12798:417::o;14354:356::-;14556:2;14538:21;;;14575:18;;;14568:30;14634:34;14629:2;14614:18;;14607:62;14701:2;14686:18;;14354:356::o;14715:410::-;14917:2;14899:21;;;14956:2;14936:18;;;14929:30;14995:34;14990:2;14975:18;;14968:62;-1:-1:-1;;;15061:2:1;15046:18;;15039:44;15115:3;15100:19;;14715:410::o;15956:408::-;16158:2;16140:21;;;16197:2;16177:18;;;16170:30;16236:34;16231:2;16216:18;;16209:62;-1:-1:-1;;;16302:2:1;16287:18;;16280:42;16354:3;16339:19;;15956:408::o;16781:411::-;16983:2;16965:21;;;17022:2;17002:18;;;16995:30;17061:34;17056:2;17041:18;;17034:62;-1:-1:-1;;;17127:2:1;17112:18;;17105:45;17182:3;17167:19;;16781:411::o;18006:413::-;18208:2;18190:21;;;18247:2;18227:18;;;18220:30;18286:34;18281:2;18266:18;;18259:62;-1:-1:-1;;;18352:2:1;18337:18;;18330:47;18409:3;18394:19;;18006:413::o;18424:403::-;18626:2;18608:21;;;18665:2;18645:18;;;18638:30;18704:34;18699:2;18684:18;;18677:62;-1:-1:-1;;;18770:2:1;18755:18;;18748:37;18817:3;18802:19;;18424:403::o;20450:401::-;20652:2;20634:21;;;20691:2;20671:18;;;20664:30;20730:34;20725:2;20710:18;;20703:62;-1:-1:-1;;;20796:2:1;20781:18;;20774:35;20841:3;20826:19;;20450:401::o;21038:128::-;21078:3;21109:1;21105:6;21102:1;21099:13;21096:39;;;21115:18;;:::i;:::-;-1:-1:-1;21151:9:1;;21038:128::o;21171:120::-;21211:1;21237;21227:35;;21242:18;;:::i;:::-;-1:-1:-1;21276:9:1;;21171:120::o;21296:125::-;21336:4;21364:1;21361;21358:8;21355:34;;;21369:18;;:::i;:::-;-1:-1:-1;21406:9:1;;21296:125::o;21426:258::-;21498:1;21508:113;21522:6;21519:1;21516:13;21508:113;;;21598:11;;;21592:18;21579:11;;;21572:39;21544:2;21537:10;21508:113;;;21639:6;21636:1;21633:13;21630:48;;;-1:-1:-1;;21674:1:1;21656:16;;21649:27;21426:258::o;21689:380::-;21768:1;21764:12;;;;21811;;;21832:61;;21886:4;21878:6;21874:17;21864:27;;21832:61;21939:2;21931:6;21928:14;21908:18;21905:38;21902:161;;;21985:10;21980:3;21976:20;21973:1;21966:31;22020:4;22017:1;22010:15;22048:4;22045:1;22038:15;21902:161;;21689:380;;;:::o;22074:135::-;22113:3;-1:-1:-1;;22134:17:1;;22131:43;;;22154:18;;:::i;:::-;-1:-1:-1;22201:1:1;22190:13;;22074:135::o;22214:112::-;22246:1;22272;22262:35;;22277:18;;:::i;:::-;-1:-1:-1;22311:9:1;;22214:112::o;22331:127::-;22392:10;22387:3;22383:20;22380:1;22373:31;22423:4;22420:1;22413:15;22447:4;22444:1;22437:15;22463:127;22524:10;22519:3;22515:20;22512:1;22505:31;22555:4;22552:1;22545:15;22579:4;22576:1;22569:15;22595:127;22656:10;22651:3;22647:20;22644:1;22637:31;22687:4;22684:1;22677:15;22711:4;22708:1;22701:15;22727:127;22788:10;22783:3;22779:20;22776:1;22769:31;22819:4;22816:1;22809:15;22843:4;22840:1;22833:15;22859:127;22920:10;22915:3;22911:20;22908:1;22901:31;22951:4;22948:1;22941:15;22975:4;22972:1;22965:15;22991:118;23077:5;23070:13;23063:21;23056:5;23053:32;23043:60;;23099:1;23096;23089:12;23114:131;-1:-1:-1;;;;;;23188:32:1;;23178:43;;23168:71;;23235:1;23232;23225:12

Swarm Source

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

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