ETH Price: $2,619.87 (-2.50%)

Token

24Sevens (24/7)
 

Overview

Max Total Supply

15 24/7

Holders

6

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
flufbear.eth
Balance
1 24/7
0x6805e260db96cb44ae9154a541e60525cddcbe98
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:
TwentyFourSevens

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-07
*/

// File: @openzeppelin/contracts/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/IERC721.sol


pragma solidity ^0.8.0;


/**
 * @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/IERC721Receiver.sol


pragma solidity ^0.8.0;

/**
 * @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/IERC721Metadata.sol


pragma solidity ^0.8.0;


/**
 * @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/Address.sol


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


pragma solidity ^0.8.0;

/**
 * @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/ERC165.sol


pragma solidity ^0.8.0;


/**
 * @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/ERC721.sol


pragma solidity ^0.8.0;








/**
 * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/TwentyFourSevens.sol

pragma solidity ^0.8.0;




contract TwentyFourSevens is ERC721Enumerable, Ownable {
    uint256 public constant MAX_SUPPLY = 86400;
    uint256 public constant MAX_RESERVE_SUPPLY = 2160;
    uint256 public constant START_TIMESTAMP = 1631102400;
    uint256 public constant PRICE = 0.1 ether;
    uint256 public reserveBalance;
    bool public mintStart;

    constructor() ERC721("24Sevens", "24/7") {}

    modifier mintingStarted() {
        require(mintStart, "Minting has not been allowed");
        require(block.timestamp >= START_TIMESTAMP, "Minting has not started");
        _;
    }

    modifier validTokenId(uint256 tokenId) {
        require(tokenId >= 0 && tokenId < MAX_SUPPLY, "Invalid tokenId");
        _;
    }

    function getHour(uint256 tokenId) public pure validTokenId(tokenId) returns (uint256) {
        return (tokenId / 3600) % 24;
    }

    function getMinute(uint256 tokenId) public pure validTokenId(tokenId) returns (uint256) {
        return (tokenId / 60) % 60;
    }

    function getSecond(uint256 tokenId) public pure validTokenId(tokenId) returns (uint256) {
        return tokenId % 60;
    }

    function getTime(uint256 tokenId) public pure validTokenId(tokenId) returns (uint256, uint256, uint256) {
        return (getHour(tokenId), getMinute(tokenId), getSecond(tokenId));
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        (uint256 _hour, uint256 _minute, uint256 _second) = getTime(tokenId);
        string memory formatted;

        if (_hour < 10) {
            formatted = string(abi.encodePacked(formatted, "0"));
        }
        formatted = string(abi.encodePacked(formatted, Strings.toString(_hour), ":"));

        if (_minute < 10) {
            formatted = string(abi.encodePacked(formatted, "0"));
        }
        formatted = string(abi.encodePacked(formatted, Strings.toString(_minute), ":"));

        if (_second < 10) {
            formatted = string(abi.encodePacked(formatted, "0"));
        }
        formatted = string(abi.encodePacked(formatted, Strings.toString(_second)));

        string memory output = string(abi.encodePacked(
            "<svg xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\" viewBox=\"0 0 350 350\">",
            "<style>.base { fill: black; font-family: serif; font-size: 60px; }</style>",
            "<rect width=\"100%\" height=\"100%\" fill=\"white\" />",
            "<text x=\"50%\" y=\"50%\" dominant-baseline=\"middle\" text-anchor=\"middle\" class=\"base\">",
            formatted,
            "</text></svg>"
        ));
        string memory json = encodeBase64(bytes(string(abi.encodePacked(
            "{\"name\": \"Time #", Strings.toString(tokenId), "\",",
            "\"time\": \"", formatted, "\",",
            "\"description\": \"24/7 is time generated and stored on chain. Stats, images, and other functionality are intentionally omitted for others to interpret. Feel free to use 24/7 in any way you want.\",",
            "\"image\": \"data:image/svg+xml;base64,",
            encodeBase64(bytes(output)),
            "\"}"
        ))));
        output = string(abi.encodePacked("data:application/json;base64,", json));

        return output;
    }

    function mint(uint256 tokenId) external payable mintingStarted validTokenId(tokenId) {
        require(totalSupply() < MAX_SUPPLY - MAX_RESERVE_SUPPLY, "Public mint has ended");
        require(msg.value == PRICE, "Ether sent incorrect");
        _safeMint(_msgSender(), tokenId);
    }

    function ownerMint(uint256 tokenId) external mintingStarted validTokenId(tokenId) onlyOwner {
        require(reserveBalance < MAX_RESERVE_SUPPLY, "Exceeded reserve supply");
        reserveBalance = reserveBalance + 1;
        _safeMint(owner(), tokenId);
    }

    function setMintStart(bool _mintStart) external onlyOwner {
        mintStart = _mintStart;
    }

    function withdraw() external onlyOwner {
        uint bal = address(this).balance;
        payable(owner()).transfer(bal);
    }

    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encodeBase64(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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_RESERVE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","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":"START_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMinute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"reserveBalance","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":"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":"bool","name":"_mintStart","type":"bool"}],"name":"setMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060408051808201825260088152673234536576656e7360c01b60208083019182528351808501909452600484526332342f3760e01b9084015281519192916200005e91600091620000ed565b50805162000074906001906020840190620000ed565b505050620000916200008b6200009760201b60201c565b6200009b565b620001d0565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000fb9062000193565b90600052602060002090601f0160209004810192826200011f57600085556200016a565b82601f106200013a57805160ff19168380011785556200016a565b828001600101855582156200016a579182015b828111156200016a5782518255916020019190600101906200014d565b50620001789291506200017c565b5090565b5b808211156200017857600081556001016200017d565b600181811c90821680620001a857607f821691505b60208210811415620001ca57634e487b7160e01b600052602260045260246000fd5b50919050565b6137f680620001e06000396000f3fe6080604052600436106101fe5760003560e01c8063715018a61161011d578063a10954fe116100b0578063c87b56dd1161007f578063f19e75d411610064578063f19e75d4146105ff578063f2fde38b1461061f578063fa93f8831461063f57600080fd5b8063c87b56dd14610589578063e985e9c5146105a957600080fd5b8063a10954fe1461051d578063a22cb46514610533578063a4a5e76314610553578063b88d4fde1461056957600080fd5b80638d859f3e116100ec5780638d859f3e146104ae5780638da5cb5b146104ca57806395d89b41146104f5578063a0712d681461050a57600080fd5b8063715018a614610426578063736278261461043b578063781cd99d146104765780638aa001fc1461048e57600080fd5b80632f745c591161019557806342842e0e1161016457806342842e0e146103a65780634f6ccce7146103c65780636352211e146103e657806370a082311461040657600080fd5b80632f745c591461033a57806332cb6b0c1461035a5780633ccfd60b146103715780633e239e1a1461038657600080fd5b8063095ea7b3116101d1578063095ea7b3146102c157806318160ddd146102e157806323b872dd14610300578063255e46851461032057600080fd5b806301ffc9a71461020357806306fdde03146102385780630715d7041461025a578063081812fc1461027c575b600080fd5b34801561020f57600080fd5b5061022361021e366004612f43565b61065f565b60405190151581526020015b60405180910390f35b34801561024457600080fd5b5061024d6106bb565b60405161022f919061356b565b34801561026657600080fd5b5061027a610275366004612f29565b61074d565b005b34801561028857600080fd5b5061029c610297366004612f7b565b610804565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022f565b3480156102cd57600080fd5b5061027a6102dc366004612f00565b6108de565b3480156102ed57600080fd5b506008545b60405190815260200161022f565b34801561030c57600080fd5b5061027a61031b366004612da9565b610a6b565b34801561032c57600080fd5b50600c546102239060ff1681565b34801561034657600080fd5b506102f2610355366004612f00565b610b0c565b34801561036657600080fd5b506102f26201518081565b34801561037d57600080fd5b5061027a610bdb565b34801561039257600080fd5b506102f26103a1366004612f7b565b610cc5565b3480156103b257600080fd5b5061027a6103c1366004612da9565b610d55565b3480156103d257600080fd5b506102f26103e1366004612f7b565b610d70565b3480156103f257600080fd5b5061029c610401366004612f7b565b610e55565b34801561041257600080fd5b506102f2610421366004612d56565b610f07565b34801561043257600080fd5b5061027a610fd5565b34801561044757600080fd5b5061045b610456366004612f7b565b611062565b6040805193845260208401929092529082015260600161022f565b34801561048257600080fd5b506102f2636138a5c081565b34801561049a57600080fd5b506102f26104a9366004612f7b565b6110fc565b3480156104ba57600080fd5b506102f267016345785d8a000081565b3480156104d657600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff1661029c565b34801561050157600080fd5b5061024d611176565b61027a610518366004612f7b565b611185565b34801561052957600080fd5b506102f2600b5481565b34801561053f57600080fd5b5061027a61054e366004612ed7565b6113c1565b34801561055f57600080fd5b506102f261087081565b34801561057557600080fd5b5061027a610584366004612de4565b6114d8565b34801561059557600080fd5b5061024d6105a4366004612f7b565b611580565b3480156105b557600080fd5b506102236105c4366004612d77565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561060b57600080fd5b5061027a61061a366004612f7b565b61174f565b34801561062b57600080fd5b5061027a61063a366004612d56565b6119b7565b34801561064b57600080fd5b506102f261065a366004612f7b565b611ae7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806106b557506106b582611b62565b92915050565b6060600080546106ca9061362a565b80601f01602080910402602001604051908101604052809291908181526020018280546106f69061362a565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b5050505050905090565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146107d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166108b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107ca565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006108e982610e55565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016107ca565b3373ffffffffffffffffffffffffffffffffffffffff821614806109d057506109d081336105c4565b610a5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107ca565b610a668383611c45565b505050565b610a753382611ce5565b610b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107ca565b610a66838383611e55565b6000610b1783610f07565b8210610ba5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016107ca565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ca565b47610c7c600a5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cc1573d6000803e3d6000fd5b5050565b600081620151808110610d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b6018610d42610e1085613596565b610d4c91906136b1565b91505b50919050565b610a66838383604051806020016040528060008152506114d8565b6000610d7b60085490565b8210610e09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016107ca565b60088281548110610e43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806106b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016107ca565b600073ffffffffffffffffffffffffffffffffffffffff8216610fac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016107ca565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ca565b61106060006120c7565b565b60008080836201518081106110d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b6110dc85610cc5565b6110e586611ae7565b6110ee876110fc565b935093509350509193909250565b60008162015180811061116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b610d4c603c846136b1565b6060600180546106ca9061362a565b600c5460ff166111f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d696e74696e6720686173206e6f74206265656e20616c6c6f7765640000000060448201526064016107ca565b636138a5c042101561125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d696e74696e6720686173206e6f74207374617274656400000000000000000060448201526064016107ca565b806201518081106112cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b6112db610870620151806135e7565b60085410611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5075626c6963206d696e742068617320656e646564000000000000000000000060448201526064016107ca565b67016345785d8a000034146113b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f45746865722073656e7420696e636f727265637400000000000000000000000060448201526064016107ca565b610cc1335b8361213e565b73ffffffffffffffffffffffffffffffffffffffff8216331415611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107ca565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114e23383611ce5565b61156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107ca565b61157a84848484612158565b50505050565b6060600080600061159085611062565b9250925092506060600a8410156115c457806040516020016115b2919061307f565b60405160208183030381529060405290505b806115ce856121fb565b6040516020016115df929190613028565b6040516020818303038152906040529050600a83101561161c578060405160200161160a919061307f565b60405160208183030381529060405290505b80611626846121fb565b604051602001611637929190613028565b6040516020818303038152906040529050600a8210156116745780604051602001611662919061307f565b60405160208183030381529060405290505b8061167e836121fb565b60405160200161168f929190612ff9565b60405160208183030381529060405290506000816040516020016116b391906130c0565b604051602081830303815290604052905060006117026116d2896121fb565b846116dc8561237b565b6040516020016116ee939291906132c2565b60405160208183030381529060405261237b565b90508060405160200161171591906134e7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905298975050505050505050565b600c5460ff166117bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d696e74696e6720686173206e6f74206265656e20616c6c6f7765640000000060448201526064016107ca565b636138a5c0421015611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d696e74696e6720686173206e6f74207374617274656400000000000000000060448201526064016107ca565b80620151808110611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ca565b610870600b5410611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4578636565646564207265736572766520737570706c7900000000000000000060448201526064016107ca565b600b5461199290600161357e565b600b55610cc16113bb600a5473ffffffffffffffffffffffffffffffffffffffff1690565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ca565b73ffffffffffffffffffffffffffffffffffffffff8116611adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107ca565b611ae4816120c7565b50565b600081620151808110611b56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b603c610d428185613596565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611bf557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106b557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146106b5565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611c9f82610e55565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16611d96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107ca565b6000611da183610e55565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e1057508373ffffffffffffffffffffffffffffffffffffffff16611df884610804565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e4d575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16611e7582610e55565b73ffffffffffffffffffffffffffffffffffffffff1614611f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016107ca565b73ffffffffffffffffffffffffffffffffffffffff8216611fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107ca565b611fc583838361257b565b611fd0600082611c45565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081208054600192906120069084906135e7565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061204190849061357e565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610cc1828260405180602001604052806000815250612681565b612163848484611e55565b61216f84848484612724565b61157a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107ca565b60608161223b57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612265578061224f81613678565b915061225e9050600a83613596565b915061223f565b60008167ffffffffffffffff8111156122a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122d1576020820181803683370190505b5090505b8415611e4d576122e66001836135e7565b91506122f3600a866136b1565b6122fe90603061357e565b60f81b81838151811061233a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612374600a86613596565b94506122d5565b80516060908061239b575050604080516020810190915260008152919050565b600060036123aa83600261357e565b6123b49190613596565b6123bf9060046135aa565b905060006123ce82602061357e565b67ffffffffffffffff81111561240d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612437576020820181803683370190505b5090506000604051806060016040528060408152602001613781604091399050600181016020830160005b868110156124c3576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612462565b5060038606600181146124dd57600281146125275761256d565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83015261256d565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b73ffffffffffffffffffffffffffffffffffffffff83166125e3576125de81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612620565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612620576126208382612923565b73ffffffffffffffffffffffffffffffffffffffff821661264457610a66816129da565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a6657610a668282612afe565b61268b8383612b4f565b6126986000848484612724565b610a66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107ca565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612918576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061279b90339089908890889060040161352c565b602060405180830381600087803b1580156127b557600080fd5b505af1925050508015612803575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261280091810190612f5f565b60015b6128cd573d808015612831576040519150601f19603f3d011682016040523d82523d6000602084013e612836565b606091505b5080516128c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107ca565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611e4d565b506001949350505050565b6000600161293084610f07565b61293a91906135e7565b60008381526007602052604090205490915080821461299a5773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b6008546000906129ec906001906135e7565b60008381526009602052604081205460088054939450909284908110612a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a83577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ae2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b0983610f07565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff8216612bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107ca565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612c58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107ca565b612c646000838361257b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290612c9a90849061357e565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d4157600080fd5b919050565b80358015158114612d4157600080fd5b600060208284031215612d67578081fd5b612d7082612d1d565b9392505050565b60008060408385031215612d89578081fd5b612d9283612d1d565b9150612da060208401612d1d565b90509250929050565b600080600060608486031215612dbd578081fd5b612dc684612d1d565b9250612dd460208501612d1d565b9150604084013590509250925092565b60008060008060808587031215612df9578081fd5b612e0285612d1d565b9350612e1060208601612d1d565b925060408501359150606085013567ffffffffffffffff80821115612e33578283fd5b818701915087601f830112612e46578283fd5b813581811115612e5857612e58613723565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612e9e57612e9e613723565b816040528281528a6020848701011115612eb6578586fd5b82602086016020830137918201602001949094529598949750929550505050565b60008060408385031215612ee9578182fd5b612ef283612d1d565b9150612da060208401612d46565b60008060408385031215612f12578182fd5b612f1b83612d1d565b946020939093013593505050565b600060208284031215612f3a578081fd5b612d7082612d46565b600060208284031215612f54578081fd5b8135612d7081613752565b600060208284031215612f70578081fd5b8151612d7081613752565b600060208284031215612f8c578081fd5b5035919050565b60008151808452612fab8160208601602086016135fe565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151612fef8185602086016135fe565b9290920192915050565b6000835161300b8184602088016135fe565b83519083019061301f8183602088016135fe565b01949350505050565b6000835161303a8184602088016135fe565b83519083019061304e8183602088016135fe565b7f3a000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b600082516130918184602087016135fe565b7f3000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203335302033353060408201527f223e00000000000000000000000000000000000000000000000000000000000060608201527f3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e7460628201527f2d66616d696c793a2073657269663b20666f6e742d73697a653a20363070783b60828201527f207d3c2f7374796c653e0000000000000000000000000000000000000000000060a28201527f3c726563742077696474683d223130302522206865696768743d22313030252260ac8201527f2066696c6c3d22776869746522202f3e0000000000000000000000000000000060cc8201527f3c7465787420783d223530252220793d223530252220646f6d696e616e742d6260dc8201527f6173656c696e653d226d6964646c652220746578742d616e63686f723d226d6960fc8201527f64646c652220636c6173733d2262617365223e0000000000000000000000000061011c8201526000612d7061329961012f840185612fdd565b7f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152600d0190565b7f7b226e616d65223a202254696d652023000000000000000000000000000000008152600084516132fa8160108501602089016135fe565b80830190507f222c0000000000000000000000000000000000000000000000000000000000008060108301527f2274696d65223a202200000000000000000000000000000000000000000000006012830152855161335f81601b850160208a016135fe565b601b92019182018190527f226465736372697074696f6e223a202232342f372069732074696d652067656e601d8301527f65726174656420616e642073746f726564206f6e20636861696e2e2053746174603d8301527f732c20696d616765732c20616e64206f746865722066756e6374696f6e616c69605d8301527f74792061726520696e74656e74696f6e616c6c79206f6d697474656420666f72607d8301527f206f746865727320746f20696e746572707265742e204665656c206672656520609d8301527f746f207573652032342f3720696e20616e792077617920796f752077616e742e60bd83015260dd8201526134dd6134b46134ae60df84017f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617381527f6536342c00000000000000000000000000000000000000000000000000000000602082015260240190565b86612fdd565b7f227d000000000000000000000000000000000000000000000000000000000000815260020190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161351f81601d8501602087016135fe565b91909101601d0192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526134dd6080830184612f93565b602081526000612d706020830184612f93565b60008219821115613591576135916136c5565b500190565b6000826135a5576135a56136f4565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135e2576135e26136c5565b500290565b6000828210156135f9576135f96136c5565b500390565b60005b83811015613619578181015183820152602001613601565b8381111561157a5750506000910152565b600181811c9082168061363e57607f821691505b60208210811415610d4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136aa576136aa6136c5565b5060010190565b6000826136c0576136c06136f4565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611ae457600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212203718be2a210f41f0f89b2201bc2f4d0391d8ab4db719b5d8490e2d967de7639064736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101fe5760003560e01c8063715018a61161011d578063a10954fe116100b0578063c87b56dd1161007f578063f19e75d411610064578063f19e75d4146105ff578063f2fde38b1461061f578063fa93f8831461063f57600080fd5b8063c87b56dd14610589578063e985e9c5146105a957600080fd5b8063a10954fe1461051d578063a22cb46514610533578063a4a5e76314610553578063b88d4fde1461056957600080fd5b80638d859f3e116100ec5780638d859f3e146104ae5780638da5cb5b146104ca57806395d89b41146104f5578063a0712d681461050a57600080fd5b8063715018a614610426578063736278261461043b578063781cd99d146104765780638aa001fc1461048e57600080fd5b80632f745c591161019557806342842e0e1161016457806342842e0e146103a65780634f6ccce7146103c65780636352211e146103e657806370a082311461040657600080fd5b80632f745c591461033a57806332cb6b0c1461035a5780633ccfd60b146103715780633e239e1a1461038657600080fd5b8063095ea7b3116101d1578063095ea7b3146102c157806318160ddd146102e157806323b872dd14610300578063255e46851461032057600080fd5b806301ffc9a71461020357806306fdde03146102385780630715d7041461025a578063081812fc1461027c575b600080fd5b34801561020f57600080fd5b5061022361021e366004612f43565b61065f565b60405190151581526020015b60405180910390f35b34801561024457600080fd5b5061024d6106bb565b60405161022f919061356b565b34801561026657600080fd5b5061027a610275366004612f29565b61074d565b005b34801561028857600080fd5b5061029c610297366004612f7b565b610804565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022f565b3480156102cd57600080fd5b5061027a6102dc366004612f00565b6108de565b3480156102ed57600080fd5b506008545b60405190815260200161022f565b34801561030c57600080fd5b5061027a61031b366004612da9565b610a6b565b34801561032c57600080fd5b50600c546102239060ff1681565b34801561034657600080fd5b506102f2610355366004612f00565b610b0c565b34801561036657600080fd5b506102f26201518081565b34801561037d57600080fd5b5061027a610bdb565b34801561039257600080fd5b506102f26103a1366004612f7b565b610cc5565b3480156103b257600080fd5b5061027a6103c1366004612da9565b610d55565b3480156103d257600080fd5b506102f26103e1366004612f7b565b610d70565b3480156103f257600080fd5b5061029c610401366004612f7b565b610e55565b34801561041257600080fd5b506102f2610421366004612d56565b610f07565b34801561043257600080fd5b5061027a610fd5565b34801561044757600080fd5b5061045b610456366004612f7b565b611062565b6040805193845260208401929092529082015260600161022f565b34801561048257600080fd5b506102f2636138a5c081565b34801561049a57600080fd5b506102f26104a9366004612f7b565b6110fc565b3480156104ba57600080fd5b506102f267016345785d8a000081565b3480156104d657600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff1661029c565b34801561050157600080fd5b5061024d611176565b61027a610518366004612f7b565b611185565b34801561052957600080fd5b506102f2600b5481565b34801561053f57600080fd5b5061027a61054e366004612ed7565b6113c1565b34801561055f57600080fd5b506102f261087081565b34801561057557600080fd5b5061027a610584366004612de4565b6114d8565b34801561059557600080fd5b5061024d6105a4366004612f7b565b611580565b3480156105b557600080fd5b506102236105c4366004612d77565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561060b57600080fd5b5061027a61061a366004612f7b565b61174f565b34801561062b57600080fd5b5061027a61063a366004612d56565b6119b7565b34801561064b57600080fd5b506102f261065a366004612f7b565b611ae7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806106b557506106b582611b62565b92915050565b6060600080546106ca9061362a565b80601f01602080910402602001604051908101604052809291908181526020018280546106f69061362a565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b5050505050905090565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146107d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166108b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107ca565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006108e982610e55565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016107ca565b3373ffffffffffffffffffffffffffffffffffffffff821614806109d057506109d081336105c4565b610a5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107ca565b610a668383611c45565b505050565b610a753382611ce5565b610b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107ca565b610a66838383611e55565b6000610b1783610f07565b8210610ba5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016107ca565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ca565b47610c7c600a5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cc1573d6000803e3d6000fd5b5050565b600081620151808110610d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b6018610d42610e1085613596565b610d4c91906136b1565b91505b50919050565b610a66838383604051806020016040528060008152506114d8565b6000610d7b60085490565b8210610e09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016107ca565b60088281548110610e43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806106b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016107ca565b600073ffffffffffffffffffffffffffffffffffffffff8216610fac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016107ca565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ca565b61106060006120c7565b565b60008080836201518081106110d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b6110dc85610cc5565b6110e586611ae7565b6110ee876110fc565b935093509350509193909250565b60008162015180811061116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b610d4c603c846136b1565b6060600180546106ca9061362a565b600c5460ff166111f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d696e74696e6720686173206e6f74206265656e20616c6c6f7765640000000060448201526064016107ca565b636138a5c042101561125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d696e74696e6720686173206e6f74207374617274656400000000000000000060448201526064016107ca565b806201518081106112cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b6112db610870620151806135e7565b60085410611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5075626c6963206d696e742068617320656e646564000000000000000000000060448201526064016107ca565b67016345785d8a000034146113b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f45746865722073656e7420696e636f727265637400000000000000000000000060448201526064016107ca565b610cc1335b8361213e565b73ffffffffffffffffffffffffffffffffffffffff8216331415611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107ca565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114e23383611ce5565b61156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107ca565b61157a84848484612158565b50505050565b6060600080600061159085611062565b9250925092506060600a8410156115c457806040516020016115b2919061307f565b60405160208183030381529060405290505b806115ce856121fb565b6040516020016115df929190613028565b6040516020818303038152906040529050600a83101561161c578060405160200161160a919061307f565b60405160208183030381529060405290505b80611626846121fb565b604051602001611637929190613028565b6040516020818303038152906040529050600a8210156116745780604051602001611662919061307f565b60405160208183030381529060405290505b8061167e836121fb565b60405160200161168f929190612ff9565b60405160208183030381529060405290506000816040516020016116b391906130c0565b604051602081830303815290604052905060006117026116d2896121fb565b846116dc8561237b565b6040516020016116ee939291906132c2565b60405160208183030381529060405261237b565b90508060405160200161171591906134e7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905298975050505050505050565b600c5460ff166117bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d696e74696e6720686173206e6f74206265656e20616c6c6f7765640000000060448201526064016107ca565b636138a5c0421015611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d696e74696e6720686173206e6f74207374617274656400000000000000000060448201526064016107ca565b80620151808110611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ca565b610870600b5410611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4578636565646564207265736572766520737570706c7900000000000000000060448201526064016107ca565b600b5461199290600161357e565b600b55610cc16113bb600a5473ffffffffffffffffffffffffffffffffffffffff1690565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ca565b73ffffffffffffffffffffffffffffffffffffffff8116611adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107ca565b611ae4816120c7565b50565b600081620151808110611b56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c696420746f6b656e4964000000000000000000000000000000000060448201526064016107ca565b603c610d428185613596565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611bf557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106b557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146106b5565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611c9f82610e55565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16611d96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107ca565b6000611da183610e55565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e1057508373ffffffffffffffffffffffffffffffffffffffff16611df884610804565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e4d575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16611e7582610e55565b73ffffffffffffffffffffffffffffffffffffffff1614611f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016107ca565b73ffffffffffffffffffffffffffffffffffffffff8216611fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107ca565b611fc583838361257b565b611fd0600082611c45565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081208054600192906120069084906135e7565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061204190849061357e565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610cc1828260405180602001604052806000815250612681565b612163848484611e55565b61216f84848484612724565b61157a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107ca565b60608161223b57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612265578061224f81613678565b915061225e9050600a83613596565b915061223f565b60008167ffffffffffffffff8111156122a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122d1576020820181803683370190505b5090505b8415611e4d576122e66001836135e7565b91506122f3600a866136b1565b6122fe90603061357e565b60f81b81838151811061233a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612374600a86613596565b94506122d5565b80516060908061239b575050604080516020810190915260008152919050565b600060036123aa83600261357e565b6123b49190613596565b6123bf9060046135aa565b905060006123ce82602061357e565b67ffffffffffffffff81111561240d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612437576020820181803683370190505b5090506000604051806060016040528060408152602001613781604091399050600181016020830160005b868110156124c3576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612462565b5060038606600181146124dd57600281146125275761256d565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83015261256d565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b73ffffffffffffffffffffffffffffffffffffffff83166125e3576125de81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612620565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612620576126208382612923565b73ffffffffffffffffffffffffffffffffffffffff821661264457610a66816129da565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a6657610a668282612afe565b61268b8383612b4f565b6126986000848484612724565b610a66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107ca565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612918576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061279b90339089908890889060040161352c565b602060405180830381600087803b1580156127b557600080fd5b505af1925050508015612803575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261280091810190612f5f565b60015b6128cd573d808015612831576040519150601f19603f3d011682016040523d82523d6000602084013e612836565b606091505b5080516128c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107ca565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611e4d565b506001949350505050565b6000600161293084610f07565b61293a91906135e7565b60008381526007602052604090205490915080821461299a5773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b6008546000906129ec906001906135e7565b60008381526009602052604081205460088054939450909284908110612a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a83577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ae2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b0983610f07565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff8216612bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107ca565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612c58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107ca565b612c646000838361257b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290612c9a90849061357e565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d4157600080fd5b919050565b80358015158114612d4157600080fd5b600060208284031215612d67578081fd5b612d7082612d1d565b9392505050565b60008060408385031215612d89578081fd5b612d9283612d1d565b9150612da060208401612d1d565b90509250929050565b600080600060608486031215612dbd578081fd5b612dc684612d1d565b9250612dd460208501612d1d565b9150604084013590509250925092565b60008060008060808587031215612df9578081fd5b612e0285612d1d565b9350612e1060208601612d1d565b925060408501359150606085013567ffffffffffffffff80821115612e33578283fd5b818701915087601f830112612e46578283fd5b813581811115612e5857612e58613723565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612e9e57612e9e613723565b816040528281528a6020848701011115612eb6578586fd5b82602086016020830137918201602001949094529598949750929550505050565b60008060408385031215612ee9578182fd5b612ef283612d1d565b9150612da060208401612d46565b60008060408385031215612f12578182fd5b612f1b83612d1d565b946020939093013593505050565b600060208284031215612f3a578081fd5b612d7082612d46565b600060208284031215612f54578081fd5b8135612d7081613752565b600060208284031215612f70578081fd5b8151612d7081613752565b600060208284031215612f8c578081fd5b5035919050565b60008151808452612fab8160208601602086016135fe565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151612fef8185602086016135fe565b9290920192915050565b6000835161300b8184602088016135fe565b83519083019061301f8183602088016135fe565b01949350505050565b6000835161303a8184602088016135fe565b83519083019061304e8183602088016135fe565b7f3a000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b600082516130918184602087016135fe565b7f3000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203335302033353060408201527f223e00000000000000000000000000000000000000000000000000000000000060608201527f3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e7460628201527f2d66616d696c793a2073657269663b20666f6e742d73697a653a20363070783b60828201527f207d3c2f7374796c653e0000000000000000000000000000000000000000000060a28201527f3c726563742077696474683d223130302522206865696768743d22313030252260ac8201527f2066696c6c3d22776869746522202f3e0000000000000000000000000000000060cc8201527f3c7465787420783d223530252220793d223530252220646f6d696e616e742d6260dc8201527f6173656c696e653d226d6964646c652220746578742d616e63686f723d226d6960fc8201527f64646c652220636c6173733d2262617365223e0000000000000000000000000061011c8201526000612d7061329961012f840185612fdd565b7f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152600d0190565b7f7b226e616d65223a202254696d652023000000000000000000000000000000008152600084516132fa8160108501602089016135fe565b80830190507f222c0000000000000000000000000000000000000000000000000000000000008060108301527f2274696d65223a202200000000000000000000000000000000000000000000006012830152855161335f81601b850160208a016135fe565b601b92019182018190527f226465736372697074696f6e223a202232342f372069732074696d652067656e601d8301527f65726174656420616e642073746f726564206f6e20636861696e2e2053746174603d8301527f732c20696d616765732c20616e64206f746865722066756e6374696f6e616c69605d8301527f74792061726520696e74656e74696f6e616c6c79206f6d697474656420666f72607d8301527f206f746865727320746f20696e746572707265742e204665656c206672656520609d8301527f746f207573652032342f3720696e20616e792077617920796f752077616e742e60bd83015260dd8201526134dd6134b46134ae60df84017f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617381527f6536342c00000000000000000000000000000000000000000000000000000000602082015260240190565b86612fdd565b7f227d000000000000000000000000000000000000000000000000000000000000815260020190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161351f81601d8501602087016135fe565b91909101601d0192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526134dd6080830184612f93565b602081526000612d706020830184612f93565b60008219821115613591576135916136c5565b500190565b6000826135a5576135a56136f4565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135e2576135e26136c5565b500290565b6000828210156135f9576135f96136c5565b500390565b60005b83811015613619578181015183820152602001613601565b8381111561157a5750506000910152565b600181811c9082168061363e57607f821691505b60208210811415610d4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136aa576136aa6136c5565b5060010190565b6000826136c0576136c06136f4565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611ae457600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212203718be2a210f41f0f89b2201bc2f4d0391d8ab4db719b5d8490e2d967de7639064736f6c63430008040033

Deployed Bytecode Sourcemap

43167:5844:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34667:224;;;;;;;;;;-1:-1:-1;34667:224:0;;;;;:::i;:::-;;:::i;:::-;;;11796:14:1;;11789:22;11771:41;;11759:2;11744:18;34667:224:0;;;;;;;;21572:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47042:99::-;;;;;;;;;;-1:-1:-1;47042:99:0;;;;;:::i;:::-;;:::i;:::-;;23131:221;;;;;;;;;;-1:-1:-1;23131:221:0;;;;;:::i;:::-;;:::i;:::-;;;11060:42:1;11048:55;;;11030:74;;11018:2;11003:18;23131:221:0;10985:125:1;22654:411:0;;;;;;;;;;-1:-1:-1;22654:411:0;;;;;:::i;:::-;;:::i;35307:113::-;;;;;;;;;;-1:-1:-1;35395:10:0;:17;35307:113;;;21088:25:1;;;21076:2;21061:18;35307:113:0;21043:76:1;24021:339:0;;;;;;;;;;-1:-1:-1;24021:339:0;;;;;:::i;:::-;;:::i;43477:21::-;;;;;;;;;;-1:-1:-1;43477:21:0;;;;;;;;34975:256;;;;;;;;;;-1:-1:-1;34975:256:0;;;;;:::i;:::-;;:::i;43229:42::-;;;;;;;;;;;;43266:5;43229:42;;47149:131;;;;;;;;;;;;;:::i;43896:133::-;;;;;;;;;;-1:-1:-1;43896:133:0;;;;;:::i;:::-;;:::i;24431:185::-;;;;;;;;;;-1:-1:-1;24431:185:0;;;;;:::i;:::-;;:::i;35497:233::-;;;;;;;;;;-1:-1:-1;35497:233:0;;;;;:::i;:::-;;:::i;21266:239::-;;;;;;;;;;-1:-1:-1;21266:239:0;;;;;:::i;:::-;;:::i;20996:208::-;;;;;;;;;;-1:-1:-1;20996:208:0;;;;;:::i;:::-;;:::i;42462:94::-;;;;;;;;;;;;;:::i;44312:188::-;;;;;;;;;;-1:-1:-1;44312:188:0;;;;;:::i;:::-;;:::i;:::-;;;;21326:25:1;;;21382:2;21367:18;;21360:34;;;;21410:18;;;21403:34;21314:2;21299:18;44312:188:0;21281:162:1;43334:52:0;;;;;;;;;;;;43376:10;43334:52;;44178:126;;;;;;;;;;-1:-1:-1;44178:126:0;;;;;:::i;:::-;;:::i;43393:41::-;;;;;;;;;;;;43425:9;43393:41;;41811:87;;;;;;;;;;-1:-1:-1;41884:6:0;;;;41811:87;;21741:104;;;;;;;;;;;;;:::i;46470:290::-;;;;;;:::i;:::-;;:::i;43441:29::-;;;;;;;;;;;;;;;;23424:295;;;;;;;;;;-1:-1:-1;23424:295:0;;;;;:::i;:::-;;:::i;43278:49::-;;;;;;;;;;;;43323:4;43278:49;;24687:328;;;;;;;;;;-1:-1:-1;24687:328:0;;;;;:::i;:::-;;:::i;44508:1954::-;;;;;;;;;;-1:-1:-1;44508:1954:0;;;;;:::i;:::-;;:::i;23790:164::-;;;;;;;;;;-1:-1:-1;23790:164:0;;;;;:::i;:::-;23911:25;;;;23887:4;23911:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23790:164;46768:266;;;;;;;;;;-1:-1:-1;46768:266:0;;;;;:::i;:::-;;:::i;42711:192::-;;;;;;;;;;-1:-1:-1;42711:192:0;;;;;:::i;:::-;;:::i;44037:133::-;;;;;;;;;;-1:-1:-1;44037:133:0;;;;;:::i;:::-;;:::i;34667:224::-;34769:4;34793:50;;;34808:35;34793:50;;:90;;;34847:36;34871:11;34847:23;:36::i;:::-;34786:97;34667:224;-1:-1:-1;;34667:224:0:o;21572:100::-;21626:13;21659:5;21652:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21572:100;:::o;47042:99::-;41884:6;;42031:23;41884:6;16135:10;42031:23;42023:68;;;;;;;18788:2:1;42023:68:0;;;18770:21:1;;;18807:18;;;18800:30;18866:34;18846:18;;;18839:62;18918:18;;42023:68:0;;;;;;;;;47111:9:::1;:22:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;47042:99::o;23131:221::-;23207:7;26614:16;;;:7;:16;;;;;;:30;:16;23227:73;;;;;;;18375:2:1;23227:73:0;;;18357:21:1;18414:2;18394:18;;;18387:30;18453:34;18433:18;;;18426:62;18524:14;18504:18;;;18497:42;18556:19;;23227:73:0;18347:234:1;23227:73:0;-1:-1:-1;23320:24:0;;;;:15;:24;;;;;;;;;23131:221::o;22654:411::-;22735:13;22751:23;22766:7;22751:14;:23::i;:::-;22735:39;;22799:5;22793:11;;:2;:11;;;;22785:57;;;;;;;19559:2:1;22785:57:0;;;19541:21:1;19598:2;19578:18;;;19571:30;19637:34;19617:18;;;19610:62;19708:3;19688:18;;;19681:31;19729:19;;22785:57:0;19531:223:1;22785:57:0;16135:10;22877:21;;;;;:62;;-1:-1:-1;22902:37:0;22919:5;16135:10;23790:164;:::i;22902:37::-;22855:168;;;;;;;16416:2:1;22855:168:0;;;16398:21:1;16455:2;16435:18;;;16428:30;16494:34;16474:18;;;16467:62;16565:26;16545:18;;;16538:54;16609:19;;22855:168:0;16388:246:1;22855:168:0;23036:21;23045:2;23049:7;23036:8;:21::i;:::-;22654:411;;;:::o;24021:339::-;24216:41;16135:10;24249:7;24216:18;:41::i;:::-;24208:103;;;;;;;19961:2:1;24208:103:0;;;19943:21:1;20000:2;19980:18;;;19973:30;20039:34;20019:18;;;20012:62;20110:19;20090:18;;;20083:47;20147:19;;24208:103:0;19933:239:1;24208:103:0;24324:28;24334:4;24340:2;24344:7;24324:9;:28::i;34975:256::-;35072:7;35108:23;35125:5;35108:16;:23::i;:::-;35100:5;:31;35092:87;;;;;;;12598:2:1;35092:87:0;;;12580:21:1;12637:2;12617:18;;;12610:30;12676:34;12656:18;;;12649:62;12747:13;12727:18;;;12720:41;12778:19;;35092:87:0;12570:233:1;35092:87:0;-1:-1:-1;35197:19:0;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34975:256::o;47149:131::-;41884:6;;42031:23;41884:6;16135:10;42031:23;42023:68;;;;;;;18788:2:1;42023:68:0;;;18770:21:1;;;18807:18;;;18800:30;18866:34;18846:18;;;18839:62;18918:18;;42023:68:0;18760:182:1;42023:68:0;47210:21:::1;47250:7;41884:6:::0;;;;;41811:87;47250:7:::1;47242:25;;:30;47268:3;47242:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42102:1;47149:131::o:0;43896:133::-;43973:7;43955;43266:5;43828:7;:20;43804:64;;;;;;;15309:2:1;43804:64:0;;;15291:21:1;15348:2;15328:18;;;15321:30;15387:17;15367:18;;;15360:45;15422:18;;43804:64:0;15281:165:1;43804:64:0;44019:2:::1;44001:14;44011:4;44001:7:::0;:14:::1;:::i;:::-;44000:21;;;;:::i;:::-;43993:28;;43879:1;43896:133:::0;;;;:::o;24431:185::-;24569:39;24586:4;24592:2;24596:7;24569:39;;;;;;;;;;;;:16;:39::i;35497:233::-;35572:7;35608:30;35395:10;:17;;35307:113;35608:30;35600:5;:38;35592:95;;;;;;;20379:2:1;35592:95:0;;;20361:21:1;20418:2;20398:18;;;20391:30;20457:34;20437:18;;;20430:62;20528:14;20508:18;;;20501:42;20560:19;;35592:95:0;20351:234:1;35592:95:0;35705:10;35716:5;35705:17;;;;;;;;;;;;;;;;;;;;;;;;35698:24;;35497:233;;;:::o;21266:239::-;21338:7;21374:16;;;:7;:16;;;;;;;;21409:19;21401:73;;;;;;;17252:2:1;21401:73:0;;;17234:21:1;17291:2;17271:18;;;17264:30;17330:34;17310:18;;;17303:62;17401:11;17381:18;;;17374:39;17430:19;;21401:73:0;17224:231:1;20996:208:0;21068:7;21096:19;;;21088:74;;;;;;;16841:2:1;21088:74:0;;;16823:21:1;16880:2;16860:18;;;16853:30;16919:34;16899:18;;;16892:62;16990:12;16970:18;;;16963:40;17020:19;;21088:74:0;16813:232:1;21088:74:0;-1:-1:-1;21180:16:0;;;;;;:9;:16;;;;;;;20996:208::o;42462:94::-;41884:6;;42031:23;41884:6;16135:10;42031:23;42023:68;;;;;;;18788:2:1;42023:68:0;;;18770:21:1;;;18807:18;;;18800:30;18866:34;18846:18;;;18839:62;18918:18;;42023:68:0;18760:182:1;42023:68:0;42527:21:::1;42545:1;42527:9;:21::i;:::-;42462:94::o:0;44312:188::-;44389:7;;;44371;43266:5;43828:7;:20;43804:64;;;;;;;15309:2:1;43804:64:0;;;15291:21:1;15348:2;15328:18;;;15321:30;15387:17;15367:18;;;15360:45;15422:18;;43804:64:0;15281:165:1;43804:64:0;44435:16:::1;44443:7;44435;:16::i;:::-;44453:18;44463:7;44453:9;:18::i;:::-;44473;44483:7;44473:9;:18::i;:::-;44427:65;;;;;;44312:188:::0;;;;;;:::o;44178:126::-;44257:7;44239;43266:5;43828:7;:20;43804:64;;;;;;;15309:2:1;43804:64:0;;;15291:21:1;15348:2;15328:18;;;15321:30;15387:17;15367:18;;;15360:45;15422:18;;43804:64:0;15281:165:1;43804:64:0;44284:12:::1;44294:2;44284:7:::0;:12:::1;:::i;21741:104::-:0;21797:13;21830:7;21823:14;;;;;:::i;46470:290::-;43603:9;;;;43595:50;;;;;;;14193:2:1;43595:50:0;;;14175:21:1;14232:2;14212:18;;;14205:30;14271;14251:18;;;14244:58;14319:18;;43595:50:0;14165:178:1;43595:50:0;43376:10;43664:15;:34;;43656:70;;;;;;;20792:2:1;43656:70:0;;;20774:21:1;20831:2;20811:18;;;20804:30;20870:25;20850:18;;;20843:53;20913:18;;43656:70:0;20764:173:1;43656:70:0;46546:7;43266:5:::1;43828:7;:20;43804:64;;;::::0;::::1;::::0;;15309:2:1;43804:64:0::1;::::0;::::1;15291:21:1::0;15348:2;15328:18;;;15321:30;15387:17;15367:18;;;15360:45;15422:18;;43804:64:0::1;15281:165:1::0;43804:64:0::1;46590:31:::2;43323:4;43266:5;46590:31;:::i;:::-;35395:10:::0;:17;46574:47:::2;46566:81;;;::::0;::::2;::::0;;16066:2:1;46566:81:0::2;::::0;::::2;16048:21:1::0;16105:2;16085:18;;;16078:30;16144:23;16124:18;;;16117:51;16185:18;;46566:81:0::2;16038:171:1::0;46566:81:0::2;43425:9;46666;:18;46658:51;;;::::0;::::2;::::0;;12249:2:1;46658:51:0::2;::::0;::::2;12231:21:1::0;12288:2;12268:18;;;12261:30;12327:22;12307:18;;;12300:50;12367:18;;46658:51:0::2;12221:170:1::0;46658:51:0::2;46720:32;16135:10:::0;46730:12:::2;46744:7;46720:9;:32::i;23424:295::-:0;23527:24;;;16135:10;23527:24;;23519:62;;;;;;;14955:2:1;23519:62:0;;;14937:21:1;14994:2;14974:18;;;14967:30;15033:27;15013:18;;;15006:55;15078:18;;23519:62:0;14927:175:1;23519:62:0;16135:10;23594:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;23663:48;;11771:41:1;;;23594:42:0;;16135:10;23663:48;;11744:18:1;23663:48:0;;;;;;;23424:295;;:::o;24687:328::-;24862:41;16135:10;24895:7;24862:18;:41::i;:::-;24854:103;;;;;;;19961:2:1;24854:103:0;;;19943:21:1;20000:2;19980:18;;;19973:30;20039:34;20019:18;;;20012:62;20110:19;20090:18;;;20083:47;20147:19;;24854:103:0;19933:239:1;24854:103:0;24968:39;24982:4;24988:2;24992:7;25001:5;24968:13;:39::i;:::-;24687:328;;;;:::o;44508:1954::-;44573:13;44600;44615:15;44632;44651:16;44659:7;44651;:16::i;:::-;44599:68;;;;;;44678:23;44726:2;44718:5;:10;44714:95;;;44781:9;44764:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;44745:52;;44714:95;44855:9;44866:23;44883:5;44866:16;:23::i;:::-;44838:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44819:77;;44923:2;44913:7;:12;44909:97;;;44978:9;44961:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;44942:52;;44909:97;45052:9;45063:25;45080:7;45063:16;:25::i;:::-;45035:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45016:79;;45122:2;45112:7;:12;45108:97;;;45177:9;45160:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;45141:52;;45108:97;45251:9;45262:25;45279:7;45262:16;:25::i;:::-;45234:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45215:74;;45302:20;45756:9;45332:474;;;;;;;;:::i;:::-;;;;;;;;;;;;;45302:505;;45818:18;45839:506;45919:25;45936:7;45919:16;:25::i;:::-;45982:9;46284:27;46303:6;46284:12;:27::i;:::-;45865:477;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45839:12;:506::i;:::-;45818:527;;46422:4;46372:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;44508:1954;-1:-1:-1;;;;;;;;44508:1954:0:o;46768:266::-;43603:9;;;;43595:50;;;;;;;14193:2:1;43595:50:0;;;14175:21:1;14232:2;14212:18;;;14205:30;14271;14251:18;;;14244:58;14319:18;;43595:50:0;14165:178:1;43595:50:0;43376:10;43664:15;:34;;43656:70;;;;;;;20792:2:1;43656:70:0;;;20774:21:1;20831:2;20811:18;;;20804:30;20870:25;20850:18;;;20843:53;20913:18;;43656:70:0;20764:173:1;43656:70:0;46841:7;43266:5:::1;43828:7;:20;43804:64;;;::::0;::::1;::::0;;15309:2:1;43804:64:0::1;::::0;::::1;15291:21:1::0;15348:2;15328:18;;;15321:30;15387:17;15367:18;;;15360:45;15422:18;;43804:64:0::1;15281:165:1::0;43804:64:0::1;41884:6:::0;;42031:23:::2;41884:6:::0;16135:10;42031:23:::2;42023:68;;;::::0;::::2;::::0;;18788:2:1;42023:68:0::2;::::0;::::2;18770:21:1::0;;;18807:18;;;18800:30;18866:34;18846:18;;;18839:62;18918:18;;42023:68:0::2;18760:182:1::0;42023:68:0::2;43323:4:::3;46879:14;;:35;46871:71;;;::::0;::::3;::::0;;17662:2:1;46871:71:0::3;::::0;::::3;17644:21:1::0;17701:2;17681:18;;;17674:30;17740:25;17720:18;;;17713:53;17783:18;;46871:71:0::3;17634:173:1::0;46871:71:0::3;46970:14;::::0;:18:::3;::::0;46987:1:::3;46970:18;:::i;:::-;46953:14;:35:::0;46999:27:::3;47009:7;41884:6:::0;;;;;41811:87;42711:192;41884:6;;42031:23;41884:6;16135:10;42031:23;42023:68;;;;;;;18788:2:1;42023:68:0;;;18770:21:1;;;18807:18;;;18800:30;18866:34;18846:18;;;18839:62;18918:18;;42023:68:0;18760:182:1;42023:68:0;42800:22:::1;::::0;::::1;42792:73;;;::::0;::::1;::::0;;13429:2:1;42792:73:0::1;::::0;::::1;13411:21:1::0;13468:2;13448:18;;;13441:30;13507:34;13487:18;;;13480:62;13578:8;13558:18;;;13551:36;13604:19;;42792:73:0::1;13401:228:1::0;42792:73:0::1;42876:19;42886:8;42876:9;:19::i;:::-;42711:192:::0;:::o;44037:133::-;44116:7;44098;43266:5;43828:7;:20;43804:64;;;;;;;15309:2:1;43804:64:0;;;15291:21:1;15348:2;15328:18;;;15321:30;15387:17;15367:18;;;15360:45;15422:18;;43804:64:0;15281:165:1;43804:64:0;44160:2:::1;44144:12;44160:2:::0;44144:7;:12:::1;:::i;20627:305::-:0;20729:4;20766:40;;;20781:25;20766:40;;:105;;-1:-1:-1;20823:48:0;;;20838:33;20823:48;20766:105;:158;;;-1:-1:-1;19257:25:0;19242:40;;;;20888:36;19133:157;30507:174;30582:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;30636:23;30582:24;30636:14;:23::i;:::-;30627:46;;;;;;;;;;;;30507:174;;:::o;26819:348::-;26912:4;26614:16;;;:7;:16;;;;;;:30;:16;26929:73;;;;;;;15653:2:1;26929:73:0;;;15635:21:1;15692:2;15672:18;;;15665:30;15731:34;15711:18;;;15704:62;15802:14;15782:18;;;15775:42;15834:19;;26929:73:0;15625:234:1;26929:73:0;27013:13;27029:23;27044:7;27029:14;:23::i;:::-;27013:39;;27082:5;27071:16;;:7;:16;;;:51;;;;27115:7;27091:31;;:20;27103:7;27091:11;:20::i;:::-;:31;;;27071:51;:87;;;-1:-1:-1;23911:25:0;;;;23887:4;23911:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27126:32;27063:96;26819:348;-1:-1:-1;;;;26819:348:0:o;29811:578::-;29970:4;29943:31;;:23;29958:7;29943:14;:23::i;:::-;:31;;;29935:85;;;;;;;19149:2:1;29935:85:0;;;19131:21:1;19188:2;19168:18;;;19161:30;19227:34;19207:18;;;19200:62;19298:11;19278:18;;;19271:39;19327:19;;29935:85:0;19121:231:1;29935:85:0;30039:16;;;30031:65;;;;;;;14550:2:1;30031:65:0;;;14532:21:1;14589:2;14569:18;;;14562:30;14628:34;14608:18;;;14601:62;14699:6;14679:18;;;14672:34;14723:19;;30031:65:0;14522:226:1;30031:65:0;30109:39;30130:4;30136:2;30140:7;30109:20;:39::i;:::-;30213:29;30230:1;30234:7;30213:8;:29::i;:::-;30255:15;;;;;;;:9;:15;;;;;:20;;30274:1;;30255:15;:20;;30274:1;;30255:20;:::i;:::-;;;;-1:-1:-1;;30286:13:0;;;;;;;:9;:13;;;;;:18;;30303:1;;30286:13;:18;;30303:1;;30286:18;:::i;:::-;;;;-1:-1:-1;;30315:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;30354:27;;30315:16;;30354:27;;;;;;;29811:578;;;:::o;42911:173::-;42986:6;;;;43003:17;;;;;;;;;;;43036:40;;42986:6;;;43003:17;42986:6;;43036:40;;42967:16;;43036:40;42911:173;;:::o;27509:110::-;27585:26;27595:2;27599:7;27585:26;;;;;;;;;;;;:9;:26::i;25897:315::-;26054:28;26064:4;26070:2;26074:7;26054:9;:28::i;:::-;26101:48;26124:4;26130:2;26134:7;26143:5;26101:22;:48::i;:::-;26093:111;;;;;;;13010:2:1;26093:111:0;;;12992:21:1;13049:2;13029:18;;;13022:30;13088:34;13068:18;;;13061:62;13159:20;13139:18;;;13132:48;13197:19;;26093:111:0;12982:240:1;16578:723:0;16634:13;16855:10;16851:53;;-1:-1:-1;;16882:10:0;;;;;;;;;;;;;;;;;;16578:723::o;16851:53::-;16929:5;16914:12;16970:78;16977:9;;16970:78;;17003:8;;;;:::i;:::-;;-1:-1:-1;17026:10:0;;-1:-1:-1;17034:2:0;17026:10;;:::i;:::-;;;16970:78;;;17058:19;17090:6;17080:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17080:17:0;;17058:39;;17108:154;17115:10;;17108:154;;17142:11;17152:1;17142:11;;:::i;:::-;;-1:-1:-1;17211:10:0;17219:2;17211:5;:10;:::i;:::-;17198:24;;:2;:24;:::i;:::-;17185:39;;17168:6;17175;17168:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;17239:11:0;17248:2;17239:11;;:::i;:::-;;;17108:154;;47395:1613;47499:11;;47459:13;;47525:8;47521:23;;-1:-1:-1;;47535:9:0;;;;;;;;;-1:-1:-1;47535:9:0;;;47395:1613;-1:-1:-1;47395:1613:0:o;47521:23::-;47596:18;47634:1;47623:7;:3;47629:1;47623:7;:::i;:::-;47622:13;;;;:::i;:::-;47617:19;;:1;:19;:::i;:::-;47596:40;-1:-1:-1;47694:19:0;47726:15;47596:40;47739:2;47726:15;:::i;:::-;47716:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47716:26:0;;47694:48;;47755:18;47776:5;;;;;;;;;;;;;;;;;47755:26;;47845:1;47838:5;47834:13;47890:2;47882:6;47878:15;47941:1;47909:777;47964:3;47961:1;47958:10;47909:777;;;48019:1;48062:12;;;;;48056:19;48157:4;48145:2;48141:14;;;;;48123:40;;48117:47;48266:2;48262:14;;;48258:25;;48244:40;;48238:47;48395:1;48391:13;;;48387:24;;48373:39;;48367:46;48515:16;;;;48501:31;;48495:38;48193:1;48189:11;;;48287:4;48234:58;;;48225:68;48318:11;;48363:57;;;48354:67;;;;48446:11;;48491:49;;48482:59;48570:3;48566:13;48599:22;;48669:1;48654:17;;;;48012:9;47909:777;;;47913:44;48718:1;48713:3;48709:11;48739:1;48734:84;;;;48837:1;48832:82;;;;48702:212;;48734:84;48786:16;48767:17;;;48760:43;48734:84;;48832:82;48884:14;48865:17;;;48858:41;48702:212;-1:-1:-1;;;48930:26:0;;;48937:6;47395:1613;-1:-1:-1;;;;47395:1613:0:o;36343:589::-;36549:18;;;36545:187;;36584:40;36616:7;37759:10;:17;;37732:24;;;;:15;:24;;;;;:44;;;37787:24;;;;;;;;;;;;37655:164;36584:40;36545:187;;;36654:2;36646:10;;:4;:10;;;36642:90;;36673:47;36706:4;36712:7;36673:32;:47::i;:::-;36746:16;;;36742:183;;36779:45;36816:7;36779:36;:45::i;36742:183::-;36852:4;36846:10;;:2;:10;;;36842:83;;36873:40;36901:2;36905:7;36873:27;:40::i;27846:321::-;27976:18;27982:2;27986:7;27976:5;:18::i;:::-;28027:54;28058:1;28062:2;28066:7;28075:5;28027:22;:54::i;:::-;28005:154;;;;;;;13010:2:1;28005:154:0;;;12992:21:1;13049:2;13029:18;;;13022:30;13088:34;13068:18;;;13061:62;13159:20;13139:18;;;13132:48;13197:19;;28005:154:0;12982:240:1;31246:799:0;31401:4;31422:13;;;8424:20;8472:8;31418:620;;31458:72;;;;;:36;;;;;;:72;;16135:10;;31509:4;;31515:7;;31524:5;;31458:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31458:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31454:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31700:13:0;;31696:272;;31743:60;;;;;13010:2:1;31743:60:0;;;12992:21:1;13049:2;13029:18;;;13022:30;13088:34;13068:18;;;13061:62;13159:20;13139:18;;;13132:48;13197:19;;31743:60:0;12982:240:1;31696:272:0;31918:6;31912:13;31903:6;31899:2;31895:15;31888:38;31454:529;31581:51;;31591:41;31581:51;;-1:-1:-1;31574:58:0;;31418:620;-1:-1:-1;32022:4:0;31246:799;;;;;;:::o;38446:988::-;38712:22;38762:1;38737:22;38754:4;38737:16;:22::i;:::-;:26;;;;:::i;:::-;38774:18;38795:26;;;:17;:26;;;;;;38712:51;;-1:-1:-1;38928:28:0;;;38924:328;;38995:18;;;38973:19;38995:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39046:30;;;;;;:44;;;39163:30;;:17;:30;;;;;:43;;;38924:328;-1:-1:-1;39348:26:0;;;;:17;:26;;;;;;;;39341:33;;;39392:18;;;;;;:12;:18;;;;;:34;;;;;;;39385:41;38446:988::o;39729:1079::-;40007:10;:17;39982:22;;40007:21;;40027:1;;40007:21;:::i;:::-;40039:18;40060:24;;;:15;:24;;;;;;40433:10;:26;;39982:46;;-1:-1:-1;40060:24:0;;39982:46;;40433:26;;;;;;;;;;;;;;;;;;;;;;40411:48;;40497:11;40472:10;40483;40472:22;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40577:28;;;:15;:28;;;;;;;:41;;;40749:24;;;;;40742:31;40784:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39729:1079;;;;:::o;37233:221::-;37318:14;37335:20;37352:2;37335:16;:20::i;:::-;37366:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37411:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37233:221:0:o;28503:382::-;28583:16;;;28575:61;;;;;;;18014:2:1;28575:61:0;;;17996:21:1;;;18033:18;;;18026:30;18092:34;18072:18;;;18065:62;18144:18;;28575:61:0;17986:182:1;28575:61:0;26590:4;26614:16;;;:7;:16;;;;;;:30;:16;:30;28647:58;;;;;;;13836:2:1;28647:58:0;;;13818:21:1;13875:2;13855:18;;;13848:30;13914;13894:18;;;13887:58;13962:18;;28647:58:0;13808:178:1;28647:58:0;28718:45;28747:1;28751:2;28755:7;28718:20;:45::i;:::-;28776:13;;;;;;;:9;:13;;;;;:18;;28793:1;;28776:13;:18;;28793:1;;28776:18;:::i;:::-;;;;-1:-1:-1;;28805:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;28844:33;;28805:16;;;28844:33;;28805:16;;28844:33;28503:382;;:::o;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:2;;200:1;197;190:12;111:2;63:147;;;:::o;215:160::-;280:20;;336:13;;329:21;319:32;;309:2;;365:1;362;355:12;380:196;439:6;492:2;480:9;471:7;467:23;463:32;460:2;;;513:6;505;498:22;460:2;541:29;560:9;541:29;:::i;:::-;531:39;450:126;-1:-1:-1;;;450:126:1:o;581:270::-;649:6;657;710:2;698:9;689:7;685:23;681:32;678:2;;;731:6;723;716:22;678:2;759:29;778:9;759:29;:::i;:::-;749:39;;807:38;841:2;830:9;826:18;807:38;:::i;:::-;797:48;;668:183;;;;;:::o;856:338::-;933:6;941;949;1002:2;990:9;981:7;977:23;973:32;970:2;;;1023:6;1015;1008:22;970:2;1051:29;1070:9;1051:29;:::i;:::-;1041:39;;1099:38;1133:2;1122:9;1118:18;1099:38;:::i;:::-;1089:48;;1184:2;1173:9;1169:18;1156:32;1146:42;;960:234;;;;;:::o;1199:1242::-;1294:6;1302;1310;1318;1371:3;1359:9;1350:7;1346:23;1342:33;1339:2;;;1393:6;1385;1378:22;1339:2;1421:29;1440:9;1421:29;:::i;:::-;1411:39;;1469:38;1503:2;1492:9;1488:18;1469:38;:::i;:::-;1459:48;;1554:2;1543:9;1539:18;1526:32;1516:42;;1609:2;1598:9;1594:18;1581:32;1632:18;1673:2;1665:6;1662:14;1659:2;;;1694:6;1686;1679:22;1659:2;1737:6;1726:9;1722:22;1712:32;;1782:7;1775:4;1771:2;1767:13;1763:27;1753:2;;1809:6;1801;1794:22;1753:2;1850;1837:16;1872:2;1868;1865:10;1862:2;;;1878:18;;:::i;:::-;2012:2;2006:9;2074:4;2066:13;;1917:66;2062:22;;;2086:2;2058:31;2054:40;2042:53;;;2110:18;;;2130:22;;;2107:46;2104:2;;;2156:18;;:::i;:::-;2196:10;2192:2;2185:22;2231:2;2223:6;2216:18;2271:7;2266:2;2261;2257;2253:11;2249:20;2246:33;2243:2;;;2297:6;2289;2282:22;2243:2;2358;2353;2349;2345:11;2340:2;2332:6;2328:15;2315:46;2381:15;;;2398:2;2377:24;2370:40;;;;1329:1112;;;;-1:-1:-1;1329:1112:1;;-1:-1:-1;;;;1329:1112:1:o;2446:264::-;2511:6;2519;2572:2;2560:9;2551:7;2547:23;2543:32;2540:2;;;2593:6;2585;2578:22;2540:2;2621:29;2640:9;2621:29;:::i;:::-;2611:39;;2669:35;2700:2;2689:9;2685:18;2669:35;:::i;2715:264::-;2783:6;2791;2844:2;2832:9;2823:7;2819:23;2815:32;2812:2;;;2865:6;2857;2850:22;2812:2;2893:29;2912:9;2893:29;:::i;:::-;2883:39;2969:2;2954:18;;;;2941:32;;-1:-1:-1;;;2802:177:1:o;2984:190::-;3040:6;3093:2;3081:9;3072:7;3068:23;3064:32;3061:2;;;3114:6;3106;3099:22;3061:2;3142:26;3158:9;3142:26;:::i;3179:255::-;3237:6;3290:2;3278:9;3269:7;3265:23;3261:32;3258:2;;;3311:6;3303;3296:22;3258:2;3355:9;3342:23;3374:30;3398:5;3374:30;:::i;3439:259::-;3508:6;3561:2;3549:9;3540:7;3536:23;3532:32;3529:2;;;3582:6;3574;3567:22;3529:2;3619:9;3613:16;3638:30;3662:5;3638:30;:::i;3703:190::-;3762:6;3815:2;3803:9;3794:7;3790:23;3786:32;3783:2;;;3836:6;3828;3821:22;3783:2;-1:-1:-1;3864:23:1;;3773:120;-1:-1:-1;3773:120:1:o;3898:316::-;3939:3;3977:5;3971:12;4004:6;3999:3;3992:19;4020:63;4076:6;4069:4;4064:3;4060:14;4053:4;4046:5;4042:16;4020:63;:::i;:::-;4128:2;4116:15;4133:66;4112:88;4103:98;;;;4203:4;4099:109;;3947:267;-1:-1:-1;;3947:267:1:o;4219:185::-;4261:3;4299:5;4293:12;4314:52;4359:6;4354:3;4347:4;4340:5;4336:16;4314:52;:::i;:::-;4382:16;;;;;4269:135;-1:-1:-1;;4269:135:1:o;4943:470::-;5122:3;5160:6;5154:13;5176:53;5222:6;5217:3;5210:4;5202:6;5198:17;5176:53;:::i;:::-;5292:13;;5251:16;;;;5314:57;5292:13;5251:16;5348:4;5336:17;;5314:57;:::i;:::-;5387:20;;5130:283;-1:-1:-1;;;;5130:283:1:o;5418:633::-;5698:3;5736:6;5730:13;5752:53;5798:6;5793:3;5786:4;5778:6;5774:17;5752:53;:::i;:::-;5868:13;;5827:16;;;;5890:57;5868:13;5827:16;5924:4;5912:17;;5890:57;:::i;:::-;6012:3;5969:20;;5998:18;;;6043:1;6032:13;;5706:345;-1:-1:-1;;;;5706:345:1:o;6056:439::-;6288:3;6326:6;6320:13;6342:53;6388:6;6383:3;6376:4;6368:6;6364:17;6342:53;:::i;:::-;6456:3;6417:16;;6442:18;;;-1:-1:-1;6487:1:1;6476:13;;6296:199;-1:-1:-1;6296:199:1:o;6500:1782::-;7166:66;7161:3;7154:79;7263:66;7258:2;7253:3;7249:12;7242:88;7360:66;7355:2;7350:3;7346:12;7339:88;7457:66;7452:2;7447:3;7443:12;7436:88;7554:34;7549:2;7544:3;7540:12;7533:56;7620:34;7614:3;7609;7605:13;7598:57;7686:12;7680:3;7675;7671:13;7664:35;7730:66;7724:3;7719;7715:13;7708:89;7828:66;7822:3;7817;7813:13;7806:89;7926:66;7920:3;7915;7911:13;7904:89;8024:66;8018:3;8013;8009:13;8002:89;8122:66;8116:3;8111;8107:13;8100:89;7136:3;8205:71;8235:40;8270:3;8265;8261:13;8253:6;8235:40;:::i;:::-;4486:15;4474:28;;4527:2;4518:12;;4464:72;8287:2139;9251:66;9246:3;9239:79;9221:3;9347:6;9341:13;9363:62;9418:6;9413:2;9408:3;9404:12;9397:4;9389:6;9385:17;9363:62;:::i;:::-;9453:6;9448:3;9444:16;9434:26;;9479:66;9574:2;9569;9565;9561:11;9554:23;9606:66;9601:2;9597;9593:11;9586:87;9704:6;9698:13;9720:63;9774:8;9769:2;9765;9761:11;9754:4;9746:6;9742:17;9720:63;:::i;:::-;9843:2;9802:17;;9835:11;;;9828:23;;;9880:66;9875:2;9867:11;;9860:87;9976:34;9971:2;9963:11;;9956:55;10040:34;10035:2;10027:11;;10020:55;10105:34;10099:3;10091:12;;10084:56;10170:34;10164:3;10156:12;;10149:56;10235:34;10229:3;10221:12;;10214:56;10294:3;10286:12;;10279:24;10319:101;10349:70;10375:43;10413:3;10405:12;;4618:66;4606:79;;4715:6;4710:2;4701:12;;4694:28;4747:2;4738:12;;4596:160;10375:43;10367:6;10349:70;:::i;:::-;4838:66;4826:79;;4930:1;4921:11;;4816:122;10319:101;10312:108;9229:1197;-1:-1:-1;;;;;;9229:1197:1:o;10431:448::-;10693:31;10688:3;10681:44;10663:3;10754:6;10748:13;10770:62;10825:6;10820:2;10815:3;10811:12;10804:4;10796:6;10792:17;10770:62;:::i;:::-;10852:16;;;;10870:2;10848:25;;10671:208;-1:-1:-1;;10671:208:1:o;11115:511::-;11309:4;11338:42;11419:2;11411:6;11407:15;11396:9;11389:34;11471:2;11463:6;11459:15;11454:2;11443:9;11439:18;11432:43;;11511:6;11506:2;11495:9;11491:18;11484:34;11554:3;11549:2;11538:9;11534:18;11527:31;11575:45;11615:3;11604:9;11600:19;11592:6;11575:45;:::i;11823:219::-;11972:2;11961:9;11954:21;11935:4;11992:44;12032:2;12021:9;12017:18;12009:6;11992:44;:::i;21448:128::-;21488:3;21519:1;21515:6;21512:1;21509:13;21506:2;;;21525:18;;:::i;:::-;-1:-1:-1;21561:9:1;;21496:80::o;21581:120::-;21621:1;21647;21637:2;;21652:18;;:::i;:::-;-1:-1:-1;21686:9:1;;21627:74::o;21706:228::-;21746:7;21872:1;21804:66;21800:74;21797:1;21794:81;21789:1;21782:9;21775:17;21771:105;21768:2;;;21879:18;;:::i;:::-;-1:-1:-1;21919:9:1;;21758:176::o;21939:125::-;21979:4;22007:1;22004;22001:8;21998:2;;;22012:18;;:::i;:::-;-1:-1:-1;22049:9:1;;21988:76::o;22069:258::-;22141:1;22151:113;22165:6;22162:1;22159:13;22151:113;;;22241:11;;;22235:18;22222:11;;;22215:39;22187:2;22180:10;22151:113;;;22282:6;22279:1;22276:13;22273:2;;;-1:-1:-1;;22317:1:1;22299:16;;22292:27;22122:205::o;22332:437::-;22411:1;22407:12;;;;22454;;;22475:2;;22529:4;22521:6;22517:17;22507:27;;22475:2;22582;22574:6;22571:14;22551:18;22548:38;22545:2;;;22619:77;22616:1;22609:88;22720:4;22717:1;22710:15;22748:4;22745:1;22738:15;22774:195;22813:3;22844:66;22837:5;22834:77;22831:2;;;22914:18;;:::i;:::-;-1:-1:-1;22961:1:1;22950:13;;22821:148::o;22974:112::-;23006:1;23032;23022:2;;23037:18;;:::i;:::-;-1:-1:-1;23071:9:1;;23012:74::o;23091:184::-;23143:77;23140:1;23133:88;23240:4;23237:1;23230:15;23264:4;23261:1;23254:15;23280:184;23332:77;23329:1;23322:88;23429:4;23426:1;23419:15;23453:4;23450:1;23443:15;23469:184;23521:77;23518:1;23511:88;23618:4;23615:1;23608:15;23642:4;23639:1;23632:15;23658:177;23743:66;23736:5;23732:78;23725:5;23722:89;23712:2;;23825:1;23822;23815:12

Swarm Source

ipfs://3718be2a210f41f0f89b2201bc2f4d0391d8ab4db719b5d8490e2d967de76390
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.