ETH Price: $3,414.06 (+3.44%)

Token

LifeMapBook (LMB)
 

Overview

Max Total Supply

4,795 LMB

Holders

2,730

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LMB
0xac8352e02660a4da6732ea27306b59760243ead2
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:
LifeMapBook

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-29
*/

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

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

pragma solidity ^0.8.0;

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

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

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

// File @openzeppelin/contracts/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 erc721a/contracts/[email protected]

// Creator: Chiru Labs

pragma solidity ^0.8.4;

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (
            to.isContract() &&
            !_checkContractOnERC721Received(from, to, tokenId, _data)
        ) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (
                        !_checkContractOnERC721Received(
                            address(0),
                            to,
                            updatedIndex++,
                            _data
                        )
                    ) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try
            IERC721Receiver(to).onERC721Received(
                _msgSender(),
                from,
                tokenId,
                _data
            )
        returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// 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 contracts/LifeMapBook.sol

pragma solidity ^0.8.0;

contract LifeMapBook is ERC721A, Ownable {
    string public baseURI;

    constructor(string memory uri) ERC721A("LifeMapBook", "LMB") {
        baseURI = uri;
    }

    function batchMint(address[] calldata addresses) external payable {
        require(
            addresses.length < 50,
            "LMB: Number Of Addresses Size Must Be Less Than 50"
        );
        for (uint256 index = 0; index < addresses.length; index++) {
            _safeMint(addresses[index], 1);
        }
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        return string(abi.encodePacked(super.tokenURI(tokenId), ".json"));
    }

    /**
     * @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 override returns (string memory) {
        return baseURI;
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function setURI(string memory newuri) public onlyOwner {
        baseURI = newuri;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function burn(uint256 tokenId) public {
        require(
            ownerOf(tokenId) == _msgSender(),
            "LMB: You Are Not The Owner Of The Token"
        );
        super._burn(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","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":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"}]

60806040523480156200001157600080fd5b50604051620038fb380380620038fb833981810160405281019062000037919062000322565b6040518060400160405280600b81526020017f4c6966654d6170426f6f6b0000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4c4d4200000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000bb92919062000200565b508060039080519060200190620000d492919062000200565b50620000e56200012d60201b60201c565b60008190555050506200010d620001016200013260201b60201c565b6200013a60201b60201c565b80600990805190602001906200012592919062000200565b5050620004d7565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020e90620003fc565b90600052602060002090601f0160209004810192826200023257600085556200027e565b82601f106200024d57805160ff19168380011785556200027e565b828001600101855582156200027e579182015b828111156200027d57825182559160200191906001019062000260565b5b5090506200028d919062000291565b5090565b5b80821115620002ac57600081600090555060010162000292565b5090565b6000620002c7620002c18462000390565b62000367565b905082815260208101848484011115620002e057600080fd5b620002ed848285620003c6565b509392505050565b600082601f8301126200030757600080fd5b815162000319848260208601620002b0565b91505092915050565b6000602082840312156200033557600080fd5b600082015167ffffffffffffffff8111156200035057600080fd5b6200035e84828501620002f5565b91505092915050565b60006200037362000386565b905062000381828262000432565b919050565b6000604051905090565b600067ffffffffffffffff821115620003ae57620003ad62000497565b5b620003b982620004c6565b9050602081019050919050565b60005b83811015620003e6578082015181840152602081019050620003c9565b83811115620003f6576000848401525b50505050565b600060028204905060018216806200041557607f821691505b602082108114156200042c576200042b62000468565b5b50919050565b6200043d82620004c6565b810181811067ffffffffffffffff821117156200045f576200045e62000497565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61341480620004e76000396000f3fe60806040526004361061012a5760003560e01c80636c0360eb116100ab578063a22cb4651161006f578063a22cb465146103de578063b88d4fde14610407578063c87b56dd14610430578063d67b06c11461046d578063e985e9c514610489578063f2fde38b146104c65761012a565b80636c0360eb1461030957806370a0823114610334578063715018a6146103715780638da5cb5b1461038857806395d89b41146103b35761012a565b806318160ddd116100f257806318160ddd1461022657806323b872dd1461025157806342842e0e1461027a57806342966c68146102a35780636352211e146102cc5761012a565b806301ffc9a71461012f57806302fe53051461016c57806306fdde0314610195578063081812fc146101c0578063095ea7b3146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190612a9e565b6104ef565b6040516101639190612d86565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190612af0565b6105d1565b005b3480156101a157600080fd5b506101aa610667565b6040516101b79190612da1565b60405180910390f35b3480156101cc57600080fd5b506101e760048036038101906101e29190612b31565b6106f9565b6040516101f49190612d1f565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f9190612a1d565b610775565b005b34801561023257600080fd5b5061023b610880565b6040516102489190612e43565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190612917565b610897565b005b34801561028657600080fd5b506102a1600480360381019061029c9190612917565b6108a7565b005b3480156102af57600080fd5b506102ca60048036038101906102c59190612b31565b6108c7565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190612b31565b610950565b6040516103009190612d1f565b60405180910390f35b34801561031557600080fd5b5061031e610966565b60405161032b9190612da1565b60405180910390f35b34801561034057600080fd5b5061035b600480360381019061035691906128b2565b6109f4565b6040516103689190612e43565b60405180910390f35b34801561037d57600080fd5b50610386610ac4565b005b34801561039457600080fd5b5061039d610b4c565b6040516103aa9190612d1f565b60405180910390f35b3480156103bf57600080fd5b506103c8610b76565b6040516103d59190612da1565b60405180910390f35b3480156103ea57600080fd5b50610405600480360381019061040091906129e1565b610c08565b005b34801561041357600080fd5b5061042e60048036038101906104299190612966565b610d80565b005b34801561043c57600080fd5b5061045760048036038101906104529190612b31565b610dfc565b6040516104649190612da1565b60405180910390f35b61048760048036038101906104829190612a59565b610e2d565b005b34801561049557600080fd5b506104b060048036038101906104ab91906128db565b610ef1565b6040516104bd9190612d86565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e891906128b2565b610f85565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ca57506105c98261107d565b5b9050919050565b6105d96110e7565b73ffffffffffffffffffffffffffffffffffffffff166105f7610b4c565b73ffffffffffffffffffffffffffffffffffffffff161461064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064490612de3565b60405180910390fd5b8060099080519060200190610663929190612649565b5050565b60606002805461067690613099565b80601f01602080910402602001604051908101604052809291908181526020018280546106a290613099565b80156106ef5780601f106106c4576101008083540402835291602001916106ef565b820191906000526020600020905b8154815290600101906020018083116106d257829003601f168201915b5050505050905090565b6000610704826110ef565b61073a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078082610950565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108076110e7565b73ffffffffffffffffffffffffffffffffffffffff16141580156108395750610837816108326110e7565b610ef1565b155b15610870576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61087b83838361113d565b505050565b600061088a6111ef565b6001546000540303905090565b6108a28383836111f4565b505050565b6108c283838360405180602001604052806000815250610d80565b505050565b6108cf6110e7565b73ffffffffffffffffffffffffffffffffffffffff166108ee82610950565b73ffffffffffffffffffffffffffffffffffffffff1614610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b90612e03565b60405180910390fd5b61094d816116e5565b50565b600061095b82611a89565b600001519050919050565b6009805461097390613099565b80601f016020809104026020016040519081016040528092919081815260200182805461099f90613099565b80156109ec5780601f106109c1576101008083540402835291602001916109ec565b820191906000526020600020905b8154815290600101906020018083116109cf57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a5c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610acc6110e7565b73ffffffffffffffffffffffffffffffffffffffff16610aea610b4c565b73ffffffffffffffffffffffffffffffffffffffff1614610b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3790612de3565b60405180910390fd5b610b4a6000611d18565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610b8590613099565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb190613099565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b5050505050905090565b610c106110e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c75576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610c826110e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d2f6110e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d749190612d86565b60405180910390a35050565b610d8b8484846111f4565b610daa8373ffffffffffffffffffffffffffffffffffffffff16611dde565b8015610dbf5750610dbd84848484611e01565b155b15610df6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610e0782611f61565b604051602001610e179190612cfd565b6040516020818303038152906040529050919050565b60328282905010610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90612e23565b60405180910390fd5b60005b82829050811015610eec57610ed9838383818110610ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610ed291906128b2565b6001612000565b8080610ee4906130fc565b915050610e76565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f8d6110e7565b73ffffffffffffffffffffffffffffffffffffffff16610fab610b4c565b73ffffffffffffffffffffffffffffffffffffffff1614611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff890612de3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890612dc3565b60405180910390fd5b61107a81611d18565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000816110fa6111ef565b11158015611109575060005482105b8015611136575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006111ff82611a89565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166112266110e7565b73ffffffffffffffffffffffffffffffffffffffff161480611259575061125882600001516112536110e7565b610ef1565b5b8061129e57506112676110e7565b73ffffffffffffffffffffffffffffffffffffffff16611286846106f9565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806112d7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611340576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156113a7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113b4858585600161201e565b6113c4600084846000015161113d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611675576000548110156116745782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116de8585856001612024565b5050505050565b60006116f082611a89565b90506117048160000151600084600161201e565b611714600083836000015161113d565b600160056000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160056000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600001516004600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160046000848152602001908152602001600020600001601c6101000a81548160ff0219169083151502179055506000600183019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a00576000548110156119ff5781600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5081600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a7381600001516000846001612024565b6001600081548092919060010191905055505050565b611a916126cf565b600082905080611a9f6111ef565b11158015611aae575060005481105b15611ce1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611cdf57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bc3578092505050611d13565b5b600115611cde57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cd9578092505050611d13565b611bc4565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e276110e7565b8786866040518563ffffffff1660e01b8152600401611e499493929190612d3a565b602060405180830381600087803b158015611e6357600080fd5b505af1925050508015611e9457506040513d601f19601f82011682018060405250810190611e919190612ac7565b60015b611f0e573d8060008114611ec4576040519150601f19603f3d011682016040523d82523d6000602084013e611ec9565b606091505b50600081511415611f06576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060611f6c826110ef565b611fa2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fac61202a565b9050600081511415611fcd5760405180602001604052806000815250611ff8565b80611fd7846120bc565b604051602001611fe8929190612cd9565b6040516020818303038152906040525b915050919050565b61201a828260405180602001604052806000815250612269565b5050565b50505050565b50505050565b60606009805461203990613099565b80601f016020809104026020016040519081016040528092919081815260200182805461206590613099565b80156120b25780601f10612087576101008083540402835291602001916120b2565b820191906000526020600020905b81548152906001019060200180831161209557829003601f168201915b5050505050905090565b60606000821415612104576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612264565b600082905060005b6000821461213657808061211f906130fc565b915050600a8261212f9190612f7e565b915061210c565b60008167ffffffffffffffff811115612178577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121aa5781602001600182028036833780820191505090505b5090505b6000851461225d576001826121c39190612faf565b9150600a856121d29190613145565b60306121de9190612f28565b60f81b81838151811061221a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122569190612f7e565b94506121ae565b8093505050505b919050565b612276838383600161227b565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156122e8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612323576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612330600086838761201e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156124fa57506124f98773ffffffffffffffffffffffffffffffffffffffff16611dde565b5b156125c0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461256f6000888480600101955088611e01565b6125a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156125005782600054146125bb57600080fd5b61262c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156125c1575b8160008190555050506126426000868387612024565b5050505050565b82805461265590613099565b90600052602060002090601f01602090048101928261267757600085556126be565b82601f1061269057805160ff19168380011785556126be565b828001600101855582156126be579182015b828111156126bd5782518255916020019190600101906126a2565b5b5090506126cb9190612712565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561272b576000816000905550600101612713565b5090565b600061274261273d84612e83565b612e5e565b90508281526020810184848401111561275a57600080fd5b612765848285613057565b509392505050565b600061278061277b84612eb4565b612e5e565b90508281526020810184848401111561279857600080fd5b6127a3848285613057565b509392505050565b6000813590506127ba81613382565b92915050565b60008083601f8401126127d257600080fd5b8235905067ffffffffffffffff8111156127eb57600080fd5b60208301915083602082028301111561280357600080fd5b9250929050565b60008135905061281981613399565b92915050565b60008135905061282e816133b0565b92915050565b600081519050612843816133b0565b92915050565b600082601f83011261285a57600080fd5b813561286a84826020860161272f565b91505092915050565b600082601f83011261288457600080fd5b813561289484826020860161276d565b91505092915050565b6000813590506128ac816133c7565b92915050565b6000602082840312156128c457600080fd5b60006128d2848285016127ab565b91505092915050565b600080604083850312156128ee57600080fd5b60006128fc858286016127ab565b925050602061290d858286016127ab565b9150509250929050565b60008060006060848603121561292c57600080fd5b600061293a868287016127ab565b935050602061294b868287016127ab565b925050604061295c8682870161289d565b9150509250925092565b6000806000806080858703121561297c57600080fd5b600061298a878288016127ab565b945050602061299b878288016127ab565b93505060406129ac8782880161289d565b925050606085013567ffffffffffffffff8111156129c957600080fd5b6129d587828801612849565b91505092959194509250565b600080604083850312156129f457600080fd5b6000612a02858286016127ab565b9250506020612a138582860161280a565b9150509250929050565b60008060408385031215612a3057600080fd5b6000612a3e858286016127ab565b9250506020612a4f8582860161289d565b9150509250929050565b60008060208385031215612a6c57600080fd5b600083013567ffffffffffffffff811115612a8657600080fd5b612a92858286016127c0565b92509250509250929050565b600060208284031215612ab057600080fd5b6000612abe8482850161281f565b91505092915050565b600060208284031215612ad957600080fd5b6000612ae784828501612834565b91505092915050565b600060208284031215612b0257600080fd5b600082013567ffffffffffffffff811115612b1c57600080fd5b612b2884828501612873565b91505092915050565b600060208284031215612b4357600080fd5b6000612b518482850161289d565b91505092915050565b612b6381612fe3565b82525050565b612b7281612ff5565b82525050565b6000612b8382612ee5565b612b8d8185612efb565b9350612b9d818560208601613066565b612ba681613232565b840191505092915050565b6000612bbc82612ef0565b612bc68185612f0c565b9350612bd6818560208601613066565b612bdf81613232565b840191505092915050565b6000612bf582612ef0565b612bff8185612f1d565b9350612c0f818560208601613066565b80840191505092915050565b6000612c28602683612f0c565b9150612c3382613243565b604082019050919050565b6000612c4b600583612f1d565b9150612c5682613292565b600582019050919050565b6000612c6e602083612f0c565b9150612c79826132bb565b602082019050919050565b6000612c91602783612f0c565b9150612c9c826132e4565b604082019050919050565b6000612cb4603283612f0c565b9150612cbf82613333565b604082019050919050565b612cd38161304d565b82525050565b6000612ce58285612bea565b9150612cf18284612bea565b91508190509392505050565b6000612d098284612bea565b9150612d1482612c3e565b915081905092915050565b6000602082019050612d346000830184612b5a565b92915050565b6000608082019050612d4f6000830187612b5a565b612d5c6020830186612b5a565b612d696040830185612cca565b8181036060830152612d7b8184612b78565b905095945050505050565b6000602082019050612d9b6000830184612b69565b92915050565b60006020820190508181036000830152612dbb8184612bb1565b905092915050565b60006020820190508181036000830152612ddc81612c1b565b9050919050565b60006020820190508181036000830152612dfc81612c61565b9050919050565b60006020820190508181036000830152612e1c81612c84565b9050919050565b60006020820190508181036000830152612e3c81612ca7565b9050919050565b6000602082019050612e586000830184612cca565b92915050565b6000612e68612e79565b9050612e7482826130cb565b919050565b6000604051905090565b600067ffffffffffffffff821115612e9e57612e9d613203565b5b612ea782613232565b9050602081019050919050565b600067ffffffffffffffff821115612ecf57612ece613203565b5b612ed882613232565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f338261304d565b9150612f3e8361304d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f7357612f72613176565b5b828201905092915050565b6000612f898261304d565b9150612f948361304d565b925082612fa457612fa36131a5565b5b828204905092915050565b6000612fba8261304d565b9150612fc58361304d565b925082821015612fd857612fd7613176565b5b828203905092915050565b6000612fee8261302d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613084578082015181840152602081019050613069565b83811115613093576000848401525b50505050565b600060028204905060018216806130b157607f821691505b602082108114156130c5576130c46131d4565b5b50919050565b6130d482613232565b810181811067ffffffffffffffff821117156130f3576130f2613203565b5b80604052505050565b60006131078261304d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561313a57613139613176565b5b600182019050919050565b60006131508261304d565b915061315b8361304d565b92508261316b5761316a6131a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4c4d423a20596f7520417265204e6f7420546865204f776e6572204f6620546860008201527f6520546f6b656e00000000000000000000000000000000000000000000000000602082015250565b7f4c4d423a204e756d626572204f66204164647265737365732053697a65204d7560008201527f7374204265204c657373205468616e2035300000000000000000000000000000602082015250565b61338b81612fe3565b811461339657600080fd5b50565b6133a281612ff5565b81146133ad57600080fd5b50565b6133b981613001565b81146133c457600080fd5b50565b6133d08161304d565b81146133db57600080fd5b5056fea26469706673582212202dec5af0049119018534f69c2a38ab1ebf08d4bf91f5ad5818d09a7f03f4c76b64736f6c634300080400330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d623835716a395a76435a6f5a7853515656506261666578795275367674545364707448656a756657644a4a632f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061012a5760003560e01c80636c0360eb116100ab578063a22cb4651161006f578063a22cb465146103de578063b88d4fde14610407578063c87b56dd14610430578063d67b06c11461046d578063e985e9c514610489578063f2fde38b146104c65761012a565b80636c0360eb1461030957806370a0823114610334578063715018a6146103715780638da5cb5b1461038857806395d89b41146103b35761012a565b806318160ddd116100f257806318160ddd1461022657806323b872dd1461025157806342842e0e1461027a57806342966c68146102a35780636352211e146102cc5761012a565b806301ffc9a71461012f57806302fe53051461016c57806306fdde0314610195578063081812fc146101c0578063095ea7b3146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190612a9e565b6104ef565b6040516101639190612d86565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190612af0565b6105d1565b005b3480156101a157600080fd5b506101aa610667565b6040516101b79190612da1565b60405180910390f35b3480156101cc57600080fd5b506101e760048036038101906101e29190612b31565b6106f9565b6040516101f49190612d1f565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f9190612a1d565b610775565b005b34801561023257600080fd5b5061023b610880565b6040516102489190612e43565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190612917565b610897565b005b34801561028657600080fd5b506102a1600480360381019061029c9190612917565b6108a7565b005b3480156102af57600080fd5b506102ca60048036038101906102c59190612b31565b6108c7565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190612b31565b610950565b6040516103009190612d1f565b60405180910390f35b34801561031557600080fd5b5061031e610966565b60405161032b9190612da1565b60405180910390f35b34801561034057600080fd5b5061035b600480360381019061035691906128b2565b6109f4565b6040516103689190612e43565b60405180910390f35b34801561037d57600080fd5b50610386610ac4565b005b34801561039457600080fd5b5061039d610b4c565b6040516103aa9190612d1f565b60405180910390f35b3480156103bf57600080fd5b506103c8610b76565b6040516103d59190612da1565b60405180910390f35b3480156103ea57600080fd5b50610405600480360381019061040091906129e1565b610c08565b005b34801561041357600080fd5b5061042e60048036038101906104299190612966565b610d80565b005b34801561043c57600080fd5b5061045760048036038101906104529190612b31565b610dfc565b6040516104649190612da1565b60405180910390f35b61048760048036038101906104829190612a59565b610e2d565b005b34801561049557600080fd5b506104b060048036038101906104ab91906128db565b610ef1565b6040516104bd9190612d86565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e891906128b2565b610f85565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ca57506105c98261107d565b5b9050919050565b6105d96110e7565b73ffffffffffffffffffffffffffffffffffffffff166105f7610b4c565b73ffffffffffffffffffffffffffffffffffffffff161461064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064490612de3565b60405180910390fd5b8060099080519060200190610663929190612649565b5050565b60606002805461067690613099565b80601f01602080910402602001604051908101604052809291908181526020018280546106a290613099565b80156106ef5780601f106106c4576101008083540402835291602001916106ef565b820191906000526020600020905b8154815290600101906020018083116106d257829003601f168201915b5050505050905090565b6000610704826110ef565b61073a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078082610950565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108076110e7565b73ffffffffffffffffffffffffffffffffffffffff16141580156108395750610837816108326110e7565b610ef1565b155b15610870576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61087b83838361113d565b505050565b600061088a6111ef565b6001546000540303905090565b6108a28383836111f4565b505050565b6108c283838360405180602001604052806000815250610d80565b505050565b6108cf6110e7565b73ffffffffffffffffffffffffffffffffffffffff166108ee82610950565b73ffffffffffffffffffffffffffffffffffffffff1614610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b90612e03565b60405180910390fd5b61094d816116e5565b50565b600061095b82611a89565b600001519050919050565b6009805461097390613099565b80601f016020809104026020016040519081016040528092919081815260200182805461099f90613099565b80156109ec5780601f106109c1576101008083540402835291602001916109ec565b820191906000526020600020905b8154815290600101906020018083116109cf57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a5c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610acc6110e7565b73ffffffffffffffffffffffffffffffffffffffff16610aea610b4c565b73ffffffffffffffffffffffffffffffffffffffff1614610b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3790612de3565b60405180910390fd5b610b4a6000611d18565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610b8590613099565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb190613099565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b5050505050905090565b610c106110e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c75576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610c826110e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d2f6110e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d749190612d86565b60405180910390a35050565b610d8b8484846111f4565b610daa8373ffffffffffffffffffffffffffffffffffffffff16611dde565b8015610dbf5750610dbd84848484611e01565b155b15610df6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610e0782611f61565b604051602001610e179190612cfd565b6040516020818303038152906040529050919050565b60328282905010610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90612e23565b60405180910390fd5b60005b82829050811015610eec57610ed9838383818110610ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610ed291906128b2565b6001612000565b8080610ee4906130fc565b915050610e76565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f8d6110e7565b73ffffffffffffffffffffffffffffffffffffffff16610fab610b4c565b73ffffffffffffffffffffffffffffffffffffffff1614611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff890612de3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890612dc3565b60405180910390fd5b61107a81611d18565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000816110fa6111ef565b11158015611109575060005482105b8015611136575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006111ff82611a89565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166112266110e7565b73ffffffffffffffffffffffffffffffffffffffff161480611259575061125882600001516112536110e7565b610ef1565b5b8061129e57506112676110e7565b73ffffffffffffffffffffffffffffffffffffffff16611286846106f9565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806112d7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611340576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156113a7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113b4858585600161201e565b6113c4600084846000015161113d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611675576000548110156116745782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116de8585856001612024565b5050505050565b60006116f082611a89565b90506117048160000151600084600161201e565b611714600083836000015161113d565b600160056000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160056000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600001516004600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160046000848152602001908152602001600020600001601c6101000a81548160ff0219169083151502179055506000600183019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a00576000548110156119ff5781600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5081600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a7381600001516000846001612024565b6001600081548092919060010191905055505050565b611a916126cf565b600082905080611a9f6111ef565b11158015611aae575060005481105b15611ce1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611cdf57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bc3578092505050611d13565b5b600115611cde57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cd9578092505050611d13565b611bc4565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e276110e7565b8786866040518563ffffffff1660e01b8152600401611e499493929190612d3a565b602060405180830381600087803b158015611e6357600080fd5b505af1925050508015611e9457506040513d601f19601f82011682018060405250810190611e919190612ac7565b60015b611f0e573d8060008114611ec4576040519150601f19603f3d011682016040523d82523d6000602084013e611ec9565b606091505b50600081511415611f06576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060611f6c826110ef565b611fa2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fac61202a565b9050600081511415611fcd5760405180602001604052806000815250611ff8565b80611fd7846120bc565b604051602001611fe8929190612cd9565b6040516020818303038152906040525b915050919050565b61201a828260405180602001604052806000815250612269565b5050565b50505050565b50505050565b60606009805461203990613099565b80601f016020809104026020016040519081016040528092919081815260200182805461206590613099565b80156120b25780601f10612087576101008083540402835291602001916120b2565b820191906000526020600020905b81548152906001019060200180831161209557829003601f168201915b5050505050905090565b60606000821415612104576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612264565b600082905060005b6000821461213657808061211f906130fc565b915050600a8261212f9190612f7e565b915061210c565b60008167ffffffffffffffff811115612178577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121aa5781602001600182028036833780820191505090505b5090505b6000851461225d576001826121c39190612faf565b9150600a856121d29190613145565b60306121de9190612f28565b60f81b81838151811061221a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122569190612f7e565b94506121ae565b8093505050505b919050565b612276838383600161227b565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156122e8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612323576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612330600086838761201e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156124fa57506124f98773ffffffffffffffffffffffffffffffffffffffff16611dde565b5b156125c0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461256f6000888480600101955088611e01565b6125a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156125005782600054146125bb57600080fd5b61262c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156125c1575b8160008190555050506126426000868387612024565b5050505050565b82805461265590613099565b90600052602060002090601f01602090048101928261267757600085556126be565b82601f1061269057805160ff19168380011785556126be565b828001600101855582156126be579182015b828111156126bd5782518255916020019190600101906126a2565b5b5090506126cb9190612712565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561272b576000816000905550600101612713565b5090565b600061274261273d84612e83565b612e5e565b90508281526020810184848401111561275a57600080fd5b612765848285613057565b509392505050565b600061278061277b84612eb4565b612e5e565b90508281526020810184848401111561279857600080fd5b6127a3848285613057565b509392505050565b6000813590506127ba81613382565b92915050565b60008083601f8401126127d257600080fd5b8235905067ffffffffffffffff8111156127eb57600080fd5b60208301915083602082028301111561280357600080fd5b9250929050565b60008135905061281981613399565b92915050565b60008135905061282e816133b0565b92915050565b600081519050612843816133b0565b92915050565b600082601f83011261285a57600080fd5b813561286a84826020860161272f565b91505092915050565b600082601f83011261288457600080fd5b813561289484826020860161276d565b91505092915050565b6000813590506128ac816133c7565b92915050565b6000602082840312156128c457600080fd5b60006128d2848285016127ab565b91505092915050565b600080604083850312156128ee57600080fd5b60006128fc858286016127ab565b925050602061290d858286016127ab565b9150509250929050565b60008060006060848603121561292c57600080fd5b600061293a868287016127ab565b935050602061294b868287016127ab565b925050604061295c8682870161289d565b9150509250925092565b6000806000806080858703121561297c57600080fd5b600061298a878288016127ab565b945050602061299b878288016127ab565b93505060406129ac8782880161289d565b925050606085013567ffffffffffffffff8111156129c957600080fd5b6129d587828801612849565b91505092959194509250565b600080604083850312156129f457600080fd5b6000612a02858286016127ab565b9250506020612a138582860161280a565b9150509250929050565b60008060408385031215612a3057600080fd5b6000612a3e858286016127ab565b9250506020612a4f8582860161289d565b9150509250929050565b60008060208385031215612a6c57600080fd5b600083013567ffffffffffffffff811115612a8657600080fd5b612a92858286016127c0565b92509250509250929050565b600060208284031215612ab057600080fd5b6000612abe8482850161281f565b91505092915050565b600060208284031215612ad957600080fd5b6000612ae784828501612834565b91505092915050565b600060208284031215612b0257600080fd5b600082013567ffffffffffffffff811115612b1c57600080fd5b612b2884828501612873565b91505092915050565b600060208284031215612b4357600080fd5b6000612b518482850161289d565b91505092915050565b612b6381612fe3565b82525050565b612b7281612ff5565b82525050565b6000612b8382612ee5565b612b8d8185612efb565b9350612b9d818560208601613066565b612ba681613232565b840191505092915050565b6000612bbc82612ef0565b612bc68185612f0c565b9350612bd6818560208601613066565b612bdf81613232565b840191505092915050565b6000612bf582612ef0565b612bff8185612f1d565b9350612c0f818560208601613066565b80840191505092915050565b6000612c28602683612f0c565b9150612c3382613243565b604082019050919050565b6000612c4b600583612f1d565b9150612c5682613292565b600582019050919050565b6000612c6e602083612f0c565b9150612c79826132bb565b602082019050919050565b6000612c91602783612f0c565b9150612c9c826132e4565b604082019050919050565b6000612cb4603283612f0c565b9150612cbf82613333565b604082019050919050565b612cd38161304d565b82525050565b6000612ce58285612bea565b9150612cf18284612bea565b91508190509392505050565b6000612d098284612bea565b9150612d1482612c3e565b915081905092915050565b6000602082019050612d346000830184612b5a565b92915050565b6000608082019050612d4f6000830187612b5a565b612d5c6020830186612b5a565b612d696040830185612cca565b8181036060830152612d7b8184612b78565b905095945050505050565b6000602082019050612d9b6000830184612b69565b92915050565b60006020820190508181036000830152612dbb8184612bb1565b905092915050565b60006020820190508181036000830152612ddc81612c1b565b9050919050565b60006020820190508181036000830152612dfc81612c61565b9050919050565b60006020820190508181036000830152612e1c81612c84565b9050919050565b60006020820190508181036000830152612e3c81612ca7565b9050919050565b6000602082019050612e586000830184612cca565b92915050565b6000612e68612e79565b9050612e7482826130cb565b919050565b6000604051905090565b600067ffffffffffffffff821115612e9e57612e9d613203565b5b612ea782613232565b9050602081019050919050565b600067ffffffffffffffff821115612ecf57612ece613203565b5b612ed882613232565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f338261304d565b9150612f3e8361304d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f7357612f72613176565b5b828201905092915050565b6000612f898261304d565b9150612f948361304d565b925082612fa457612fa36131a5565b5b828204905092915050565b6000612fba8261304d565b9150612fc58361304d565b925082821015612fd857612fd7613176565b5b828203905092915050565b6000612fee8261302d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613084578082015181840152602081019050613069565b83811115613093576000848401525b50505050565b600060028204905060018216806130b157607f821691505b602082108114156130c5576130c46131d4565b5b50919050565b6130d482613232565b810181811067ffffffffffffffff821117156130f3576130f2613203565b5b80604052505050565b60006131078261304d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561313a57613139613176565b5b600182019050919050565b60006131508261304d565b915061315b8361304d565b92508261316b5761316a6131a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4c4d423a20596f7520417265204e6f7420546865204f776e6572204f6620546860008201527f6520546f6b656e00000000000000000000000000000000000000000000000000602082015250565b7f4c4d423a204e756d626572204f66204164647265737365732053697a65204d7560008201527f7374204265204c657373205468616e2035300000000000000000000000000000602082015250565b61338b81612fe3565b811461339657600080fd5b50565b6133a281612ff5565b81146133ad57600080fd5b50565b6133b981613001565b81146133c457600080fd5b50565b6133d08161304d565b81146133db57600080fd5b5056fea26469706673582212202dec5af0049119018534f69c2a38ab1ebf08d4bf91f5ad5818d09a7f03f4c76b64736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d623835716a395a76435a6f5a7853515656506261666578795275367674545364707448656a756657644a4a632f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uri (string): https://ipfs.io/ipfs/Qmb85qj9ZvCZoZxSQVVPbafexyRu6vtTSdptHejufWdJJc/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [2] : 68747470733a2f2f697066732e696f2f697066732f516d623835716a395a7643
Arg [3] : 5a6f5a7853515656506261666578795275367674545364707448656a75665764
Arg [4] : 4a4a632f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

47274:2537:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26449:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49280:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29916:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31516:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31079:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25698:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32487:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32728:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49599:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29725:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47322:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26868:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46356:103;;;;;;;;;;;;;:::i;:::-;;45705:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30085:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31833:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32984:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47856:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47453:332;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32206:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46614:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26449:355;26596:4;26653:25;26638:40;;;:11;:40;;;;:105;;;;26710:33;26695:48;;;:11;:48;;;;26638:105;:158;;;;26760:36;26784:11;26760:23;:36::i;:::-;26638:158;26618:178;;26449:355;;;:::o;49280:90::-;45936:12;:10;:12::i;:::-;45925:23;;:7;:5;:7::i;:::-;:23;;;45917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49356:6:::1;49346:7;:16;;;;;;;;;;;;:::i;:::-;;49280:90:::0;:::o;29916:100::-;29970:13;30003:5;29996:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29916:100;:::o;31516:245::-;31620:7;31650:16;31658:7;31650;:16::i;:::-;31645:64;;31675:34;;;;;;;;;;;;;;31645:64;31729:15;:24;31745:7;31729:24;;;;;;;;;;;;;;;;;;;;;31722:31;;31516:245;;;:::o;31079:371::-;31152:13;31168:24;31184:7;31168:15;:24::i;:::-;31152:40;;31213:5;31207:11;;:2;:11;;;31203:48;;;31227:24;;;;;;;;;;;;;;31203:48;31284:5;31268:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;31294:37;31311:5;31318:12;:10;:12::i;:::-;31294:16;:37::i;:::-;31293:38;31268:63;31264:138;;;31355:35;;;;;;;;;;;;;;31264:138;31414:28;31423:2;31427:7;31436:5;31414:8;:28::i;:::-;31079:371;;;:::o;25698:303::-;25742:7;25967:15;:13;:15::i;:::-;25952:12;;25936:13;;:28;:46;25929:53;;25698:303;:::o;32487:170::-;32621:28;32631:4;32637:2;32641:7;32621:9;:28::i;:::-;32487:170;;;:::o;32728:185::-;32866:39;32883:4;32889:2;32893:7;32866:39;;;;;;;;;;;;:16;:39::i;:::-;32728:185;;;:::o;49599:209::-;49690:12;:10;:12::i;:::-;49670:32;;:16;49678:7;49670;:16::i;:::-;:32;;;49648:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;49780:20;49792:7;49780:11;:20::i;:::-;49599:209;:::o;29725:124::-;29789:7;29816:20;29828:7;29816:11;:20::i;:::-;:25;;;29809:32;;29725:124;;;:::o;47322:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26868:206::-;26932:7;26973:1;26956:19;;:5;:19;;;26952:60;;;26984:28;;;;;;;;;;;;;;26952:60;27038:12;:19;27051:5;27038:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27030:36;;27023:43;;26868:206;;;:::o;46356:103::-;45936:12;:10;:12::i;:::-;45925:23;;:7;:5;:7::i;:::-;:23;;;45917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46421:30:::1;46448:1;46421:18;:30::i;:::-;46356:103::o:0;45705:87::-;45751:7;45778:6;;;;;;;;;;;45771:13;;45705:87;:::o;30085:104::-;30141:13;30174:7;30167:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30085:104;:::o;31833:302::-;31959:12;:10;:12::i;:::-;31947:24;;:8;:24;;;31943:54;;;31980:17;;;;;;;;;;;;;;31943:54;32055:8;32010:18;:32;32029:12;:10;:12::i;:::-;32010:32;;;;;;;;;;;;;;;:42;32043:8;32010:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32108:8;32079:48;;32094:12;:10;:12::i;:::-;32079:48;;;32118:8;32079:48;;;;;;:::i;:::-;;;;;;;;31833:302;;:::o;32984:406::-;33151:28;33161:4;33167:2;33171:7;33151:9;:28::i;:::-;33208:15;:2;:13;;;:15::i;:::-;:89;;;;;33241:56;33272:4;33278:2;33282:7;33291:5;33241:30;:56::i;:::-;33240:57;33208:89;33190:193;;;33331:40;;;;;;;;;;;;;;33190:193;32984:406;;;;:::o;47856:222::-;47974:13;48036:23;48051:7;48036:14;:23::i;:::-;48019:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;48005:65;;47856:222;;;:::o;47453:332::-;47571:2;47552:9;;:16;;:21;47530:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;47667:13;47662:116;47694:9;;:16;;47686:5;:24;47662:116;;;47736:30;47746:9;;47756:5;47746:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47764:1;47736:9;:30::i;:::-;47712:7;;;;;:::i;:::-;;;;47662:116;;;;47453:332;;:::o;32206:214::-;32348:4;32377:18;:25;32396:5;32377:25;;;;;;;;;;;;;;;:35;32403:8;32377:35;;;;;;;;;;;;;;;;;;;;;;;;;32370:42;;32206:214;;;;:::o;46614:238::-;45936:12;:10;:12::i;:::-;45925:23;;:7;:5;:7::i;:::-;:23;;;45917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46737:1:::1;46717:22;;:8;:22;;;;46695:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46816:28;46835:8;46816:18;:28::i;:::-;46614:238:::0;:::o;21757:207::-;21887:4;21931:25;21916:40;;;:11;:40;;;;21909:47;;21757:207;;;:::o;18516:98::-;18569:7;18596:10;18589:17;;18516:98;:::o;33645:213::-;33702:4;33758:7;33739:15;:13;:15::i;:::-;:26;;:66;;;;;33792:13;;33782:7;:23;33739:66;:111;;;;;33823:11;:20;33835:7;33823:20;;;;;;;;;;;:27;;;;;;;;;;;;33822:28;33739:111;33719:131;;33645:213;;;:::o;41525:196::-;41667:2;41640:15;:24;41656:7;41640:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41705:7;41701:2;41685:28;;41694:5;41685:28;;;;;;;;;;;;41525:196;;;:::o;25422:92::-;25478:7;25422:92;:::o;36975:2138::-;37090:35;37128:20;37140:7;37128:11;:20::i;:::-;37090:58;;37161:22;37203:13;:18;;;37187:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;37238:50;37255:13;:18;;;37275:12;:10;:12::i;:::-;37238:16;:50::i;:::-;37187:101;:154;;;;37329:12;:10;:12::i;:::-;37305:36;;:20;37317:7;37305:11;:20::i;:::-;:36;;;37187:154;37161:181;;37360:17;37355:66;;37386:35;;;;;;;;;;;;;;37355:66;37458:4;37436:26;;:13;:18;;;:26;;;37432:67;;37471:28;;;;;;;;;;;;;;37432:67;37528:1;37514:16;;:2;:16;;;37510:52;;;37539:23;;;;;;;;;;;;;;37510:52;37575:43;37597:4;37603:2;37607:7;37616:1;37575:21;:43::i;:::-;37683:49;37700:1;37704:7;37713:13;:18;;;37683:8;:49::i;:::-;38058:1;38028:12;:18;38041:4;38028:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38102:1;38074:12;:16;38087:2;38074:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38148:2;38120:11;:20;38132:7;38120:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;38210:15;38165:11;:20;38177:7;38165:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;38478:19;38510:1;38500:7;:11;38478:33;;38571:1;38530:43;;:11;:24;38542:11;38530:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;38526:471;;;38755:13;;38741:11;:27;38737:245;;;38825:13;:18;;;38793:11;:24;38805:11;38793:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;38908:13;:54;;;38866:11;:24;38878:11;38866:24;;;;;;;;;;;:39;;;:96;;;;;;;;;;;;;;;;;;38737:245;38526:471;36975:2138;39044:7;39040:2;39025:27;;39034:4;39025:27;;;;;;;;;;;;39063:42;39084:4;39090:2;39094:7;39103:1;39063:20;:42::i;:::-;36975:2138;;;;;:::o;39342:2065::-;39402:35;39440:20;39452:7;39440:11;:20::i;:::-;39402:58;;39473:65;39495:13;:18;;;39523:1;39527:7;39536:1;39473:21;:65::i;:::-;39603:49;39620:1;39624:7;39633:13;:18;;;39603:8;:49::i;:::-;39992:1;39948:12;:32;39961:13;:18;;;39948:32;;;;;;;;;;;;;;;:40;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40057:1;40008:12;:32;40021:13;:18;;;40008:32;;;;;;;;;;;;;;;:45;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40185:13;:18;;;40157:11;:20;40169:7;40157:20;;;;;;;;;;;:25;;;:46;;;;;;;;;;;;;;;;;;40263:15;40218:11;:20;40230:7;40218:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;40324:4;40294:11;:20;40306:7;40294:20;;;;;;;;;;;:27;;;:34;;;;;;;;;;;;;;;;;;40576:19;40608:1;40598:7;:11;40576:33;;40669:1;40628:43;;:11;:24;40640:11;40628:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40624:471;;;40853:13;;40839:11;:27;40835:245;;;40923:13;:18;;;40891:11;:24;40903:11;40891:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;41006:13;:54;;;40964:11;:24;40976:11;40964:24;;;;;;;;;;;:39;;;:96;;;;;;;;;;;;;;;;;;40835:245;40624:471;39342:2065;41164:7;41160:1;41123:49;;41132:13;:18;;;41123:49;;;;;;;;;;;;41183:64;41204:13;:18;;;41232:1;41236:7;41245:1;41183:20;:64::i;:::-;41374:12;;:14;;;;;;;;;;;;;39342:2065;;:::o;28523:1140::-;28611:21;;:::i;:::-;28650:12;28665:7;28650:22;;28733:4;28714:15;:13;:15::i;:::-;:23;;:47;;;;;28748:13;;28741:4;:20;28714:47;28710:886;;;28782:31;28816:11;:17;28828:4;28816:17;;;;;;;;;;;28782:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28857:9;:16;;;28852:729;;28928:1;28902:28;;:9;:14;;;:28;;;28898:101;;28966:9;28959:16;;;;;;28898:101;29301:261;29308:4;29301:261;;;29341:6;;;;;;;;29386:11;:17;29398:4;29386:17;;;;;;;;;;;29374:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29460:1;29434:28;;:9;:14;;;:28;;;29430:109;;29502:9;29495:16;;;;;;29430:109;29301:261;;;28852:729;28710:886;;29624:31;;;;;;;;;;;;;;28523:1140;;;;:::o;47012:191::-;47086:16;47105:6;;;;;;;;;;;47086:25;;47131:8;47122:6;;:17;;;;;;;;;;;;;;;;;;47186:8;47155:40;;47176:8;47155:40;;;;;;;;;;;;47012:191;;:::o;10096:326::-;10156:4;10413:1;10391:7;:19;;;:23;10384:30;;10096:326;;;:::o;42213:772::-;42376:4;42426:2;42410:36;;;42465:12;:10;:12::i;:::-;42496:4;42519:7;42545:5;42410:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42393:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42753:1;42736:6;:13;:18;42732:235;;;42782:40;;;;;;;;;;;;;;42732:235;42925:6;42919:13;42910:6;42906:2;42902:15;42895:38;42393:585;42631:45;;;42621:55;;;:6;:55;;;;42614:62;;;42213:772;;;;;;:::o;30260:415::-;30378:13;30414:16;30422:7;30414;:16::i;:::-;30409:59;;30439:29;;;;;;;;;;;;;;30409:59;30481:21;30505:10;:8;:10::i;:::-;30481:34;;30571:1;30552:7;30546:21;:26;;:121;;;;;;;;;;;;;;;;;30616:7;30625:18;:7;:16;:18::i;:::-;30599:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30546:121;30526:141;;;30260:415;;;:::o;33866:104::-;33935:27;33945:2;33949:8;33935:27;;;;;;;;;;;;:9;:27::i;:::-;33866:104;;:::o;43633:159::-;;;;;:::o;44451:158::-;;;;;:::o;48328:108::-;48388:13;48421:7;48414:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48328:108;:::o;19099:723::-;19155:13;19385:1;19376:5;:10;19372:53;;;19403:10;;;;;;;;;;;;;;;;;;;;;19372:53;19435:12;19450:5;19435:20;;19466:14;19491:78;19506:1;19498:4;:9;19491:78;;19524:8;;;;;:::i;:::-;;;;19555:2;19547:10;;;;;:::i;:::-;;;19491:78;;;19579:19;19611:6;19601:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19579:39;;19629:154;19645:1;19636:5;:10;19629:154;;19673:1;19663:11;;;;;:::i;:::-;;;19740:2;19732:5;:10;;;;:::i;:::-;19719:2;:24;;;;:::i;:::-;19706:39;;19689:6;19696;19689:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;19769:2;19760:11;;;;;:::i;:::-;;;19629:154;;;19807:6;19793:21;;;;;19099:723;;;;:::o;34333:163::-;34456:32;34462:2;34466:8;34476:5;34483:4;34456:5;:32::i;:::-;34333:163;;;:::o;34755:1966::-;34894:20;34917:13;;34894:36;;34959:1;34945:16;;:2;:16;;;34941:48;;;34970:19;;;;;;;;;;;;;;34941:48;35016:1;35004:8;:13;35000:44;;;35026:18;;;;;;;;;;;;;;35000:44;35057:61;35087:1;35091:2;35095:12;35109:8;35057:21;:61::i;:::-;35430:8;35395:12;:16;35408:2;35395:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35494:8;35454:12;:16;35467:2;35454:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35553:2;35520:11;:25;35532:12;35520:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;35620:15;35570:11;:25;35582:12;35570:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;35653:20;35676:12;35653:35;;35703:11;35732:8;35717:12;:23;35703:37;;35761:4;:23;;;;;35769:15;:2;:13;;;:15::i;:::-;35761:23;35757:832;;;35805:505;35861:12;35857:2;35836:38;;35853:1;35836:38;;;;;;;;;;;;35928:212;35997:1;36030:2;36063:14;;;;;;36108:5;35928:30;:212::i;:::-;35897:365;;36198:40;;;;;;;;;;;;;;35897:365;36305:3;36289:12;:19;;35805:505;;36391:12;36374:13;;:29;36370:43;;36405:8;;;36370:43;35757:832;;;36454:120;36510:14;;;;;;36506:2;36485:40;;36502:1;36485:40;;;;;;;;;;;;36569:3;36553:12;:19;;36454:120;;35757:832;36619:12;36603:13;:28;;;;34755:1966;;36653:60;36682:1;36686:2;36690:12;36704:8;36653:20;:60::i;:::-;34755:1966;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;1426:5;1464:6;1451:20;1442:29;;1480:32;1506:5;1480:32;:::i;:::-;1432:86;;;;:::o;1524:141::-;1580:5;1611:6;1605:13;1596:22;;1627:32;1653:5;1627:32;:::i;:::-;1586:79;;;;:::o;1684:271::-;1739:5;1788:3;1781:4;1773:6;1769:17;1765:27;1755:2;;1806:1;1803;1796:12;1755:2;1846:6;1833:20;1871:78;1945:3;1937:6;1930:4;1922:6;1918:17;1871:78;:::i;:::-;1862:87;;1745:210;;;;;:::o;1975:273::-;2031:5;2080:3;2073:4;2065:6;2061:17;2057:27;2047:2;;2098:1;2095;2088:12;2047:2;2138:6;2125:20;2163:79;2238:3;2230:6;2223:4;2215:6;2211:17;2163:79;:::i;:::-;2154:88;;2037:211;;;;;:::o;2254:139::-;2300:5;2338:6;2325:20;2316:29;;2354:33;2381:5;2354:33;:::i;:::-;2306:87;;;;:::o;2399:262::-;2458:6;2507:2;2495:9;2486:7;2482:23;2478:32;2475:2;;;2523:1;2520;2513:12;2475:2;2566:1;2591:53;2636:7;2627:6;2616:9;2612:22;2591:53;:::i;:::-;2581:63;;2537:117;2465:196;;;;:::o;2667:407::-;2735:6;2743;2792:2;2780:9;2771:7;2767:23;2763:32;2760:2;;;2808:1;2805;2798:12;2760:2;2851:1;2876:53;2921:7;2912:6;2901:9;2897:22;2876:53;:::i;:::-;2866:63;;2822:117;2978:2;3004:53;3049:7;3040:6;3029:9;3025:22;3004:53;:::i;:::-;2994:63;;2949:118;2750:324;;;;;:::o;3080:552::-;3157:6;3165;3173;3222:2;3210:9;3201:7;3197:23;3193:32;3190:2;;;3238:1;3235;3228:12;3190:2;3281:1;3306:53;3351:7;3342:6;3331:9;3327:22;3306:53;:::i;:::-;3296:63;;3252:117;3408:2;3434:53;3479:7;3470:6;3459:9;3455:22;3434:53;:::i;:::-;3424:63;;3379:118;3536:2;3562:53;3607:7;3598:6;3587:9;3583:22;3562:53;:::i;:::-;3552:63;;3507:118;3180:452;;;;;:::o;3638:809::-;3733:6;3741;3749;3757;3806:3;3794:9;3785:7;3781:23;3777:33;3774:2;;;3823:1;3820;3813:12;3774:2;3866:1;3891:53;3936:7;3927:6;3916:9;3912:22;3891:53;:::i;:::-;3881:63;;3837:117;3993:2;4019:53;4064:7;4055:6;4044:9;4040:22;4019:53;:::i;:::-;4009:63;;3964:118;4121:2;4147:53;4192:7;4183:6;4172:9;4168:22;4147:53;:::i;:::-;4137:63;;4092:118;4277:2;4266:9;4262:18;4249:32;4308:18;4300:6;4297:30;4294:2;;;4340:1;4337;4330:12;4294:2;4368:62;4422:7;4413:6;4402:9;4398:22;4368:62;:::i;:::-;4358:72;;4220:220;3764:683;;;;;;;:::o;4453:401::-;4518:6;4526;4575:2;4563:9;4554:7;4550:23;4546:32;4543:2;;;4591:1;4588;4581:12;4543:2;4634:1;4659:53;4704:7;4695:6;4684:9;4680:22;4659:53;:::i;:::-;4649:63;;4605:117;4761:2;4787:50;4829:7;4820:6;4809:9;4805:22;4787:50;:::i;:::-;4777:60;;4732:115;4533:321;;;;;:::o;4860:407::-;4928:6;4936;4985:2;4973:9;4964:7;4960:23;4956:32;4953:2;;;5001:1;4998;4991:12;4953:2;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4943:324;;;;;:::o;5273:425::-;5359:6;5367;5416:2;5404:9;5395:7;5391:23;5387:32;5384:2;;;5432:1;5429;5422:12;5384:2;5503:1;5492:9;5488:17;5475:31;5533:18;5525:6;5522:30;5519:2;;;5565:1;5562;5555:12;5519:2;5601:80;5673:7;5664:6;5653:9;5649:22;5601:80;:::i;:::-;5583:98;;;;5446:245;5374:324;;;;;:::o;5704:260::-;5762:6;5811:2;5799:9;5790:7;5786:23;5782:32;5779:2;;;5827:1;5824;5817:12;5779:2;5870:1;5895:52;5939:7;5930:6;5919:9;5915:22;5895:52;:::i;:::-;5885:62;;5841:116;5769:195;;;;:::o;5970:282::-;6039:6;6088:2;6076:9;6067:7;6063:23;6059:32;6056:2;;;6104:1;6101;6094:12;6056:2;6147:1;6172:63;6227:7;6218:6;6207:9;6203:22;6172:63;:::i;:::-;6162:73;;6118:127;6046:206;;;;:::o;6258:375::-;6327:6;6376:2;6364:9;6355:7;6351:23;6347:32;6344:2;;;6392:1;6389;6382:12;6344:2;6463:1;6452:9;6448:17;6435:31;6493:18;6485:6;6482:30;6479:2;;;6525:1;6522;6515:12;6479:2;6553:63;6608:7;6599:6;6588:9;6584:22;6553:63;:::i;:::-;6543:73;;6406:220;6334:299;;;;:::o;6639:262::-;6698:6;6747:2;6735:9;6726:7;6722:23;6718:32;6715:2;;;6763:1;6760;6753:12;6715:2;6806:1;6831:53;6876:7;6867:6;6856:9;6852:22;6831:53;:::i;:::-;6821:63;;6777:117;6705:196;;;;:::o;6907:118::-;6994:24;7012:5;6994:24;:::i;:::-;6989:3;6982:37;6972:53;;:::o;7031:109::-;7112:21;7127:5;7112:21;:::i;:::-;7107:3;7100:34;7090:50;;:::o;7146:360::-;7232:3;7260:38;7292:5;7260:38;:::i;:::-;7314:70;7377:6;7372:3;7314:70;:::i;:::-;7307:77;;7393:52;7438:6;7433:3;7426:4;7419:5;7415:16;7393:52;:::i;:::-;7470:29;7492:6;7470:29;:::i;:::-;7465:3;7461:39;7454:46;;7236:270;;;;;:::o;7512:364::-;7600:3;7628:39;7661:5;7628:39;:::i;:::-;7683:71;7747:6;7742:3;7683:71;:::i;:::-;7676:78;;7763:52;7808:6;7803:3;7796:4;7789:5;7785:16;7763:52;:::i;:::-;7840:29;7862:6;7840:29;:::i;:::-;7835:3;7831:39;7824:46;;7604:272;;;;;:::o;7882:377::-;7988:3;8016:39;8049:5;8016:39;:::i;:::-;8071:89;8153:6;8148:3;8071:89;:::i;:::-;8064:96;;8169:52;8214:6;8209:3;8202:4;8195:5;8191:16;8169:52;:::i;:::-;8246:6;8241:3;8237:16;8230:23;;7992:267;;;;;:::o;8265:366::-;8407:3;8428:67;8492:2;8487:3;8428:67;:::i;:::-;8421:74;;8504:93;8593:3;8504:93;:::i;:::-;8622:2;8617:3;8613:12;8606:19;;8411:220;;;:::o;8637:400::-;8797:3;8818:84;8900:1;8895:3;8818:84;:::i;:::-;8811:91;;8911:93;9000:3;8911:93;:::i;:::-;9029:1;9024:3;9020:11;9013:18;;8801:236;;;:::o;9043:366::-;9185:3;9206:67;9270:2;9265:3;9206:67;:::i;:::-;9199:74;;9282:93;9371:3;9282:93;:::i;:::-;9400:2;9395:3;9391:12;9384:19;;9189:220;;;:::o;9415:366::-;9557:3;9578:67;9642:2;9637:3;9578:67;:::i;:::-;9571:74;;9654:93;9743:3;9654:93;:::i;:::-;9772:2;9767:3;9763:12;9756:19;;9561:220;;;:::o;9787:366::-;9929:3;9950:67;10014:2;10009:3;9950:67;:::i;:::-;9943:74;;10026:93;10115:3;10026:93;:::i;:::-;10144:2;10139:3;10135:12;10128:19;;9933:220;;;:::o;10159:118::-;10246:24;10264:5;10246:24;:::i;:::-;10241:3;10234:37;10224:53;;:::o;10283:435::-;10463:3;10485:95;10576:3;10567:6;10485:95;:::i;:::-;10478:102;;10597:95;10688:3;10679:6;10597:95;:::i;:::-;10590:102;;10709:3;10702:10;;10467:251;;;;;:::o;10724:541::-;10957:3;10979:95;11070:3;11061:6;10979:95;:::i;:::-;10972:102;;11091:148;11235:3;11091:148;:::i;:::-;11084:155;;11256:3;11249:10;;10961:304;;;;:::o;11271:222::-;11364:4;11402:2;11391:9;11387:18;11379:26;;11415:71;11483:1;11472:9;11468:17;11459:6;11415:71;:::i;:::-;11369:124;;;;:::o;11499:640::-;11694:4;11732:3;11721:9;11717:19;11709:27;;11746:71;11814:1;11803:9;11799:17;11790:6;11746:71;:::i;:::-;11827:72;11895:2;11884:9;11880:18;11871:6;11827:72;:::i;:::-;11909;11977:2;11966:9;11962:18;11953:6;11909:72;:::i;:::-;12028:9;12022:4;12018:20;12013:2;12002:9;11998:18;11991:48;12056:76;12127:4;12118:6;12056:76;:::i;:::-;12048:84;;11699:440;;;;;;;:::o;12145:210::-;12232:4;12270:2;12259:9;12255:18;12247:26;;12283:65;12345:1;12334:9;12330:17;12321:6;12283:65;:::i;:::-;12237:118;;;;:::o;12361:313::-;12474:4;12512:2;12501:9;12497:18;12489:26;;12561:9;12555:4;12551:20;12547:1;12536:9;12532:17;12525:47;12589:78;12662:4;12653:6;12589:78;:::i;:::-;12581:86;;12479:195;;;;:::o;12680:419::-;12846:4;12884:2;12873:9;12869:18;12861:26;;12933:9;12927:4;12923:20;12919:1;12908:9;12904:17;12897:47;12961:131;13087:4;12961:131;:::i;:::-;12953:139;;12851:248;;;:::o;13105:419::-;13271:4;13309:2;13298:9;13294:18;13286:26;;13358:9;13352:4;13348:20;13344:1;13333:9;13329:17;13322:47;13386:131;13512:4;13386:131;:::i;:::-;13378:139;;13276:248;;;:::o;13530:419::-;13696:4;13734:2;13723:9;13719:18;13711:26;;13783:9;13777:4;13773:20;13769:1;13758:9;13754:17;13747:47;13811:131;13937:4;13811:131;:::i;:::-;13803:139;;13701:248;;;:::o;13955:419::-;14121:4;14159:2;14148:9;14144:18;14136:26;;14208:9;14202:4;14198:20;14194:1;14183:9;14179:17;14172:47;14236:131;14362:4;14236:131;:::i;:::-;14228:139;;14126:248;;;:::o;14380:222::-;14473:4;14511:2;14500:9;14496:18;14488:26;;14524:71;14592:1;14581:9;14577:17;14568:6;14524:71;:::i;:::-;14478:124;;;;:::o;14608:129::-;14642:6;14669:20;;:::i;:::-;14659:30;;14698:33;14726:4;14718:6;14698:33;:::i;:::-;14649:88;;;:::o;14743:75::-;14776:6;14809:2;14803:9;14793:19;;14783:35;:::o;14824:307::-;14885:4;14975:18;14967:6;14964:30;14961:2;;;14997:18;;:::i;:::-;14961:2;15035:29;15057:6;15035:29;:::i;:::-;15027:37;;15119:4;15113;15109:15;15101:23;;14890:241;;;:::o;15137:308::-;15199:4;15289:18;15281:6;15278:30;15275:2;;;15311:18;;:::i;:::-;15275:2;15349:29;15371:6;15349:29;:::i;:::-;15341:37;;15433:4;15427;15423:15;15415:23;;15204:241;;;:::o;15451:98::-;15502:6;15536:5;15530:12;15520:22;;15509:40;;;:::o;15555:99::-;15607:6;15641:5;15635:12;15625:22;;15614:40;;;:::o;15660:168::-;15743:11;15777:6;15772:3;15765:19;15817:4;15812:3;15808:14;15793:29;;15755:73;;;;:::o;15834:169::-;15918:11;15952:6;15947:3;15940:19;15992:4;15987:3;15983:14;15968:29;;15930:73;;;;:::o;16009:148::-;16111:11;16148:3;16133:18;;16123:34;;;;:::o;16163:305::-;16203:3;16222:20;16240:1;16222:20;:::i;:::-;16217:25;;16256:20;16274:1;16256:20;:::i;:::-;16251:25;;16410:1;16342:66;16338:74;16335:1;16332:81;16329:2;;;16416:18;;:::i;:::-;16329:2;16460:1;16457;16453:9;16446:16;;16207:261;;;;:::o;16474:185::-;16514:1;16531:20;16549:1;16531:20;:::i;:::-;16526:25;;16565:20;16583:1;16565:20;:::i;:::-;16560:25;;16604:1;16594:2;;16609:18;;:::i;:::-;16594:2;16651:1;16648;16644:9;16639:14;;16516:143;;;;:::o;16665:191::-;16705:4;16725:20;16743:1;16725:20;:::i;:::-;16720:25;;16759:20;16777:1;16759:20;:::i;:::-;16754:25;;16798:1;16795;16792:8;16789:2;;;16803:18;;:::i;:::-;16789:2;16848:1;16845;16841:9;16833:17;;16710:146;;;;:::o;16862:96::-;16899:7;16928:24;16946:5;16928:24;:::i;:::-;16917:35;;16907:51;;;:::o;16964:90::-;16998:7;17041:5;17034:13;17027:21;17016:32;;17006:48;;;:::o;17060:149::-;17096:7;17136:66;17129:5;17125:78;17114:89;;17104:105;;;:::o;17215:126::-;17252:7;17292:42;17285:5;17281:54;17270:65;;17260:81;;;:::o;17347:77::-;17384:7;17413:5;17402:16;;17392:32;;;:::o;17430:154::-;17514:6;17509:3;17504;17491:30;17576:1;17567:6;17562:3;17558:16;17551:27;17481:103;;;:::o;17590:307::-;17658:1;17668:113;17682:6;17679:1;17676:13;17668:113;;;17767:1;17762:3;17758:11;17752:18;17748:1;17743:3;17739:11;17732:39;17704:2;17701:1;17697:10;17692:15;;17668:113;;;17799:6;17796:1;17793:13;17790:2;;;17879:1;17870:6;17865:3;17861:16;17854:27;17790:2;17639:258;;;;:::o;17903:320::-;17947:6;17984:1;17978:4;17974:12;17964:22;;18031:1;18025:4;18021:12;18052:18;18042:2;;18108:4;18100:6;18096:17;18086:27;;18042:2;18170;18162:6;18159:14;18139:18;18136:38;18133:2;;;18189:18;;:::i;:::-;18133:2;17954:269;;;;:::o;18229:281::-;18312:27;18334:4;18312:27;:::i;:::-;18304:6;18300:40;18442:6;18430:10;18427:22;18406:18;18394:10;18391:34;18388:62;18385:2;;;18453:18;;:::i;:::-;18385:2;18493:10;18489:2;18482:22;18272:238;;;:::o;18516:233::-;18555:3;18578:24;18596:5;18578:24;:::i;:::-;18569:33;;18624:66;18617:5;18614:77;18611:2;;;18694:18;;:::i;:::-;18611:2;18741:1;18734:5;18730:13;18723:20;;18559:190;;;:::o;18755:176::-;18787:1;18804:20;18822:1;18804:20;:::i;:::-;18799:25;;18838:20;18856:1;18838:20;:::i;:::-;18833:25;;18877:1;18867:2;;18882:18;;:::i;:::-;18867:2;18923:1;18920;18916:9;18911:14;;18789:142;;;;:::o;18937:180::-;18985:77;18982:1;18975:88;19082:4;19079:1;19072:15;19106:4;19103:1;19096:15;19123:180;19171:77;19168:1;19161:88;19268:4;19265:1;19258:15;19292:4;19289:1;19282:15;19309:180;19357:77;19354:1;19347:88;19454:4;19451:1;19444:15;19478:4;19475:1;19468:15;19495:180;19543:77;19540:1;19533:88;19640:4;19637:1;19630:15;19664:4;19661:1;19654:15;19681:102;19722:6;19773:2;19769:7;19764:2;19757:5;19753:14;19749:28;19739:38;;19729:54;;;:::o;19789:225::-;19929:34;19925:1;19917:6;19913:14;19906:58;19998:8;19993:2;19985:6;19981:15;19974:33;19895:119;:::o;20020:155::-;20160:7;20156:1;20148:6;20144:14;20137:31;20126:49;:::o;20181:182::-;20321:34;20317:1;20309:6;20305:14;20298:58;20287:76;:::o;20369:226::-;20509:34;20505:1;20497:6;20493:14;20486:58;20578:9;20573:2;20565:6;20561:15;20554:34;20475:120;:::o;20601:237::-;20741:34;20737:1;20729:6;20725:14;20718:58;20810:20;20805:2;20797:6;20793:15;20786:45;20707:131;:::o;20844:122::-;20917:24;20935:5;20917:24;:::i;:::-;20910:5;20907:35;20897:2;;20956:1;20953;20946:12;20897:2;20887:79;:::o;20972:116::-;21042:21;21057:5;21042:21;:::i;:::-;21035:5;21032:32;21022:2;;21078:1;21075;21068:12;21022:2;21012:76;:::o;21094:120::-;21166:23;21183:5;21166:23;:::i;:::-;21159:5;21156:34;21146:2;;21204:1;21201;21194:12;21146:2;21136:78;:::o;21220:122::-;21293:24;21311:5;21293:24;:::i;:::-;21286:5;21283:35;21273:2;;21332:1;21329;21322:12;21273:2;21263:79;:::o

Swarm Source

ipfs://2dec5af0049119018534f69c2a38ab1ebf08d4bf91f5ad5818d09a7f03f4c76b
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.