ETH Price: $2,389.10 (-3.88%)

Token

UncleMine (UM)
 

Overview

Max Total Supply

100 UM

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
legionz.eth
Balance
1 UM
0x698fa6437475F3F86Df33eA0cb612AD529954811
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:
UncleMineNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)


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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)


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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)


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


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)


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

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


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)


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


// File @openzeppelin/contracts/utils/introspection/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)


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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)








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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(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 Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)


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


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)


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

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

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

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

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


// File contracts/NFT.sol




contract UncleMineNFT is ERC721, Ownable {
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    string private __baseURI;
    mapping(address => uint256) private _mintShots;
    mapping(address => bool) private _whitelist;

    uint256 private _saleStart = 0;
    uint256 private _totalSupply = 0;

    uint256 public constant TOTAL = 100;
    uint256 public constant MAX_MINTS = 1;
    uint256 public constant PRICE = 50000000000000000; //0.05 ETH

    constructor() ERC721("UncleMine", "UM") {
        __baseURI = "https://nft.unclemine.org/metadata/";
    }

    modifier limitedMintShots() {
        require(_mintShots[_msgSender()] < MAX_MINTS, "Reach mint limits");
        _;
    }

    modifier limitedSupply() {
        require(_totalSupply <= TOTAL, "Sold out");
        _;
    }

    modifier saleIsOpened() {
        require(_isSaleOpened(), "Sale is not opened yet");
        _;
    }

    function _isSaleOpened() internal view returns (bool) {
        return _saleStart != 0 && _saleStart <= block.timestamp;
    }

    function addToWhitelist(address a) public onlyOwner {
        _whitelist[a] = true;
    }

    function setSaleOpenTime(uint256 _ts) public onlyOwner {
        require(_ts > 0, "Invalid sale open time");
        _saleStart = _ts;
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        (bool sent, bytes memory data) = msg.sender.call{value: balance}("");
        require(sent, "Failed to send Ether");
    }

    function reserve(uint256 c) public onlyOwner {
        uint256 _id;
        uint256 currentId = _tokenIdCounter.current();
        uint256 m = (currentId + c > TOTAL) ? TOTAL - currentId : c;
        for (uint256 _i = 0; _i < m; _i++) {
            _id = _tokenIdCounter.current();
            _tokenIdCounter.increment();
            _safeMint(_msgSender(), _id);
            _totalSupply += 1;
        }
    }

    function mintTo(address to)
        public
        payable
        limitedMintShots
        limitedSupply
        saleIsOpened
        returns (uint256)
    {
        if (_whitelist[_msgSender()] == true) {
            require(msg.value == 0, "whitelist member");
        } else {
            require(msg.value >= PRICE, "Ether value is not enough");
        }

        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);

        _mintShots[_msgSender()] += 1;

        _totalSupply += 1;

        return tokenId;
    }

    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(), ".json"))
                : "";
    }

    function setBaseURI(string memory s) public virtual onlyOwner {
        __baseURI = s;
    }

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

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":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"c","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"s","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ts","type":"uint256"}],"name":"setSaleOpenTime","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b556000600c553480156200001b57600080fd5b506040518060400160405280600981526020017f556e636c654d696e6500000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f554d0000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000a0929190620001e2565b508060019080519060200190620000b9929190620001e2565b505050620000dc620000d06200011460201b60201c565b6200011c60201b60201c565b60405180606001604052806023815260200162003ddf60239139600890805190602001906200010d929190620001e2565b50620002f7565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f09062000292565b90600052602060002090601f01602090048101928262000214576000855562000260565b82601f106200022f57805160ff191683800117855562000260565b8280016001018555821562000260579182015b828111156200025f57825182559160200191906001019062000242565b5b5090506200026f919062000273565b5090565b5b808211156200028e57600081600090555060010162000274565b5090565b60006002820490506001821680620002ab57607f821691505b60208210811415620002c257620002c1620002c8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613ad880620003076000396000f3fe6080604052600436106101815760003560e01c8063715018a6116100d1578063a22cb4651161008a578063cce132d111610064578063cce132d11461055f578063e43252d71461058a578063e985e9c5146105b3578063f2fde38b146105f057610181565b8063a22cb465146104d0578063b88d4fde146104f9578063c87b56dd1461052257610181565b8063715018a6146103df578063755edd17146103f6578063819b25ba146104265780638d859f3e1461044f5780638da5cb5b1461047a57806395d89b41146104a557610181565b806327efc0861161013e57806355f804b31161011857806355f804b314610313578063573734151461033c5780636352211e1461036557806370a08231146103a257610181565b806327efc086146102a85780633ccfd60b146102d357806342842e0e146102ea57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906127d9565b610619565b6040516101ba9190612d7b565b60405180910390f35b3480156101cf57600080fd5b506101d86106fb565b6040516101e59190612d96565b60405180910390f35b3480156101fa57600080fd5b506102156004803603810190610210919061286c565b61078d565b6040516102229190612d14565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d919061279d565b610812565b005b34801561026057600080fd5b5061026961092a565b6040516102769190613098565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612697565b610934565b005b3480156102b457600080fd5b506102bd610994565b6040516102ca9190613098565b60405180910390f35b3480156102df57600080fd5b506102e8610999565b005b3480156102f657600080fd5b50610311600480360381019061030c9190612697565b610acd565b005b34801561031f57600080fd5b5061033a6004803603810190610335919061282b565b610aed565b005b34801561034857600080fd5b50610363600480360381019061035e919061286c565b610b83565b005b34801561037157600080fd5b5061038c6004803603810190610387919061286c565b610c4c565b6040516103999190612d14565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190612632565b610cfe565b6040516103d69190613098565b60405180910390f35b3480156103eb57600080fd5b506103f4610db6565b005b610410600480360381019061040b9190612632565b610e3e565b60405161041d9190613098565b60405180910390f35b34801561043257600080fd5b5061044d6004803603810190610448919061286c565b6110ec565b005b34801561045b57600080fd5b50610464611208565b6040516104719190613098565b60405180910390f35b34801561048657600080fd5b5061048f611213565b60405161049c9190612d14565b60405180910390f35b3480156104b157600080fd5b506104ba61123d565b6040516104c79190612d96565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190612761565b6112cf565b005b34801561050557600080fd5b50610520600480360381019061051b91906126e6565b6112e5565b005b34801561052e57600080fd5b506105496004803603810190610544919061286c565b611347565b6040516105569190612d96565b60405180910390f35b34801561056b57600080fd5b506105746113ee565b6040516105819190613098565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612632565b6113f3565b005b3480156105bf57600080fd5b506105da60048036038101906105d5919061265b565b6114ca565b6040516105e79190612d7b565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190612632565b61155e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f457506106f382611656565b5b9050919050565b60606000805461070a906132f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610736906132f9565b80156107835780601f1061075857610100808354040283529160200191610783565b820191906000526020600020905b81548152906001019060200180831161076657829003601f168201915b5050505050905090565b6000610798826116c0565b6107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612f98565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081d82610c4c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561088e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088590613018565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ad61172c565b73ffffffffffffffffffffffffffffffffffffffff1614806108dc57506108db816108d661172c565b6114ca565b5b61091b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091290612ef8565b60405180910390fd5b6109258383611734565b505050565b6000600c54905090565b61094561093f61172c565b826117ed565b610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b90613038565b60405180910390fd5b61098f8383836118cb565b505050565b606481565b6109a161172c565b73ffffffffffffffffffffffffffffffffffffffff166109bf611213565b73ffffffffffffffffffffffffffffffffffffffff1614610a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0c90612fd8565b60405180910390fd5b60004790506000803373ffffffffffffffffffffffffffffffffffffffff1683604051610a4190612cff565b60006040518083038185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b509150915081610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90612e78565b60405180910390fd5b505050565b610ae8838383604051806020016040528060008152506112e5565b505050565b610af561172c565b73ffffffffffffffffffffffffffffffffffffffff16610b13611213565b73ffffffffffffffffffffffffffffffffffffffff1614610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6090612fd8565b60405180910390fd5b8060089080519060200190610b7f929190612456565b5050565b610b8b61172c565b73ffffffffffffffffffffffffffffffffffffffff16610ba9611213565b73ffffffffffffffffffffffffffffffffffffffff1614610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf690612fd8565b60405180910390fd5b60008111610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990612fb8565b60405180910390fd5b80600b8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90612f38565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690612f18565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dbe61172c565b73ffffffffffffffffffffffffffffffffffffffff16610ddc611213565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2990612fd8565b60405180910390fd5b610e3c6000611b32565b565b6000600160096000610e4e61172c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090612e38565b60405180910390fd5b6064600c541115610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690613058565b60405180910390fd5b610f17611bf8565b610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90612f58565b60405180910390fd5b60011515600a6000610f6661172c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415610ffe5760003414610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff090612e58565b60405180910390fd5b611049565b66b1a2bc2ec50000341015611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90613078565b60405180910390fd5b5b60006110556007611c13565b90506110616007611c21565b61106b8382611c37565b60016009600061107961172c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110c29190613188565b925050819055506001600c60008282546110dc9190613188565b9250508190555080915050919050565b6110f461172c565b73ffffffffffffffffffffffffffffffffffffffff16611112611213565b73ffffffffffffffffffffffffffffffffffffffff1614611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612fd8565b60405180910390fd5b6000806111756007611c13565b90506000606484836111879190613188565b1161119257836111a0565b81606461119f919061320f565b5b905060005b81811015611201576111b76007611c13565b93506111c36007611c21565b6111d46111ce61172c565b85611c37565b6001600c60008282546111e79190613188565b9250508190555080806111f99061335c565b9150506111a5565b5050505050565b66b1a2bc2ec5000081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461124c906132f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611278906132f9565b80156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050905090565b6112e16112da61172c565b8383611c55565b5050565b6112f66112f061172c565b836117ed565b611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613038565b60405180910390fd5b61134184848484611dc2565b50505050565b6060611352826116c0565b611391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138890612ff8565b60405180910390fd5b600061139b611e1e565b905060008151116113bb57604051806020016040528060008152506113e6565b806113c584611eb0565b6040516020016113d6929190612cd0565b6040516020818303038152906040525b915050919050565b600181565b6113fb61172c565b73ffffffffffffffffffffffffffffffffffffffff16611419611213565b73ffffffffffffffffffffffffffffffffffffffff161461146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690612fd8565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61156661172c565b73ffffffffffffffffffffffffffffffffffffffff16611584611213565b73ffffffffffffffffffffffffffffffffffffffff16146115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190612fd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190612dd8565b60405180910390fd5b61165381611b32565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117a783610c4c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117f8826116c0565b611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90612ed8565b60405180910390fd5b600061184283610c4c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118b157508373ffffffffffffffffffffffffffffffffffffffff166118998461078d565b73ffffffffffffffffffffffffffffffffffffffff16145b806118c257506118c181856114ca565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118eb82610c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193890612df8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a890612e98565b60405180910390fd5b6119bc83838361205d565b6119c7600082611734565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a17919061320f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a6e9190613188565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b2d838383612062565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600b5414158015611c0e575042600b5411155b905090565b600081600001549050919050565b6001816000016000828254019250508190555050565b611c51828260405180602001604052806000815250612067565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90612eb8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611db59190612d7b565b60405180910390a3505050565b611dcd8484846118cb565b611dd9848484846120c2565b611e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0f90612db8565b60405180910390fd5b50505050565b606060088054611e2d906132f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611e59906132f9565b8015611ea65780601f10611e7b57610100808354040283529160200191611ea6565b820191906000526020600020905b815481529060010190602001808311611e8957829003601f168201915b5050505050905090565b60606000821415611ef8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612058565b600082905060005b60008214611f2a578080611f139061335c565b915050600a82611f2391906131de565b9150611f00565b60008167ffffffffffffffff811115611f6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f9e5781602001600182028036833780820191505090505b5090505b6000851461205157600182611fb7919061320f565b9150600a85611fc691906133a5565b6030611fd29190613188565b60f81b81838151811061200e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561204a91906131de565b9450611fa2565b8093505050505b919050565b505050565b505050565b6120718383612259565b61207e60008484846120c2565b6120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490612db8565b60405180910390fd5b505050565b60006120e38473ffffffffffffffffffffffffffffffffffffffff16612433565b1561224c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261210c61172c565b8786866040518563ffffffff1660e01b815260040161212e9493929190612d2f565b602060405180830381600087803b15801561214857600080fd5b505af192505050801561217957506040513d601f19601f820116820180604052508101906121769190612802565b60015b6121fc573d80600081146121a9576040519150601f19603f3d011682016040523d82523d6000602084013e6121ae565b606091505b506000815114156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90612db8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612251565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c090612f78565b60405180910390fd5b6122d2816116c0565b15612312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230990612e18565b60405180910390fd5b61231e6000838361205d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461236e9190613188565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461242f60008383612062565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612462906132f9565b90600052602060002090601f01602090048101928261248457600085556124cb565b82601f1061249d57805160ff19168380011785556124cb565b828001600101855582156124cb579182015b828111156124ca5782518255916020019190600101906124af565b5b5090506124d891906124dc565b5090565b5b808211156124f55760008160009055506001016124dd565b5090565b600061250c612507846130d8565b6130b3565b90508281526020810184848401111561252457600080fd5b61252f8482856132b7565b509392505050565b600061254a61254584613109565b6130b3565b90508281526020810184848401111561256257600080fd5b61256d8482856132b7565b509392505050565b60008135905061258481613a46565b92915050565b60008135905061259981613a5d565b92915050565b6000813590506125ae81613a74565b92915050565b6000815190506125c381613a74565b92915050565b600082601f8301126125da57600080fd5b81356125ea8482602086016124f9565b91505092915050565b600082601f83011261260457600080fd5b8135612614848260208601612537565b91505092915050565b60008135905061262c81613a8b565b92915050565b60006020828403121561264457600080fd5b600061265284828501612575565b91505092915050565b6000806040838503121561266e57600080fd5b600061267c85828601612575565b925050602061268d85828601612575565b9150509250929050565b6000806000606084860312156126ac57600080fd5b60006126ba86828701612575565b93505060206126cb86828701612575565b92505060406126dc8682870161261d565b9150509250925092565b600080600080608085870312156126fc57600080fd5b600061270a87828801612575565b945050602061271b87828801612575565b935050604061272c8782880161261d565b925050606085013567ffffffffffffffff81111561274957600080fd5b612755878288016125c9565b91505092959194509250565b6000806040838503121561277457600080fd5b600061278285828601612575565b92505060206127938582860161258a565b9150509250929050565b600080604083850312156127b057600080fd5b60006127be85828601612575565b92505060206127cf8582860161261d565b9150509250929050565b6000602082840312156127eb57600080fd5b60006127f98482850161259f565b91505092915050565b60006020828403121561281457600080fd5b6000612822848285016125b4565b91505092915050565b60006020828403121561283d57600080fd5b600082013567ffffffffffffffff81111561285757600080fd5b612863848285016125f3565b91505092915050565b60006020828403121561287e57600080fd5b600061288c8482850161261d565b91505092915050565b61289e81613243565b82525050565b6128ad81613255565b82525050565b60006128be8261313a565b6128c88185613150565b93506128d88185602086016132c6565b6128e181613492565b840191505092915050565b60006128f782613145565b612901818561316c565b93506129118185602086016132c6565b61291a81613492565b840191505092915050565b600061293082613145565b61293a818561317d565b935061294a8185602086016132c6565b80840191505092915050565b600061296360328361316c565b915061296e826134a3565b604082019050919050565b600061298660268361316c565b9150612991826134f2565b604082019050919050565b60006129a960258361316c565b91506129b482613541565b604082019050919050565b60006129cc601c8361316c565b91506129d782613590565b602082019050919050565b60006129ef60118361316c565b91506129fa826135b9565b602082019050919050565b6000612a1260108361316c565b9150612a1d826135e2565b602082019050919050565b6000612a3560148361316c565b9150612a408261360b565b602082019050919050565b6000612a5860248361316c565b9150612a6382613634565b604082019050919050565b6000612a7b60198361316c565b9150612a8682613683565b602082019050919050565b6000612a9e602c8361316c565b9150612aa9826136ac565b604082019050919050565b6000612ac160388361316c565b9150612acc826136fb565b604082019050919050565b6000612ae4602a8361316c565b9150612aef8261374a565b604082019050919050565b6000612b0760298361316c565b9150612b1282613799565b604082019050919050565b6000612b2a60168361316c565b9150612b35826137e8565b602082019050919050565b6000612b4d60208361316c565b9150612b5882613811565b602082019050919050565b6000612b70602c8361316c565b9150612b7b8261383a565b604082019050919050565b6000612b9360168361316c565b9150612b9e82613889565b602082019050919050565b6000612bb660058361317d565b9150612bc1826138b2565b600582019050919050565b6000612bd960208361316c565b9150612be4826138db565b602082019050919050565b6000612bfc602f8361316c565b9150612c0782613904565b604082019050919050565b6000612c1f60218361316c565b9150612c2a82613953565b604082019050919050565b6000612c42600083613161565b9150612c4d826139a2565b600082019050919050565b6000612c6560318361316c565b9150612c70826139a5565b604082019050919050565b6000612c8860088361316c565b9150612c93826139f4565b602082019050919050565b6000612cab60198361316c565b9150612cb682613a1d565b602082019050919050565b612cca816132ad565b82525050565b6000612cdc8285612925565b9150612ce88284612925565b9150612cf382612ba9565b91508190509392505050565b6000612d0a82612c35565b9150819050919050565b6000602082019050612d296000830184612895565b92915050565b6000608082019050612d446000830187612895565b612d516020830186612895565b612d5e6040830185612cc1565b8181036060830152612d7081846128b3565b905095945050505050565b6000602082019050612d9060008301846128a4565b92915050565b60006020820190508181036000830152612db081846128ec565b905092915050565b60006020820190508181036000830152612dd181612956565b9050919050565b60006020820190508181036000830152612df181612979565b9050919050565b60006020820190508181036000830152612e118161299c565b9050919050565b60006020820190508181036000830152612e31816129bf565b9050919050565b60006020820190508181036000830152612e51816129e2565b9050919050565b60006020820190508181036000830152612e7181612a05565b9050919050565b60006020820190508181036000830152612e9181612a28565b9050919050565b60006020820190508181036000830152612eb181612a4b565b9050919050565b60006020820190508181036000830152612ed181612a6e565b9050919050565b60006020820190508181036000830152612ef181612a91565b9050919050565b60006020820190508181036000830152612f1181612ab4565b9050919050565b60006020820190508181036000830152612f3181612ad7565b9050919050565b60006020820190508181036000830152612f5181612afa565b9050919050565b60006020820190508181036000830152612f7181612b1d565b9050919050565b60006020820190508181036000830152612f9181612b40565b9050919050565b60006020820190508181036000830152612fb181612b63565b9050919050565b60006020820190508181036000830152612fd181612b86565b9050919050565b60006020820190508181036000830152612ff181612bcc565b9050919050565b6000602082019050818103600083015261301181612bef565b9050919050565b6000602082019050818103600083015261303181612c12565b9050919050565b6000602082019050818103600083015261305181612c58565b9050919050565b6000602082019050818103600083015261307181612c7b565b9050919050565b6000602082019050818103600083015261309181612c9e565b9050919050565b60006020820190506130ad6000830184612cc1565b92915050565b60006130bd6130ce565b90506130c9828261332b565b919050565b6000604051905090565b600067ffffffffffffffff8211156130f3576130f2613463565b5b6130fc82613492565b9050602081019050919050565b600067ffffffffffffffff82111561312457613123613463565b5b61312d82613492565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613193826132ad565b915061319e836132ad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131d3576131d26133d6565b5b828201905092915050565b60006131e9826132ad565b91506131f4836132ad565b92508261320457613203613405565b5b828204905092915050565b600061321a826132ad565b9150613225836132ad565b925082821015613238576132376133d6565b5b828203905092915050565b600061324e8261328d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132e45780820151818401526020810190506132c9565b838111156132f3576000848401525b50505050565b6000600282049050600182168061331157607f821691505b6020821081141561332557613324613434565b5b50919050565b61333482613492565b810181811067ffffffffffffffff8211171561335357613352613463565b5b80604052505050565b6000613367826132ad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561339a576133996133d6565b5b600182019050919050565b60006133b0826132ad565b91506133bb836132ad565b9250826133cb576133ca613405565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5265616368206d696e74206c696d697473000000000000000000000000000000600082015250565b7f77686974656c697374206d656d62657200000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206f70656e65642079657400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e76616c69642073616c65206f70656e2074696d6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f45746865722076616c7565206973206e6f7420656e6f75676800000000000000600082015250565b613a4f81613243565b8114613a5a57600080fd5b50565b613a6681613255565b8114613a7157600080fd5b50565b613a7d81613261565b8114613a8857600080fd5b50565b613a94816132ad565b8114613a9f57600080fd5b5056fea26469706673582212201c4d2b11026ef1fec04e3a1605ebe4f193abcf301b1194a80195f089d37d964564736f6c6343000804003368747470733a2f2f6e66742e756e636c656d696e652e6f72672f6d657461646174612f

Deployed Bytecode

0x6080604052600436106101815760003560e01c8063715018a6116100d1578063a22cb4651161008a578063cce132d111610064578063cce132d11461055f578063e43252d71461058a578063e985e9c5146105b3578063f2fde38b146105f057610181565b8063a22cb465146104d0578063b88d4fde146104f9578063c87b56dd1461052257610181565b8063715018a6146103df578063755edd17146103f6578063819b25ba146104265780638d859f3e1461044f5780638da5cb5b1461047a57806395d89b41146104a557610181565b806327efc0861161013e57806355f804b31161011857806355f804b314610313578063573734151461033c5780636352211e1461036557806370a08231146103a257610181565b806327efc086146102a85780633ccfd60b146102d357806342842e0e146102ea57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906127d9565b610619565b6040516101ba9190612d7b565b60405180910390f35b3480156101cf57600080fd5b506101d86106fb565b6040516101e59190612d96565b60405180910390f35b3480156101fa57600080fd5b506102156004803603810190610210919061286c565b61078d565b6040516102229190612d14565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d919061279d565b610812565b005b34801561026057600080fd5b5061026961092a565b6040516102769190613098565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612697565b610934565b005b3480156102b457600080fd5b506102bd610994565b6040516102ca9190613098565b60405180910390f35b3480156102df57600080fd5b506102e8610999565b005b3480156102f657600080fd5b50610311600480360381019061030c9190612697565b610acd565b005b34801561031f57600080fd5b5061033a6004803603810190610335919061282b565b610aed565b005b34801561034857600080fd5b50610363600480360381019061035e919061286c565b610b83565b005b34801561037157600080fd5b5061038c6004803603810190610387919061286c565b610c4c565b6040516103999190612d14565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190612632565b610cfe565b6040516103d69190613098565b60405180910390f35b3480156103eb57600080fd5b506103f4610db6565b005b610410600480360381019061040b9190612632565b610e3e565b60405161041d9190613098565b60405180910390f35b34801561043257600080fd5b5061044d6004803603810190610448919061286c565b6110ec565b005b34801561045b57600080fd5b50610464611208565b6040516104719190613098565b60405180910390f35b34801561048657600080fd5b5061048f611213565b60405161049c9190612d14565b60405180910390f35b3480156104b157600080fd5b506104ba61123d565b6040516104c79190612d96565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190612761565b6112cf565b005b34801561050557600080fd5b50610520600480360381019061051b91906126e6565b6112e5565b005b34801561052e57600080fd5b506105496004803603810190610544919061286c565b611347565b6040516105569190612d96565b60405180910390f35b34801561056b57600080fd5b506105746113ee565b6040516105819190613098565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612632565b6113f3565b005b3480156105bf57600080fd5b506105da60048036038101906105d5919061265b565b6114ca565b6040516105e79190612d7b565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190612632565b61155e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f457506106f382611656565b5b9050919050565b60606000805461070a906132f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610736906132f9565b80156107835780601f1061075857610100808354040283529160200191610783565b820191906000526020600020905b81548152906001019060200180831161076657829003601f168201915b5050505050905090565b6000610798826116c0565b6107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612f98565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081d82610c4c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561088e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088590613018565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ad61172c565b73ffffffffffffffffffffffffffffffffffffffff1614806108dc57506108db816108d661172c565b6114ca565b5b61091b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091290612ef8565b60405180910390fd5b6109258383611734565b505050565b6000600c54905090565b61094561093f61172c565b826117ed565b610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b90613038565b60405180910390fd5b61098f8383836118cb565b505050565b606481565b6109a161172c565b73ffffffffffffffffffffffffffffffffffffffff166109bf611213565b73ffffffffffffffffffffffffffffffffffffffff1614610a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0c90612fd8565b60405180910390fd5b60004790506000803373ffffffffffffffffffffffffffffffffffffffff1683604051610a4190612cff565b60006040518083038185875af1925050503d8060008114610a7e576040519150601f19603f3d011682016040523d82523d6000602084013e610a83565b606091505b509150915081610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90612e78565b60405180910390fd5b505050565b610ae8838383604051806020016040528060008152506112e5565b505050565b610af561172c565b73ffffffffffffffffffffffffffffffffffffffff16610b13611213565b73ffffffffffffffffffffffffffffffffffffffff1614610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6090612fd8565b60405180910390fd5b8060089080519060200190610b7f929190612456565b5050565b610b8b61172c565b73ffffffffffffffffffffffffffffffffffffffff16610ba9611213565b73ffffffffffffffffffffffffffffffffffffffff1614610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf690612fd8565b60405180910390fd5b60008111610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990612fb8565b60405180910390fd5b80600b8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90612f38565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690612f18565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dbe61172c565b73ffffffffffffffffffffffffffffffffffffffff16610ddc611213565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2990612fd8565b60405180910390fd5b610e3c6000611b32565b565b6000600160096000610e4e61172c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090612e38565b60405180910390fd5b6064600c541115610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690613058565b60405180910390fd5b610f17611bf8565b610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90612f58565b60405180910390fd5b60011515600a6000610f6661172c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415610ffe5760003414610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff090612e58565b60405180910390fd5b611049565b66b1a2bc2ec50000341015611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90613078565b60405180910390fd5b5b60006110556007611c13565b90506110616007611c21565b61106b8382611c37565b60016009600061107961172c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110c29190613188565b925050819055506001600c60008282546110dc9190613188565b9250508190555080915050919050565b6110f461172c565b73ffffffffffffffffffffffffffffffffffffffff16611112611213565b73ffffffffffffffffffffffffffffffffffffffff1614611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612fd8565b60405180910390fd5b6000806111756007611c13565b90506000606484836111879190613188565b1161119257836111a0565b81606461119f919061320f565b5b905060005b81811015611201576111b76007611c13565b93506111c36007611c21565b6111d46111ce61172c565b85611c37565b6001600c60008282546111e79190613188565b9250508190555080806111f99061335c565b9150506111a5565b5050505050565b66b1a2bc2ec5000081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461124c906132f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611278906132f9565b80156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050905090565b6112e16112da61172c565b8383611c55565b5050565b6112f66112f061172c565b836117ed565b611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613038565b60405180910390fd5b61134184848484611dc2565b50505050565b6060611352826116c0565b611391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138890612ff8565b60405180910390fd5b600061139b611e1e565b905060008151116113bb57604051806020016040528060008152506113e6565b806113c584611eb0565b6040516020016113d6929190612cd0565b6040516020818303038152906040525b915050919050565b600181565b6113fb61172c565b73ffffffffffffffffffffffffffffffffffffffff16611419611213565b73ffffffffffffffffffffffffffffffffffffffff161461146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690612fd8565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61156661172c565b73ffffffffffffffffffffffffffffffffffffffff16611584611213565b73ffffffffffffffffffffffffffffffffffffffff16146115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190612fd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190612dd8565b60405180910390fd5b61165381611b32565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117a783610c4c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117f8826116c0565b611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90612ed8565b60405180910390fd5b600061184283610c4c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118b157508373ffffffffffffffffffffffffffffffffffffffff166118998461078d565b73ffffffffffffffffffffffffffffffffffffffff16145b806118c257506118c181856114ca565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118eb82610c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193890612df8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a890612e98565b60405180910390fd5b6119bc83838361205d565b6119c7600082611734565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a17919061320f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a6e9190613188565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b2d838383612062565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600b5414158015611c0e575042600b5411155b905090565b600081600001549050919050565b6001816000016000828254019250508190555050565b611c51828260405180602001604052806000815250612067565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90612eb8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611db59190612d7b565b60405180910390a3505050565b611dcd8484846118cb565b611dd9848484846120c2565b611e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0f90612db8565b60405180910390fd5b50505050565b606060088054611e2d906132f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611e59906132f9565b8015611ea65780601f10611e7b57610100808354040283529160200191611ea6565b820191906000526020600020905b815481529060010190602001808311611e8957829003601f168201915b5050505050905090565b60606000821415611ef8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612058565b600082905060005b60008214611f2a578080611f139061335c565b915050600a82611f2391906131de565b9150611f00565b60008167ffffffffffffffff811115611f6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f9e5781602001600182028036833780820191505090505b5090505b6000851461205157600182611fb7919061320f565b9150600a85611fc691906133a5565b6030611fd29190613188565b60f81b81838151811061200e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561204a91906131de565b9450611fa2565b8093505050505b919050565b505050565b505050565b6120718383612259565b61207e60008484846120c2565b6120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490612db8565b60405180910390fd5b505050565b60006120e38473ffffffffffffffffffffffffffffffffffffffff16612433565b1561224c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261210c61172c565b8786866040518563ffffffff1660e01b815260040161212e9493929190612d2f565b602060405180830381600087803b15801561214857600080fd5b505af192505050801561217957506040513d601f19601f820116820180604052508101906121769190612802565b60015b6121fc573d80600081146121a9576040519150601f19603f3d011682016040523d82523d6000602084013e6121ae565b606091505b506000815114156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90612db8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612251565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c090612f78565b60405180910390fd5b6122d2816116c0565b15612312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230990612e18565b60405180910390fd5b61231e6000838361205d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461236e9190613188565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461242f60008383612062565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612462906132f9565b90600052602060002090601f01602090048101928261248457600085556124cb565b82601f1061249d57805160ff19168380011785556124cb565b828001600101855582156124cb579182015b828111156124ca5782518255916020019190600101906124af565b5b5090506124d891906124dc565b5090565b5b808211156124f55760008160009055506001016124dd565b5090565b600061250c612507846130d8565b6130b3565b90508281526020810184848401111561252457600080fd5b61252f8482856132b7565b509392505050565b600061254a61254584613109565b6130b3565b90508281526020810184848401111561256257600080fd5b61256d8482856132b7565b509392505050565b60008135905061258481613a46565b92915050565b60008135905061259981613a5d565b92915050565b6000813590506125ae81613a74565b92915050565b6000815190506125c381613a74565b92915050565b600082601f8301126125da57600080fd5b81356125ea8482602086016124f9565b91505092915050565b600082601f83011261260457600080fd5b8135612614848260208601612537565b91505092915050565b60008135905061262c81613a8b565b92915050565b60006020828403121561264457600080fd5b600061265284828501612575565b91505092915050565b6000806040838503121561266e57600080fd5b600061267c85828601612575565b925050602061268d85828601612575565b9150509250929050565b6000806000606084860312156126ac57600080fd5b60006126ba86828701612575565b93505060206126cb86828701612575565b92505060406126dc8682870161261d565b9150509250925092565b600080600080608085870312156126fc57600080fd5b600061270a87828801612575565b945050602061271b87828801612575565b935050604061272c8782880161261d565b925050606085013567ffffffffffffffff81111561274957600080fd5b612755878288016125c9565b91505092959194509250565b6000806040838503121561277457600080fd5b600061278285828601612575565b92505060206127938582860161258a565b9150509250929050565b600080604083850312156127b057600080fd5b60006127be85828601612575565b92505060206127cf8582860161261d565b9150509250929050565b6000602082840312156127eb57600080fd5b60006127f98482850161259f565b91505092915050565b60006020828403121561281457600080fd5b6000612822848285016125b4565b91505092915050565b60006020828403121561283d57600080fd5b600082013567ffffffffffffffff81111561285757600080fd5b612863848285016125f3565b91505092915050565b60006020828403121561287e57600080fd5b600061288c8482850161261d565b91505092915050565b61289e81613243565b82525050565b6128ad81613255565b82525050565b60006128be8261313a565b6128c88185613150565b93506128d88185602086016132c6565b6128e181613492565b840191505092915050565b60006128f782613145565b612901818561316c565b93506129118185602086016132c6565b61291a81613492565b840191505092915050565b600061293082613145565b61293a818561317d565b935061294a8185602086016132c6565b80840191505092915050565b600061296360328361316c565b915061296e826134a3565b604082019050919050565b600061298660268361316c565b9150612991826134f2565b604082019050919050565b60006129a960258361316c565b91506129b482613541565b604082019050919050565b60006129cc601c8361316c565b91506129d782613590565b602082019050919050565b60006129ef60118361316c565b91506129fa826135b9565b602082019050919050565b6000612a1260108361316c565b9150612a1d826135e2565b602082019050919050565b6000612a3560148361316c565b9150612a408261360b565b602082019050919050565b6000612a5860248361316c565b9150612a6382613634565b604082019050919050565b6000612a7b60198361316c565b9150612a8682613683565b602082019050919050565b6000612a9e602c8361316c565b9150612aa9826136ac565b604082019050919050565b6000612ac160388361316c565b9150612acc826136fb565b604082019050919050565b6000612ae4602a8361316c565b9150612aef8261374a565b604082019050919050565b6000612b0760298361316c565b9150612b1282613799565b604082019050919050565b6000612b2a60168361316c565b9150612b35826137e8565b602082019050919050565b6000612b4d60208361316c565b9150612b5882613811565b602082019050919050565b6000612b70602c8361316c565b9150612b7b8261383a565b604082019050919050565b6000612b9360168361316c565b9150612b9e82613889565b602082019050919050565b6000612bb660058361317d565b9150612bc1826138b2565b600582019050919050565b6000612bd960208361316c565b9150612be4826138db565b602082019050919050565b6000612bfc602f8361316c565b9150612c0782613904565b604082019050919050565b6000612c1f60218361316c565b9150612c2a82613953565b604082019050919050565b6000612c42600083613161565b9150612c4d826139a2565b600082019050919050565b6000612c6560318361316c565b9150612c70826139a5565b604082019050919050565b6000612c8860088361316c565b9150612c93826139f4565b602082019050919050565b6000612cab60198361316c565b9150612cb682613a1d565b602082019050919050565b612cca816132ad565b82525050565b6000612cdc8285612925565b9150612ce88284612925565b9150612cf382612ba9565b91508190509392505050565b6000612d0a82612c35565b9150819050919050565b6000602082019050612d296000830184612895565b92915050565b6000608082019050612d446000830187612895565b612d516020830186612895565b612d5e6040830185612cc1565b8181036060830152612d7081846128b3565b905095945050505050565b6000602082019050612d9060008301846128a4565b92915050565b60006020820190508181036000830152612db081846128ec565b905092915050565b60006020820190508181036000830152612dd181612956565b9050919050565b60006020820190508181036000830152612df181612979565b9050919050565b60006020820190508181036000830152612e118161299c565b9050919050565b60006020820190508181036000830152612e31816129bf565b9050919050565b60006020820190508181036000830152612e51816129e2565b9050919050565b60006020820190508181036000830152612e7181612a05565b9050919050565b60006020820190508181036000830152612e9181612a28565b9050919050565b60006020820190508181036000830152612eb181612a4b565b9050919050565b60006020820190508181036000830152612ed181612a6e565b9050919050565b60006020820190508181036000830152612ef181612a91565b9050919050565b60006020820190508181036000830152612f1181612ab4565b9050919050565b60006020820190508181036000830152612f3181612ad7565b9050919050565b60006020820190508181036000830152612f5181612afa565b9050919050565b60006020820190508181036000830152612f7181612b1d565b9050919050565b60006020820190508181036000830152612f9181612b40565b9050919050565b60006020820190508181036000830152612fb181612b63565b9050919050565b60006020820190508181036000830152612fd181612b86565b9050919050565b60006020820190508181036000830152612ff181612bcc565b9050919050565b6000602082019050818103600083015261301181612bef565b9050919050565b6000602082019050818103600083015261303181612c12565b9050919050565b6000602082019050818103600083015261305181612c58565b9050919050565b6000602082019050818103600083015261307181612c7b565b9050919050565b6000602082019050818103600083015261309181612c9e565b9050919050565b60006020820190506130ad6000830184612cc1565b92915050565b60006130bd6130ce565b90506130c9828261332b565b919050565b6000604051905090565b600067ffffffffffffffff8211156130f3576130f2613463565b5b6130fc82613492565b9050602081019050919050565b600067ffffffffffffffff82111561312457613123613463565b5b61312d82613492565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613193826132ad565b915061319e836132ad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131d3576131d26133d6565b5b828201905092915050565b60006131e9826132ad565b91506131f4836132ad565b92508261320457613203613405565b5b828204905092915050565b600061321a826132ad565b9150613225836132ad565b925082821015613238576132376133d6565b5b828203905092915050565b600061324e8261328d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132e45780820151818401526020810190506132c9565b838111156132f3576000848401525b50505050565b6000600282049050600182168061331157607f821691505b6020821081141561332557613324613434565b5b50919050565b61333482613492565b810181811067ffffffffffffffff8211171561335357613352613463565b5b80604052505050565b6000613367826132ad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561339a576133996133d6565b5b600182019050919050565b60006133b0826132ad565b91506133bb836132ad565b9250826133cb576133ca613405565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5265616368206d696e74206c696d697473000000000000000000000000000000600082015250565b7f77686974656c697374206d656d62657200000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206f70656e65642079657400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e76616c69642073616c65206f70656e2074696d6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f45746865722076616c7565206973206e6f7420656e6f75676800000000000000600082015250565b613a4f81613243565b8114613a5a57600080fd5b50565b613a6681613255565b8114613a7157600080fd5b50565b613a7d81613261565b8114613a8857600080fd5b50565b613a94816132ad565b8114613a9f57600080fd5b5056fea26469706673582212201c4d2b11026ef1fec04e3a1605ebe4f193abcf301b1194a80195f089d37d964564736f6c63430008040033

Deployed Bytecode Sourcemap

38488:3465:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21382:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22327:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23886:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23409:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39882:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24636:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38873:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39981:222;;;;;;;;;;;;;:::i;:::-;;25046:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41738:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39731:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22021:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21751:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36188:103;;;;;;;;;;;;;:::i;:::-;;40640:605;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40211:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38959:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35537:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22496:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24179:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25302:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41253:477;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38915:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39632:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24405:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36446:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21382:305;21484:4;21536:25;21521:40;;;:11;:40;;;;:105;;;;21593:33;21578:48;;;:11;:48;;;;21521:105;:158;;;;21643:36;21667:11;21643:23;:36::i;:::-;21521:158;21501:178;;21382:305;;;:::o;22327:100::-;22381:13;22414:5;22407:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22327:100;:::o;23886:221::-;23962:7;23990:16;23998:7;23990;:16::i;:::-;23982:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24075:15;:24;24091:7;24075:24;;;;;;;;;;;;;;;;;;;;;24068:31;;23886:221;;;:::o;23409:411::-;23490:13;23506:23;23521:7;23506:14;:23::i;:::-;23490:39;;23554:5;23548:11;;:2;:11;;;;23540:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23648:5;23632:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23657:37;23674:5;23681:12;:10;:12::i;:::-;23657:16;:37::i;:::-;23632:62;23610:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23791:21;23800:2;23804:7;23791:8;:21::i;:::-;23409:411;;;:::o;39882:91::-;39926:7;39953:12;;39946:19;;39882:91;:::o;24636:339::-;24831:41;24850:12;:10;:12::i;:::-;24864:7;24831:18;:41::i;:::-;24823:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24939:28;24949:4;24955:2;24959:7;24939:9;:28::i;:::-;24636:339;;;:::o;38873:35::-;38905:3;38873:35;:::o;39981:222::-;35768:12;:10;:12::i;:::-;35757:23;;:7;:5;:7::i;:::-;:23;;;35749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40029:15:::1;40047:21;40029:39;;40080:9;40091:17:::0;40112:10:::1;:15;;40135:7;40112:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40079:68;;;;40166:4;40158:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;35828:1;;;39981:222::o:0;25046:185::-;25184:39;25201:4;25207:2;25211:7;25184:39;;;;;;;;;;;;:16;:39::i;:::-;25046:185;;;:::o;41738:94::-;35768:12;:10;:12::i;:::-;35757:23;;:7;:5;:7::i;:::-;:23;;;35749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41823:1:::1;41811:9;:13;;;;;;;;;;;;:::i;:::-;;41738:94:::0;:::o;39731:143::-;35768:12;:10;:12::i;:::-;35757:23;;:7;:5;:7::i;:::-;:23;;;35749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39811:1:::1;39805:3;:7;39797:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;39863:3;39850:10;:16;;;;39731:143:::0;:::o;22021:239::-;22093:7;22113:13;22129:7;:16;22137:7;22129:16;;;;;;;;;;;;;;;;;;;;;22113:32;;22181:1;22164:19;;:5;:19;;;;22156:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22247:5;22240:12;;;22021:239;;;:::o;21751:208::-;21823:7;21868:1;21851:19;;:5;:19;;;;21843:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21935:9;:16;21945:5;21935:16;;;;;;;;;;;;;;;;21928:23;;21751:208;;;:::o;36188:103::-;35768:12;:10;:12::i;:::-;35757:23;;:7;:5;:7::i;:::-;:23;;;35749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36253:30:::1;36280:1;36253:18;:30::i;:::-;36188:103::o:0;40640:605::-;40790:7;38951:1;39191:10;:24;39202:12;:10;:12::i;:::-;39191:24;;;;;;;;;;;;;;;;:36;39183:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38905:3:::1;39321:12;;:21;;39313:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;39426:15:::2;:13;:15::i;:::-;39418:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;40847:4:::3;40819:32;;:10;:24;40830:12;:10;:12::i;:::-;40819:24;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;40815:197;;;40889:1;40876:9;:14;40868:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;40815:197;;;38991:17;40952:9;:18;;40944:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40815:197;41024:15;41042:25;:15;:23;:25::i;:::-;41024:43;;41078:27;:15;:25;:27::i;:::-;41116:22;41126:2;41130:7;41116:9;:22::i;:::-;41179:1;41151:10;:24;41162:12;:10;:12::i;:::-;41151:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;41209:1;41193:12;;:17;;;;;;;:::i;:::-;;;;;;;;41230:7;41223:14;;;40640:605:::0;;;:::o;40211:421::-;35768:12;:10;:12::i;:::-;35757:23;;:7;:5;:7::i;:::-;:23;;;35749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40267:11:::1;40289:17:::0;40309:25:::1;:15;:23;:25::i;:::-;40289:45;;40345:9;38905:3;40370:1;40358:9;:13;;;;:::i;:::-;:21;40357:47;;40403:1;40357:47;;;40391:9;38905:3;40383:17;;;;:::i;:::-;40357:47;40345:59;;40420:10;40415:210;40441:1;40436:2;:6;40415:210;;;40471:25;:15;:23;:25::i;:::-;40465:31;;40511:27;:15;:25;:27::i;:::-;40553:28;40563:12;:10;:12::i;:::-;40577:3;40553:9;:28::i;:::-;40612:1;40596:12;;:17;;;;;;;:::i;:::-;;;;;;;;40444:4;;;;;:::i;:::-;;;;40415:210;;;;35828:1;;;40211:421:::0;:::o;38959:49::-;38991:17;38959:49;:::o;35537:87::-;35583:7;35610:6;;;;;;;;;;;35603:13;;35537:87;:::o;22496:104::-;22552:13;22585:7;22578:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22496:104;:::o;24179:155::-;24274:52;24293:12;:10;:12::i;:::-;24307:8;24317;24274:18;:52::i;:::-;24179:155;;:::o;25302:328::-;25477:41;25496:12;:10;:12::i;:::-;25510:7;25477:18;:41::i;:::-;25469:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25583:39;25597:4;25603:2;25607:7;25616:5;25583:13;:39::i;:::-;25302:328;;;;:::o;41253:477::-;41371:13;41424:16;41432:7;41424;:16::i;:::-;41402:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;41528:21;41552:10;:8;:10::i;:::-;41528:34;;41617:1;41599:7;41593:21;:25;:129;;;;;;;;;;;;;;;;;41662:7;41671:18;:7;:16;:18::i;:::-;41645:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41593:129;41573:149;;;41253:477;;;:::o;38915:37::-;38951:1;38915:37;:::o;39632:91::-;35768:12;:10;:12::i;:::-;35757:23;;:7;:5;:7::i;:::-;:23;;;35749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39711:4:::1;39695:10;:13;39706:1;39695:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;39632:91:::0;:::o;24405:164::-;24502:4;24526:18;:25;24545:5;24526:25;;;;;;;;;;;;;;;:35;24552:8;24526:35;;;;;;;;;;;;;;;;;;;;;;;;;24519:42;;24405:164;;;;:::o;36446:201::-;35768:12;:10;:12::i;:::-;35757:23;;:7;:5;:7::i;:::-;:23;;;35749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36555:1:::1;36535:22;;:8;:22;;;;36527:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36611:28;36630:8;36611:18;:28::i;:::-;36446:201:::0;:::o;19832:157::-;19917:4;19956:25;19941:40;;;:11;:40;;;;19934:47;;19832:157;;;:::o;27140:127::-;27205:4;27257:1;27229:30;;:7;:16;27237:7;27229:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27222:37;;27140:127;;;:::o;16669:98::-;16722:7;16749:10;16742:17;;16669:98;:::o;31286:174::-;31388:2;31361:15;:24;31377:7;31361:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31444:7;31440:2;31406:46;;31415:23;31430:7;31415:14;:23::i;:::-;31406:46;;;;;;;;;;;;31286:174;;:::o;27434:348::-;27527:4;27552:16;27560:7;27552;:16::i;:::-;27544:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27628:13;27644:23;27659:7;27644:14;:23::i;:::-;27628:39;;27697:5;27686:16;;:7;:16;;;:51;;;;27730:7;27706:31;;:20;27718:7;27706:11;:20::i;:::-;:31;;;27686:51;:87;;;;27741:32;27758:5;27765:7;27741:16;:32::i;:::-;27686:87;27678:96;;;27434:348;;;;:::o;30543:625::-;30702:4;30675:31;;:23;30690:7;30675:14;:23::i;:::-;:31;;;30667:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30781:1;30767:16;;:2;:16;;;;30759:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30837:39;30858:4;30864:2;30868:7;30837:20;:39::i;:::-;30941:29;30958:1;30962:7;30941:8;:29::i;:::-;31002:1;30983:9;:15;30993:4;30983:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31031:1;31014:9;:13;31024:2;31014:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31062:2;31043:7;:16;31051:7;31043:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31101:7;31097:2;31082:27;;31091:4;31082:27;;;;;;;;;;;;31122:38;31142:4;31148:2;31152:7;31122:19;:38::i;:::-;30543:625;;;:::o;36807:191::-;36881:16;36900:6;;;;;;;;;;;36881:25;;36926:8;36917:6;;:17;;;;;;;;;;;;;;;;;;36981:8;36950:40;;36971:8;36950:40;;;;;;;;;;;;36807:191;;:::o;39496:128::-;39544:4;39582:1;39568:10;;:15;;:48;;;;;39601:15;39587:10;;:29;;39568:48;39561:55;;39496:128;:::o;37858:114::-;37923:7;37950;:14;;;37943:21;;37858:114;;;:::o;37980:127::-;38087:1;38069:7;:14;;;:19;;;;;;;;;;;37980:127;:::o;28124:110::-;28200:26;28210:2;28214:7;28200:26;;;;;;;;;;;;:9;:26::i;:::-;28124:110;;:::o;31602:315::-;31757:8;31748:17;;:5;:17;;;;31740:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31844:8;31806:18;:25;31825:5;31806:25;;;;;;;;;;;;;;;:35;31832:8;31806:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31890:8;31868:41;;31883:5;31868:41;;;31900:8;31868:41;;;;;;:::i;:::-;;;;;;;;31602:315;;;:::o;26512:::-;26669:28;26679:4;26685:2;26689:7;26669:9;:28::i;:::-;26716:48;26739:4;26745:2;26749:7;26758:5;26716:22;:48::i;:::-;26708:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26512:315;;;;:::o;41840:110::-;41900:13;41933:9;41926:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41840:110;:::o;17229:723::-;17285:13;17515:1;17506:5;:10;17502:53;;;17533:10;;;;;;;;;;;;;;;;;;;;;17502:53;17565:12;17580:5;17565:20;;17596:14;17621:78;17636:1;17628:4;:9;17621:78;;17654:8;;;;;:::i;:::-;;;;17685:2;17677:10;;;;;:::i;:::-;;;17621:78;;;17709:19;17741:6;17731:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17709:39;;17759:154;17775:1;17766:5;:10;17759:154;;17803:1;17793:11;;;;;:::i;:::-;;;17870:2;17862:5;:10;;;;:::i;:::-;17849:2;:24;;;;:::i;:::-;17836:39;;17819:6;17826;17819:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17899:2;17890:11;;;;;:::i;:::-;;;17759:154;;;17937:6;17923:21;;;;;17229:723;;;;:::o;33853:126::-;;;;:::o;34364:125::-;;;;:::o;28461:321::-;28591:18;28597:2;28601:7;28591:5;:18::i;:::-;28642:54;28673:1;28677:2;28681:7;28690:5;28642:22;:54::i;:::-;28620:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28461:321;;;:::o;32482:799::-;32637:4;32658:15;:2;:13;;;:15::i;:::-;32654:620;;;32710:2;32694:36;;;32731:12;:10;:12::i;:::-;32745:4;32751:7;32760:5;32694:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32690:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32953:1;32936:6;:13;:18;32932:272;;;32979:60;;;;;;;;;;:::i;:::-;;;;;;;;32932:272;33154:6;33148:13;33139:6;33135:2;33131:15;33124:38;32690:529;32827:41;;;32817:51;;;:6;:51;;;;32810:58;;;;;32654:620;33258:4;33251:11;;32482:799;;;;;;;:::o;29118:439::-;29212:1;29198:16;;:2;:16;;;;29190:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29271:16;29279:7;29271;:16::i;:::-;29270:17;29262:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29333:45;29362:1;29366:2;29370:7;29333:20;:45::i;:::-;29408:1;29391:9;:13;29401:2;29391:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29439:2;29420:7;:16;29428:7;29420:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29484:7;29480:2;29459:33;;29476:1;29459:33;;;;;;;;;;;;29505:44;29533:1;29537:2;29541:7;29505:19;:44::i;:::-;29118:439;;:::o;8739:326::-;8799:4;9056:1;9034:7;:19;;;:23;9027:30;;8739:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:118::-;6173:24;6191:5;6173:24;:::i;:::-;6168:3;6161:37;6151:53;;:::o;6210:109::-;6291:21;6306:5;6291:21;:::i;:::-;6286:3;6279:34;6269:50;;:::o;6325:360::-;6411:3;6439:38;6471:5;6439:38;:::i;:::-;6493:70;6556:6;6551:3;6493:70;:::i;:::-;6486:77;;6572:52;6617:6;6612:3;6605:4;6598:5;6594:16;6572:52;:::i;:::-;6649:29;6671:6;6649:29;:::i;:::-;6644:3;6640:39;6633:46;;6415:270;;;;;:::o;6691:364::-;6779:3;6807:39;6840:5;6807:39;:::i;:::-;6862:71;6926:6;6921:3;6862:71;:::i;:::-;6855:78;;6942:52;6987:6;6982:3;6975:4;6968:5;6964:16;6942:52;:::i;:::-;7019:29;7041:6;7019:29;:::i;:::-;7014:3;7010:39;7003:46;;6783:272;;;;;:::o;7061:377::-;7167:3;7195:39;7228:5;7195:39;:::i;:::-;7250:89;7332:6;7327:3;7250:89;:::i;:::-;7243:96;;7348:52;7393:6;7388:3;7381:4;7374:5;7370:16;7348:52;:::i;:::-;7425:6;7420:3;7416:16;7409:23;;7171:267;;;;;:::o;7444:366::-;7586:3;7607:67;7671:2;7666:3;7607:67;:::i;:::-;7600:74;;7683:93;7772:3;7683:93;:::i;:::-;7801:2;7796:3;7792:12;7785:19;;7590:220;;;:::o;7816:366::-;7958:3;7979:67;8043:2;8038:3;7979:67;:::i;:::-;7972:74;;8055:93;8144:3;8055:93;:::i;:::-;8173:2;8168:3;8164:12;8157:19;;7962:220;;;:::o;8188:366::-;8330:3;8351:67;8415:2;8410:3;8351:67;:::i;:::-;8344:74;;8427:93;8516:3;8427:93;:::i;:::-;8545:2;8540:3;8536:12;8529:19;;8334:220;;;:::o;8560:366::-;8702:3;8723:67;8787:2;8782:3;8723:67;:::i;:::-;8716:74;;8799:93;8888:3;8799:93;:::i;:::-;8917:2;8912:3;8908:12;8901:19;;8706:220;;;:::o;8932:366::-;9074:3;9095:67;9159:2;9154:3;9095:67;:::i;:::-;9088:74;;9171:93;9260:3;9171:93;:::i;:::-;9289:2;9284:3;9280:12;9273:19;;9078:220;;;:::o;9304:366::-;9446:3;9467:67;9531:2;9526:3;9467:67;:::i;:::-;9460:74;;9543:93;9632:3;9543:93;:::i;:::-;9661:2;9656:3;9652:12;9645:19;;9450:220;;;:::o;9676:366::-;9818:3;9839:67;9903:2;9898:3;9839:67;:::i;:::-;9832:74;;9915:93;10004:3;9915:93;:::i;:::-;10033:2;10028:3;10024:12;10017:19;;9822:220;;;:::o;10048:366::-;10190:3;10211:67;10275:2;10270:3;10211:67;:::i;:::-;10204:74;;10287:93;10376:3;10287:93;:::i;:::-;10405:2;10400:3;10396:12;10389:19;;10194:220;;;:::o;10420:366::-;10562:3;10583:67;10647:2;10642:3;10583:67;:::i;:::-;10576:74;;10659:93;10748:3;10659:93;:::i;:::-;10777:2;10772:3;10768:12;10761:19;;10566:220;;;:::o;10792:366::-;10934:3;10955:67;11019:2;11014:3;10955:67;:::i;:::-;10948:74;;11031:93;11120:3;11031:93;:::i;:::-;11149:2;11144:3;11140:12;11133:19;;10938:220;;;:::o;11164:366::-;11306:3;11327:67;11391:2;11386:3;11327:67;:::i;:::-;11320:74;;11403:93;11492:3;11403:93;:::i;:::-;11521:2;11516:3;11512:12;11505:19;;11310:220;;;:::o;11536:366::-;11678:3;11699:67;11763:2;11758:3;11699:67;:::i;:::-;11692:74;;11775:93;11864:3;11775:93;:::i;:::-;11893:2;11888:3;11884:12;11877:19;;11682:220;;;:::o;11908:366::-;12050:3;12071:67;12135:2;12130:3;12071:67;:::i;:::-;12064:74;;12147:93;12236:3;12147:93;:::i;:::-;12265:2;12260:3;12256:12;12249:19;;12054:220;;;:::o;12280:366::-;12422:3;12443:67;12507:2;12502:3;12443:67;:::i;:::-;12436:74;;12519:93;12608:3;12519:93;:::i;:::-;12637:2;12632:3;12628:12;12621:19;;12426:220;;;:::o;12652:366::-;12794:3;12815:67;12879:2;12874:3;12815:67;:::i;:::-;12808:74;;12891:93;12980:3;12891:93;:::i;:::-;13009:2;13004:3;13000:12;12993:19;;12798:220;;;:::o;13024:366::-;13166:3;13187:67;13251:2;13246:3;13187:67;:::i;:::-;13180:74;;13263:93;13352:3;13263:93;:::i;:::-;13381:2;13376:3;13372:12;13365:19;;13170:220;;;:::o;13396:366::-;13538:3;13559:67;13623:2;13618:3;13559:67;:::i;:::-;13552:74;;13635:93;13724:3;13635:93;:::i;:::-;13753:2;13748:3;13744:12;13737:19;;13542:220;;;:::o;13768:400::-;13928:3;13949:84;14031:1;14026:3;13949:84;:::i;:::-;13942:91;;14042:93;14131:3;14042:93;:::i;:::-;14160:1;14155:3;14151:11;14144:18;;13932:236;;;:::o;14174:366::-;14316:3;14337:67;14401:2;14396:3;14337:67;:::i;:::-;14330:74;;14413:93;14502:3;14413:93;:::i;:::-;14531:2;14526:3;14522:12;14515:19;;14320:220;;;:::o;14546:366::-;14688:3;14709:67;14773:2;14768:3;14709:67;:::i;:::-;14702:74;;14785:93;14874:3;14785:93;:::i;:::-;14903:2;14898:3;14894:12;14887:19;;14692:220;;;:::o;14918:366::-;15060:3;15081:67;15145:2;15140:3;15081:67;:::i;:::-;15074:74;;15157:93;15246:3;15157:93;:::i;:::-;15275:2;15270:3;15266:12;15259:19;;15064:220;;;:::o;15290:398::-;15449:3;15470:83;15551:1;15546:3;15470:83;:::i;:::-;15463:90;;15562:93;15651:3;15562:93;:::i;:::-;15680:1;15675:3;15671:11;15664:18;;15453:235;;;:::o;15694:366::-;15836:3;15857:67;15921:2;15916:3;15857:67;:::i;:::-;15850:74;;15933:93;16022:3;15933:93;:::i;:::-;16051:2;16046:3;16042:12;16035:19;;15840:220;;;:::o;16066:365::-;16208:3;16229:66;16293:1;16288:3;16229:66;:::i;:::-;16222:73;;16304:93;16393:3;16304:93;:::i;:::-;16422:2;16417:3;16413:12;16406:19;;16212:219;;;:::o;16437:366::-;16579:3;16600:67;16664:2;16659:3;16600:67;:::i;:::-;16593:74;;16676:93;16765:3;16676:93;:::i;:::-;16794:2;16789:3;16785:12;16778:19;;16583:220;;;:::o;16809:118::-;16896:24;16914:5;16896:24;:::i;:::-;16891:3;16884:37;16874:53;;:::o;16933:701::-;17214:3;17236:95;17327:3;17318:6;17236:95;:::i;:::-;17229:102;;17348:95;17439:3;17430:6;17348:95;:::i;:::-;17341:102;;17460:148;17604:3;17460:148;:::i;:::-;17453:155;;17625:3;17618:10;;17218:416;;;;;:::o;17640:379::-;17824:3;17846:147;17989:3;17846:147;:::i;:::-;17839:154;;18010:3;18003:10;;17828:191;;;:::o;18025:222::-;18118:4;18156:2;18145:9;18141:18;18133:26;;18169:71;18237:1;18226:9;18222:17;18213:6;18169:71;:::i;:::-;18123:124;;;;:::o;18253:640::-;18448:4;18486:3;18475:9;18471:19;18463:27;;18500:71;18568:1;18557:9;18553:17;18544:6;18500:71;:::i;:::-;18581:72;18649:2;18638:9;18634:18;18625:6;18581:72;:::i;:::-;18663;18731:2;18720:9;18716:18;18707:6;18663:72;:::i;:::-;18782:9;18776:4;18772:20;18767:2;18756:9;18752:18;18745:48;18810:76;18881:4;18872:6;18810:76;:::i;:::-;18802:84;;18453:440;;;;;;;:::o;18899:210::-;18986:4;19024:2;19013:9;19009:18;19001:26;;19037:65;19099:1;19088:9;19084:17;19075:6;19037:65;:::i;:::-;18991:118;;;;:::o;19115:313::-;19228:4;19266:2;19255:9;19251:18;19243:26;;19315:9;19309:4;19305:20;19301:1;19290:9;19286:17;19279:47;19343:78;19416:4;19407:6;19343:78;:::i;:::-;19335:86;;19233:195;;;;:::o;19434:419::-;19600:4;19638:2;19627:9;19623:18;19615:26;;19687:9;19681:4;19677:20;19673:1;19662:9;19658:17;19651:47;19715:131;19841:4;19715:131;:::i;:::-;19707:139;;19605:248;;;:::o;19859:419::-;20025:4;20063:2;20052:9;20048:18;20040:26;;20112:9;20106:4;20102:20;20098:1;20087:9;20083:17;20076:47;20140:131;20266:4;20140:131;:::i;:::-;20132:139;;20030:248;;;:::o;20284:419::-;20450:4;20488:2;20477:9;20473:18;20465:26;;20537:9;20531:4;20527:20;20523:1;20512:9;20508:17;20501:47;20565:131;20691:4;20565:131;:::i;:::-;20557:139;;20455:248;;;:::o;20709:419::-;20875:4;20913:2;20902:9;20898:18;20890:26;;20962:9;20956:4;20952:20;20948:1;20937:9;20933:17;20926:47;20990:131;21116:4;20990:131;:::i;:::-;20982:139;;20880:248;;;:::o;21134:419::-;21300:4;21338:2;21327:9;21323:18;21315:26;;21387:9;21381:4;21377:20;21373:1;21362:9;21358:17;21351:47;21415:131;21541:4;21415:131;:::i;:::-;21407:139;;21305:248;;;:::o;21559:419::-;21725:4;21763:2;21752:9;21748:18;21740:26;;21812:9;21806:4;21802:20;21798:1;21787:9;21783:17;21776:47;21840:131;21966:4;21840:131;:::i;:::-;21832:139;;21730:248;;;:::o;21984:419::-;22150:4;22188:2;22177:9;22173:18;22165:26;;22237:9;22231:4;22227:20;22223:1;22212:9;22208:17;22201:47;22265:131;22391:4;22265:131;:::i;:::-;22257:139;;22155:248;;;:::o;22409:419::-;22575:4;22613:2;22602:9;22598:18;22590:26;;22662:9;22656:4;22652:20;22648:1;22637:9;22633:17;22626:47;22690:131;22816:4;22690:131;:::i;:::-;22682:139;;22580:248;;;:::o;22834:419::-;23000:4;23038:2;23027:9;23023:18;23015:26;;23087:9;23081:4;23077:20;23073:1;23062:9;23058:17;23051:47;23115:131;23241:4;23115:131;:::i;:::-;23107:139;;23005:248;;;:::o;23259:419::-;23425:4;23463:2;23452:9;23448:18;23440:26;;23512:9;23506:4;23502:20;23498:1;23487:9;23483:17;23476:47;23540:131;23666:4;23540:131;:::i;:::-;23532:139;;23430:248;;;:::o;23684:419::-;23850:4;23888:2;23877:9;23873:18;23865:26;;23937:9;23931:4;23927:20;23923:1;23912:9;23908:17;23901:47;23965:131;24091:4;23965:131;:::i;:::-;23957:139;;23855:248;;;:::o;24109:419::-;24275:4;24313:2;24302:9;24298:18;24290:26;;24362:9;24356:4;24352:20;24348:1;24337:9;24333:17;24326:47;24390:131;24516:4;24390:131;:::i;:::-;24382:139;;24280:248;;;:::o;24534:419::-;24700:4;24738:2;24727:9;24723:18;24715:26;;24787:9;24781:4;24777:20;24773:1;24762:9;24758:17;24751:47;24815:131;24941:4;24815:131;:::i;:::-;24807:139;;24705:248;;;:::o;24959:419::-;25125:4;25163:2;25152:9;25148:18;25140:26;;25212:9;25206:4;25202:20;25198:1;25187:9;25183:17;25176:47;25240:131;25366:4;25240:131;:::i;:::-;25232:139;;25130:248;;;:::o;25384:419::-;25550:4;25588:2;25577:9;25573:18;25565:26;;25637:9;25631:4;25627:20;25623:1;25612:9;25608:17;25601:47;25665:131;25791:4;25665:131;:::i;:::-;25657:139;;25555:248;;;:::o;25809:419::-;25975:4;26013:2;26002:9;25998:18;25990:26;;26062:9;26056:4;26052:20;26048:1;26037:9;26033:17;26026:47;26090:131;26216:4;26090:131;:::i;:::-;26082:139;;25980:248;;;:::o;26234:419::-;26400:4;26438:2;26427:9;26423:18;26415:26;;26487:9;26481:4;26477:20;26473:1;26462:9;26458:17;26451:47;26515:131;26641:4;26515:131;:::i;:::-;26507:139;;26405:248;;;:::o;26659:419::-;26825:4;26863:2;26852:9;26848:18;26840:26;;26912:9;26906:4;26902:20;26898:1;26887:9;26883:17;26876:47;26940:131;27066:4;26940:131;:::i;:::-;26932:139;;26830:248;;;:::o;27084:419::-;27250:4;27288:2;27277:9;27273:18;27265:26;;27337:9;27331:4;27327:20;27323:1;27312:9;27308:17;27301:47;27365:131;27491:4;27365:131;:::i;:::-;27357:139;;27255:248;;;:::o;27509:419::-;27675:4;27713:2;27702:9;27698:18;27690:26;;27762:9;27756:4;27752:20;27748:1;27737:9;27733:17;27726:47;27790:131;27916:4;27790:131;:::i;:::-;27782:139;;27680:248;;;:::o;27934:419::-;28100:4;28138:2;28127:9;28123:18;28115:26;;28187:9;28181:4;28177:20;28173:1;28162:9;28158:17;28151:47;28215:131;28341:4;28215:131;:::i;:::-;28207:139;;28105:248;;;:::o;28359:419::-;28525:4;28563:2;28552:9;28548:18;28540:26;;28612:9;28606:4;28602:20;28598:1;28587:9;28583:17;28576:47;28640:131;28766:4;28640:131;:::i;:::-;28632:139;;28530:248;;;:::o;28784:419::-;28950:4;28988:2;28977:9;28973:18;28965:26;;29037:9;29031:4;29027:20;29023:1;29012:9;29008:17;29001:47;29065:131;29191:4;29065:131;:::i;:::-;29057:139;;28955:248;;;:::o;29209:222::-;29302:4;29340:2;29329:9;29325:18;29317:26;;29353:71;29421:1;29410:9;29406:17;29397:6;29353:71;:::i;:::-;29307:124;;;;:::o;29437:129::-;29471:6;29498:20;;:::i;:::-;29488:30;;29527:33;29555:4;29547:6;29527:33;:::i;:::-;29478:88;;;:::o;29572:75::-;29605:6;29638:2;29632:9;29622:19;;29612:35;:::o;29653:307::-;29714:4;29804:18;29796:6;29793:30;29790:2;;;29826:18;;:::i;:::-;29790:2;29864:29;29886:6;29864:29;:::i;:::-;29856:37;;29948:4;29942;29938:15;29930:23;;29719:241;;;:::o;29966:308::-;30028:4;30118:18;30110:6;30107:30;30104:2;;;30140:18;;:::i;:::-;30104:2;30178:29;30200:6;30178:29;:::i;:::-;30170:37;;30262:4;30256;30252:15;30244:23;;30033:241;;;:::o;30280:98::-;30331:6;30365:5;30359:12;30349:22;;30338:40;;;:::o;30384:99::-;30436:6;30470:5;30464:12;30454:22;;30443:40;;;:::o;30489:168::-;30572:11;30606:6;30601:3;30594:19;30646:4;30641:3;30637:14;30622:29;;30584:73;;;;:::o;30663:147::-;30764:11;30801:3;30786:18;;30776:34;;;;:::o;30816:169::-;30900:11;30934:6;30929:3;30922:19;30974:4;30969:3;30965:14;30950:29;;30912:73;;;;:::o;30991:148::-;31093:11;31130:3;31115:18;;31105:34;;;;:::o;31145:305::-;31185:3;31204:20;31222:1;31204:20;:::i;:::-;31199:25;;31238:20;31256:1;31238:20;:::i;:::-;31233:25;;31392:1;31324:66;31320:74;31317:1;31314:81;31311:2;;;31398:18;;:::i;:::-;31311:2;31442:1;31439;31435:9;31428:16;;31189:261;;;;:::o;31456:185::-;31496:1;31513:20;31531:1;31513:20;:::i;:::-;31508:25;;31547:20;31565:1;31547:20;:::i;:::-;31542:25;;31586:1;31576:2;;31591:18;;:::i;:::-;31576:2;31633:1;31630;31626:9;31621:14;;31498:143;;;;:::o;31647:191::-;31687:4;31707:20;31725:1;31707:20;:::i;:::-;31702:25;;31741:20;31759:1;31741:20;:::i;:::-;31736:25;;31780:1;31777;31774:8;31771:2;;;31785:18;;:::i;:::-;31771:2;31830:1;31827;31823:9;31815:17;;31692:146;;;;:::o;31844:96::-;31881:7;31910:24;31928:5;31910:24;:::i;:::-;31899:35;;31889:51;;;:::o;31946:90::-;31980:7;32023:5;32016:13;32009:21;31998:32;;31988:48;;;:::o;32042:149::-;32078:7;32118:66;32111:5;32107:78;32096:89;;32086:105;;;:::o;32197:126::-;32234:7;32274:42;32267:5;32263:54;32252:65;;32242:81;;;:::o;32329:77::-;32366:7;32395:5;32384:16;;32374:32;;;:::o;32412:154::-;32496:6;32491:3;32486;32473:30;32558:1;32549:6;32544:3;32540:16;32533:27;32463:103;;;:::o;32572:307::-;32640:1;32650:113;32664:6;32661:1;32658:13;32650:113;;;32749:1;32744:3;32740:11;32734:18;32730:1;32725:3;32721:11;32714:39;32686:2;32683:1;32679:10;32674:15;;32650:113;;;32781:6;32778:1;32775:13;32772:2;;;32861:1;32852:6;32847:3;32843:16;32836:27;32772:2;32621:258;;;;:::o;32885:320::-;32929:6;32966:1;32960:4;32956:12;32946:22;;33013:1;33007:4;33003:12;33034:18;33024:2;;33090:4;33082:6;33078:17;33068:27;;33024:2;33152;33144:6;33141:14;33121:18;33118:38;33115:2;;;33171:18;;:::i;:::-;33115:2;32936:269;;;;:::o;33211:281::-;33294:27;33316:4;33294:27;:::i;:::-;33286:6;33282:40;33424:6;33412:10;33409:22;33388:18;33376:10;33373:34;33370:62;33367:2;;;33435:18;;:::i;:::-;33367:2;33475:10;33471:2;33464:22;33254:238;;;:::o;33498:233::-;33537:3;33560:24;33578:5;33560:24;:::i;:::-;33551:33;;33606:66;33599:5;33596:77;33593:2;;;33676:18;;:::i;:::-;33593:2;33723:1;33716:5;33712:13;33705:20;;33541:190;;;:::o;33737:176::-;33769:1;33786:20;33804:1;33786:20;:::i;:::-;33781:25;;33820:20;33838:1;33820:20;:::i;:::-;33815:25;;33859:1;33849:2;;33864:18;;:::i;:::-;33849:2;33905:1;33902;33898:9;33893:14;;33771:142;;;;:::o;33919:180::-;33967:77;33964:1;33957:88;34064:4;34061:1;34054:15;34088:4;34085:1;34078:15;34105:180;34153:77;34150:1;34143:88;34250:4;34247:1;34240:15;34274:4;34271:1;34264:15;34291:180;34339:77;34336:1;34329:88;34436:4;34433:1;34426:15;34460:4;34457:1;34450:15;34477:180;34525:77;34522:1;34515:88;34622:4;34619:1;34612:15;34646:4;34643:1;34636:15;34663:102;34704:6;34755:2;34751:7;34746:2;34739:5;34735:14;34731:28;34721:38;;34711:54;;;:::o;34771:237::-;34911:34;34907:1;34899:6;34895:14;34888:58;34980:20;34975:2;34967:6;34963:15;34956:45;34877:131;:::o;35014:225::-;35154:34;35150:1;35142:6;35138:14;35131:58;35223:8;35218:2;35210:6;35206:15;35199:33;35120:119;:::o;35245:224::-;35385:34;35381:1;35373:6;35369:14;35362:58;35454:7;35449:2;35441:6;35437:15;35430:32;35351:118;:::o;35475:178::-;35615:30;35611:1;35603:6;35599:14;35592:54;35581:72;:::o;35659:167::-;35799:19;35795:1;35787:6;35783:14;35776:43;35765:61;:::o;35832:166::-;35972:18;35968:1;35960:6;35956:14;35949:42;35938:60;:::o;36004:170::-;36144:22;36140:1;36132:6;36128:14;36121:46;36110:64;:::o;36180:223::-;36320:34;36316:1;36308:6;36304:14;36297:58;36389:6;36384:2;36376:6;36372:15;36365:31;36286:117;:::o;36409:175::-;36549:27;36545:1;36537:6;36533:14;36526:51;36515:69;:::o;36590:231::-;36730:34;36726:1;36718:6;36714:14;36707:58;36799:14;36794:2;36786:6;36782:15;36775:39;36696:125;:::o;36827:243::-;36967:34;36963:1;36955:6;36951:14;36944:58;37036:26;37031:2;37023:6;37019:15;37012:51;36933:137;:::o;37076:229::-;37216:34;37212:1;37204:6;37200:14;37193:58;37285:12;37280:2;37272:6;37268:15;37261:37;37182:123;:::o;37311:228::-;37451:34;37447:1;37439:6;37435:14;37428:58;37520:11;37515:2;37507:6;37503:15;37496:36;37417:122;:::o;37545:172::-;37685:24;37681:1;37673:6;37669:14;37662:48;37651:66;:::o;37723:182::-;37863:34;37859:1;37851:6;37847:14;37840:58;37829:76;:::o;37911:231::-;38051:34;38047:1;38039:6;38035:14;38028:58;38120:14;38115:2;38107:6;38103:15;38096:39;38017:125;:::o;38148:172::-;38288:24;38284:1;38276:6;38272:14;38265:48;38254:66;:::o;38326:155::-;38466:7;38462:1;38454:6;38450:14;38443:31;38432:49;:::o;38487:182::-;38627:34;38623:1;38615:6;38611:14;38604:58;38593:76;:::o;38675:234::-;38815:34;38811:1;38803:6;38799:14;38792:58;38884:17;38879:2;38871:6;38867:15;38860:42;38781:128;:::o;38915:220::-;39055:34;39051:1;39043:6;39039:14;39032:58;39124:3;39119:2;39111:6;39107:15;39100:28;39021:114;:::o;39141:::-;39247:8;:::o;39261:236::-;39401:34;39397:1;39389:6;39385:14;39378:58;39470:19;39465:2;39457:6;39453:15;39446:44;39367:130;:::o;39503:158::-;39643:10;39639:1;39631:6;39627:14;39620:34;39609:52;:::o;39667:175::-;39807:27;39803:1;39795:6;39791:14;39784:51;39773:69;:::o;39848:122::-;39921:24;39939:5;39921:24;:::i;:::-;39914:5;39911:35;39901:2;;39960:1;39957;39950:12;39901:2;39891:79;:::o;39976:116::-;40046:21;40061:5;40046:21;:::i;:::-;40039:5;40036:32;40026:2;;40082:1;40079;40072:12;40026:2;40016:76;:::o;40098:120::-;40170:23;40187:5;40170:23;:::i;:::-;40163:5;40160:34;40150:2;;40208:1;40205;40198:12;40150:2;40140:78;:::o;40224:122::-;40297:24;40315:5;40297:24;:::i;:::-;40290:5;40287:35;40277:2;;40336:1;40333;40326:12;40277:2;40267:79;:::o

Swarm Source

ipfs://1c4d2b11026ef1fec04e3a1605ebe4f193abcf301b1194a80195f089d37d9645
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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