ETH Price: $3,052.80 (+2.43%)
Gas: 1 Gwei

Token

MontyExperiences (MONTYEXP)
 

Overview

Max Total Supply

110 MONTYEXP

Holders

34

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 MONTYEXP
0x15EF584bDcD03AAEA40e567C70C393361432bcF4
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:
NFTExp

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-07
*/

// Sources flattened with hardhat v2.9.1 https://hardhat.org

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

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

pragma solidity ^0.8.0;

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


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


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

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/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/[email protected]


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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


// OpenZeppelin Contracts v4.4.1 (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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


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


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC1271 standard signature validation method for
 * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].
 *
 * _Available since v4.1._
 */
interface IERC1271 {
    /**
     * @dev Should return whether the signature provided is valid for the provided data
     * @param hash      Hash of the data to be signed
     * @param signature Signature byte array associated with _data
     */
    function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);
}


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


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

pragma solidity ^0.8.0;



/**
 * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA
 * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like
 * Argent and Gnosis Safe.
 *
 * _Available since v4.1._
 */
library SignatureChecker {
    /**
     * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the
     * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`.
     *
     * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus
     * change through time. It could return true at block N and false at block N+1 (or the opposite).
     */
    function isValidSignatureNow(
        address signer,
        bytes32 hash,
        bytes memory signature
    ) internal view returns (bool) {
        (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature);
        if (error == ECDSA.RecoverError.NoError && recovered == signer) {
            return true;
        }

        (bool success, bytes memory result) = signer.staticcall(
            abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature)
        );
        return (success && result.length == 32 && abi.decode(result, (bytes4)) == IERC1271.isValidSignature.selector);
    }
}


// File contracts/NFTExp.sol


pragma solidity ^0.8.4;






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

    Counters.Counter private currentTokenId;
    string private _contractURI;
    string private _baseURIextended;
    address private _montysBooked;
    address private _montysExpired;
    uint256 public expiryDate;
    string private _hash =
        "By signing this message I confirm that Tech Alchemist can book an experience withdrawing NFT number ";

    constructor(
        string memory contractURI_,
        string memory baseURI_,
        address montysBooked_,
        address montysExpired_,
        uint256 expiryDate_
    ) ERC721("MontyExperiences", "MONTYEXP") {
        for (uint256 i = 0; i < 110; i++) {
            currentTokenId.increment();
            uint256 newItemId = currentTokenId.current();
            _safeMint(owner(), newItemId);
        }
        _contractURI = contractURI_;
        _baseURIextended = baseURI_;
        _montysBooked = montysBooked_;
        _montysExpired = montysExpired_;
        expiryDate = expiryDate_;
    }

    function totalSupply() public view returns (uint256) {
        return currentTokenId.current();
    }

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

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "NFTExp: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        string memory tokenIdString = "";
        if (ownerOf(tokenId) == _montysBooked) {
            tokenIdString = string(abi.encodePacked(tokenId.toString(), "-booked"));
        } else if (ownerOf(tokenId) == _montysExpired) {
            tokenIdString = string(abi.encodePacked(tokenId.toString(), "-expired"));
        } else {
            tokenIdString = tokenId.toString();
        }
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenIdString)) : "";
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function setExpiryDate(uint256 expiryDate_) public onlyOwner {
        expiryDate = expiryDate_;
    }

    function claim(uint256 tokenId, bytes memory signature) public onlyOwner {
        bytes memory intermediateHash = abi.encodePacked(_hash, tokenId.toString());
        bytes32 finalHash = ECDSA.toEthSignedMessageHash(intermediateHash);
        require(SignatureChecker.isValidSignatureNow(ownerOf(tokenId), finalHash, signature), "Invalid signature");
        _transfer(ownerOf(tokenId), _montysBooked, tokenId);
    }

    function claimExpired(uint256[] memory tokenIds) public onlyOwner {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(block.timestamp > expiryDate, "NFTExp: Not expired yet");
            _transfer(ownerOf(tokenIds[i]), _montysExpired, tokenIds[i]);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"montysBooked_","type":"address"},{"internalType":"address","name":"montysExpired_","type":"address"},{"internalType":"uint256","name":"expiryDate_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimExpired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expiryDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"expiryDate_","type":"uint256"}],"name":"setExpiryDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61012060405260646080818152906200266c60a03980516200002a91600d916020909101906200058c565b503480156200003857600080fd5b50604051620026d0380380620026d08339810160408190526200005b916200070f565b6040518060400160405280601081526020016f4d6f6e7479457870657269656e63657360801b8152506040518060400160405280600881526020016704d4f4e54594558560c41b815250620000bf620000b9620001c960201b60201c565b620001cd565b8151620000d49060019060208501906200058c565b508051620000ea9060029060208401906200058c565b50505060005b606e81101562000160576200011160076200021d60201b62000bc61760201c565b60006200012a60076200022660201b62000bcf1760201c565b90506200014a620001436000546001600160a01b031690565b826200022a565b5080620001578162000886565b915050620000f0565b508451620001769060089060208801906200058c565b5083516200018c9060099060208701906200058c565b50600a80546001600160a01b039485166001600160a01b031991821617909155600b805493909416921691909117909155600c5550620008d09050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80546001019055565b5490565b6200024c8282604051806020016040528060008152506200025060201b60201c565b5050565b6200025c8383620002cc565b6200026b600084848462000414565b620002c75760405162461bcd60e51b815260206004820152603260248201526000805160206200264c83398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084015b60405180910390fd5b505050565b6001600160a01b038216620003245760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620002be565b6000818152600360205260409020546001600160a01b0316156200038b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620002be565b6001600160a01b0382166000908152600460205260408120805460019290620003b6908490620007fb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600062000435846001600160a01b03166200057d60201b62000bd31760201c565b156200057157604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200046f903390899088908890600401620007a5565b602060405180830381600087803b1580156200048a57600080fd5b505af1925050508015620004bd575060408051601f3d908101601f19168201909252620004ba91810190620006de565b60015b62000556573d808015620004ee576040519150601f19603f3d011682016040523d82523d6000602084013e620004f3565b606091505b5080516200054e5760405162461bcd60e51b815260206004820152603260248201526000805160206200264c83398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620002be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000575565b5060015b949350505050565b6001600160a01b03163b151590565b8280546200059a9062000849565b90600052602060002090601f016020900481019282620005be576000855562000609565b82601f10620005d957805160ff191683800117855562000609565b8280016001018555821562000609579182015b8281111562000609578251825591602001919060010190620005ec565b50620006179291506200061b565b5090565b5b808211156200061757600081556001016200061c565b80516001600160a01b03811681146200064a57600080fd5b919050565b600082601f83011262000660578081fd5b81516001600160401b03808211156200067d576200067d620008ba565b604051601f8301601f19908116603f01168101908282118183101715620006a857620006a8620008ba565b81604052838152866020858801011115620006c1578485fd5b620006d484602083016020890162000816565b9695505050505050565b600060208284031215620006f0578081fd5b81516001600160e01b03198116811462000708578182fd5b9392505050565b600080600080600060a0868803121562000727578081fd5b85516001600160401b03808211156200073e578283fd5b6200074c89838a016200064f565b9650602088015191508082111562000762578283fd5b5062000771888289016200064f565b945050620007826040870162000632565b9250620007926060870162000632565b9150608086015190509295509295909350565b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620007e48160a085016020870162000816565b601f01601f19169190910160a00195945050505050565b60008219821115620008115762000811620008a4565b500190565b60005b838110156200083357818101518382015260200162000819565b8381111562000843576000848401525b50505050565b600181811c908216806200085e57607f821691505b602082108114156200088057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200089d576200089d620008a4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b611d6c80620008e06000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde14610289578063c87b56dd1461029c578063e221c31a146102af578063e8a3d485146102c2578063e985e9c5146102ca578063f2fde38b1461030657600080fd5b8063715018a6146102425780638da5cb5b1461024a57806391e173ab1461025b57806395d89b411461026e578063a22cb4651461027657600080fd5b806323b872dd1161010a57806323b872dd146101da57806338926b6d146101ed57806342842e0e14610200578063516dde43146102135780636352211e1461021c57806370a082311461022f57600080fd5b806301ffc9a71461014757806306fdde031461016f578063081812fc14610184578063095ea7b3146101af57806318160ddd146101c4575b600080fd5b61015a610155366004611813565b610319565b60405190151581526020015b60405180910390f35b61017761036b565b6040516101669190611ae9565b61019761019236600461184b565b6103fd565b6040516001600160a01b039091168152602001610166565b6101c26101bd366004611742565b610497565b005b6101cc6105ad565b604051908152602001610166565b6101c26101e8366004611667565b6105bd565b6101c26101fb366004611863565b6105ee565b6101c261020e366004611667565b6106cb565b6101cc600c5481565b61019761022a36600461184b565b6106e6565b6101cc61023d36600461161b565b61075d565b6101c26107e4565b6000546001600160a01b0316610197565b6101c261026936600461184b565b61081a565b610177610849565b6101c2610284366004611708565b610858565b6101c26102973660046116a2565b610867565b6101776102aa36600461184b565b610899565b6101c26102bd36600461176b565b610a12565b610177610b1c565b61015a6102d8366004611635565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101c261031436600461161b565b610b2b565b60006001600160e01b031982166380ac58cd60e01b148061034a57506001600160e01b03198216635b5e139f60e01b145b8061036557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461037a90611c74565b80601f01602080910402602001604051908101604052809291908181526020018280546103a690611c74565b80156103f35780601f106103c8576101008083540402835291602001916103f3565b820191906000526020600020905b8154815290600101906020018083116103d657829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661047b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006104a2826106e6565b9050806001600160a01b0316836001600160a01b031614156105105760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610472565b336001600160a01b038216148061052c575061052c81336102d8565b61059e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610472565b6105a88383610be2565b505050565b60006105b860075490565b905090565b6105c73382610c50565b6105e35760405162461bcd60e51b815260040161047290611b83565b6105a8838383610d43565b6000546001600160a01b031633146106185760405162461bcd60e51b815260040161047290611b4e565b6000600d61062584610edf565b604051602001610636929190611992565b6040516020818303038152906040529050600061065282610ff9565b9050610667610660856106e6565b8285611034565b6106a75760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610472565b6106c56106b3856106e6565b600a546001600160a01b031686610d43565b50505050565b6105a883838360405180602001604052806000815250610867565b6000818152600360205260408120546001600160a01b0316806103655760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610472565b60006001600160a01b0382166107c85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610472565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b0316331461080e5760405162461bcd60e51b815260040161047290611b4e565b6108186000611190565b565b6000546001600160a01b031633146108445760405162461bcd60e51b815260040161047290611b4e565b600c55565b60606002805461037a90611c74565b6108633383836111e0565b5050565b6108713383610c50565b61088d5760405162461bcd60e51b815260040161047290611b83565b6106c5848484846112af565b6000818152600360205260409020546060906001600160a01b03166109105760405162461bcd60e51b815260206004820152602760248201527f4e46544578703a2055524920717565727920666f72206e6f6e6578697374656e6044820152663a103a37b5b2b760c91b6064820152608401610472565b600061091a6112e2565b604080516020810190915260008152600a54919250906001600160a01b0316610942856106e6565b6001600160a01b031614156109805761095a84610edf565b60405160200161096a919061193b565b60405160208183030381529060405290506109c9565b600b546001600160a01b0316610995856106e6565b6001600160a01b031614156109bd576109ad84610edf565b60405160200161096a9190611966565b6109c684610edf565b90505b60008251116109e75760405180602001604052806000815250610a0a565b81816040516020016109fa92919061190c565b6040516020818303038152906040525b949350505050565b6000546001600160a01b03163314610a3c5760405162461bcd60e51b815260040161047290611b4e565b60005b815181101561086357600c544211610a995760405162461bcd60e51b815260206004820152601760248201527f4e46544578703a204e6f742065787069726564207965740000000000000000006044820152606401610472565b610b0a610acc838381518110610abf57634e487b7160e01b600052603260045260246000fd5b60200260200101516106e6565b600b5484516001600160a01b0390911690859085908110610afd57634e487b7160e01b600052603260045260246000fd5b6020026020010151610d43565b80610b1481611caf565b915050610a3f565b60606008805461037a90611c74565b6000546001600160a01b03163314610b555760405162461bcd60e51b815260040161047290611b4e565b6001600160a01b038116610bba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610472565b610bc381611190565b50565b80546001019055565b5490565b6001600160a01b03163b151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610c17826106e6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316610cc95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610472565b6000610cd4836106e6565b9050806001600160a01b0316846001600160a01b03161480610d0f5750836001600160a01b0316610d04846103fd565b6001600160a01b0316145b80610a0a57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16610a0a565b826001600160a01b0316610d56826106e6565b6001600160a01b031614610dba5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610472565b6001600160a01b038216610e1c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610472565b610e27600082610be2565b6001600160a01b0383166000908152600460205260408120805460019290610e50908490611c31565b90915550506001600160a01b0382166000908152600460205260408120805460019290610e7e908490611c05565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081610f035750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f2d5780610f1781611caf565b9150610f269050600a83611c1d565b9150610f07565b60008167ffffffffffffffff811115610f5657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610f80576020820181803683370190505b5090505b8415610a0a57610f95600183611c31565b9150610fa2600a86611cca565b610fad906030611c05565b60f81b818381518110610fd057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350610ff2600a86611c1d565b9450610f84565b60006110058251610edf565b82604051602001611017929190611a38565b604051602081830303815290604052805190602001209050919050565b600080600061104385856112f1565b9092509050600081600481111561106a57634e487b7160e01b600052602160045260246000fd5b1480156110885750856001600160a01b0316826001600160a01b0316145b1561109857600192505050611189565b600080876001600160a01b0316631626ba7e60e01b88886040516024016110c0929190611ad0565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516110fe91906118f0565b600060405180830381855afa9150503d8060008114611139576040519150601f19603f3d011682016040523d82523d6000602084013e61113e565b606091505b5091509150818015611151575080516020145b801561118257508051630b135d3f60e11b90611176908301602090810190840161182f565b6001600160e01b031916145b9450505050505b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156112425760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610472565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6112ba848484610d43565b6112c684848484611361565b6106c55760405162461bcd60e51b815260040161047290611afc565b60606009805461037a90611c74565b6000808251604114156113285760208301516040840151606085015160001a61131c8782858561146e565b9450945050505061135a565b825160401415611352576020830151604084015161134786838361155b565b93509350505061135a565b506000905060025b9250929050565b60006001600160a01b0384163b1561146357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906113a5903390899088908890600401611a93565b602060405180830381600087803b1580156113bf57600080fd5b505af19250505080156113ef575060408051601f3d908101601f191682019092526113ec9181019061182f565b60015b611449573d80801561141d576040519150601f19603f3d011682016040523d82523d6000602084013e611422565b606091505b5080516114415760405162461bcd60e51b815260040161047290611afc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a0a565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156114a55750600090506003611552565b8460ff16601b141580156114bd57508460ff16601c14155b156114ce5750600090506004611552565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611522573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661154b57600060019250925050611552565b9150600090505b94509492505050565b6000806001600160ff1b0383168161157860ff86901c601b611c05565b90506115868782888561146e565b935093505050935093915050565b80356001600160a01b03811681146115ab57600080fd5b919050565b600082601f8301126115c0578081fd5b813567ffffffffffffffff8111156115da576115da611d0a565b6115ed601f8201601f1916602001611bd4565b818152846020838601011115611601578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561162c578081fd5b61118982611594565b60008060408385031215611647578081fd5b61165083611594565b915061165e60208401611594565b90509250929050565b60008060006060848603121561167b578081fd5b61168484611594565b925061169260208501611594565b9150604084013590509250925092565b600080600080608085870312156116b7578081fd5b6116c085611594565b93506116ce60208601611594565b925060408501359150606085013567ffffffffffffffff8111156116f0578182fd5b6116fc878288016115b0565b91505092959194509250565b6000806040838503121561171a578182fd5b61172383611594565b915060208301358015158114611737578182fd5b809150509250929050565b60008060408385031215611754578182fd5b61175d83611594565b946020939093013593505050565b6000602080838503121561177d578182fd5b823567ffffffffffffffff80821115611794578384fd5b818501915085601f8301126117a7578384fd5b8135818111156117b9576117b9611d0a565b8060051b91506117ca848301611bd4565b8181528481019084860184860187018a10156117e4578788fd5b8795505b838610156118065780358352600195909501949186019186016117e8565b5098975050505050505050565b600060208284031215611824578081fd5b813561118981611d20565b600060208284031215611840578081fd5b815161118981611d20565b60006020828403121561185c578081fd5b5035919050565b60008060408385031215611875578182fd5b82359150602083013567ffffffffffffffff811115611892578182fd5b61189e858286016115b0565b9150509250929050565b600081518084526118c0816020860160208601611c48565b601f01601f19169290920160200192915050565b600081516118e6818560208601611c48565b9290920192915050565b60008251611902818460208701611c48565b9190910192915050565b6000835161191e818460208801611c48565b835190830190611932818360208801611c48565b01949350505050565b6000825161194d818460208701611c48565b660b589bdbdad95960ca1b920191825250600701919050565b60008251611978818460208701611c48565b670b595e1c1a5c995960c21b920191825250600801919050565b600080845482600182811c9150808316806119ae57607f831692505b60208084108214156119ce57634e487b7160e01b87526022600452602487fd5b8180156119e257600181146119f357611a1f565b60ff19861689528489019650611a1f565b60008b815260209020885b86811015611a175781548b8201529085019083016119fe565b505084890196505b505050505050611a2f81856118d4565b95945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000815260008351611a7081601a850160208801611c48565b835190830190611a8781601a840160208801611c48565b01601a01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ac6908301846118a8565b9695505050505050565b828152604060208201526000610a0a60408301846118a8565b60208152600061118960208301846118a8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611bfd57611bfd611d0a565b604052919050565b60008219821115611c1857611c18611cde565b500190565b600082611c2c57611c2c611cf4565b500490565b600082821015611c4357611c43611cde565b500390565b60005b83811015611c63578181015183820152602001611c4b565b838111156106c55750506000910152565b600181811c90821680611c8857607f821691505b60208210811415611ca957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611cc357611cc3611cde565b5060010190565b600082611cd957611cd9611cf4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610bc357600080fdfea26469706673582212204f04f200ef8f32c1adbc091886e922801f2ec654c214142f7ab27dc7776f1a6864736f6c634300080400334552433732313a207472616e7366657220746f206e6f6e2045524337323152654279207369676e696e672074686973206d657373616765204920636f6e6669726d2074686174205465636820416c6368656d6973742063616e20626f6f6b20616e20657870657269656e6365207769746864726177696e67204e4654206e756d6265722000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000005c2465537307048675dd43d781733f5dc77265410000000000000000000000005a5ddabf4c33f781812c1c0e423405cecfa711e30000000000000000000000000000000000000000000000000000000063b0ccff0000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5262577746414c784133505362684d514a4e4844464564444a6453355437705250396868456370536137366f00000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5557764c58794e63753739366e6d7868356544456938714862614753753456774d753871587931583852646b2f00000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde14610289578063c87b56dd1461029c578063e221c31a146102af578063e8a3d485146102c2578063e985e9c5146102ca578063f2fde38b1461030657600080fd5b8063715018a6146102425780638da5cb5b1461024a57806391e173ab1461025b57806395d89b411461026e578063a22cb4651461027657600080fd5b806323b872dd1161010a57806323b872dd146101da57806338926b6d146101ed57806342842e0e14610200578063516dde43146102135780636352211e1461021c57806370a082311461022f57600080fd5b806301ffc9a71461014757806306fdde031461016f578063081812fc14610184578063095ea7b3146101af57806318160ddd146101c4575b600080fd5b61015a610155366004611813565b610319565b60405190151581526020015b60405180910390f35b61017761036b565b6040516101669190611ae9565b61019761019236600461184b565b6103fd565b6040516001600160a01b039091168152602001610166565b6101c26101bd366004611742565b610497565b005b6101cc6105ad565b604051908152602001610166565b6101c26101e8366004611667565b6105bd565b6101c26101fb366004611863565b6105ee565b6101c261020e366004611667565b6106cb565b6101cc600c5481565b61019761022a36600461184b565b6106e6565b6101cc61023d36600461161b565b61075d565b6101c26107e4565b6000546001600160a01b0316610197565b6101c261026936600461184b565b61081a565b610177610849565b6101c2610284366004611708565b610858565b6101c26102973660046116a2565b610867565b6101776102aa36600461184b565b610899565b6101c26102bd36600461176b565b610a12565b610177610b1c565b61015a6102d8366004611635565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101c261031436600461161b565b610b2b565b60006001600160e01b031982166380ac58cd60e01b148061034a57506001600160e01b03198216635b5e139f60e01b145b8061036557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461037a90611c74565b80601f01602080910402602001604051908101604052809291908181526020018280546103a690611c74565b80156103f35780601f106103c8576101008083540402835291602001916103f3565b820191906000526020600020905b8154815290600101906020018083116103d657829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661047b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006104a2826106e6565b9050806001600160a01b0316836001600160a01b031614156105105760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610472565b336001600160a01b038216148061052c575061052c81336102d8565b61059e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610472565b6105a88383610be2565b505050565b60006105b860075490565b905090565b6105c73382610c50565b6105e35760405162461bcd60e51b815260040161047290611b83565b6105a8838383610d43565b6000546001600160a01b031633146106185760405162461bcd60e51b815260040161047290611b4e565b6000600d61062584610edf565b604051602001610636929190611992565b6040516020818303038152906040529050600061065282610ff9565b9050610667610660856106e6565b8285611034565b6106a75760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610472565b6106c56106b3856106e6565b600a546001600160a01b031686610d43565b50505050565b6105a883838360405180602001604052806000815250610867565b6000818152600360205260408120546001600160a01b0316806103655760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610472565b60006001600160a01b0382166107c85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610472565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b0316331461080e5760405162461bcd60e51b815260040161047290611b4e565b6108186000611190565b565b6000546001600160a01b031633146108445760405162461bcd60e51b815260040161047290611b4e565b600c55565b60606002805461037a90611c74565b6108633383836111e0565b5050565b6108713383610c50565b61088d5760405162461bcd60e51b815260040161047290611b83565b6106c5848484846112af565b6000818152600360205260409020546060906001600160a01b03166109105760405162461bcd60e51b815260206004820152602760248201527f4e46544578703a2055524920717565727920666f72206e6f6e6578697374656e6044820152663a103a37b5b2b760c91b6064820152608401610472565b600061091a6112e2565b604080516020810190915260008152600a54919250906001600160a01b0316610942856106e6565b6001600160a01b031614156109805761095a84610edf565b60405160200161096a919061193b565b60405160208183030381529060405290506109c9565b600b546001600160a01b0316610995856106e6565b6001600160a01b031614156109bd576109ad84610edf565b60405160200161096a9190611966565b6109c684610edf565b90505b60008251116109e75760405180602001604052806000815250610a0a565b81816040516020016109fa92919061190c565b6040516020818303038152906040525b949350505050565b6000546001600160a01b03163314610a3c5760405162461bcd60e51b815260040161047290611b4e565b60005b815181101561086357600c544211610a995760405162461bcd60e51b815260206004820152601760248201527f4e46544578703a204e6f742065787069726564207965740000000000000000006044820152606401610472565b610b0a610acc838381518110610abf57634e487b7160e01b600052603260045260246000fd5b60200260200101516106e6565b600b5484516001600160a01b0390911690859085908110610afd57634e487b7160e01b600052603260045260246000fd5b6020026020010151610d43565b80610b1481611caf565b915050610a3f565b60606008805461037a90611c74565b6000546001600160a01b03163314610b555760405162461bcd60e51b815260040161047290611b4e565b6001600160a01b038116610bba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610472565b610bc381611190565b50565b80546001019055565b5490565b6001600160a01b03163b151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610c17826106e6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316610cc95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610472565b6000610cd4836106e6565b9050806001600160a01b0316846001600160a01b03161480610d0f5750836001600160a01b0316610d04846103fd565b6001600160a01b0316145b80610a0a57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16610a0a565b826001600160a01b0316610d56826106e6565b6001600160a01b031614610dba5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610472565b6001600160a01b038216610e1c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610472565b610e27600082610be2565b6001600160a01b0383166000908152600460205260408120805460019290610e50908490611c31565b90915550506001600160a01b0382166000908152600460205260408120805460019290610e7e908490611c05565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081610f035750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f2d5780610f1781611caf565b9150610f269050600a83611c1d565b9150610f07565b60008167ffffffffffffffff811115610f5657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610f80576020820181803683370190505b5090505b8415610a0a57610f95600183611c31565b9150610fa2600a86611cca565b610fad906030611c05565b60f81b818381518110610fd057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350610ff2600a86611c1d565b9450610f84565b60006110058251610edf565b82604051602001611017929190611a38565b604051602081830303815290604052805190602001209050919050565b600080600061104385856112f1565b9092509050600081600481111561106a57634e487b7160e01b600052602160045260246000fd5b1480156110885750856001600160a01b0316826001600160a01b0316145b1561109857600192505050611189565b600080876001600160a01b0316631626ba7e60e01b88886040516024016110c0929190611ad0565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516110fe91906118f0565b600060405180830381855afa9150503d8060008114611139576040519150601f19603f3d011682016040523d82523d6000602084013e61113e565b606091505b5091509150818015611151575080516020145b801561118257508051630b135d3f60e11b90611176908301602090810190840161182f565b6001600160e01b031916145b9450505050505b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156112425760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610472565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6112ba848484610d43565b6112c684848484611361565b6106c55760405162461bcd60e51b815260040161047290611afc565b60606009805461037a90611c74565b6000808251604114156113285760208301516040840151606085015160001a61131c8782858561146e565b9450945050505061135a565b825160401415611352576020830151604084015161134786838361155b565b93509350505061135a565b506000905060025b9250929050565b60006001600160a01b0384163b1561146357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906113a5903390899088908890600401611a93565b602060405180830381600087803b1580156113bf57600080fd5b505af19250505080156113ef575060408051601f3d908101601f191682019092526113ec9181019061182f565b60015b611449573d80801561141d576040519150601f19603f3d011682016040523d82523d6000602084013e611422565b606091505b5080516114415760405162461bcd60e51b815260040161047290611afc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a0a565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156114a55750600090506003611552565b8460ff16601b141580156114bd57508460ff16601c14155b156114ce5750600090506004611552565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611522573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661154b57600060019250925050611552565b9150600090505b94509492505050565b6000806001600160ff1b0383168161157860ff86901c601b611c05565b90506115868782888561146e565b935093505050935093915050565b80356001600160a01b03811681146115ab57600080fd5b919050565b600082601f8301126115c0578081fd5b813567ffffffffffffffff8111156115da576115da611d0a565b6115ed601f8201601f1916602001611bd4565b818152846020838601011115611601578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561162c578081fd5b61118982611594565b60008060408385031215611647578081fd5b61165083611594565b915061165e60208401611594565b90509250929050565b60008060006060848603121561167b578081fd5b61168484611594565b925061169260208501611594565b9150604084013590509250925092565b600080600080608085870312156116b7578081fd5b6116c085611594565b93506116ce60208601611594565b925060408501359150606085013567ffffffffffffffff8111156116f0578182fd5b6116fc878288016115b0565b91505092959194509250565b6000806040838503121561171a578182fd5b61172383611594565b915060208301358015158114611737578182fd5b809150509250929050565b60008060408385031215611754578182fd5b61175d83611594565b946020939093013593505050565b6000602080838503121561177d578182fd5b823567ffffffffffffffff80821115611794578384fd5b818501915085601f8301126117a7578384fd5b8135818111156117b9576117b9611d0a565b8060051b91506117ca848301611bd4565b8181528481019084860184860187018a10156117e4578788fd5b8795505b838610156118065780358352600195909501949186019186016117e8565b5098975050505050505050565b600060208284031215611824578081fd5b813561118981611d20565b600060208284031215611840578081fd5b815161118981611d20565b60006020828403121561185c578081fd5b5035919050565b60008060408385031215611875578182fd5b82359150602083013567ffffffffffffffff811115611892578182fd5b61189e858286016115b0565b9150509250929050565b600081518084526118c0816020860160208601611c48565b601f01601f19169290920160200192915050565b600081516118e6818560208601611c48565b9290920192915050565b60008251611902818460208701611c48565b9190910192915050565b6000835161191e818460208801611c48565b835190830190611932818360208801611c48565b01949350505050565b6000825161194d818460208701611c48565b660b589bdbdad95960ca1b920191825250600701919050565b60008251611978818460208701611c48565b670b595e1c1a5c995960c21b920191825250600801919050565b600080845482600182811c9150808316806119ae57607f831692505b60208084108214156119ce57634e487b7160e01b87526022600452602487fd5b8180156119e257600181146119f357611a1f565b60ff19861689528489019650611a1f565b60008b815260209020885b86811015611a175781548b8201529085019083016119fe565b505084890196505b505050505050611a2f81856118d4565b95945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000815260008351611a7081601a850160208801611c48565b835190830190611a8781601a840160208801611c48565b01601a01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ac6908301846118a8565b9695505050505050565b828152604060208201526000610a0a60408301846118a8565b60208152600061118960208301846118a8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611bfd57611bfd611d0a565b604052919050565b60008219821115611c1857611c18611cde565b500190565b600082611c2c57611c2c611cf4565b500490565b600082821015611c4357611c43611cde565b500390565b60005b83811015611c63578181015183820152602001611c4b565b838111156106c55750506000910152565b600181811c90821680611c8857607f821691505b60208210811415611ca957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611cc357611cc3611cde565b5060010190565b600082611cd957611cd9611cf4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610bc357600080fdfea26469706673582212204f04f200ef8f32c1adbc091886e922801f2ec654c214142f7ab27dc7776f1a6864736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000005c2465537307048675dd43d781733f5dc77265410000000000000000000000005a5ddabf4c33f781812c1c0e423405cecfa711e30000000000000000000000000000000000000000000000000000000063b0ccff0000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5262577746414c784133505362684d514a4e4844464564444a6453355437705250396868456370536137366f00000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5557764c58794e63753739366e6d7868356544456938714862614753753456774d753871587931583852646b2f00000000000000000000

-----Decoded View---------------
Arg [0] : contractURI_ (string): ipfs://QmRbWwFALxA3PSbhMQJNHDFEdDJdS5T7pRP9hhEcpSa76o
Arg [1] : baseURI_ (string): ipfs://QmUWvLXyNcu796nmxh5eDEi8qHbaGSu4VwMu8qXy1X8Rdk/
Arg [2] : montysBooked_ (address): 0x5C2465537307048675Dd43d781733f5dC7726541
Arg [3] : montysExpired_ (address): 0x5a5DDAbF4C33f781812c1c0e423405CECfa711E3
Arg [4] : expiryDate_ (uint256): 1672531199

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000005c2465537307048675dd43d781733f5dc7726541
Arg [3] : 0000000000000000000000005a5ddabf4c33f781812c1c0e423405cecfa711e3
Arg [4] : 0000000000000000000000000000000000000000000000000000000063b0ccff
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [6] : 697066733a2f2f516d5262577746414c784133505362684d514a4e4844464564
Arg [7] : 444a6453355437705250396868456370536137366f0000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d5557764c58794e63753739366e6d786835654445693871
Arg [10] : 4862614753753456774d753871587931583852646b2f00000000000000000000


Deployed Bytecode Sourcemap

50878:3022:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21736:305;;;;;;:::i;:::-;;:::i;:::-;;;9764:14:1;;9757:22;9739:41;;9727:2;9712:18;21736:305:0;;;;;;;;22681:100;;;:::i;:::-;;;;;;;:::i;24240:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9051:32:1;;;9033:51;;9021:2;9006:18;24240:221:0;8988:102:1;23763:411:0;;;;;;:::i;:::-;;:::i;:::-;;51994:103;;;:::i;:::-;;;17229:25:1;;;17217:2;17202:18;51994:103:0;17184:76:1;24990:339:0;;;;;;:::i;:::-;;:::i;53170:423::-;;;;;;:::i;:::-;;:::i;25400:185::-;;;;;;:::i;:::-;;:::i;51187:25::-;;;;;;22375:239;;;;;;:::i;:::-;;:::i;22105:208::-;;;;;;:::i;:::-;;:::i;38042:103::-;;;:::i;37391:87::-;37437:7;37464:6;-1:-1:-1;;;;;37464:6:0;37391:87;;53058:104;;;;;;:::i;:::-;;:::i;22850:::-;;;:::i;24533:155::-;;;;;;:::i;:::-;;:::i;25656:328::-;;;;;;:::i;:::-;;:::i;52230:715::-;;;;;;:::i;:::-;;:::i;53601:296::-;;;;;;:::i;:::-;;:::i;52953:97::-;;;:::i;24759:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24880:25:0;;;24856:4;24880:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24759:164;38300:201;;;;;;:::i;:::-;;:::i;21736:305::-;21838:4;-1:-1:-1;;;;;;21875:40:0;;-1:-1:-1;;;21875:40:0;;:105;;-1:-1:-1;;;;;;;21932:48:0;;-1:-1:-1;;;21932:48:0;21875:105;:158;;;-1:-1:-1;;;;;;;;;;20268:40:0;;;21997:36;21855:178;21736:305;-1:-1:-1;;21736:305:0:o;22681:100::-;22735:13;22768:5;22761:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22681:100;:::o;24240:221::-;24316:7;27583:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27583:16:0;24336:73;;;;-1:-1:-1;;;24336:73:0;;15283:2:1;24336:73:0;;;15265:21:1;15322:2;15302:18;;;15295:30;15361:34;15341:18;;;15334:62;-1:-1:-1;;;15412:18:1;;;15405:42;15464:19;;24336:73:0;;;;;;;;;-1:-1:-1;24429:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24429:24:0;;24240:221::o;23763:411::-;23844:13;23860:23;23875:7;23860:14;:23::i;:::-;23844:39;;23908:5;-1:-1:-1;;;;;23902:11:0;:2;-1:-1:-1;;;;;23902:11:0;;;23894:57;;;;-1:-1:-1;;;23894:57:0;;16057:2:1;23894:57:0;;;16039:21:1;16096:2;16076:18;;;16069:30;16135:34;16115:18;;;16108:62;-1:-1:-1;;;16186:18:1;;;16179:31;16227:19;;23894:57:0;16029:223:1;23894:57:0;17022:10;-1:-1:-1;;;;;23986:21:0;;;;:62;;-1:-1:-1;24011:37:0;24028:5;17022:10;24759:164;:::i;24011:37::-;23964:168;;;;-1:-1:-1;;;23964:168:0;;14037:2:1;23964:168:0;;;14019:21:1;14076:2;14056:18;;;14049:30;14115:34;14095:18;;;14088:62;14186:26;14166:18;;;14159:54;14230:19;;23964:168:0;14009:246:1;23964:168:0;24145:21;24154:2;24158:7;24145:8;:21::i;:::-;23763:411;;;:::o;51994:103::-;52038:7;52065:24;:14;35822;;35730:114;52065:24;52058:31;;51994:103;:::o;24990:339::-;25185:41;17022:10;25218:7;25185:18;:41::i;:::-;25177:103;;;;-1:-1:-1;;;25177:103:0;;;;;;;:::i;:::-;25293:28;25303:4;25309:2;25313:7;25293:9;:28::i;53170:423::-;37437:7;37464:6;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;53254:29:::1;53303:5;53310:18;:7;:16;:18::i;:::-;53286:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53254:75;;53340:17;53360:46;53389:16;53360:28;:46::i;:::-;53340:66;;53425:76;53462:16;53470:7;53462;:16::i;:::-;53480:9;53491;53425:36;:76::i;:::-;53417:106;;;::::0;-1:-1:-1;;;53417:106:0;;12926:2:1;53417:106:0::1;::::0;::::1;12908:21:1::0;12965:2;12945:18;;;12938:30;-1:-1:-1;;;12984:18:1;;;12977:47;13041:18;;53417:106:0::1;12898:167:1::0;53417:106:0::1;53534:51;53544:16;53552:7;53544;:16::i;:::-;53562:13;::::0;-1:-1:-1;;;;;53562:13:0::1;53577:7:::0;53534:9:::1;:51::i;:::-;37682:1;;53170:423:::0;;:::o;25400:185::-;25538:39;25555:4;25561:2;25565:7;25538:39;;;;;;;;;;;;:16;:39::i;22375:239::-;22447:7;22483:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22483:16:0;22518:19;22510:73;;;;-1:-1:-1;;;22510:73:0;;14873:2:1;22510:73:0;;;14855:21:1;14912:2;14892:18;;;14885:30;14951:34;14931:18;;;14924:62;-1:-1:-1;;;15002:18:1;;;14995:39;15051:19;;22510:73:0;14845:231:1;22105:208:0;22177:7;-1:-1:-1;;;;;22205:19:0;;22197:74;;;;-1:-1:-1;;;22197:74:0;;14462:2:1;22197:74:0;;;14444:21:1;14501:2;14481:18;;;14474:30;14540:34;14520:18;;;14513:62;-1:-1:-1;;;14591:18:1;;;14584:40;14641:19;;22197:74:0;14434:232:1;22197:74:0;-1:-1:-1;;;;;;22289:16:0;;;;;:9;:16;;;;;;;22105:208::o;38042:103::-;37437:7;37464:6;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;38107:30:::1;38134:1;38107:18;:30::i;:::-;38042:103::o:0;53058:104::-;37437:7;37464:6;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;53130:10:::1;:24:::0;53058:104::o;22850:::-;22906:13;22939:7;22932:14;;;;;:::i;24533:155::-;24628:52;17022:10;24661:8;24671;24628:18;:52::i;:::-;24533:155;;:::o;25656:328::-;25831:41;17022:10;25864:7;25831:18;:41::i;:::-;25823:103;;;;-1:-1:-1;;;25823:103:0;;;;;;;:::i;:::-;25937:39;25951:4;25957:2;25961:7;25970:5;25937:13;:39::i;52230:715::-;27559:4;27583:16;;;:7;:16;;;;;;52295:13;;-1:-1:-1;;;;;27583:16:0;52321:68;;;;-1:-1:-1;;;52321:68:0;;16877:2:1;52321:68:0;;;16859:21:1;16916:2;16896:18;;;16889:30;16955:34;16935:18;;;16928:62;-1:-1:-1;;;17006:18:1;;;16999:37;17053:19;;52321:68:0;16849:229:1;52321:68:0;52402:21;52426:10;:8;:10::i;:::-;52447:32;;;;;;;;;:27;:32;;52514:13;;52402:34;;-1:-1:-1;52447:32:0;-1:-1:-1;;;;;52514:13:0;52494:16;52502:7;52494;:16::i;:::-;-1:-1:-1;;;;;52494:33:0;;52490:349;;;52584:18;:7;:16;:18::i;:::-;52567:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;52544:71;;52490:349;;;52657:14;;-1:-1:-1;;;;;52657:14:0;52637:16;52645:7;52637;:16::i;:::-;-1:-1:-1;;;;;52637:34:0;;52633:206;;;52728:18;:7;:16;:18::i;:::-;52711:48;;;;;;;;:::i;52633:206::-;52809:18;:7;:16;:18::i;:::-;52793:34;;52633:206;52880:1;52862:7;52856:21;:25;:81;;;;;;;;;;;;;;;;;52908:7;52917:13;52891:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52856:81;52849:88;52230:715;-1:-1:-1;;;;52230:715:0:o;53601:296::-;37437:7;37464:6;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;53683:9:::1;53678:212;53702:8;:15;53698:1;:19;53678:212;;;53765:10;;53747:15;:28;53739:64;;;::::0;-1:-1:-1;;;53739:64:0;;13685:2:1;53739:64:0::1;::::0;::::1;13667:21:1::0;13724:2;13704:18;;;13697:30;13763:25;13743:18;;;13736:53;13806:18;;53739:64:0::1;13657:173:1::0;53739:64:0::1;53818:60;53828:20;53836:8;53845:1;53836:11;;;;;;-1:-1:-1::0;;;53836:11:0::1;;;;;;;;;;;;;;;53828:7;:20::i;:::-;53850:14;::::0;53866:11;;-1:-1:-1;;;;;53850:14:0;;::::1;::::0;53866:8;;53875:1;;53866:11;::::1;;;-1:-1:-1::0;;;53866:11:0::1;;;;;;;;;;;;;;;53818:9;:60::i;:::-;53719:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53678:212;;52953:97:::0;52997:13;53030:12;53023:19;;;;;:::i;38300:201::-;37437:7;37464:6;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38389:22:0;::::1;38381:73;;;::::0;-1:-1:-1;;;38381:73:0;;11354:2:1;38381:73:0::1;::::0;::::1;11336:21:1::0;11393:2;11373:18;;;11366:30;11432:34;11412:18;;;11405:62;-1:-1:-1;;;11483:18:1;;;11476:36;11529:19;;38381:73:0::1;11326:228:1::0;38381:73:0::1;38465:28;38484:8;38465:18;:28::i;:::-;38300:201:::0;:::o;35852:127::-;35941:19;;35959:1;35941:19;;;35852:127::o;35730:114::-;35822:14;;35730:114::o;8985:326::-;-1:-1:-1;;;;;9280:19:0;;:23;;;8985:326::o;31640:174::-;31715:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31715:29:0;-1:-1:-1;;;;;31715:29:0;;;;;;;;:24;;31769:23;31715:24;31769:14;:23::i;:::-;-1:-1:-1;;;;;31760:46:0;;;;;;;;;;;31640:174;;:::o;27788:348::-;27881:4;27583:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27583:16:0;27898:73;;;;-1:-1:-1;;;27898:73:0;;13272:2:1;27898:73:0;;;13254:21:1;13311:2;13291:18;;;13284:30;13350:34;13330:18;;;13323:62;-1:-1:-1;;;13401:18:1;;;13394:42;13453:19;;27898:73:0;13244:234:1;27898:73:0;27982:13;27998:23;28013:7;27998:14;:23::i;:::-;27982:39;;28051:5;-1:-1:-1;;;;;28040:16:0;:7;-1:-1:-1;;;;;28040:16:0;;:51;;;;28084:7;-1:-1:-1;;;;;28060:31:0;:20;28072:7;28060:11;:20::i;:::-;-1:-1:-1;;;;;28060:31:0;;28040:51;:87;;;-1:-1:-1;;;;;;24880:25:0;;;24856:4;24880:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28095:32;24759:164;30897:625;31056:4;-1:-1:-1;;;;;31029:31:0;:23;31044:7;31029:14;:23::i;:::-;-1:-1:-1;;;;;31029:31:0;;31021:81;;;;-1:-1:-1;;;31021:81:0;;11761:2:1;31021:81:0;;;11743:21:1;11800:2;11780:18;;;11773:30;11839:34;11819:18;;;11812:62;-1:-1:-1;;;11890:18:1;;;11883:35;11935:19;;31021:81:0;11733:227:1;31021:81:0;-1:-1:-1;;;;;31121:16:0;;31113:65;;;;-1:-1:-1;;;31113:65:0;;12167:2:1;31113:65:0;;;12149:21:1;12206:2;12186:18;;;12179:30;12245:34;12225:18;;;12218:62;-1:-1:-1;;;12296:18:1;;;12289:34;12340:19;;31113:65:0;12139:226:1;31113:65:0;31295:29;31312:1;31316:7;31295:8;:29::i;:::-;-1:-1:-1;;;;;31337:15:0;;;;;;:9;:15;;;;;:20;;31356:1;;31337:15;:20;;31356:1;;31337:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31368:13:0;;;;;;:9;:13;;;;;:18;;31385:1;;31368:13;:18;;31385:1;;31368:18;:::i;:::-;;;;-1:-1:-1;;31397:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31397:21:0;-1:-1:-1;;;;;31397:21:0;;;;;;;;;31436:27;;31397:16;;31436:27;;;;;;;23763:411;;;:::o;17529:723::-;17585:13;17806:10;17802:53;;-1:-1:-1;;17833:10:0;;;;;;;;;;;;-1:-1:-1;;;17833:10:0;;;;;17529:723::o;17802:53::-;17880:5;17865:12;17921:78;17928:9;;17921:78;;17954:8;;;;:::i;:::-;;-1:-1:-1;17977:10:0;;-1:-1:-1;17985:2:0;17977:10;;:::i;:::-;;;17921:78;;;18009:19;18041:6;18031:17;;;;;;-1:-1:-1;;;18031:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18031:17:0;;18009:39;;18059:154;18066:10;;18059:154;;18093:11;18103:1;18093:11;;:::i;:::-;;-1:-1:-1;18162:10:0;18170:2;18162:5;:10;:::i;:::-;18149:24;;:2;:24;:::i;:::-;18136:39;;18119:6;18126;18119:14;;;;;;-1:-1:-1;;;18119:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;18119:56:0;;;;;;;;-1:-1:-1;18190:11:0;18199:2;18190:11;;:::i;:::-;;;18059:154;;47648:198;47719:7;47807:26;47824:1;:8;47807:16;:26::i;:::-;47835:1;47756:81;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47746:92;;;;;;47739:99;;47648:198;;;:::o;50151:647::-;50291:4;50309:17;50328:24;50356:33;50373:4;50379:9;50356:16;:33::i;:::-;50308:81;;-1:-1:-1;50308:81:0;-1:-1:-1;50413:26:0;50404:5;:35;;;;;;-1:-1:-1;;;50404:35:0;;;;;;;;;;:58;;;;;50456:6;-1:-1:-1;;;;;50443:19:0;:9;-1:-1:-1;;;;;50443:19:0;;50404:58;50400:102;;;50486:4;50479:11;;;;;;50400:102;50515:12;50529:19;50552:6;-1:-1:-1;;;;;50552:17:0;50607:34;;;50643:4;50649:9;50584:75;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50584:75:0;;;;;;;;;;;;;;-1:-1:-1;;;;;50584:75:0;-1:-1:-1;;;;;;50584:75:0;;;;;;;;;;50552:118;;;;50584:75;50552:118;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50514:156;;;;50689:7;:30;;;;;50700:6;:13;50717:2;50700:19;50689:30;:100;;;;-1:-1:-1;50723:28:0;;-1:-1:-1;;;50755:34:0;50723:28;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;50723:66:0;;50689:100;50681:109;;;;;;50151:647;;;;;;:::o;38661:191::-;38735:16;38754:6;;-1:-1:-1;;;;;38771:17:0;;;-1:-1:-1;;;;;;38771:17:0;;;;;;38804:40;;38754:6;;;;;;;38804:40;;38735:16;38804:40;38661:191;;:::o;31956:315::-;32111:8;-1:-1:-1;;;;;32102:17:0;:5;-1:-1:-1;;;;;32102:17:0;;;32094:55;;;;-1:-1:-1;;;32094:55:0;;12572:2:1;32094:55:0;;;12554:21:1;12611:2;12591:18;;;12584:30;12650:27;12630:18;;;12623:55;12695:18;;32094:55:0;12544:175:1;32094:55:0;-1:-1:-1;;;;;32160:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32160:46:0;;;;;;;;;;32222:41;;9739::1;;;32222::0;;9712:18:1;32222:41:0;;;;;;;31956:315;;;:::o;26866:::-;27023:28;27033:4;27039:2;27043:7;27023:9;:28::i;:::-;27070:48;27093:4;27099:2;27103:7;27112:5;27070:22;:48::i;:::-;27062:111;;;;-1:-1:-1;;;27062:111:0;;;;;;;:::i;52105:117::-;52165:13;52198:16;52191:23;;;;;:::i;41172:1308::-;41253:7;41262:12;41487:9;:16;41507:2;41487:22;41483:990;;;41783:4;41768:20;;41762:27;41833:4;41818:20;;41812:27;41891:4;41876:20;;41870:27;41526:9;41862:36;41934:25;41945:4;41862:36;41762:27;41812;41934:10;:25::i;:::-;41927:32;;;;;;;;;41483:990;41981:9;:16;42001:2;41981:22;41977:496;;;42256:4;42241:20;;42235:27;42307:4;42292:20;;42286:27;42349:23;42360:4;42235:27;42286;42349:10;:23::i;:::-;42342:30;;;;;;;;41977:496;-1:-1:-1;42421:1:0;;-1:-1:-1;42425:35:0;41977:496;41172:1308;;;;;:::o;32836:799::-;32991:4;-1:-1:-1;;;;;33012:13:0;;9280:19;:23;33008:620;;33048:72;;-1:-1:-1;;;33048:72:0;;-1:-1:-1;;;;;33048:36:0;;;;;:72;;17022:10;;33099:4;;33105:7;;33114:5;;33048:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33048:72:0;;;;;;;;-1:-1:-1;;33048:72:0;;;;;;;;;;;;:::i;:::-;;;33044:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33290:13:0;;33286:272;;33333:60;;-1:-1:-1;;;33333:60:0;;;;;;;:::i;33286:272::-;33508:6;33502:13;33493:6;33489:2;33485:15;33478:38;33044:529;-1:-1:-1;;;;;;33171:51:0;-1:-1:-1;;;33171:51:0;;-1:-1:-1;33164:58:0;;33008:620;-1:-1:-1;33612:4:0;32836:799;;;;;;:::o;44734:1632::-;44865:7;;45799:66;45786:79;;45782:163;;;-1:-1:-1;45898:1:0;;-1:-1:-1;45902:30:0;45882:51;;45782:163;45959:1;:7;;45964:2;45959:7;;:18;;;;;45970:1;:7;;45975:2;45970:7;;45959:18;45955:102;;;-1:-1:-1;46010:1:0;;-1:-1:-1;46014:30:0;45994:51;;45955:102;46171:24;;;46154:14;46171:24;;;;;;;;;10322:25:1;;;10395:4;10383:17;;10363:18;;;10356:45;;;;10417:18;;;10410:34;;;10460:18;;;10453:34;;;46171:24:0;;10294:19:1;;46171:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46171:24:0;;-1:-1:-1;;46171:24:0;;;-1:-1:-1;;;;;;;46210:20:0;;46206:103;;46263:1;46267:29;46247:50;;;;;;;46206:103;46329:6;-1:-1:-1;46337:20:0;;-1:-1:-1;44734:1632:0;;;;;;;;:::o;43776:344::-;43890:7;;-1:-1:-1;;;;;43936:80:0;;43890:7;44043:25;44059:3;44044:18;;;44066:2;44043:25;:::i;:::-;44027:42;;44087:25;44098:4;44104:1;44107;44110;44087:10;:25::i;:::-;44080:32;;;;;;43776:344;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:550::-;234:5;287:3;280:4;272:6;268:17;264:27;254:2;;309:5;302;295:20;254:2;349:6;336:20;375:18;371:2;368:26;365:2;;;397:18;;:::i;:::-;441:55;484:2;465:13;;-1:-1:-1;;461:27:1;490:4;457:38;441:55;:::i;:::-;521:2;512:7;505:19;567:3;560:4;555:2;547:6;543:15;539:26;536:35;533:2;;;588:5;581;574:20;533:2;657;650:4;642:6;638:17;631:4;622:7;618:18;605:55;680:16;;;698:4;676:27;669:42;;;;684:7;244:498;-1:-1:-1;;244:498:1:o;747:196::-;806:6;859:2;847:9;838:7;834:23;830:32;827:2;;;880:6;872;865:22;827:2;908:29;927:9;908:29;:::i;948:270::-;1016:6;1024;1077:2;1065:9;1056:7;1052:23;1048:32;1045:2;;;1098:6;1090;1083:22;1045:2;1126:29;1145:9;1126:29;:::i;:::-;1116:39;;1174:38;1208:2;1197:9;1193:18;1174:38;:::i;:::-;1164:48;;1035:183;;;;;:::o;1223:338::-;1300:6;1308;1316;1369:2;1357:9;1348:7;1344:23;1340:32;1337:2;;;1390:6;1382;1375:22;1337:2;1418:29;1437:9;1418:29;:::i;:::-;1408:39;;1466:38;1500:2;1489:9;1485:18;1466:38;:::i;:::-;1456:48;;1551:2;1540:9;1536:18;1523:32;1513:42;;1327:234;;;;;:::o;1566:557::-;1661:6;1669;1677;1685;1738:3;1726:9;1717:7;1713:23;1709:33;1706:2;;;1760:6;1752;1745:22;1706:2;1788:29;1807:9;1788:29;:::i;:::-;1778:39;;1836:38;1870:2;1859:9;1855:18;1836:38;:::i;:::-;1826:48;;1921:2;1910:9;1906:18;1893:32;1883:42;;1976:2;1965:9;1961:18;1948:32;2003:18;1995:6;1992:30;1989:2;;;2040:6;2032;2025:22;1989:2;2068:49;2109:7;2100:6;2089:9;2085:22;2068:49;:::i;:::-;2058:59;;;1696:427;;;;;;;:::o;2128:367::-;2193:6;2201;2254:2;2242:9;2233:7;2229:23;2225:32;2222:2;;;2275:6;2267;2260:22;2222:2;2303:29;2322:9;2303:29;:::i;:::-;2293:39;;2382:2;2371:9;2367:18;2354:32;2429:5;2422:13;2415:21;2408:5;2405:32;2395:2;;2456:6;2448;2441:22;2395:2;2484:5;2474:15;;;2212:283;;;;;:::o;2500:264::-;2568:6;2576;2629:2;2617:9;2608:7;2604:23;2600:32;2597:2;;;2650:6;2642;2635:22;2597:2;2678:29;2697:9;2678:29;:::i;:::-;2668:39;2754:2;2739:18;;;;2726:32;;-1:-1:-1;;;2587:177:1:o;2769:1002::-;2853:6;2884:2;2927;2915:9;2906:7;2902:23;2898:32;2895:2;;;2948:6;2940;2933:22;2895:2;2993:9;2980:23;3022:18;3063:2;3055:6;3052:14;3049:2;;;3084:6;3076;3069:22;3049:2;3127:6;3116:9;3112:22;3102:32;;3172:7;3165:4;3161:2;3157:13;3153:27;3143:2;;3199:6;3191;3184:22;3143:2;3240;3227:16;3262:2;3258;3255:10;3252:2;;;3268:18;;:::i;:::-;3314:2;3311:1;3307:10;3297:20;;3337:28;3361:2;3357;3353:11;3337:28;:::i;:::-;3399:15;;;3430:12;;;;3462:11;;;3492;;;3488:20;;3485:33;-1:-1:-1;3482:2:1;;;3536:6;3528;3521:22;3482:2;3563:6;3554:15;;3578:163;3592:2;3589:1;3586:9;3578:163;;;3649:17;;3637:30;;3610:1;3603:9;;;;;3687:12;;;;3719;;3578:163;;;-1:-1:-1;3760:5:1;2864:907;-1:-1:-1;;;;;;;;2864:907:1:o;3776:255::-;3834:6;3887:2;3875:9;3866:7;3862:23;3858:32;3855:2;;;3908:6;3900;3893:22;3855:2;3952:9;3939:23;3971:30;3995:5;3971:30;:::i;4036:259::-;4105:6;4158:2;4146:9;4137:7;4133:23;4129:32;4126:2;;;4179:6;4171;4164:22;4126:2;4216:9;4210:16;4235:30;4259:5;4235:30;:::i;4300:190::-;4359:6;4412:2;4400:9;4391:7;4387:23;4383:32;4380:2;;;4433:6;4425;4418:22;4380:2;-1:-1:-1;4461:23:1;;4370:120;-1:-1:-1;4370:120:1:o;4495:408::-;4572:6;4580;4633:2;4621:9;4612:7;4608:23;4604:32;4601:2;;;4654:6;4646;4639:22;4601:2;4695:9;4682:23;4672:33;;4756:2;4745:9;4741:18;4728:32;4783:18;4775:6;4772:30;4769:2;;;4820:6;4812;4805:22;4769:2;4848:49;4889:7;4880:6;4869:9;4865:22;4848:49;:::i;:::-;4838:59;;;4591:312;;;;;:::o;4908:268::-;4960:3;4998:5;4992:12;5025:6;5020:3;5013:19;5041:63;5097:6;5090:4;5085:3;5081:14;5074:4;5067:5;5063:16;5041:63;:::i;:::-;5158:2;5137:15;-1:-1:-1;;5133:29:1;5124:39;;;;5165:4;5120:50;;4968:208;-1:-1:-1;;4968:208:1:o;5181:184::-;5222:3;5260:5;5254:12;5275:52;5320:6;5315:3;5308:4;5301:5;5297:16;5275:52;:::i;:::-;5343:16;;;;;5230:135;-1:-1:-1;;5230:135:1:o;5370:274::-;5499:3;5537:6;5531:13;5553:53;5599:6;5594:3;5587:4;5579:6;5575:17;5553:53;:::i;:::-;5622:16;;;;;5507:137;-1:-1:-1;;5507:137:1:o;5649:470::-;5828:3;5866:6;5860:13;5882:53;5928:6;5923:3;5916:4;5908:6;5904:17;5882:53;:::i;:::-;5998:13;;5957:16;;;;6020:57;5998:13;5957:16;6054:4;6042:17;;6020:57;:::i;:::-;6093:20;;5836:283;-1:-1:-1;;;;5836:283:1:o;6124:445::-;6356:3;6394:6;6388:13;6410:53;6456:6;6451:3;6444:4;6436:6;6432:17;6410:53;:::i;:::-;-1:-1:-1;;;6485:16:1;;6510:24;;;-1:-1:-1;6561:1:1;6550:13;;6364:205;-1:-1:-1;6364:205:1:o;6574:446::-;6806:3;6844:6;6838:13;6860:53;6906:6;6901:3;6894:4;6886:6;6882:17;6860:53;:::i;:::-;-1:-1:-1;;;6935:16:1;;6960:25;;;-1:-1:-1;7012:1:1;7001:13;;6814:206;-1:-1:-1;6814:206:1:o;7025:1177::-;7201:3;7230;7265:6;7259:13;7295:3;7317:1;7345:9;7341:2;7337:18;7327:28;;7405:2;7394:9;7390:18;7427;7417:2;;7471:4;7463:6;7459:17;7449:27;;7417:2;7497;7545;7537:6;7534:14;7514:18;7511:38;7508:2;;;-1:-1:-1;;;7572:33:1;;7628:4;7625:1;7618:15;7658:4;7579:3;7646:17;7508:2;7689:18;7716:104;;;;7834:1;7829:322;;;;7682:469;;7716:104;-1:-1:-1;;7749:24:1;;7737:37;;7794:16;;;;-1:-1:-1;7716:104:1;;7829:322;17592:4;17611:17;;;17661:4;17645:21;;7924:3;7940:165;7954:6;7951:1;7948:13;7940:165;;;8032:14;;8019:11;;;8012:35;8075:16;;;;7969:10;;7940:165;;;7944:3;;8134:6;8129:3;8125:16;8118:23;;7682:469;;;;;;;8167:29;8192:3;8184:6;8167:29;:::i;:::-;8160:36;7209:993;-1:-1:-1;;;;;7209:993:1:o;8207:675::-;8515:66;8510:3;8503:79;8485:3;8611:6;8605:13;8627:62;8682:6;8677:2;8672:3;8668:12;8661:4;8653:6;8649:17;8627:62;:::i;:::-;8749:13;;8708:16;;;;8771:63;8749:13;8820:2;8812:11;;8805:4;8793:17;;8771:63;:::i;:::-;8854:17;8873:2;8850:26;;8493:389;-1:-1:-1;;;;8493:389:1:o;9095:499::-;-1:-1:-1;;;;;9364:15:1;;;9346:34;;9416:15;;9411:2;9396:18;;9389:43;9463:2;9448:18;;9441:34;;;9511:3;9506:2;9491:18;;9484:31;;;9289:4;;9532:56;;9568:19;;9560:6;9532:56;:::i;:::-;9524:64;9298:296;-1:-1:-1;;;;;;9298:296:1:o;9791:299::-;9966:6;9955:9;9948:25;10009:2;10004;9993:9;9989:18;9982:30;9929:4;10029:55;10080:2;10069:9;10065:18;10057:6;10029:55;:::i;10498:230::-;10647:2;10636:9;10629:21;10610:4;10667:55;10718:2;10707:9;10703:18;10695:6;10667:55;:::i;10733:414::-;10935:2;10917:21;;;10974:2;10954:18;;;10947:30;11013:34;11008:2;10993:18;;10986:62;-1:-1:-1;;;11079:2:1;11064:18;;11057:48;11137:3;11122:19;;10907:240::o;15494:356::-;15696:2;15678:21;;;15715:18;;;15708:30;15774:34;15769:2;15754:18;;15747:62;15841:2;15826:18;;15668:182::o;16257:413::-;16459:2;16441:21;;;16498:2;16478:18;;;16471:30;16537:34;16532:2;16517:18;;16510:62;-1:-1:-1;;;16603:2:1;16588:18;;16581:47;16660:3;16645:19;;16431:239::o;17265:275::-;17336:2;17330:9;17401:2;17382:13;;-1:-1:-1;;17378:27:1;17366:40;;17436:18;17421:34;;17457:22;;;17418:62;17415:2;;;17483:18;;:::i;:::-;17519:2;17512:22;17310:230;;-1:-1:-1;17310:230:1:o;17677:128::-;17717:3;17748:1;17744:6;17741:1;17738:13;17735:2;;;17754:18;;:::i;:::-;-1:-1:-1;17790:9:1;;17725:80::o;17810:120::-;17850:1;17876;17866:2;;17881:18;;:::i;:::-;-1:-1:-1;17915:9:1;;17856:74::o;17935:125::-;17975:4;18003:1;18000;17997:8;17994:2;;;18008:18;;:::i;:::-;-1:-1:-1;18045:9:1;;17984:76::o;18065:258::-;18137:1;18147:113;18161:6;18158:1;18155:13;18147:113;;;18237:11;;;18231:18;18218:11;;;18211:39;18183:2;18176:10;18147:113;;;18278:6;18275:1;18272:13;18269:2;;;-1:-1:-1;;18313:1:1;18295:16;;18288:27;18118:205::o;18328:380::-;18407:1;18403:12;;;;18450;;;18471:2;;18525:4;18517:6;18513:17;18503:27;;18471:2;18578;18570:6;18567:14;18547:18;18544:38;18541:2;;;18624:10;18619:3;18615:20;18612:1;18605:31;18659:4;18656:1;18649:15;18687:4;18684:1;18677:15;18541:2;;18383:325;;;:::o;18713:135::-;18752:3;-1:-1:-1;;18773:17:1;;18770:2;;;18793:18;;:::i;:::-;-1:-1:-1;18840:1:1;18829:13;;18760:88::o;18853:112::-;18885:1;18911;18901:2;;18916:18;;:::i;:::-;-1:-1:-1;18950:9:1;;18891:74::o;18970:127::-;19031:10;19026:3;19022:20;19019:1;19012:31;19062:4;19059:1;19052:15;19086:4;19083:1;19076:15;19102:127;19163:10;19158:3;19154:20;19151:1;19144:31;19194:4;19191:1;19184:15;19218:4;19215:1;19208:15;19234:127;19295:10;19290:3;19286:20;19283:1;19276:31;19326:4;19323:1;19316:15;19350:4;19347:1;19340:15;19366:131;-1:-1:-1;;;;;;19440:32:1;;19430:43;;19420:2;;19487:1;19484;19477:12

Swarm Source

ipfs://4f04f200ef8f32c1adbc091886e922801f2ec654c214142f7ab27dc7776f1a68
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.