ETH Price: $3,275.56 (+0.58%)

Handsome Monkey King Club (HMK)
 

Overview

TokenID

3284

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
HMK

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-10
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    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 "";
    }

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

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract 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();
    }
}

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

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

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

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

contract HMK is ERC721, Ownable, ERC721Enumerable, ReentrancyGuard {
    using Strings for uint256;
	
    uint256 constant private MAX_NFT = 5555;
	uint256 public MAX_MINT_PRESALE = 10;
	uint256 public MAX_MINT_SALE = 10;
	
	uint256 public MAX_BY_MINT_IN_TRANSACTION_PRESALE = 10;
	uint256 public MAX_BY_MINT_IN_TRANSACTION_SALE = 10;
	
	uint256 public PRESALE_MINTED;
	uint256 public SALE_MINTED;
	uint256 public GIVEAWAY_MINTED;
	
	uint256 public PRESALE_PRICE = 6 * 10**16;
	uint256 public SALE_PRICE = 72 * 10**15;
	
    bool public presaleEnable = false;
	bool public saleEnable = false;
    string private baseURI;
	bytes32 public merkleRoot;
	
	uint[MAX_NFT] public indices;
    uint nonce;
	
	struct User {
		uint256 presalemint;
		uint256 salemint;
    }
	mapping (address => User) public users;

    constructor() ERC721('Handsome Monkey King Club', 'HMK') {}
	
	function mintGiveawayNFT(address _to, uint256 _count) public onlyOwner{
	    uint256 totalSupply = totalSupply();
        require(
            totalSupply + _count <= MAX_NFT, 
            "Max limit"
        );
		for (uint256 i = 0; i < _count; i++) {
		     uint256 tokenId = _randMod();
            _safeMint(_to, tokenId);
			GIVEAWAY_MINTED++;
        }
    }
	
	function mintPreSaleNFT(uint256 _count, bytes32[] calldata merkleProof) public payable{
		bytes32 node = keccak256(abi.encodePacked(msg.sender));
		uint256 totalSupply = totalSupply();
		require(
			presaleEnable, 
			"Pre-sale is not enable"
		);
        require(
			totalSupply + _count <= MAX_NFT, 
			"Exceeds max limit"
		);
		require(
			MerkleProof.verify(merkleProof, merkleRoot, node), 
			"MerkleDistributor: Invalid proof."
		);
		require(
			users[msg.sender].presalemint + _count <= MAX_MINT_PRESALE,
			"Exceeds max mint limit per wallet"
		);
		require(
			_count <= MAX_BY_MINT_IN_TRANSACTION_PRESALE,
			"Exceeds max mint limit per tnx"
		);
		require(
			msg.value >= PRESALE_PRICE * _count,
			"Value below price"
		);
		for (uint256 i = 0; i < _count; i++) {
		    uint256 tokenId = _randMod();
            _safeMint(msg.sender, tokenId);
			PRESALE_MINTED++;
        }
		users[msg.sender].presalemint = users[msg.sender].presalemint + _count;
    }
	
	function mintSaleNFT(uint256 _count) public payable{
		uint256 totalSupply = totalSupply();
		require(
			saleEnable, 
			"Sale is not enable"
		);
        require(
			totalSupply + _count <= MAX_NFT, 
			"Exceeds max limit"
		);
		require(
			users[msg.sender].salemint + _count <= MAX_MINT_SALE,
			"Exceeds max mint limit per wallet"
		);
		require(
			_count <= MAX_BY_MINT_IN_TRANSACTION_SALE,
			"Exceeds max mint limit per tnx"
		);
		require(
			msg.value >= SALE_PRICE * _count,
			"Value below price"
		);
		for (uint256 i = 0; i < _count; i++) {
		    uint256 tokenId = _randMod();
            _safeMint(msg.sender, tokenId);
			SALE_MINTED++;
        }
		users[msg.sender].salemint = users[msg.sender].salemint + _count;
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable){
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(baseURI, _tokenId.toString(), ".json"));
    }
	
    function setURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }
	
	function withdraw() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
	
	function updateSalePrice(uint256 newPrice) external onlyOwner {
        SALE_PRICE = newPrice;
    }
	
	function updatePreSalePrice(uint256 newPrice) external onlyOwner {
        PRESALE_PRICE = newPrice;
    }
	
	function setSaleStatus(bool status) public onlyOwner {
        require(saleEnable != status);
		saleEnable = status;
    }
	
	function setPreSaleStatus(bool status) public onlyOwner {
	   require(presaleEnable != status);
       presaleEnable = status;
    }
	
	function updateSaleMintLimit(uint256 newLimit) external onlyOwner {
	    require(MAX_NFT >= newLimit, "Incorrect value");
        MAX_MINT_SALE = newLimit;
    }
	
	function updatePreSaleMintLimit(uint256 newLimit) external onlyOwner {
	    require(MAX_NFT >= newLimit, "Incorrect value");
        MAX_MINT_PRESALE = newLimit;
    }
	
	function updateMintLimitPerTransectionPreSale(uint256 newLimit) external onlyOwner {
	    require(MAX_NFT >= newLimit, "Incorrect value");
        MAX_BY_MINT_IN_TRANSACTION_PRESALE = newLimit;
    }
	
	function updateMintLimitPerTransectionSale(uint256 newLimit) external onlyOwner {
	    require(MAX_NFT >= newLimit, "Incorrect value");
        MAX_BY_MINT_IN_TRANSACTION_SALE = newLimit;
    }
	
	function updateMerkleRoot(bytes32 newRoot) external onlyOwner {
	    merkleRoot = newRoot;
	}
	
    function _randMod() private returns (uint) {
        uint totalSize = MAX_NFT - nonce;
        uint index = uint(keccak256(abi.encodePacked(nonce, msg.sender, block.difficulty, block.timestamp))) % totalSize;
        uint value = 0;
        if (indices[index] != 0) {
            value = indices[index];
        } else {
            value = index;
        }
 
        if (indices[totalSize - 1] == 0) {
            indices[index] = totalSize - 1;
        } else {
            indices[index] = indices[totalSize - 1];
        }
        nonce++;
        return value+1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GIVEAWAY_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_MINT_IN_TRANSACTION_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_MINT_IN_TRANSACTION_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indices","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":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintGiveawayNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintPreSaleNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintSaleNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPreSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","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":"bytes32","name":"newRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateMintLimitPerTransectionPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateMintLimitPerTransectionSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updatePreSaleMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updatePreSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateSaleMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updateSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"presalemint","type":"uint256"},{"internalType":"uint256","name":"salemint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a600c819055600d819055600e819055600f5566d529ae9e86000060135566ffcb9e57d400006014556015805461ffff191690553480156200004657600080fd5b50604080518082018252601981527f48616e64736f6d65204d6f6e6b6579204b696e6720436c756200000000000000602080830191825283518085019094526003845262484d4b60e81b908401528151919291620000a7916000916200013b565b508051620000bd9060019060208401906200013b565b505050620000da620000d4620000e560201b60201c565b620000e9565b6001600b556200021e565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014990620001e1565b90600052602060002090601f0160209004810192826200016d5760008555620001b8565b82601f106200018857805160ff1916838001178555620001b8565b82800160010185558215620001b8579182015b82811115620001b85782518255916020019190600101906200019b565b50620001c6929150620001ca565b5090565b5b80821115620001c65760008155600101620001cb565b600281046001821680620001f657607f821691505b602082108114156200021857634e487b7160e01b600052602260045260246000fd5b50919050565b612d32806200022e6000396000f3fe6080604052600436106102885760003560e01c8063715018a61161015a578063a9526862116100c1578063dce051cc1161007a578063dce051cc1461076e578063e60400b41461078e578063e985e9c5146107a4578063f176baaa146107ed578063f2fde38b1461080d578063fe4ca8471461082d57610288565b8063a9526862146106cf578063ae5cc172146106e2578063b88d4fde146106f8578063c87b56dd14610718578063ccfb63a414610738578063d897833e1461074e57610288565b8063941e79fc11610113578063941e79fc146105fd578063945242c61461061d57806395d89b4114610630578063a1a953fd14610645578063a22cb46514610665578063a87430ba1461068557610288565b8063715018a6146105645780637e95eac4146105795780637ec0912e1461058f5780637ec18cf6146105af5780637f205a74146105c95780638da5cb5b146105df57610288565b80633ccfd60b116101fe5780635e326b92116101b75780635e326b92146104b857806362dc6e21146104d85780636352211e146104ee57806365fccb521461050e57806370a082311461052e578063711cc2ae1461054e57610288565b80633ccfd60b1461040d5780633e2e2a801461042257806342842e0e146104425780634783f0ef146104625780634d7cea16146104825780634f6ccce71461049857610288565b80630990e534116102505780630990e5341461035e57806318160ddd1461038257806323b872dd146103975780632eb4a7ab146103b75780632f745c59146103cd578063305004d9146103ed57610288565b806301ffc9a71461028d57806302fe5305146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004612821565b61084c565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004612859565b61085f565b005b3480156102f057600080fd5b506102f96108a9565b6040516102b99190612a57565b34801561031257600080fd5b50610326610321366004612809565b61093b565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e26103593660046127c6565b6109d0565b34801561036a57600080fd5b5061037460115481565b6040519081526020016102b9565b34801561038e57600080fd5b50600954610374565b3480156103a357600080fd5b506102e26103b23660046126e9565b610ae6565b3480156103c357600080fd5b5061037460175481565b3480156103d957600080fd5b506103746103e83660046127c6565b610b17565b3480156103f957600080fd5b506102e2610408366004612809565b610bad565b34801561041957600080fd5b506102e2610bfe565b34801561042e57600080fd5b506102e261043d366004612809565b610c4e565b34801561044e57600080fd5b506102e261045d3660046126e9565b610c9f565b34801561046e57600080fd5b506102e261047d366004612809565b610cba565b34801561048e57600080fd5b5061037460125481565b3480156104a457600080fd5b506103746104b3366004612809565b610ce9565b3480156104c457600080fd5b506102e26104d33660046127ef565b610d8a565b3480156104e457600080fd5b5061037460135481565b3480156104fa57600080fd5b50610326610509366004612809565b610ddd565b34801561051a57600080fd5b506102e2610529366004612809565b610e54565b34801561053a57600080fd5b50610374610549366004612696565b610e83565b34801561055a57600080fd5b50610374600f5481565b34801561057057600080fd5b506102e2610f0a565b34801561058557600080fd5b50610374600c5481565b34801561059b57600080fd5b506102e26105aa366004612809565b610f3e565b3480156105bb57600080fd5b506015546102ad9060ff1681565b3480156105d557600080fd5b5061037460145481565b3480156105eb57600080fd5b506006546001600160a01b0316610326565b34801561060957600080fd5b506102e2610618366004612809565b610f6d565b6102e261062b36600461289f565b610fbe565b34801561063c57600080fd5b506102f9611295565b34801561065157600080fd5b50610374610660366004612809565b6112a4565b34801561067157600080fd5b506102e261068036600461279d565b6112bc565b34801561069157600080fd5b506106ba6106a0366004612696565b6115cc602052600090815260409020805460019091015482565b604080519283526020830191909152016102b9565b6102e26106dd366004612809565b6112c7565b3480156106ee57600080fd5b50610374600d5481565b34801561070457600080fd5b506102e2610713366004612724565b6114d5565b34801561072457600080fd5b506102f9610733366004612809565b61150d565b34801561074457600080fd5b50610374600e5481565b34801561075a57600080fd5b506102e26107693660046127ef565b6115be565b34801561077a57600080fd5b506102e26107893660046127c6565b61161e565b34801561079a57600080fd5b5061037460105481565b3480156107b057600080fd5b506102ad6107bf3660046126b7565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107f957600080fd5b506102e2610808366004612809565b6116e6565b34801561081957600080fd5b506102e2610828366004612696565b611737565b34801561083957600080fd5b506015546102ad90610100900460ff1681565b6000610857826117d2565b90505b919050565b6006546001600160a01b031633146108925760405162461bcd60e51b815260040161088990612ae5565b60405180910390fd5b80516108a5906016906020840190612560565b5050565b6060600080546108b890612c3a565b80601f01602080910402602001604051908101604052809291908181526020018280546108e490612c3a565b80156109315780601f1061090657610100808354040283529160200191610931565b820191906000526020600020905b81548152906001019060200180831161091457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109b45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610889565b506000908152600460205260409020546001600160a01b031690565b60006109db82610ddd565b9050806001600160a01b0316836001600160a01b03161415610a495760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610889565b336001600160a01b0382161480610a655750610a6581336107bf565b610ad75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610889565b610ae183836117f7565b505050565b610af03382611865565b610b0c5760405162461bcd60e51b815260040161088990612b1a565b610ae183838361195c565b6000610b2283610e83565b8210610b845760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610889565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6006546001600160a01b03163314610bd75760405162461bcd60e51b815260040161088990612ae5565b806115b31015610bf95760405162461bcd60e51b815260040161088990612abc565b600e55565b6006546001600160a01b03163314610c285760405162461bcd60e51b815260040161088990612ae5565b60405133904780156108fc02916000818181858888f19350505050610c4c57600080fd5b565b6006546001600160a01b03163314610c785760405162461bcd60e51b815260040161088990612ae5565b806115b31015610c9a5760405162461bcd60e51b815260040161088990612abc565b600f55565b610ae1838383604051806020016040528060008152506114d5565b6006546001600160a01b03163314610ce45760405162461bcd60e51b815260040161088990612ae5565b601755565b6000610cf460095490565b8210610d575760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610889565b60098281548110610d7857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6006546001600160a01b03163314610db45760405162461bcd60e51b815260040161088990612ae5565b60155460ff1615158115151415610dca57600080fd5b6015805460ff1916911515919091179055565b6000818152600260205260408120546001600160a01b0316806108575760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610889565b6006546001600160a01b03163314610e7e5760405162461bcd60e51b815260040161088990612ae5565b601355565b60006001600160a01b038216610eee5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610889565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f345760405162461bcd60e51b815260040161088990612ae5565b610c4c6000611b07565b6006546001600160a01b03163314610f685760405162461bcd60e51b815260040161088990612ae5565b601455565b6006546001600160a01b03163314610f975760405162461bcd60e51b815260040161088990612ae5565b806115b31015610fb95760405162461bcd60e51b815260040161088990612abc565b600c55565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050600061100260095490565b60155490915060ff166110505760405162461bcd60e51b81526020600482015260166024820152755072652d73616c65206973206e6f7420656e61626c6560501b6044820152606401610889565b6115b361105d8683612bac565b111561109f5760405162461bcd60e51b8152602060048201526011602482015270115e18d959591cc81b585e081b1a5b5a5d607a1b6044820152606401610889565b6110e0848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506017549150859050611b59565b6111365760405162461bcd60e51b815260206004820152602160248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152601760f91b6064820152608401610889565b600c543360009081526115cc6020526040902054611155908790612bac565b11156111735760405162461bcd60e51b815260040161088990612b6b565b600e548511156111c55760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178206d696e74206c696d69742070657220746e7800006044820152606401610889565b846013546111d39190612bd8565b3410156112165760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b6044820152606401610889565b60005b8581101561126057600061122b611c16565b90506112373382611dc9565b6010805490600061124783612c75565b919050555050808061125890612c75565b915050611219565b503360009081526115cc602052604090205461127d908690612bac565b3360009081526115cc60205260409020555050505050565b6060600180546108b890612c3a565b6018816115b381106112b557600080fd5b0154905081565b6108a5338383611de3565b60006112d260095490565b601554909150610100900460ff166113215760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f7420656e61626c6560701b6044820152606401610889565b6115b361132e8383612bac565b11156113705760405162461bcd60e51b8152602060048201526011602482015270115e18d959591cc81b585e081b1a5b5a5d607a1b6044820152606401610889565b600d543360009081526115cc6020526040902060010154611392908490612bac565b11156113b05760405162461bcd60e51b815260040161088990612b6b565b600f548211156114025760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178206d696e74206c696d69742070657220746e7800006044820152606401610889565b816014546114109190612bd8565b3410156114535760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b6044820152606401610889565b60005b8281101561149d576000611468611c16565b90506114743382611dc9565b6011805490600061148483612c75565b919050555050808061149590612c75565b915050611456565b503360009081526115cc60205260409020600101546114bd908390612bac565b3360009081526115cc60205260409020600101555050565b6114df3383611865565b6114fb5760405162461bcd60e51b815260040161088990612b1a565b61150784848484611eb2565b50505050565b6000818152600260205260409020546060906001600160a01b031661158c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610889565b601661159783611ee5565b6040516020016115a8929190612960565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146115e85760405162461bcd60e51b815260040161088990612ae5565b60155460ff610100909104161515811515141561160457600080fd5b601580549115156101000261ff0019909216919091179055565b6006546001600160a01b031633146116485760405162461bcd60e51b815260040161088990612ae5565b600061165360095490565b90506115b36116628383612bac565b111561169c5760405162461bcd60e51b815260206004820152600960248201526813585e081b1a5b5a5d60ba1b6044820152606401610889565b60005b828110156115075760006116b1611c16565b90506116bd8582611dc9565b601280549060006116cd83612c75565b91905055505080806116de90612c75565b91505061169f565b6006546001600160a01b031633146117105760405162461bcd60e51b815260040161088990612ae5565b806115b310156117325760405162461bcd60e51b815260040161088990612abc565b600d55565b6006546001600160a01b031633146117615760405162461bcd60e51b815260040161088990612ae5565b6001600160a01b0381166117c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610889565b6117cf81611b07565b50565b60006001600160e01b0319821663780e9d6360e01b1480610857575061085782612000565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061182c82610ddd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118de5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610889565b60006118e983610ddd565b9050806001600160a01b0316846001600160a01b031614806119245750836001600160a01b03166119198461093b565b6001600160a01b0316145b8061195457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661196f82610ddd565b6001600160a01b0316146119d75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610889565b6001600160a01b038216611a395760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610889565b611a44838383612050565b611a4f6000826117f7565b6001600160a01b0383166000908152600360205260408120805460019290611a78908490612bf7565b90915550506001600160a01b0382166000908152600360205260408120805460019290611aa6908490612bac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081815b8551811015611c0b576000868281518110611b8957634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311611bcb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611bf8565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611c0381612c75565b915050611b5e565b509092149392505050565b6000806115cb546115b3611c2a9190612bf7565b6115cb546040805160208101929092526bffffffffffffffffffffffff193360601b169082015244605482015242607482015290915060009082906094016040516020818303038152906040528051906020012060001c611c8b9190612c90565b905060006018826115b38110611cb157634e487b7160e01b600052603260045260246000fd5b015415611ce3576018826115b38110611cda57634e487b7160e01b600052603260045260246000fd5b01549050611ce6565b50805b6018611cf3600185612bf7565b6115b38110611d1257634e487b7160e01b600052603260045260246000fd5b0154611d4c57611d23600184612bf7565b6018836115b38110611d4557634e487b7160e01b600052603260045260246000fd5b0155611d9f565b6018611d59600185612bf7565b6115b38110611d7857634e487b7160e01b600052603260045260246000fd5b01546018836115b38110611d9c57634e487b7160e01b600052603260045260246000fd5b01555b6115cb8054906000611db083612c75565b90915550611dc19050816001612bac565b935050505090565b6108a582826040518060200160405280600081525061205b565b816001600160a01b0316836001600160a01b03161415611e455760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610889565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ebd84848461195c565b611ec98484848461208e565b6115075760405162461bcd60e51b815260040161088990612a6a565b606081611f0a57506040805180820190915260018152600360fc1b602082015261085a565b8160005b8115611f345780611f1e81612c75565b9150611f2d9050600a83612bc4565b9150611f0e565b60008167ffffffffffffffff811115611f5d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f87576020820181803683370190505b5090505b841561195457611f9c600183612bf7565b9150611fa9600a86612c90565b611fb4906030612bac565b60f81b818381518110611fd757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ff9600a86612bc4565b9450611f8b565b60006001600160e01b031982166380ac58cd60e01b148061203157506001600160e01b03198216635b5e139f60e01b145b8061085757506301ffc9a760e01b6001600160e01b0319831614610857565b610ae183838361219b565b6120658383612258565b612072600084848461208e565b610ae15760405162461bcd60e51b815260040161088990612a6a565b60006001600160a01b0384163b1561219057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120d2903390899088908890600401612a1a565b602060405180830381600087803b1580156120ec57600080fd5b505af192505050801561211c575060408051601f3d908101601f191682019092526121199181019061283d565b60015b612176573d80801561214a576040519150601f19603f3d011682016040523d82523d6000602084013e61214f565b606091505b50805161216e5760405162461bcd60e51b815260040161088990612a6a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611954565b506001949350505050565b6001600160a01b0383166121f6576121f181600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612219565b816001600160a01b0316836001600160a01b0316146122195761221983826123a6565b6001600160a01b0382166122355761223081612443565b610ae1565b826001600160a01b0316826001600160a01b031614610ae157610ae1828261251c565b6001600160a01b0382166122ae5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610889565b6000818152600260205260409020546001600160a01b0316156123135760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610889565b61231f60008383612050565b6001600160a01b0382166000908152600360205260408120805460019290612348908490612bac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016123b384610e83565b6123bd9190612bf7565b600083815260086020526040902054909150808214612410576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061245590600190612bf7565b6000838152600a60205260408120546009805493945090928490811061248b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600983815481106124ba57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061250057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061252783610e83565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b82805461256c90612c3a565b90600052602060002090601f01602090048101928261258e57600085556125d4565b82601f106125a757805160ff19168380011785556125d4565b828001600101855582156125d4579182015b828111156125d45782518255916020019190600101906125b9565b506125e09291506125e4565b5090565b5b808211156125e057600081556001016125e5565b600067ffffffffffffffff8084111561261457612614612cd0565b604051601f8501601f19908116603f0116810190828211818310171561263c5761263c612cd0565b8160405280935085815286868601111561265557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461085a57600080fd5b8035801515811461085a57600080fd5b6000602082840312156126a7578081fd5b6126b08261266f565b9392505050565b600080604083850312156126c9578081fd5b6126d28361266f565b91506126e06020840161266f565b90509250929050565b6000806000606084860312156126fd578081fd5b6127068461266f565b92506127146020850161266f565b9150604084013590509250925092565b60008060008060808587031215612739578081fd5b6127428561266f565b93506127506020860161266f565b925060408501359150606085013567ffffffffffffffff811115612772578182fd5b8501601f81018713612782578182fd5b612791878235602084016125f9565b91505092959194509250565b600080604083850312156127af578182fd5b6127b88361266f565b91506126e060208401612686565b600080604083850312156127d8578182fd5b6127e18361266f565b946020939093013593505050565b600060208284031215612800578081fd5b6126b082612686565b60006020828403121561281a578081fd5b5035919050565b600060208284031215612832578081fd5b81356126b081612ce6565b60006020828403121561284e578081fd5b81516126b081612ce6565b60006020828403121561286a578081fd5b813567ffffffffffffffff811115612880578182fd5b8201601f81018413612890578182fd5b611954848235602084016125f9565b6000806000604084860312156128b3578283fd5b83359250602084013567ffffffffffffffff808211156128d1578384fd5b818601915086601f8301126128e4578384fd5b8135818111156128f2578485fd5b8760208083028501011115612905578485fd5b6020830194508093505050509250925092565b60008151808452612930816020860160208601612c0e565b601f01601f19169290920160200192915050565b60008151612956818560208601612c0e565b9290920192915050565b825460009081906002810460018083168061297c57607f831692505b602080841082141561299c57634e487b7160e01b87526022600452602487fd5b8180156129b057600181146129c1576129ed565b60ff198616895284890196506129ed565b60008b815260209020885b868110156129e55781548b8201529085019083016129cc565b505084890196505b505050505050612a11612a008286612944565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a4d90830184612918565b9695505050505050565b6000602082526126b06020830184612918565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600f908201526e496e636f72726563742076616c756560881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526021908201527f45786365656473206d6178206d696e74206c696d6974207065722077616c6c656040820152601d60fa1b606082015260800190565b60008219821115612bbf57612bbf612ca4565b500190565b600082612bd357612bd3612cba565b500490565b6000816000190483118215151615612bf257612bf2612ca4565b500290565b600082821015612c0957612c09612ca4565b500390565b60005b83811015612c29578181015183820152602001612c11565b838111156115075750506000910152565b600281046001821680612c4e57607f821691505b60208210811415612c6f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c8957612c89612ca4565b5060010190565b600082612c9f57612c9f612cba565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146117cf57600080fdfea2646970667358221220bbaaeb8685a40f5b581e4481ba60a9294c450935b42f7ebeae5668cbf115a0f864736f6c63430008020033

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063715018a61161015a578063a9526862116100c1578063dce051cc1161007a578063dce051cc1461076e578063e60400b41461078e578063e985e9c5146107a4578063f176baaa146107ed578063f2fde38b1461080d578063fe4ca8471461082d57610288565b8063a9526862146106cf578063ae5cc172146106e2578063b88d4fde146106f8578063c87b56dd14610718578063ccfb63a414610738578063d897833e1461074e57610288565b8063941e79fc11610113578063941e79fc146105fd578063945242c61461061d57806395d89b4114610630578063a1a953fd14610645578063a22cb46514610665578063a87430ba1461068557610288565b8063715018a6146105645780637e95eac4146105795780637ec0912e1461058f5780637ec18cf6146105af5780637f205a74146105c95780638da5cb5b146105df57610288565b80633ccfd60b116101fe5780635e326b92116101b75780635e326b92146104b857806362dc6e21146104d85780636352211e146104ee57806365fccb521461050e57806370a082311461052e578063711cc2ae1461054e57610288565b80633ccfd60b1461040d5780633e2e2a801461042257806342842e0e146104425780634783f0ef146104625780634d7cea16146104825780634f6ccce71461049857610288565b80630990e534116102505780630990e5341461035e57806318160ddd1461038257806323b872dd146103975780632eb4a7ab146103b75780632f745c59146103cd578063305004d9146103ed57610288565b806301ffc9a71461028d57806302fe5305146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004612821565b61084c565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004612859565b61085f565b005b3480156102f057600080fd5b506102f96108a9565b6040516102b99190612a57565b34801561031257600080fd5b50610326610321366004612809565b61093b565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e26103593660046127c6565b6109d0565b34801561036a57600080fd5b5061037460115481565b6040519081526020016102b9565b34801561038e57600080fd5b50600954610374565b3480156103a357600080fd5b506102e26103b23660046126e9565b610ae6565b3480156103c357600080fd5b5061037460175481565b3480156103d957600080fd5b506103746103e83660046127c6565b610b17565b3480156103f957600080fd5b506102e2610408366004612809565b610bad565b34801561041957600080fd5b506102e2610bfe565b34801561042e57600080fd5b506102e261043d366004612809565b610c4e565b34801561044e57600080fd5b506102e261045d3660046126e9565b610c9f565b34801561046e57600080fd5b506102e261047d366004612809565b610cba565b34801561048e57600080fd5b5061037460125481565b3480156104a457600080fd5b506103746104b3366004612809565b610ce9565b3480156104c457600080fd5b506102e26104d33660046127ef565b610d8a565b3480156104e457600080fd5b5061037460135481565b3480156104fa57600080fd5b50610326610509366004612809565b610ddd565b34801561051a57600080fd5b506102e2610529366004612809565b610e54565b34801561053a57600080fd5b50610374610549366004612696565b610e83565b34801561055a57600080fd5b50610374600f5481565b34801561057057600080fd5b506102e2610f0a565b34801561058557600080fd5b50610374600c5481565b34801561059b57600080fd5b506102e26105aa366004612809565b610f3e565b3480156105bb57600080fd5b506015546102ad9060ff1681565b3480156105d557600080fd5b5061037460145481565b3480156105eb57600080fd5b506006546001600160a01b0316610326565b34801561060957600080fd5b506102e2610618366004612809565b610f6d565b6102e261062b36600461289f565b610fbe565b34801561063c57600080fd5b506102f9611295565b34801561065157600080fd5b50610374610660366004612809565b6112a4565b34801561067157600080fd5b506102e261068036600461279d565b6112bc565b34801561069157600080fd5b506106ba6106a0366004612696565b6115cc602052600090815260409020805460019091015482565b604080519283526020830191909152016102b9565b6102e26106dd366004612809565b6112c7565b3480156106ee57600080fd5b50610374600d5481565b34801561070457600080fd5b506102e2610713366004612724565b6114d5565b34801561072457600080fd5b506102f9610733366004612809565b61150d565b34801561074457600080fd5b50610374600e5481565b34801561075a57600080fd5b506102e26107693660046127ef565b6115be565b34801561077a57600080fd5b506102e26107893660046127c6565b61161e565b34801561079a57600080fd5b5061037460105481565b3480156107b057600080fd5b506102ad6107bf3660046126b7565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107f957600080fd5b506102e2610808366004612809565b6116e6565b34801561081957600080fd5b506102e2610828366004612696565b611737565b34801561083957600080fd5b506015546102ad90610100900460ff1681565b6000610857826117d2565b90505b919050565b6006546001600160a01b031633146108925760405162461bcd60e51b815260040161088990612ae5565b60405180910390fd5b80516108a5906016906020840190612560565b5050565b6060600080546108b890612c3a565b80601f01602080910402602001604051908101604052809291908181526020018280546108e490612c3a565b80156109315780601f1061090657610100808354040283529160200191610931565b820191906000526020600020905b81548152906001019060200180831161091457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109b45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610889565b506000908152600460205260409020546001600160a01b031690565b60006109db82610ddd565b9050806001600160a01b0316836001600160a01b03161415610a495760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610889565b336001600160a01b0382161480610a655750610a6581336107bf565b610ad75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610889565b610ae183836117f7565b505050565b610af03382611865565b610b0c5760405162461bcd60e51b815260040161088990612b1a565b610ae183838361195c565b6000610b2283610e83565b8210610b845760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610889565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6006546001600160a01b03163314610bd75760405162461bcd60e51b815260040161088990612ae5565b806115b31015610bf95760405162461bcd60e51b815260040161088990612abc565b600e55565b6006546001600160a01b03163314610c285760405162461bcd60e51b815260040161088990612ae5565b60405133904780156108fc02916000818181858888f19350505050610c4c57600080fd5b565b6006546001600160a01b03163314610c785760405162461bcd60e51b815260040161088990612ae5565b806115b31015610c9a5760405162461bcd60e51b815260040161088990612abc565b600f55565b610ae1838383604051806020016040528060008152506114d5565b6006546001600160a01b03163314610ce45760405162461bcd60e51b815260040161088990612ae5565b601755565b6000610cf460095490565b8210610d575760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610889565b60098281548110610d7857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6006546001600160a01b03163314610db45760405162461bcd60e51b815260040161088990612ae5565b60155460ff1615158115151415610dca57600080fd5b6015805460ff1916911515919091179055565b6000818152600260205260408120546001600160a01b0316806108575760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610889565b6006546001600160a01b03163314610e7e5760405162461bcd60e51b815260040161088990612ae5565b601355565b60006001600160a01b038216610eee5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610889565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f345760405162461bcd60e51b815260040161088990612ae5565b610c4c6000611b07565b6006546001600160a01b03163314610f685760405162461bcd60e51b815260040161088990612ae5565b601455565b6006546001600160a01b03163314610f975760405162461bcd60e51b815260040161088990612ae5565b806115b31015610fb95760405162461bcd60e51b815260040161088990612abc565b600c55565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050600061100260095490565b60155490915060ff166110505760405162461bcd60e51b81526020600482015260166024820152755072652d73616c65206973206e6f7420656e61626c6560501b6044820152606401610889565b6115b361105d8683612bac565b111561109f5760405162461bcd60e51b8152602060048201526011602482015270115e18d959591cc81b585e081b1a5b5a5d607a1b6044820152606401610889565b6110e0848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506017549150859050611b59565b6111365760405162461bcd60e51b815260206004820152602160248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152601760f91b6064820152608401610889565b600c543360009081526115cc6020526040902054611155908790612bac565b11156111735760405162461bcd60e51b815260040161088990612b6b565b600e548511156111c55760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178206d696e74206c696d69742070657220746e7800006044820152606401610889565b846013546111d39190612bd8565b3410156112165760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b6044820152606401610889565b60005b8581101561126057600061122b611c16565b90506112373382611dc9565b6010805490600061124783612c75565b919050555050808061125890612c75565b915050611219565b503360009081526115cc602052604090205461127d908690612bac565b3360009081526115cc60205260409020555050505050565b6060600180546108b890612c3a565b6018816115b381106112b557600080fd5b0154905081565b6108a5338383611de3565b60006112d260095490565b601554909150610100900460ff166113215760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f7420656e61626c6560701b6044820152606401610889565b6115b361132e8383612bac565b11156113705760405162461bcd60e51b8152602060048201526011602482015270115e18d959591cc81b585e081b1a5b5a5d607a1b6044820152606401610889565b600d543360009081526115cc6020526040902060010154611392908490612bac565b11156113b05760405162461bcd60e51b815260040161088990612b6b565b600f548211156114025760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178206d696e74206c696d69742070657220746e7800006044820152606401610889565b816014546114109190612bd8565b3410156114535760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b6044820152606401610889565b60005b8281101561149d576000611468611c16565b90506114743382611dc9565b6011805490600061148483612c75565b919050555050808061149590612c75565b915050611456565b503360009081526115cc60205260409020600101546114bd908390612bac565b3360009081526115cc60205260409020600101555050565b6114df3383611865565b6114fb5760405162461bcd60e51b815260040161088990612b1a565b61150784848484611eb2565b50505050565b6000818152600260205260409020546060906001600160a01b031661158c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610889565b601661159783611ee5565b6040516020016115a8929190612960565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146115e85760405162461bcd60e51b815260040161088990612ae5565b60155460ff610100909104161515811515141561160457600080fd5b601580549115156101000261ff0019909216919091179055565b6006546001600160a01b031633146116485760405162461bcd60e51b815260040161088990612ae5565b600061165360095490565b90506115b36116628383612bac565b111561169c5760405162461bcd60e51b815260206004820152600960248201526813585e081b1a5b5a5d60ba1b6044820152606401610889565b60005b828110156115075760006116b1611c16565b90506116bd8582611dc9565b601280549060006116cd83612c75565b91905055505080806116de90612c75565b91505061169f565b6006546001600160a01b031633146117105760405162461bcd60e51b815260040161088990612ae5565b806115b310156117325760405162461bcd60e51b815260040161088990612abc565b600d55565b6006546001600160a01b031633146117615760405162461bcd60e51b815260040161088990612ae5565b6001600160a01b0381166117c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610889565b6117cf81611b07565b50565b60006001600160e01b0319821663780e9d6360e01b1480610857575061085782612000565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061182c82610ddd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118de5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610889565b60006118e983610ddd565b9050806001600160a01b0316846001600160a01b031614806119245750836001600160a01b03166119198461093b565b6001600160a01b0316145b8061195457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661196f82610ddd565b6001600160a01b0316146119d75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610889565b6001600160a01b038216611a395760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610889565b611a44838383612050565b611a4f6000826117f7565b6001600160a01b0383166000908152600360205260408120805460019290611a78908490612bf7565b90915550506001600160a01b0382166000908152600360205260408120805460019290611aa6908490612bac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081815b8551811015611c0b576000868281518110611b8957634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311611bcb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611bf8565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611c0381612c75565b915050611b5e565b509092149392505050565b6000806115cb546115b3611c2a9190612bf7565b6115cb546040805160208101929092526bffffffffffffffffffffffff193360601b169082015244605482015242607482015290915060009082906094016040516020818303038152906040528051906020012060001c611c8b9190612c90565b905060006018826115b38110611cb157634e487b7160e01b600052603260045260246000fd5b015415611ce3576018826115b38110611cda57634e487b7160e01b600052603260045260246000fd5b01549050611ce6565b50805b6018611cf3600185612bf7565b6115b38110611d1257634e487b7160e01b600052603260045260246000fd5b0154611d4c57611d23600184612bf7565b6018836115b38110611d4557634e487b7160e01b600052603260045260246000fd5b0155611d9f565b6018611d59600185612bf7565b6115b38110611d7857634e487b7160e01b600052603260045260246000fd5b01546018836115b38110611d9c57634e487b7160e01b600052603260045260246000fd5b01555b6115cb8054906000611db083612c75565b90915550611dc19050816001612bac565b935050505090565b6108a582826040518060200160405280600081525061205b565b816001600160a01b0316836001600160a01b03161415611e455760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610889565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ebd84848461195c565b611ec98484848461208e565b6115075760405162461bcd60e51b815260040161088990612a6a565b606081611f0a57506040805180820190915260018152600360fc1b602082015261085a565b8160005b8115611f345780611f1e81612c75565b9150611f2d9050600a83612bc4565b9150611f0e565b60008167ffffffffffffffff811115611f5d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f87576020820181803683370190505b5090505b841561195457611f9c600183612bf7565b9150611fa9600a86612c90565b611fb4906030612bac565b60f81b818381518110611fd757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ff9600a86612bc4565b9450611f8b565b60006001600160e01b031982166380ac58cd60e01b148061203157506001600160e01b03198216635b5e139f60e01b145b8061085757506301ffc9a760e01b6001600160e01b0319831614610857565b610ae183838361219b565b6120658383612258565b612072600084848461208e565b610ae15760405162461bcd60e51b815260040161088990612a6a565b60006001600160a01b0384163b1561219057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120d2903390899088908890600401612a1a565b602060405180830381600087803b1580156120ec57600080fd5b505af192505050801561211c575060408051601f3d908101601f191682019092526121199181019061283d565b60015b612176573d80801561214a576040519150601f19603f3d011682016040523d82523d6000602084013e61214f565b606091505b50805161216e5760405162461bcd60e51b815260040161088990612a6a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611954565b506001949350505050565b6001600160a01b0383166121f6576121f181600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612219565b816001600160a01b0316836001600160a01b0316146122195761221983826123a6565b6001600160a01b0382166122355761223081612443565b610ae1565b826001600160a01b0316826001600160a01b031614610ae157610ae1828261251c565b6001600160a01b0382166122ae5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610889565b6000818152600260205260409020546001600160a01b0316156123135760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610889565b61231f60008383612050565b6001600160a01b0382166000908152600360205260408120805460019290612348908490612bac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016123b384610e83565b6123bd9190612bf7565b600083815260086020526040902054909150808214612410576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061245590600190612bf7565b6000838152600a60205260408120546009805493945090928490811061248b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600983815481106124ba57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061250057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061252783610e83565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b82805461256c90612c3a565b90600052602060002090601f01602090048101928261258e57600085556125d4565b82601f106125a757805160ff19168380011785556125d4565b828001600101855582156125d4579182015b828111156125d45782518255916020019190600101906125b9565b506125e09291506125e4565b5090565b5b808211156125e057600081556001016125e5565b600067ffffffffffffffff8084111561261457612614612cd0565b604051601f8501601f19908116603f0116810190828211818310171561263c5761263c612cd0565b8160405280935085815286868601111561265557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461085a57600080fd5b8035801515811461085a57600080fd5b6000602082840312156126a7578081fd5b6126b08261266f565b9392505050565b600080604083850312156126c9578081fd5b6126d28361266f565b91506126e06020840161266f565b90509250929050565b6000806000606084860312156126fd578081fd5b6127068461266f565b92506127146020850161266f565b9150604084013590509250925092565b60008060008060808587031215612739578081fd5b6127428561266f565b93506127506020860161266f565b925060408501359150606085013567ffffffffffffffff811115612772578182fd5b8501601f81018713612782578182fd5b612791878235602084016125f9565b91505092959194509250565b600080604083850312156127af578182fd5b6127b88361266f565b91506126e060208401612686565b600080604083850312156127d8578182fd5b6127e18361266f565b946020939093013593505050565b600060208284031215612800578081fd5b6126b082612686565b60006020828403121561281a578081fd5b5035919050565b600060208284031215612832578081fd5b81356126b081612ce6565b60006020828403121561284e578081fd5b81516126b081612ce6565b60006020828403121561286a578081fd5b813567ffffffffffffffff811115612880578182fd5b8201601f81018413612890578182fd5b611954848235602084016125f9565b6000806000604084860312156128b3578283fd5b83359250602084013567ffffffffffffffff808211156128d1578384fd5b818601915086601f8301126128e4578384fd5b8135818111156128f2578485fd5b8760208083028501011115612905578485fd5b6020830194508093505050509250925092565b60008151808452612930816020860160208601612c0e565b601f01601f19169290920160200192915050565b60008151612956818560208601612c0e565b9290920192915050565b825460009081906002810460018083168061297c57607f831692505b602080841082141561299c57634e487b7160e01b87526022600452602487fd5b8180156129b057600181146129c1576129ed565b60ff198616895284890196506129ed565b60008b815260209020885b868110156129e55781548b8201529085019083016129cc565b505084890196505b505050505050612a11612a008286612944565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a4d90830184612918565b9695505050505050565b6000602082526126b06020830184612918565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600f908201526e496e636f72726563742076616c756560881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526021908201527f45786365656473206d6178206d696e74206c696d6974207065722077616c6c656040820152601d60fa1b606082015260800190565b60008219821115612bbf57612bbf612ca4565b500190565b600082612bd357612bd3612cba565b500490565b6000816000190483118215151615612bf257612bf2612ca4565b500290565b600082821015612c0957612c09612ca4565b500390565b60005b83811015612c29578181015183820152602001612c11565b838111156115075750506000910152565b600281046001821680612c4e57607f821691505b60208210811415612c6f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c8957612c89612ca4565b5060010190565b600082612c9f57612c9f612cba565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146117cf57600080fdfea2646970667358221220bbaaeb8685a40f5b581e4481ba60a9294c450935b42f7ebeae5668cbf115a0f864736f6c63430008020033

Deployed Bytecode Sourcemap

46302:5872:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49559:171;;;;;;;;;;-1:-1:-1;49559:171:0;;;;;:::i;:::-;;:::i;:::-;;;9045:14:1;;9038:22;9020:41;;9008:2;8993:18;49559:171:0;;;;;;;;50013:88;;;;;;;;;;-1:-1:-1;50013:88:0;;;;;:::i;:::-;;:::i;:::-;;24049:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25608:221::-;;;;;;;;;;-1:-1:-1;25608:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8343:32:1;;;8325:51;;8313:2;8298:18;25608:221:0;8280:102:1;25131:411:0;;;;;;;;;;-1:-1:-1;25131:411:0;;;;;:::i;:::-;;:::i;46683:26::-;;;;;;;;;;;;;;;;;;;9218:25:1;;;9206:2;9191:18;46683:26:0;9173:76:1;36998:113:0;;;;;;;;;;-1:-1:-1;37086:10:0;:17;36998:113;;26358:339;;;;;;;;;;-1:-1:-1;26358:339:0;;;;;:::i;:::-;;:::i;46944:25::-;;;;;;;;;;;;;;;;36666:256;;;;;;;;;;-1:-1:-1;36666:256:0;;;;;:::i;:::-;;:::i;51067:202::-;;;;;;;;;;-1:-1:-1;51067:202:0;;;;;:::i;:::-;;:::i;50107:114::-;;;;;;;;;;;;;:::i;51275:196::-;;;;;;;;;;-1:-1:-1;51275:196:0;;;;;:::i;:::-;;:::i;26768:185::-;;;;;;;;;;-1:-1:-1;26768:185:0;;;;;:::i;:::-;;:::i;51477:95::-;;;;;;;;;;-1:-1:-1;51477:95:0;;;;;:::i;:::-;;:::i;46713:30::-;;;;;;;;;;;;;;;;37188:233;;;;;;;;;;-1:-1:-1;37188:233:0;;;;;:::i;:::-;;:::i;50580:135::-;;;;;;;;;;-1:-1:-1;50580:135:0;;;;;:::i;:::-;;:::i;46750:41::-;;;;;;;;;;;;;;;;23743:239;;;;;;;;;;-1:-1:-1;23743:239:0;;;;;:::i;:::-;;:::i;50335:108::-;;;;;;;;;;-1:-1:-1;50335:108:0;;;;;:::i;:::-;;:::i;23473:208::-;;;;;;;;;;-1:-1:-1;23473:208:0;;;;;:::i;:::-;;:::i;46592:51::-;;;;;;;;;;;;;;;;21060:103;;;;;;;;;;;;;:::i;46454:36::-;;;;;;;;;;;;;;;;50227:102;;;;;;;;;;-1:-1:-1;50227:102:0;;;;;:::i;:::-;;:::i;46844:33::-;;;;;;;;;;-1:-1:-1;46844:33:0;;;;;;;;46795:39;;;;;;;;;;;;;;;;20409:87;;;;;;;;;;-1:-1:-1;20482:6:0;;-1:-1:-1;;;;;20482:6:0;20409:87;;50891:170;;;;;;;;;;-1:-1:-1;50891:170:0;;;;;:::i;:::-;;:::i;47589:1002::-;;;;;;:::i;:::-;;:::i;24218:104::-;;;;;;;;;;;;;:::i;46976:28::-;;;;;;;;;;-1:-1:-1;46976:28:0;;;;;:::i;:::-;;:::i;25901:155::-;;;;;;;;;;-1:-1:-1;25901:155:0;;;;;:::i;:::-;;:::i;47096:38::-;;;;;;;;;;-1:-1:-1;47096:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;20275:25:1;;;20331:2;20316:18;;20309:34;;;;20248:18;47096:38:0;20230:119:1;48597:766:0;;;;;;:::i;:::-;;:::i;46494:33::-;;;;;;;;;;;;;;;;27024:328;;;;;;;;;;-1:-1:-1;27024:328:0;;;;;:::i;:::-;;:::i;49738:266::-;;;;;;;;;;-1:-1:-1;49738:266:0;;;;;:::i;:::-;;:::i;46534:54::-;;;;;;;;;;;;;;;;50449:125;;;;;;;;;;-1:-1:-1;50449:125:0;;;;;:::i;:::-;;:::i;47208:375::-;;;;;;;;;;-1:-1:-1;47208:375:0;;;;;:::i;:::-;;:::i;46650:29::-;;;;;;;;;;;;;;;;26127:164;;;;;;;;;;-1:-1:-1;26127:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26248:25:0;;;26224:4;26248:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26127:164;50721;;;;;;;;;;-1:-1:-1;50721:164:0;;;;;:::i;:::-;;:::i;21318:201::-;;;;;;;;;;-1:-1:-1;21318:201:0;;;;;:::i;:::-;;:::i;46881:30::-;;;;;;;;;;-1:-1:-1;46881:30:0;;;;;;;;;;;49559:171;49662:4;49686:36;49710:11;49686:23;:36::i;:::-;49679:43;;49559:171;;;;:::o;50013:88::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;;;;;;;;;50079:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50013:88:::0;:::o;24049:100::-;24103:13;24136:5;24129:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24049:100;:::o;25608:221::-;25684:7;28951:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28951:16:0;25704:73;;;;-1:-1:-1;;;25704:73:0;;16196:2:1;25704:73:0;;;16178:21:1;16235:2;16215:18;;;16208:30;16274:34;16254:18;;;16247:62;-1:-1:-1;;;16325:18:1;;;16318:42;16377:19;;25704:73:0;16168:234:1;25704:73:0;-1:-1:-1;25797:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25797:24:0;;25608:221::o;25131:411::-;25212:13;25228:23;25243:7;25228:14;:23::i;:::-;25212:39;;25276:5;-1:-1:-1;;;;;25270:11:0;:2;-1:-1:-1;;;;;25270:11:0;;;25262:57;;;;-1:-1:-1;;;25262:57:0;;18486:2:1;25262:57:0;;;18468:21:1;18525:2;18505:18;;;18498:30;18564:34;18544:18;;;18537:62;-1:-1:-1;;;18615:18:1;;;18608:31;18656:19;;25262:57:0;18458:223:1;25262:57:0;17371:10;-1:-1:-1;;;;;25354:21:0;;;;:62;;-1:-1:-1;25379:37:0;25396:5;17371:10;25403:12;17291:98;25379:37;25332:168;;;;-1:-1:-1;;;25332:168:0;;13884:2:1;25332:168:0;;;13866:21:1;13923:2;13903:18;;;13896:30;13962:34;13942:18;;;13935:62;14033:26;14013:18;;;14006:54;14077:19;;25332:168:0;13856:246:1;25332:168:0;25513:21;25522:2;25526:7;25513:8;:21::i;:::-;25131:411;;;:::o;26358:339::-;26553:41;17371:10;26586:7;26553:18;:41::i;:::-;26545:103;;;;-1:-1:-1;;;26545:103:0;;;;;;;:::i;:::-;26661:28;26671:4;26677:2;26681:7;26661:9;:28::i;36666:256::-;36763:7;36799:23;36816:5;36799:16;:23::i;:::-;36791:5;:31;36783:87;;;;-1:-1:-1;;;36783:87:0;;9680:2:1;36783:87:0;;;9662:21:1;9719:2;9699:18;;;9692:30;9758:34;9738:18;;;9731:62;-1:-1:-1;;;9809:18:1;;;9802:41;9860:19;;36783:87:0;9652:233:1;36783:87:0;-1:-1:-1;;;;;;36888:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36666:256::o;51067:202::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;51177:8:::1;46446:4;51166:19;;51158:47;;;;-1:-1:-1::0;;;51158:47:0::1;;;;;;;:::i;:::-;51216:34;:45:::0;51067:202::o;50107:114::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;50165:47:::1;::::0;50173:10:::1;::::0;50190:21:::1;50165:47:::0;::::1;;;::::0;::::1;::::0;;;50190:21;50173:10;50165:47;::::1;;;;;;50157:56;;;::::0;::::1;;50107:114::o:0;51275:196::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;51382:8:::1;46446:4;51371:19;;51363:47;;;;-1:-1:-1::0;;;51363:47:0::1;;;;;;;:::i;:::-;51421:31;:42:::0;51275:196::o;26768:185::-;26906:39;26923:4;26929:2;26933:7;26906:39;;;;;;;;;;;;:16;:39::i;51477:95::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;51547:10:::1;:20:::0;51477:95::o;37188:233::-;37263:7;37299:30;37086:10;:17;36998:113;;37299:30;37291:5;:38;37283:95;;;;-1:-1:-1;;;37283:95:0;;19708:2:1;37283:95:0;;;19690:21:1;19747:2;19727:18;;;19720:30;19786:34;19766:18;;;19759:62;-1:-1:-1;;;19837:18:1;;;19830:42;19889:19;;37283:95:0;19680:234:1;37283:95:0;37396:10;37407:5;37396:17;;;;;;-1:-1:-1;;;37396:17:0;;;;;;;;;;;;;;;;;37389:24;;37188:233;;;:::o;50580:135::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;50651:13:::1;::::0;::::1;;:23;;::::0;::::1;;;;50643:32;;;::::0;::::1;;50685:13;:22:::0;;-1:-1:-1;;50685:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50580:135::o;23743:239::-;23815:7;23851:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23851:16:0;23886:19;23878:73;;;;-1:-1:-1;;;23878:73:0;;15079:2:1;23878:73:0;;;15061:21:1;15118:2;15098:18;;;15091:30;15157:34;15137:18;;;15130:62;-1:-1:-1;;;15208:18:1;;;15201:39;15257:19;;23878:73:0;15051:231:1;50335:108:0;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;50411:13:::1;:24:::0;50335:108::o;23473:208::-;23545:7;-1:-1:-1;;;;;23573:19:0;;23565:74;;;;-1:-1:-1;;;23565:74:0;;14668:2:1;23565:74:0;;;14650:21:1;14707:2;14687:18;;;14680:30;14746:34;14726:18;;;14719:62;-1:-1:-1;;;14797:18:1;;;14790:40;14847:19;;23565:74:0;14640:232:1;23565:74:0;-1:-1:-1;;;;;;23657:16:0;;;;;:9;:16;;;;;;;23473:208::o;21060:103::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;21125:30:::1;21152:1;21125:18;:30::i;50227:102::-:0;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;50300:10:::1;:21:::0;50227:102::o;50891:170::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;50987:8:::1;46446:4;50976:19;;50968:47;;;;-1:-1:-1::0;;;50968:47:0::1;;;;;;;:::i;:::-;51026:16;:27:::0;50891:170::o;47589:1002::-;47705:28;;-1:-1:-1;;47722:10:0;6103:2:1;6099:15;6095:53;47705:28:0;;;6083:66:1;47680:12:0;;6165::1;;47705:28:0;;;;;;;;;;;;47695:39;;;;;;47680:54;;47739:19;47761:13;37086:10;:17;36998:113;;47761:13;47792;;47739:35;;-1:-1:-1;47792:13:0;;47779:62;;;;-1:-1:-1;;;47779:62:0;;13131:2:1;47779:62:0;;;13113:21:1;13170:2;13150:18;;;13143:30;-1:-1:-1;;;13189:18:1;;;13182:52;13251:18;;47779:62:0;13103:172:1;47779:62:0;46446:4;47865:20;47879:6;47865:11;:20;:::i;:::-;:31;;47852:75;;;;-1:-1:-1;;;47852:75:0;;15489:2:1;47852:75:0;;;15471:21:1;15528:2;15508:18;;;15501:30;-1:-1:-1;;;15547:18:1;;;15540:47;15604:18;;47852:75:0;15461:167:1;47852:75:0;47945:49;47964:11;;47945:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47977:10:0;;;-1:-1:-1;47989:4:0;;-1:-1:-1;47945:18:0;:49::i;:::-;47932:109;;;;-1:-1:-1;;;47932:109:0;;13482:2:1;47932:109:0;;;13464:21:1;13521:2;13501:18;;;13494:30;13560:34;13540:18;;;13533:62;-1:-1:-1;;;13611:18:1;;;13604:31;13652:19;;47932:109:0;13454:223:1;47932:109:0;48101:16;;48065:10;48059:17;;;;:5;:17;;;;;:29;:38;;48091:6;;48059:38;:::i;:::-;:58;;48046:117;;;;-1:-1:-1;;;48046:117:0;;;;;;;:::i;:::-;48191:34;;48181:6;:44;;48168:100;;;;-1:-1:-1;;;48168:100:0;;14309:2:1;48168:100:0;;;14291:21:1;14348:2;14328:18;;;14321:30;14387:32;14367:18;;;14360:60;14437:18;;48168:100:0;14281:180:1;48168:100:0;48315:6;48299:13;;:22;;;;:::i;:::-;48286:9;:35;;48273:78;;;;-1:-1:-1;;;48273:78:0;;18140:2:1;48273:78:0;;;18122:21:1;18179:2;18159:18;;;18152:30;-1:-1:-1;;;18198:18:1;;;18191:47;18255:18;;48273:78:0;18112:167:1;48273:78:0;48361:9;48356:153;48380:6;48376:1;:10;48356:153;;;48402:15;48420:10;:8;:10::i;:::-;48402:28;;48445:30;48455:10;48467:7;48445:9;:30::i;:::-;48481:14;:16;;;:14;:16;;;:::i;:::-;;;;;;48356:153;48388:3;;;;;:::i;:::-;;;;48356:153;;;-1:-1:-1;48551:10:0;48545:17;;;;:5;:17;;;;;:29;:38;;48577:6;;48545:38;:::i;:::-;48519:10;48513:17;;;;:5;:17;;;;;:70;-1:-1:-1;;;;;47589:1002:0:o;24218:104::-;24274:13;24307:7;24300:14;;;;;:::i;46976:28::-;;;;;;;;;;;;;;;-1:-1:-1;46976:28:0;:::o;25901:155::-;25996:52;17371:10;26029:8;26039;25996:18;:52::i;48597:766::-;48653:19;48675:13;37086:10;:17;36998:113;;48675:13;48706:10;;48653:35;;-1:-1:-1;48706:10:0;;;;;48693:55;;;;-1:-1:-1;;;48693:55:0;;12371:2:1;48693:55:0;;;12353:21:1;12410:2;12390:18;;;12383:30;-1:-1:-1;;;12429:18:1;;;12422:48;12487:18;;48693:55:0;12343:168:1;48693:55:0;46446:4;48772:20;48786:6;48772:11;:20;:::i;:::-;:31;;48759:75;;;;-1:-1:-1;;;48759:75:0;;15489:2:1;48759:75:0;;;15471:21:1;15528:2;15508:18;;;15501:30;-1:-1:-1;;;15547:18:1;;;15540:47;15604:18;;48759:75:0;15461:167:1;48759:75:0;48891:13;;48858:10;48852:17;;;;:5;:17;;;;;:26;;;:35;;48881:6;;48852:35;:::i;:::-;:52;;48839:111;;;;-1:-1:-1;;;48839:111:0;;;;;;;:::i;:::-;48978:31;;48968:6;:41;;48955:97;;;;-1:-1:-1;;;48955:97:0;;14309:2:1;48955:97:0;;;14291:21:1;14348:2;14328:18;;;14321:30;14387:32;14367:18;;;14360:60;14437:18;;48955:97:0;14281:180:1;48955:97:0;49096:6;49083:10;;:19;;;;:::i;:::-;49070:9;:32;;49057:75;;;;-1:-1:-1;;;49057:75:0;;18140:2:1;49057:75:0;;;18122:21:1;18179:2;18159:18;;;18152:30;-1:-1:-1;;;18198:18:1;;;18191:47;18255:18;;49057:75:0;18112:167:1;49057:75:0;49142:9;49137:150;49161:6;49157:1;:10;49137:150;;;49183:15;49201:10;:8;:10::i;:::-;49183:28;;49226:30;49236:10;49248:7;49226:9;:30::i;:::-;49262:11;:13;;;:11;:13;;;:::i;:::-;;;;;;49137:150;49169:3;;;;;:::i;:::-;;;;49137:150;;;-1:-1:-1;49326:10:0;49320:17;;;;:5;:17;;;;;:26;;;:35;;49349:6;;49320:35;:::i;:::-;49297:10;49291:17;;;;:5;:17;;;;;:26;;:64;-1:-1:-1;;48597:766:0:o;27024:328::-;27199:41;17371:10;27232:7;27199:18;:41::i;:::-;27191:103;;;;-1:-1:-1;;;27191:103:0;;;;;;;:::i;:::-;27305:39;27319:4;27325:2;27329:7;27338:5;27305:13;:39::i;:::-;27024:328;;;;:::o;49738:266::-;28927:4;28951:16;;;:7;:16;;;;;;49812:13;;-1:-1:-1;;;;;28951:16:0;49838:77;;;;-1:-1:-1;;;49838:77:0;;17724:2:1;49838:77:0;;;17706:21:1;17763:2;17743:18;;;17736:30;17802:34;17782:18;;;17775:62;-1:-1:-1;;;17853:18:1;;;17846:45;17908:19;;49838:77:0;17696:237:1;49838:77:0;49957:7;49966:19;:8;:17;:19::i;:::-;49940:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49926:70;;49738:266;;;:::o;50449:125::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;50521:10:::1;::::0;::::1;;::::0;;::::1;;:20;;::::0;::::1;;;;50513:29;;;::::0;::::1;;50547:10;:19:::0;;;::::1;;;;-1:-1:-1::0;;50547:19:0;;::::1;::::0;;;::::1;::::0;;50449:125::o;47208:375::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;47286:19:::1;47308:13;37086:10:::0;:17;36998:113;;47308:13:::1;47286:35:::0;-1:-1:-1;46446:4:0::1;47354:20;47368:6:::0;47286:35;47354:20:::1;:::i;:::-;:31;;47332:91;;;::::0;-1:-1:-1;;;47332:91:0;;12034:2:1;47332:91:0::1;::::0;::::1;12016:21:1::0;12073:1;12053:18;;;12046:29;-1:-1:-1;;;12091:18:1;;;12084:39;12140:18;;47332:91:0::1;12006:158:1::0;47332:91:0::1;47433:9;47428:148;47452:6;47448:1;:10;47428:148;;;47475:15;47493:10;:8;:10::i;:::-;47475:28;;47518:23;47528:3;47533:7;47518:9;:23::i;:::-;47547:15;:17:::0;;;:15:::1;:17;::::0;::::1;:::i;:::-;;;;;;47428:148;47460:3;;;;;:::i;:::-;;;;47428:148;;50721:164:::0;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;50814:8:::1;46446:4;50803:19;;50795:47;;;;-1:-1:-1::0;;;50795:47:0::1;;;;;;;:::i;:::-;50853:13;:24:::0;50721:164::o;21318:201::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21407:22:0;::::1;21399:73;;;::::0;-1:-1:-1;;;21399:73:0;;10511:2:1;21399:73:0::1;::::0;::::1;10493:21:1::0;10550:2;10530:18;;;10523:30;10589:34;10569:18;;;10562:62;-1:-1:-1;;;10640:18:1;;;10633:36;10686:19;;21399:73:0::1;10483:228:1::0;21399:73:0::1;21483:28;21502:8;21483:18;:28::i;:::-;21318:201:::0;:::o;36358:224::-;36460:4;-1:-1:-1;;;;;;36484:50:0;;-1:-1:-1;;;36484:50:0;;:90;;;36538:36;36562:11;36538:23;:36::i;32844:174::-;32919:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32919:29:0;-1:-1:-1;;;;;32919:29:0;;;;;;;;:24;;32973:23;32919:24;32973:14;:23::i;:::-;-1:-1:-1;;;;;32964:46:0;;;;;;;;;;;32844:174;;:::o;29156:348::-;29249:4;28951:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28951:16:0;29266:73;;;;-1:-1:-1;;;29266:73:0;;12718:2:1;29266:73:0;;;12700:21:1;12757:2;12737:18;;;12730:30;12796:34;12776:18;;;12769:62;-1:-1:-1;;;12847:18:1;;;12840:42;12899:19;;29266:73:0;12690:234:1;29266:73:0;29350:13;29366:23;29381:7;29366:14;:23::i;:::-;29350:39;;29419:5;-1:-1:-1;;;;;29408:16:0;:7;-1:-1:-1;;;;;29408:16:0;;:51;;;;29452:7;-1:-1:-1;;;;;29428:31:0;:20;29440:7;29428:11;:20::i;:::-;-1:-1:-1;;;;;29428:31:0;;29408:51;:87;;;-1:-1:-1;;;;;;26248:25:0;;;26224:4;26248:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29463:32;29400:96;29156:348;-1:-1:-1;;;;29156:348:0:o;32148:578::-;32307:4;-1:-1:-1;;;;;32280:31:0;:23;32295:7;32280:14;:23::i;:::-;-1:-1:-1;;;;;32280:31:0;;32272:85;;;;-1:-1:-1;;;32272:85:0;;17314:2:1;32272:85:0;;;17296:21:1;17353:2;17333:18;;;17326:30;17392:34;17372:18;;;17365:62;-1:-1:-1;;;17443:18:1;;;17436:39;17492:19;;32272:85:0;17286:231:1;32272:85:0;-1:-1:-1;;;;;32376:16:0;;32368:65;;;;-1:-1:-1;;;32368:65:0;;11275:2:1;32368:65:0;;;11257:21:1;11314:2;11294:18;;;11287:30;11353:34;11333:18;;;11326:62;-1:-1:-1;;;11404:18:1;;;11397:34;11448:19;;32368:65:0;11247:226:1;32368:65:0;32446:39;32467:4;32473:2;32477:7;32446:20;:39::i;:::-;32550:29;32567:1;32571:7;32550:8;:29::i;:::-;-1:-1:-1;;;;;32592:15:0;;;;;;:9;:15;;;;;:20;;32611:1;;32592:15;:20;;32611:1;;32592:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32623:13:0;;;;;;:9;:13;;;;;:18;;32640:1;;32623:13;:18;;32640:1;;32623:18;:::i;:::-;;;;-1:-1:-1;;32652:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32652:21:0;-1:-1:-1;;;;;32652:21:0;;;;;;;;;32691:27;;32652:16;;32691:27;;;;;;;32148:578;;;:::o;21679:191::-;21772:6;;;-1:-1:-1;;;;;21789:17:0;;;-1:-1:-1;;;;;;21789:17:0;;;;;;;21822:40;;21772:6;;;21789:17;21772:6;;21822:40;;21753:16;;21822:40;21679:191;;:::o;45465:830::-;45590:4;45630;45590;45647:525;45671:5;:12;45667:1;:16;45647:525;;;45705:20;45728:5;45734:1;45728:8;;;;;;-1:-1:-1;;;45728:8:0;;;;;;;;;;;;;;;45705:31;;45773:12;45757;:28;45753:408;;45910:44;;;;;;6345:19:1;;;6380:12;;;6373:28;;;6417:12;;45910:44:0;;;;;;;;;;;;45900:55;;;;;;45885:70;;45753:408;;;46100:44;;;;;;6345:19:1;;;6380:12;;;6373:28;;;6417:12;;46100:44:0;;;;;;;;;;;;46090:55;;;;;;46075:70;;45753:408;-1:-1:-1;45685:3:0;;;;:::i;:::-;;;;45647:525;;;-1:-1:-1;46267:20:0;;;;45465:830;-1:-1:-1;;;45465:830:0:o;51581:590::-;51618:4;51635:14;51662:5;;46446:4;51652:15;;;;:::i;:::-;51723:5;;51706:70;;;;;;7962:19:1;;;;-1:-1:-1;;51730:10:0;8019:2:1;8015:15;8011:53;7997:12;;;7990:75;51742:16:0;8081:12:1;;;8074:28;51760:15:0;8118:12:1;;;8111:28;51635:32:0;;-1:-1:-1;51678:10:0;;51635:32;;8155:13:1;;51706:70:0;;;;;;;;;;;;51696:81;;;;;;51691:87;;:99;;;;:::i;:::-;51678:112;;51801:10;51830:7;51838:5;51830:14;;;;;-1:-1:-1;;;51830:14:0;;;;;;;;;;;:19;51826:120;;51874:7;51882:5;51874:14;;;;;-1:-1:-1;;;51874:14:0;;;;;;;;;;;51866:22;;51826:120;;;-1:-1:-1;51929:5:0;51826:120;51963:7;51971:13;51983:1;51971:9;:13;:::i;:::-;51963:22;;;;;-1:-1:-1;;;51963:22:0;;;;;;;;;;;51959:162;;52024:13;52036:1;52024:9;:13;:::i;:::-;52007:7;52015:5;52007:14;;;;;-1:-1:-1;;;52007:14:0;;;;;;;;;;:30;51959:162;;;52087:7;52095:13;52107:1;52095:9;:13;:::i;:::-;52087:22;;;;;-1:-1:-1;;;52087:22:0;;;;;;;;;;;52070:7;52078:5;52070:14;;;;;-1:-1:-1;;;52070:14:0;;;;;;;;;;:39;51959:162;52131:5;:7;;;:5;:7;;;:::i;:::-;;;;-1:-1:-1;52156:7:0;;-1:-1:-1;52156:5:0;52162:1;52156:7;:::i;:::-;52149:14;;;;;51581:590;:::o;29846:110::-;29922:26;29932:2;29936:7;29922:26;;;;;;;;;;;;:9;:26::i;33160:315::-;33315:8;-1:-1:-1;;;;;33306:17:0;:5;-1:-1:-1;;;;;33306:17:0;;;33298:55;;;;-1:-1:-1;;;33298:55:0;;11680:2:1;33298:55:0;;;11662:21:1;11719:2;11699:18;;;11692:30;11758:27;11738:18;;;11731:55;11803:18;;33298:55:0;11652:175:1;33298:55:0;-1:-1:-1;;;;;33364:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33364:46:0;;;;;;;;;;33426:41;;9020::1;;;33426::0;;8993:18:1;33426:41:0;;;;;;;33160:315;;;:::o;28234:::-;28391:28;28401:4;28407:2;28411:7;28391:9;:28::i;:::-;28438:48;28461:4;28467:2;28471:7;28480:5;28438:22;:48::i;:::-;28430:111;;;;-1:-1:-1;;;28430:111:0;;;;;;;:::i;17731:723::-;17787:13;18008:10;18004:53;;-1:-1:-1;18035:10:0;;;;;;;;;;;;-1:-1:-1;;;18035:10:0;;;;;;18004:53;18082:5;18067:12;18123:78;18130:9;;18123:78;;18156:8;;;;:::i;:::-;;-1:-1:-1;18179:10:0;;-1:-1:-1;18187:2:0;18179:10;;:::i;:::-;;;18123:78;;;18211:19;18243:6;18233:17;;;;;;-1:-1:-1;;;18233:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18233:17:0;;18211:39;;18261:154;18268:10;;18261:154;;18295:11;18305:1;18295:11;;:::i;:::-;;-1:-1:-1;18364:10:0;18372:2;18364:5;:10;:::i;:::-;18351:24;;:2;:24;:::i;:::-;18338:39;;18321:6;18328;18321:14;;;;;;-1:-1:-1;;;18321:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;18321:56:0;;;;;;;;-1:-1:-1;18392:11:0;18401:2;18392:11;;:::i;:::-;;;18261:154;;23104:305;23206:4;-1:-1:-1;;;;;;23243:40:0;;-1:-1:-1;;;23243:40:0;;:105;;-1:-1:-1;;;;;;;23300:48:0;;-1:-1:-1;;;23300:48:0;23243:105;:158;;;-1:-1:-1;;;;;;;;;;7202:40:0;;;23365:36;7093:157;49371:180;49498:45;49525:4;49531:2;49535:7;49498:26;:45::i;30183:321::-;30313:18;30319:2;30323:7;30313:5;:18::i;:::-;30364:54;30395:1;30399:2;30403:7;30412:5;30364:22;:54::i;:::-;30342:154;;;;-1:-1:-1;;;30342:154:0;;;;;;;:::i;34040:799::-;34195:4;-1:-1:-1;;;;;34216:13:0;;9743:20;9791:8;34212:620;;34252:72;;-1:-1:-1;;;34252:72:0;;-1:-1:-1;;;;;34252:36:0;;;;;:72;;17371:10;;34303:4;;34309:7;;34318:5;;34252:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34252:72:0;;;;;;;;-1:-1:-1;;34252:72:0;;;;;;;;;;;;:::i;:::-;;;34248:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34494:13:0;;34490:272;;34537:60;;-1:-1:-1;;;34537:60:0;;;;;;;:::i;34490:272::-;34712:6;34706:13;34697:6;34693:2;34689:15;34682:38;34248:529;-1:-1:-1;;;;;;34375:51:0;-1:-1:-1;;;34375:51:0;;-1:-1:-1;34368:58:0;;34212:620;-1:-1:-1;34816:4:0;34040:799;;;;;;:::o;38034:589::-;-1:-1:-1;;;;;38240:18:0;;38236:187;;38275:40;38307:7;39450:10;:17;;39423:24;;;;:15;:24;;;;;:44;;;39478:24;;;;;;;;;;;;39346:164;38275:40;38236:187;;;38345:2;-1:-1:-1;;;;;38337:10:0;:4;-1:-1:-1;;;;;38337:10:0;;38333:90;;38364:47;38397:4;38403:7;38364:32;:47::i;:::-;-1:-1:-1;;;;;38437:16:0;;38433:183;;38470:45;38507:7;38470:36;:45::i;:::-;38433:183;;;38543:4;-1:-1:-1;;;;;38537:10:0;:2;-1:-1:-1;;;;;38537:10:0;;38533:83;;38564:40;38592:2;38596:7;38564:27;:40::i;30840:382::-;-1:-1:-1;;;;;30920:16:0;;30912:61;;;;-1:-1:-1;;;30912:61:0;;15835:2:1;30912:61:0;;;15817:21:1;;;15854:18;;;15847:30;15913:34;15893:18;;;15886:62;15965:18;;30912:61:0;15807:182:1;30912:61:0;28927:4;28951:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28951:16:0;:30;30984:58;;;;-1:-1:-1;;;30984:58:0;;10918:2:1;30984:58:0;;;10900:21:1;10957:2;10937:18;;;10930:30;10996;10976:18;;;10969:58;11044:18;;30984:58:0;10890:178:1;30984:58:0;31055:45;31084:1;31088:2;31092:7;31055:20;:45::i;:::-;-1:-1:-1;;;;;31113:13:0;;;;;;:9;:13;;;;;:18;;31130:1;;31113:13;:18;;31130:1;;31113:18;:::i;:::-;;;;-1:-1:-1;;31142:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31142:21:0;-1:-1:-1;;;;;31142:21:0;;;;;;;;31181:33;;31142:16;;;31181:33;;31142:16;;31181:33;30840:382;;:::o;40137:988::-;40403:22;40453:1;40428:22;40445:4;40428:16;:22::i;:::-;:26;;;;:::i;:::-;40465:18;40486:26;;;:17;:26;;;;;;40403:51;;-1:-1:-1;40619:28:0;;;40615:328;;-1:-1:-1;;;;;40686:18:0;;40664:19;40686:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40737:30;;;;;;:44;;;40854:30;;:17;:30;;;;;:43;;;40615:328;-1:-1:-1;41039:26:0;;;;:17;:26;;;;;;;;41032:33;;;-1:-1:-1;;;;;41083:18:0;;;;;:12;:18;;;;;:34;;;;;;;41076:41;40137:988::o;41420:1079::-;41698:10;:17;41673:22;;41698:21;;41718:1;;41698:21;:::i;:::-;41730:18;41751:24;;;:15;:24;;;;;;42124:10;:26;;41673:46;;-1:-1:-1;41751:24:0;;41673:46;;42124:26;;;;-1:-1:-1;;;42124:26:0;;;;;;;;;;;;;;;;;42102:48;;42188:11;42163:10;42174;42163:22;;;;;;-1:-1:-1;;;42163:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;42268:28;;;:15;:28;;;;;;;:41;;;42440:24;;;;;42433:31;42475:10;:16;;;;;-1:-1:-1;;;42475:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;41420:1079;;;;:::o;38924:221::-;39009:14;39026:20;39043:2;39026:16;:20::i;:::-;-1:-1:-1;;;;;39057:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39102:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38924:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;;108:18;149:2;141:6;138:14;135:2;;;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:2;;;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:2;;;532:1;529;522:12;491:2;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;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;828:160;893:20;;949:13;;942:21;932:32;;922:2;;978:1;975;968:12;993:196;;1105:2;1093:9;1084:7;1080:23;1076:32;1073:2;;;1126:6;1118;1111:22;1073:2;1154:29;1173:9;1154:29;:::i;:::-;1144:39;1063:126;-1:-1:-1;;;1063:126:1:o;1194:270::-;;;1323:2;1311:9;1302:7;1298:23;1294:32;1291:2;;;1344:6;1336;1329:22;1291:2;1372:29;1391:9;1372:29;:::i;:::-;1362:39;;1420:38;1454:2;1443:9;1439:18;1420:38;:::i;:::-;1410:48;;1281:183;;;;;:::o;1469:338::-;;;;1615:2;1603:9;1594:7;1590:23;1586:32;1583:2;;;1636:6;1628;1621:22;1583:2;1664:29;1683:9;1664:29;:::i;:::-;1654:39;;1712:38;1746:2;1735:9;1731:18;1712:38;:::i;:::-;1702:48;;1797:2;1786:9;1782:18;1769:32;1759:42;;1573:234;;;;;:::o;1812:696::-;;;;;1984:3;1972:9;1963:7;1959:23;1955:33;1952:2;;;2006:6;1998;1991:22;1952:2;2034:29;2053:9;2034:29;:::i;:::-;2024:39;;2082:38;2116:2;2105:9;2101:18;2082:38;:::i;:::-;2072:48;;2167:2;2156:9;2152:18;2139:32;2129:42;;2222:2;2211:9;2207:18;2194:32;2249:18;2241:6;2238:30;2235:2;;;2286:6;2278;2271:22;2235:2;2314:22;;2367:4;2359:13;;2355:27;-1:-1:-1;2345:2:1;;2401:6;2393;2386:22;2345:2;2429:73;2494:7;2489:2;2476:16;2471:2;2467;2463:11;2429:73;:::i;:::-;2419:83;;;1942:566;;;;;;;:::o;2513:264::-;;;2639:2;2627:9;2618:7;2614:23;2610:32;2607:2;;;2660:6;2652;2645:22;2607:2;2688:29;2707:9;2688:29;:::i;:::-;2678:39;;2736:35;2767:2;2756:9;2752:18;2736:35;:::i;2782:264::-;;;2911:2;2899:9;2890:7;2886:23;2882:32;2879:2;;;2932:6;2924;2917:22;2879:2;2960:29;2979:9;2960:29;:::i;:::-;2950:39;3036:2;3021:18;;;;3008:32;;-1:-1:-1;;;2869:177:1:o;3051:190::-;;3160:2;3148:9;3139:7;3135:23;3131:32;3128:2;;;3181:6;3173;3166:22;3128:2;3209:26;3225:9;3209:26;:::i;3246:190::-;;3358:2;3346:9;3337:7;3333:23;3329:32;3326:2;;;3379:6;3371;3364:22;3326:2;-1:-1:-1;3407:23:1;;3316:120;-1:-1:-1;3316:120:1:o;3441:255::-;;3552:2;3540:9;3531:7;3527:23;3523:32;3520:2;;;3573:6;3565;3558:22;3520:2;3617:9;3604:23;3636:30;3660:5;3636:30;:::i;3701:259::-;;3823:2;3811:9;3802:7;3798:23;3794:32;3791:2;;;3844:6;3836;3829:22;3791:2;3881:9;3875:16;3900:30;3924:5;3900:30;:::i;3965:480::-;;4087:2;4075:9;4066:7;4062:23;4058:32;4055:2;;;4108:6;4100;4093:22;4055:2;4153:9;4140:23;4186:18;4178:6;4175:30;4172:2;;;4223:6;4215;4208:22;4172:2;4251:22;;4304:4;4296:13;;4292:27;-1:-1:-1;4282:2:1;;4338:6;4330;4323:22;4282:2;4366:73;4431:7;4426:2;4413:16;4408:2;4404;4400:11;4366:73;:::i;4645:734::-;;;;4809:2;4797:9;4788:7;4784:23;4780:32;4777:2;;;4830:6;4822;4815:22;4777:2;4871:9;4858:23;4848:33;;4932:2;4921:9;4917:18;4904:32;4955:18;4996:2;4988:6;4985:14;4982:2;;;5017:6;5009;5002:22;4982:2;5060:6;5049:9;5045:22;5035:32;;5105:7;5098:4;5094:2;5090:13;5086:27;5076:2;;5132:6;5124;5117:22;5076:2;5177;5164:16;5203:2;5195:6;5192:14;5189:2;;;5224:6;5216;5209:22;5189:2;5283:7;5278:2;5272;5264:6;5260:15;5256:2;5252:24;5248:33;5245:46;5242:2;;;5309:6;5301;5294:22;5242:2;5345;5341;5337:11;5327:21;;5367:6;5357:16;;;;;4767:612;;;;;:::o;5384:257::-;;5463:5;5457:12;5490:6;5485:3;5478:19;5506:63;5562:6;5555:4;5550:3;5546:14;5539:4;5532:5;5528:16;5506:63;:::i;:::-;5623:2;5602:15;-1:-1:-1;;5598:29:1;5589:39;;;;5630:4;5585:50;;5433:208;-1:-1:-1;;5433:208:1:o;5646:185::-;;5726:5;5720:12;5741:52;5786:6;5781:3;5774:4;5767:5;5763:16;5741:52;:::i;:::-;5809:16;;;;;5696:135;-1:-1:-1;;5696:135:1:o;6440:1304::-;6775:13;;6440:1304;;;;6848:1;6833:17;;6869:1;6905:18;;;;6932:2;;6986:4;6978:6;6974:17;6964:27;;6932:2;7012;7060;7052:6;7049:14;7029:18;7026:38;7023:2;;;-1:-1:-1;;;7087:33:1;;7143:4;7140:1;7133:15;7173:4;7094:3;7161:17;7023:2;7204:18;7231:104;;;;7349:1;7344:322;;;;7197:469;;7231:104;-1:-1:-1;;7264:24:1;;7252:37;;7309:16;;;;-1:-1:-1;7231:104:1;;7344:322;20354:127;20420:17;;;20470:4;20454:21;;7439:3;7455:165;7469:6;7466:1;7463:13;7455:165;;;7547:14;;7534:11;;;7527:35;7590:16;;;;7484:10;;7455:165;;;7459:3;;7649:6;7644:3;7640:16;7633:23;;7197:469;;;;;;;7682:56;7707:30;7733:3;7725:6;7707:30;:::i;:::-;-1:-1:-1;;;5896:20:1;;5941:1;5932:11;;5886:63;7682:56;7675:63;6725:1019;-1:-1:-1;;;;;6725:1019:1:o;8387:488::-;-1:-1:-1;;;;;8656:15:1;;;8638:34;;8708:15;;8703:2;8688:18;;8681:43;8755:2;8740:18;;8733:34;;;8803:3;8798:2;8783:18;;8776:31;;;8387:488;;8824:45;;8849:19;;8841:6;8824:45;:::i;:::-;8816:53;8590:285;-1:-1:-1;;;;;;8590:285:1:o;9254:219::-;;9403:2;9392:9;9385:21;9423:44;9463:2;9452:9;9448:18;9440:6;9423:44;:::i;9890:414::-;10092:2;10074:21;;;10131:2;10111:18;;;10104:30;10170:34;10165:2;10150:18;;10143:62;-1:-1:-1;;;10236:2:1;10221:18;;10214:48;10294:3;10279:19;;10064:240::o;16407:339::-;16609:2;16591:21;;;16648:2;16628:18;;;16621:30;-1:-1:-1;;;16682:2:1;16667:18;;16660:45;16737:2;16722:18;;16581:165::o;16751:356::-;16953:2;16935:21;;;16972:18;;;16965:30;17031:34;17026:2;17011:18;;17004:62;17098:2;17083:18;;16925:182::o;18686:413::-;18888:2;18870:21;;;18927:2;18907:18;;;18900:30;18966:34;18961:2;18946:18;;18939:62;-1:-1:-1;;;19032:2:1;19017:18;;19010:47;19089:3;19074:19;;18860:239::o;19104:397::-;19306:2;19288:21;;;19345:2;19325:18;;;19318:30;19384:34;19379:2;19364:18;;19357:62;-1:-1:-1;;;19450:2:1;19435:18;;19428:31;19491:3;19476:19;;19278:223::o;20486:128::-;;20557:1;20553:6;20550:1;20547:13;20544:2;;;20563:18;;:::i;:::-;-1:-1:-1;20599:9:1;;20534:80::o;20619:120::-;;20685:1;20675:2;;20690:18;;:::i;:::-;-1:-1:-1;20724:9:1;;20665:74::o;20744:168::-;;20850:1;20846;20842:6;20838:14;20835:1;20832:21;20827:1;20820:9;20813:17;20809:45;20806:2;;;20857:18;;:::i;:::-;-1:-1:-1;20897:9:1;;20796:116::o;20917:125::-;;20985:1;20982;20979:8;20976:2;;;20990:18;;:::i;:::-;-1:-1:-1;21027:9:1;;20966:76::o;21047:258::-;21119:1;21129:113;21143:6;21140:1;21137:13;21129:113;;;21219:11;;;21213:18;21200:11;;;21193:39;21165:2;21158:10;21129:113;;;21260:6;21257:1;21254:13;21251:2;;;-1:-1:-1;;21295:1:1;21277:16;;21270:27;21100:205::o;21310:380::-;21395:1;21385:12;;21442:1;21432:12;;;21453:2;;21507:4;21499:6;21495:17;21485:27;;21453:2;21560;21552:6;21549:14;21529:18;21526:38;21523:2;;;21606:10;21601:3;21597:20;21594:1;21587:31;21641:4;21638:1;21631:15;21669:4;21666:1;21659:15;21523:2;;21365:325;;;:::o;21695:135::-;;-1:-1:-1;;21755:17:1;;21752:2;;;21775:18;;:::i;:::-;-1:-1:-1;21822:1:1;21811:13;;21742:88::o;21835:112::-;;21893:1;21883:2;;21898:18;;:::i;:::-;-1:-1:-1;21932:9:1;;21873:74::o;21952:127::-;22013:10;22008:3;22004:20;22001:1;21994:31;22044:4;22041:1;22034:15;22068:4;22065:1;22058:15;22084:127;22145:10;22140:3;22136:20;22133:1;22126:31;22176:4;22173:1;22166:15;22200:4;22197:1;22190:15;22216:127;22277:10;22272:3;22268:20;22265:1;22258:31;22308:4;22305:1;22298:15;22332:4;22329:1;22322:15;22348:131;-1:-1:-1;;;;;;22422:32:1;;22412:43;;22402:2;;22469:1;22466;22459:12

Swarm Source

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

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