ETH Price: $3,313.64 (+1.97%)
Gas: 3 Gwei

Token

MetaPeople (MP)
 

Overview

Max Total Supply

0 MP

Holders

69

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 MP
0xa47B1FC5ed4b296Dea37806120D9BceFccD80ba6
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:
MetaPeople

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-11-03
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// 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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// 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/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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


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

pragma solidity ^0.8.0;




/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}

// File: MetaPeople.sol


pragma solidity ^0.8.4;






contract MetaPeople is ERC721, ERC721Royalty, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("MetaPeople", "MP") {
        _setDefaultRoyalty(msg.sender, 250);
    }

    function _baseURI() internal pure override returns (string memory) {
        return "https://ipfs.filebase.io/ipfs/";
    }

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

    function mintNFT(address to, string memory uri) public onlyOwner {
        _tokenIdCounter.increment();
        uint256 tokenId = _tokenIdCounter.current();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    function mintNFTWithRoyalty(address recipient, string memory uri, address royaltyReceiver, uint96 feeNumerator)
        public onlyOwner {
        mintNFT(recipient, uri);
        uint256 tokenId = _tokenIdCounter.current();
        _setTokenRoyalty(tokenId, royaltyReceiver, feeNumerator);
    }

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721Royalty, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"mintNFTWithRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[{"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f4d65746150656f706c65000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4d5000000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200009692919062000366565b508060039080519060200190620000af92919062000366565b505050620000d2620000c6620000eb60201b60201c565b620000f360201b60201c565b620000e53360fa620001b960201b60201c565b62000596565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001c96200035c60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200022a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002219062000464565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200029d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002949062000486565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b8280546200037490620004b9565b90600052602060002090601f016020900481019282620003985760008555620003e4565b82601f10620003b357805160ff1916838001178555620003e4565b82800160010185558215620003e4579182015b82811115620003e3578251825591602001919060010190620003c6565b5b509050620003f39190620003f7565b5090565b5b8082111562000412576000816000905550600101620003f8565b5090565b600062000425602a83620004a8565b915062000432826200051e565b604082019050919050565b60006200044c601983620004a8565b915062000459826200056d565b602082019050919050565b600060208201905081810360008301526200047f8162000416565b9050919050565b60006020820190508181036000830152620004a1816200043d565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004d257607f821691505b60208210811415620004e957620004e8620004ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6133c480620005a66000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063715018a6116100ad578063b88d4fde11610071578063b88d4fde14610307578063c87b56dd14610323578063e985e9c514610353578063eacabe1414610383578063f2fde38b1461039f57610121565b8063715018a61461028957806375eacc20146102935780638da5cb5b146102af57806395d89b41146102cd578063a22cb465146102eb57610121565b806323b872dd116100f457806323b872dd146101c05780632a55205a146101dc57806342842e0e1461020d5780636352211e1461022957806370a082311461025957610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b91906123f5565b6103bb565b60405161014d9190612860565b60405180910390f35b61015e6103cd565b60405161016b919061287b565b60405180910390f35b61018e60048036038101906101899190612447565b61045f565b60405161019b91906127d0565b60405180910390f35b6101be60048036038101906101b991906123b9565b6104a5565b005b6101da60048036038101906101d591906121e4565b6105bd565b005b6101f660048036038101906101f19190612470565b61061d565b604051610204929190612837565b60405180910390f35b610227600480360381019061022291906121e4565b610808565b005b610243600480360381019061023e9190612447565b610828565b60405161025091906127d0565b60405180910390f35b610273600480360381019061026e919061217f565b6108da565b6040516102809190612a9d565b60405180910390f35b610291610992565b005b6102ad60048036038101906102a8919061233e565b6109a6565b005b6102b76109d8565b6040516102c491906127d0565b60405180910390f35b6102d5610a02565b6040516102e2919061287b565b60405180910390f35b610305600480360381019061030091906122ae565b610a94565b005b610321600480360381019061031c9190612233565b610aaa565b005b61033d60048036038101906103389190612447565b610b0c565b60405161034a919061287b565b60405180910390f35b61036d600480360381019061036891906121a8565b610b1e565b60405161037a9190612860565b60405180910390f35b61039d600480360381019061039891906122ea565b610bb2565b005b6103b960048036038101906103b4919061217f565b610beb565b005b60006103c682610c6f565b9050919050565b6060600280546103dc90612d65565b80601f016020809104026020016040519081016040528092919081815260200182805461040890612d65565b80156104555780601f1061042a57610100808354040283529160200191610455565b820191906000526020600020905b81548152906001019060200180831161043857829003601f168201915b5050505050905090565b600061046a82610c81565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b082610828565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051890612a1d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610540610ccc565b73ffffffffffffffffffffffffffffffffffffffff16148061056f575061056e81610569610ccc565b610b1e565b5b6105ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a59061299d565b60405180910390fd5b6105b88383610cd4565b505050565b6105ce6105c8610ccc565b82610d8d565b61060d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060490612a7d565b60405180910390fd5b610618838383610e22565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156107b35760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006107bd611089565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866107e99190612c09565b6107f39190612bd8565b90508160000151819350935050509250929050565b61082383838360405180602001604052806000815250610aaa565b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c8906129fd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561094b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109429061295d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099a611093565b6109a46000611111565b565b6109ae611093565b6109b88484610bb2565b60006109c4600a6111d7565b90506109d18184846111e5565b5050505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610a1190612d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3d90612d65565b8015610a8a5780601f10610a5f57610100808354040283529160200191610a8a565b820191906000526020600020905b815481529060010190602001808311610a6d57829003601f168201915b5050505050905090565b610aa6610a9f610ccc565b838361138d565b5050565b610abb610ab5610ccc565b83610d8d565b610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190612a7d565b60405180910390fd5b610b06848484846114fa565b50505050565b6060610b1782611556565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610bba611093565b610bc4600a611669565b6000610bd0600a6111d7565b9050610bdc838261167f565b610be6818361169d565b505050565b610bf3611093565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a906128bd565b60405180910390fd5b610c6c81611111565b50565b6000610c7a82611711565b9050919050565b610c8a816117f3565b610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc0906129fd565b60405180910390fd5b50565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610d4783610828565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d9983610828565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610ddb5750610dda8185610b1e565b5b80610e1957508373ffffffffffffffffffffffffffffffffffffffff16610e018461045f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e4282610828565b73ffffffffffffffffffffffffffffffffffffffff1614610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f906128dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff9061291d565b60405180910390fd5b610f1383838361185f565b610f1e600082610cd4565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f6e9190612c63565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fc59190612b82565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611084838383611864565b505050565b6000612710905090565b61109b610ccc565b73ffffffffffffffffffffffffffffffffffffffff166110b96109d8565b73ffffffffffffffffffffffffffffffffffffffff161461110f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611106906129dd565b60405180910390fd5b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6111ed611089565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290612a5d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290612a3d565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506001600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f39061293d565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ed9190612860565b60405180910390a3505050565b611505848484610e22565b61151184848484611869565b611550576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115479061289d565b60405180910390fd5b50505050565b606061156182610c81565b600060086000848152602001908152602001600020805461158190612d65565b80601f01602080910402602001604051908101604052809291908181526020018280546115ad90612d65565b80156115fa5780601f106115cf576101008083540402835291602001916115fa565b820191906000526020600020905b8154815290600101906020018083116115dd57829003601f168201915b50505050509050600061160b611a00565b9050600081511415611621578192505050611664565b60008251111561165657808260405160200161163e9291906127ac565b60405160208183030381529060405292505050611664565b61165f84611a3d565b925050505b919050565b6001816000016000828254019250508190555050565b611699828260405180602001604052806000815250611aa5565b5050565b6116a6826117f3565b6116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc9061297d565b60405180910390fd5b8060086000848152602001908152602001600020908051906020019061170c929190611f8e565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117dc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117ec57506117eb82611b00565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b600061188a8473ffffffffffffffffffffffffffffffffffffffff16611b7a565b156119f3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026118b3610ccc565b8786866040518563ffffffff1660e01b81526004016118d594939291906127eb565b602060405180830381600087803b1580156118ef57600080fd5b505af192505050801561192057506040513d601f19601f8201168201806040525081019061191d919061241e565b60015b6119a3573d8060008114611950576040519150601f19603f3d011682016040523d82523d6000602084013e611955565b606091505b5060008151141561199b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119929061289d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506119f8565b600190505b949350505050565b60606040518060400160405280601e81526020017f68747470733a2f2f697066732e66696c65626173652e696f2f697066732f0000815250905090565b6060611a4882610c81565b6000611a52611a00565b90506000815111611a725760405180602001604052806000815250611a9d565b80611a7c84611b9d565b604051602001611a8d9291906127ac565b6040516020818303038152906040525b915050919050565b611aaf8383611d4a565b611abc6000848484611869565b611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af29061289d565b60405180910390fd5b505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b735750611b7282611f24565b5b9050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415611be5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d45565b600082905060005b60008214611c17578080611c0090612dc8565b915050600a82611c109190612bd8565b9150611bed565b60008167ffffffffffffffff811115611c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c8b5781602001600182028036833780820191505090505b5090505b60008514611d3e57600182611ca49190612c63565b9150600a85611cb39190612e11565b6030611cbf9190612b82565b60f81b818381518110611cfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d379190612bd8565b9450611c8f565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906129bd565b60405180910390fd5b611dc3816117f3565b15611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa906128fd565b60405180910390fd5b611e0f6000838361185f565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e5f9190612b82565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f2060008383611864565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054611f9a90612d65565b90600052602060002090601f016020900481019282611fbc5760008555612003565b82601f10611fd557805160ff1916838001178555612003565b82800160010185558215612003579182015b82811115612002578251825591602001919060010190611fe7565b5b5090506120109190612014565b5090565b5b8082111561202d576000816000905550600101612015565b5090565b600061204461203f84612add565b612ab8565b90508281526020810184848401111561205c57600080fd5b612067848285612d23565b509392505050565b600061208261207d84612b0e565b612ab8565b90508281526020810184848401111561209a57600080fd5b6120a5848285612d23565b509392505050565b6000813590506120bc8161331b565b92915050565b6000813590506120d181613332565b92915050565b6000813590506120e681613349565b92915050565b6000815190506120fb81613349565b92915050565b600082601f83011261211257600080fd5b8135612122848260208601612031565b91505092915050565b600082601f83011261213c57600080fd5b813561214c84826020860161206f565b91505092915050565b60008135905061216481613360565b92915050565b60008135905061217981613377565b92915050565b60006020828403121561219157600080fd5b600061219f848285016120ad565b91505092915050565b600080604083850312156121bb57600080fd5b60006121c9858286016120ad565b92505060206121da858286016120ad565b9150509250929050565b6000806000606084860312156121f957600080fd5b6000612207868287016120ad565b9350506020612218868287016120ad565b925050604061222986828701612155565b9150509250925092565b6000806000806080858703121561224957600080fd5b6000612257878288016120ad565b9450506020612268878288016120ad565b935050604061227987828801612155565b925050606085013567ffffffffffffffff81111561229657600080fd5b6122a287828801612101565b91505092959194509250565b600080604083850312156122c157600080fd5b60006122cf858286016120ad565b92505060206122e0858286016120c2565b9150509250929050565b600080604083850312156122fd57600080fd5b600061230b858286016120ad565b925050602083013567ffffffffffffffff81111561232857600080fd5b6123348582860161212b565b9150509250929050565b6000806000806080858703121561235457600080fd5b6000612362878288016120ad565b945050602085013567ffffffffffffffff81111561237f57600080fd5b61238b8782880161212b565b935050604061239c878288016120ad565b92505060606123ad8782880161216a565b91505092959194509250565b600080604083850312156123cc57600080fd5b60006123da858286016120ad565b92505060206123eb85828601612155565b9150509250929050565b60006020828403121561240757600080fd5b6000612415848285016120d7565b91505092915050565b60006020828403121561243057600080fd5b600061243e848285016120ec565b91505092915050565b60006020828403121561245957600080fd5b600061246784828501612155565b91505092915050565b6000806040838503121561248357600080fd5b600061249185828601612155565b92505060206124a285828601612155565b9150509250929050565b6124b581612c97565b82525050565b6124c481612ca9565b82525050565b60006124d582612b3f565b6124df8185612b55565b93506124ef818560208601612d32565b6124f881612efe565b840191505092915050565b600061250e82612b4a565b6125188185612b66565b9350612528818560208601612d32565b61253181612efe565b840191505092915050565b600061254782612b4a565b6125518185612b77565b9350612561818560208601612d32565b80840191505092915050565b600061257a603283612b66565b915061258582612f0f565b604082019050919050565b600061259d602683612b66565b91506125a882612f5e565b604082019050919050565b60006125c0602583612b66565b91506125cb82612fad565b604082019050919050565b60006125e3601c83612b66565b91506125ee82612ffc565b602082019050919050565b6000612606602483612b66565b915061261182613025565b604082019050919050565b6000612629601983612b66565b915061263482613074565b602082019050919050565b600061264c602983612b66565b91506126578261309d565b604082019050919050565b600061266f602e83612b66565b915061267a826130ec565b604082019050919050565b6000612692603e83612b66565b915061269d8261313b565b604082019050919050565b60006126b5602083612b66565b91506126c08261318a565b602082019050919050565b60006126d8602083612b66565b91506126e3826131b3565b602082019050919050565b60006126fb601883612b66565b9150612706826131dc565b602082019050919050565b600061271e602183612b66565b915061272982613205565b604082019050919050565b6000612741601b83612b66565b915061274c82613254565b602082019050919050565b6000612764602a83612b66565b915061276f8261327d565b604082019050919050565b6000612787602e83612b66565b9150612792826132cc565b604082019050919050565b6127a681612d01565b82525050565b60006127b8828561253c565b91506127c4828461253c565b91508190509392505050565b60006020820190506127e560008301846124ac565b92915050565b600060808201905061280060008301876124ac565b61280d60208301866124ac565b61281a604083018561279d565b818103606083015261282c81846124ca565b905095945050505050565b600060408201905061284c60008301856124ac565b612859602083018461279d565b9392505050565b600060208201905061287560008301846124bb565b92915050565b600060208201905081810360008301526128958184612503565b905092915050565b600060208201905081810360008301526128b68161256d565b9050919050565b600060208201905081810360008301526128d681612590565b9050919050565b600060208201905081810360008301526128f6816125b3565b9050919050565b60006020820190508181036000830152612916816125d6565b9050919050565b60006020820190508181036000830152612936816125f9565b9050919050565b600060208201905081810360008301526129568161261c565b9050919050565b600060208201905081810360008301526129768161263f565b9050919050565b6000602082019050818103600083015261299681612662565b9050919050565b600060208201905081810360008301526129b681612685565b9050919050565b600060208201905081810360008301526129d6816126a8565b9050919050565b600060208201905081810360008301526129f6816126cb565b9050919050565b60006020820190508181036000830152612a16816126ee565b9050919050565b60006020820190508181036000830152612a3681612711565b9050919050565b60006020820190508181036000830152612a5681612734565b9050919050565b60006020820190508181036000830152612a7681612757565b9050919050565b60006020820190508181036000830152612a968161277a565b9050919050565b6000602082019050612ab2600083018461279d565b92915050565b6000612ac2612ad3565b9050612ace8282612d97565b919050565b6000604051905090565b600067ffffffffffffffff821115612af857612af7612ecf565b5b612b0182612efe565b9050602081019050919050565b600067ffffffffffffffff821115612b2957612b28612ecf565b5b612b3282612efe565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612b8d82612d01565b9150612b9883612d01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612bcd57612bcc612e42565b5b828201905092915050565b6000612be382612d01565b9150612bee83612d01565b925082612bfe57612bfd612e71565b5b828204905092915050565b6000612c1482612d01565b9150612c1f83612d01565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c5857612c57612e42565b5b828202905092915050565b6000612c6e82612d01565b9150612c7983612d01565b925082821015612c8c57612c8b612e42565b5b828203905092915050565b6000612ca282612ce1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015612d50578082015181840152602081019050612d35565b83811115612d5f576000848401525b50505050565b60006002820490506001821680612d7d57607f821691505b60208210811415612d9157612d90612ea0565b5b50919050565b612da082612efe565b810181811067ffffffffffffffff82111715612dbf57612dbe612ecf565b5b80604052505050565b6000612dd382612d01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e0657612e05612e42565b5b600182019050919050565b6000612e1c82612d01565b9150612e2783612d01565b925082612e3757612e36612e71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61332481612c97565b811461332f57600080fd5b50565b61333b81612ca9565b811461334657600080fd5b50565b61335281612cb5565b811461335d57600080fd5b50565b61336981612d01565b811461337457600080fd5b50565b61338081612d0b565b811461338b57600080fd5b5056fea2646970667358221220883e595d587a9ef3a50e90206421bd279698afc757375318afd7df69bd937b3664736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063715018a6116100ad578063b88d4fde11610071578063b88d4fde14610307578063c87b56dd14610323578063e985e9c514610353578063eacabe1414610383578063f2fde38b1461039f57610121565b8063715018a61461028957806375eacc20146102935780638da5cb5b146102af57806395d89b41146102cd578063a22cb465146102eb57610121565b806323b872dd116100f457806323b872dd146101c05780632a55205a146101dc57806342842e0e1461020d5780636352211e1461022957806370a082311461025957610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b91906123f5565b6103bb565b60405161014d9190612860565b60405180910390f35b61015e6103cd565b60405161016b919061287b565b60405180910390f35b61018e60048036038101906101899190612447565b61045f565b60405161019b91906127d0565b60405180910390f35b6101be60048036038101906101b991906123b9565b6104a5565b005b6101da60048036038101906101d591906121e4565b6105bd565b005b6101f660048036038101906101f19190612470565b61061d565b604051610204929190612837565b60405180910390f35b610227600480360381019061022291906121e4565b610808565b005b610243600480360381019061023e9190612447565b610828565b60405161025091906127d0565b60405180910390f35b610273600480360381019061026e919061217f565b6108da565b6040516102809190612a9d565b60405180910390f35b610291610992565b005b6102ad60048036038101906102a8919061233e565b6109a6565b005b6102b76109d8565b6040516102c491906127d0565b60405180910390f35b6102d5610a02565b6040516102e2919061287b565b60405180910390f35b610305600480360381019061030091906122ae565b610a94565b005b610321600480360381019061031c9190612233565b610aaa565b005b61033d60048036038101906103389190612447565b610b0c565b60405161034a919061287b565b60405180910390f35b61036d600480360381019061036891906121a8565b610b1e565b60405161037a9190612860565b60405180910390f35b61039d600480360381019061039891906122ea565b610bb2565b005b6103b960048036038101906103b4919061217f565b610beb565b005b60006103c682610c6f565b9050919050565b6060600280546103dc90612d65565b80601f016020809104026020016040519081016040528092919081815260200182805461040890612d65565b80156104555780601f1061042a57610100808354040283529160200191610455565b820191906000526020600020905b81548152906001019060200180831161043857829003601f168201915b5050505050905090565b600061046a82610c81565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b082610828565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051890612a1d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610540610ccc565b73ffffffffffffffffffffffffffffffffffffffff16148061056f575061056e81610569610ccc565b610b1e565b5b6105ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a59061299d565b60405180910390fd5b6105b88383610cd4565b505050565b6105ce6105c8610ccc565b82610d8d565b61060d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060490612a7d565b60405180910390fd5b610618838383610e22565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156107b35760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006107bd611089565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866107e99190612c09565b6107f39190612bd8565b90508160000151819350935050509250929050565b61082383838360405180602001604052806000815250610aaa565b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c8906129fd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561094b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109429061295d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099a611093565b6109a46000611111565b565b6109ae611093565b6109b88484610bb2565b60006109c4600a6111d7565b90506109d18184846111e5565b5050505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610a1190612d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3d90612d65565b8015610a8a5780601f10610a5f57610100808354040283529160200191610a8a565b820191906000526020600020905b815481529060010190602001808311610a6d57829003601f168201915b5050505050905090565b610aa6610a9f610ccc565b838361138d565b5050565b610abb610ab5610ccc565b83610d8d565b610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190612a7d565b60405180910390fd5b610b06848484846114fa565b50505050565b6060610b1782611556565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610bba611093565b610bc4600a611669565b6000610bd0600a6111d7565b9050610bdc838261167f565b610be6818361169d565b505050565b610bf3611093565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a906128bd565b60405180910390fd5b610c6c81611111565b50565b6000610c7a82611711565b9050919050565b610c8a816117f3565b610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc0906129fd565b60405180910390fd5b50565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610d4783610828565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d9983610828565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610ddb5750610dda8185610b1e565b5b80610e1957508373ffffffffffffffffffffffffffffffffffffffff16610e018461045f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e4282610828565b73ffffffffffffffffffffffffffffffffffffffff1614610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f906128dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff9061291d565b60405180910390fd5b610f1383838361185f565b610f1e600082610cd4565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f6e9190612c63565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fc59190612b82565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611084838383611864565b505050565b6000612710905090565b61109b610ccc565b73ffffffffffffffffffffffffffffffffffffffff166110b96109d8565b73ffffffffffffffffffffffffffffffffffffffff161461110f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611106906129dd565b60405180910390fd5b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6111ed611089565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290612a5d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290612a3d565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506001600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f39061293d565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ed9190612860565b60405180910390a3505050565b611505848484610e22565b61151184848484611869565b611550576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115479061289d565b60405180910390fd5b50505050565b606061156182610c81565b600060086000848152602001908152602001600020805461158190612d65565b80601f01602080910402602001604051908101604052809291908181526020018280546115ad90612d65565b80156115fa5780601f106115cf576101008083540402835291602001916115fa565b820191906000526020600020905b8154815290600101906020018083116115dd57829003601f168201915b50505050509050600061160b611a00565b9050600081511415611621578192505050611664565b60008251111561165657808260405160200161163e9291906127ac565b60405160208183030381529060405292505050611664565b61165f84611a3d565b925050505b919050565b6001816000016000828254019250508190555050565b611699828260405180602001604052806000815250611aa5565b5050565b6116a6826117f3565b6116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc9061297d565b60405180910390fd5b8060086000848152602001908152602001600020908051906020019061170c929190611f8e565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117dc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117ec57506117eb82611b00565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b600061188a8473ffffffffffffffffffffffffffffffffffffffff16611b7a565b156119f3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026118b3610ccc565b8786866040518563ffffffff1660e01b81526004016118d594939291906127eb565b602060405180830381600087803b1580156118ef57600080fd5b505af192505050801561192057506040513d601f19601f8201168201806040525081019061191d919061241e565b60015b6119a3573d8060008114611950576040519150601f19603f3d011682016040523d82523d6000602084013e611955565b606091505b5060008151141561199b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119929061289d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506119f8565b600190505b949350505050565b60606040518060400160405280601e81526020017f68747470733a2f2f697066732e66696c65626173652e696f2f697066732f0000815250905090565b6060611a4882610c81565b6000611a52611a00565b90506000815111611a725760405180602001604052806000815250611a9d565b80611a7c84611b9d565b604051602001611a8d9291906127ac565b6040516020818303038152906040525b915050919050565b611aaf8383611d4a565b611abc6000848484611869565b611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af29061289d565b60405180910390fd5b505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b735750611b7282611f24565b5b9050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415611be5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d45565b600082905060005b60008214611c17578080611c0090612dc8565b915050600a82611c109190612bd8565b9150611bed565b60008167ffffffffffffffff811115611c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c8b5781602001600182028036833780820191505090505b5090505b60008514611d3e57600182611ca49190612c63565b9150600a85611cb39190612e11565b6030611cbf9190612b82565b60f81b818381518110611cfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d379190612bd8565b9450611c8f565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906129bd565b60405180910390fd5b611dc3816117f3565b15611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa906128fd565b60405180910390fd5b611e0f6000838361185f565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e5f9190612b82565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f2060008383611864565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054611f9a90612d65565b90600052602060002090601f016020900481019282611fbc5760008555612003565b82601f10611fd557805160ff1916838001178555612003565b82800160010185558215612003579182015b82811115612002578251825591602001919060010190611fe7565b5b5090506120109190612014565b5090565b5b8082111561202d576000816000905550600101612015565b5090565b600061204461203f84612add565b612ab8565b90508281526020810184848401111561205c57600080fd5b612067848285612d23565b509392505050565b600061208261207d84612b0e565b612ab8565b90508281526020810184848401111561209a57600080fd5b6120a5848285612d23565b509392505050565b6000813590506120bc8161331b565b92915050565b6000813590506120d181613332565b92915050565b6000813590506120e681613349565b92915050565b6000815190506120fb81613349565b92915050565b600082601f83011261211257600080fd5b8135612122848260208601612031565b91505092915050565b600082601f83011261213c57600080fd5b813561214c84826020860161206f565b91505092915050565b60008135905061216481613360565b92915050565b60008135905061217981613377565b92915050565b60006020828403121561219157600080fd5b600061219f848285016120ad565b91505092915050565b600080604083850312156121bb57600080fd5b60006121c9858286016120ad565b92505060206121da858286016120ad565b9150509250929050565b6000806000606084860312156121f957600080fd5b6000612207868287016120ad565b9350506020612218868287016120ad565b925050604061222986828701612155565b9150509250925092565b6000806000806080858703121561224957600080fd5b6000612257878288016120ad565b9450506020612268878288016120ad565b935050604061227987828801612155565b925050606085013567ffffffffffffffff81111561229657600080fd5b6122a287828801612101565b91505092959194509250565b600080604083850312156122c157600080fd5b60006122cf858286016120ad565b92505060206122e0858286016120c2565b9150509250929050565b600080604083850312156122fd57600080fd5b600061230b858286016120ad565b925050602083013567ffffffffffffffff81111561232857600080fd5b6123348582860161212b565b9150509250929050565b6000806000806080858703121561235457600080fd5b6000612362878288016120ad565b945050602085013567ffffffffffffffff81111561237f57600080fd5b61238b8782880161212b565b935050604061239c878288016120ad565b92505060606123ad8782880161216a565b91505092959194509250565b600080604083850312156123cc57600080fd5b60006123da858286016120ad565b92505060206123eb85828601612155565b9150509250929050565b60006020828403121561240757600080fd5b6000612415848285016120d7565b91505092915050565b60006020828403121561243057600080fd5b600061243e848285016120ec565b91505092915050565b60006020828403121561245957600080fd5b600061246784828501612155565b91505092915050565b6000806040838503121561248357600080fd5b600061249185828601612155565b92505060206124a285828601612155565b9150509250929050565b6124b581612c97565b82525050565b6124c481612ca9565b82525050565b60006124d582612b3f565b6124df8185612b55565b93506124ef818560208601612d32565b6124f881612efe565b840191505092915050565b600061250e82612b4a565b6125188185612b66565b9350612528818560208601612d32565b61253181612efe565b840191505092915050565b600061254782612b4a565b6125518185612b77565b9350612561818560208601612d32565b80840191505092915050565b600061257a603283612b66565b915061258582612f0f565b604082019050919050565b600061259d602683612b66565b91506125a882612f5e565b604082019050919050565b60006125c0602583612b66565b91506125cb82612fad565b604082019050919050565b60006125e3601c83612b66565b91506125ee82612ffc565b602082019050919050565b6000612606602483612b66565b915061261182613025565b604082019050919050565b6000612629601983612b66565b915061263482613074565b602082019050919050565b600061264c602983612b66565b91506126578261309d565b604082019050919050565b600061266f602e83612b66565b915061267a826130ec565b604082019050919050565b6000612692603e83612b66565b915061269d8261313b565b604082019050919050565b60006126b5602083612b66565b91506126c08261318a565b602082019050919050565b60006126d8602083612b66565b91506126e3826131b3565b602082019050919050565b60006126fb601883612b66565b9150612706826131dc565b602082019050919050565b600061271e602183612b66565b915061272982613205565b604082019050919050565b6000612741601b83612b66565b915061274c82613254565b602082019050919050565b6000612764602a83612b66565b915061276f8261327d565b604082019050919050565b6000612787602e83612b66565b9150612792826132cc565b604082019050919050565b6127a681612d01565b82525050565b60006127b8828561253c565b91506127c4828461253c565b91508190509392505050565b60006020820190506127e560008301846124ac565b92915050565b600060808201905061280060008301876124ac565b61280d60208301866124ac565b61281a604083018561279d565b818103606083015261282c81846124ca565b905095945050505050565b600060408201905061284c60008301856124ac565b612859602083018461279d565b9392505050565b600060208201905061287560008301846124bb565b92915050565b600060208201905081810360008301526128958184612503565b905092915050565b600060208201905081810360008301526128b68161256d565b9050919050565b600060208201905081810360008301526128d681612590565b9050919050565b600060208201905081810360008301526128f6816125b3565b9050919050565b60006020820190508181036000830152612916816125d6565b9050919050565b60006020820190508181036000830152612936816125f9565b9050919050565b600060208201905081810360008301526129568161261c565b9050919050565b600060208201905081810360008301526129768161263f565b9050919050565b6000602082019050818103600083015261299681612662565b9050919050565b600060208201905081810360008301526129b681612685565b9050919050565b600060208201905081810360008301526129d6816126a8565b9050919050565b600060208201905081810360008301526129f6816126cb565b9050919050565b60006020820190508181036000830152612a16816126ee565b9050919050565b60006020820190508181036000830152612a3681612711565b9050919050565b60006020820190508181036000830152612a5681612734565b9050919050565b60006020820190508181036000830152612a7681612757565b9050919050565b60006020820190508181036000830152612a968161277a565b9050919050565b6000602082019050612ab2600083018461279d565b92915050565b6000612ac2612ad3565b9050612ace8282612d97565b919050565b6000604051905090565b600067ffffffffffffffff821115612af857612af7612ecf565b5b612b0182612efe565b9050602081019050919050565b600067ffffffffffffffff821115612b2957612b28612ecf565b5b612b3282612efe565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612b8d82612d01565b9150612b9883612d01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612bcd57612bcc612e42565b5b828201905092915050565b6000612be382612d01565b9150612bee83612d01565b925082612bfe57612bfd612e71565b5b828204905092915050565b6000612c1482612d01565b9150612c1f83612d01565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c5857612c57612e42565b5b828202905092915050565b6000612c6e82612d01565b9150612c7983612d01565b925082821015612c8c57612c8b612e42565b5b828203905092915050565b6000612ca282612ce1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015612d50578082015181840152602081019050612d35565b83811115612d5f576000848401525b50505050565b60006002820490506001821680612d7d57607f821691505b60208210811415612d9157612d90612ea0565b5b50919050565b612da082612efe565b810181811067ffffffffffffffff82111715612dbf57612dbe612ecf565b5b80604052505050565b6000612dd382612d01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e0657612e05612e42565b5b600182019050919050565b6000612e1c82612d01565b9150612e2783612d01565b925082612e3757612e36612e71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61332481612c97565b811461332f57600080fd5b50565b61333b81612ca9565b811461334657600080fd5b50565b61335281612cb5565b811461335d57600080fd5b50565b61336981612d01565b811461337457600080fd5b50565b61338081612d0b565b811461338b57600080fd5b5056fea2646970667358221220883e595d587a9ef3a50e90206421bd279698afc757375318afd7df69bd937b3664736f6c63430008040033

Deployed Bytecode Sourcemap

47970:1568:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48376:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32180:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33693:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33210:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34393:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21662:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;34800:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31891:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31622:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6738:103;;;:::i;:::-;;48822:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6090:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32349:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33936:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35056:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49339:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34162:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48579:235;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6996:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48376:195;48503:4;48527:36;48551:11;48527:23;:36::i;:::-;48520:43;;48376:195;;;:::o;32180:100::-;32234:13;32267:5;32260:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32180:100;:::o;33693:171::-;33769:7;33789:23;33804:7;33789:14;:23::i;:::-;33832:15;:24;33848:7;33832:24;;;;;;;;;;;;;;;;;;;;;33825:31;;33693:171;;;:::o;33210:417::-;33291:13;33307:23;33322:7;33307:14;:23::i;:::-;33291:39;;33355:5;33349:11;;:2;:11;;;;33341:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33449:5;33433:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33458:37;33475:5;33482:12;:10;:12::i;:::-;33458:16;:37::i;:::-;33433:62;33411:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;33598:21;33607:2;33611:7;33598:8;:21::i;:::-;33210:417;;;:::o;34393:336::-;34588:41;34607:12;:10;:12::i;:::-;34621:7;34588:18;:41::i;:::-;34580:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;34693:28;34703:4;34709:2;34713:7;34693:9;:28::i;:::-;34393:336;;;:::o;21662:442::-;21759:7;21768;21788:26;21817:17;:27;21835:8;21817:27;;;;;;;;;;;21788:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21889:1;21861:30;;:7;:16;;;:30;;;21857:92;;;21918:19;21908:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21857:92;21961:21;22026:17;:15;:17::i;:::-;21985:58;;21999:7;:23;;;21986:36;;:10;:36;;;;:::i;:::-;21985:58;;;;:::i;:::-;21961:82;;22064:7;:16;;;22082:13;22056:40;;;;;;21662:442;;;;;:::o;34800:185::-;34938:39;34955:4;34961:2;34965:7;34938:39;;;;;;;;;;;;:16;:39::i;:::-;34800:185;;;:::o;31891:222::-;31963:7;31983:13;31999:7;:16;32007:7;31999:16;;;;;;;;;;;;;;;;;;;;;31983:32;;32051:1;32034:19;;:5;:19;;;;32026:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;32100:5;32093:12;;;31891:222;;;:::o;31622:207::-;31694:7;31739:1;31722:19;;:5;:19;;;;31714:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31805:9;:16;31815:5;31805:16;;;;;;;;;;;;;;;;31798:23;;31622:207;;;:::o;6738:103::-;5976:13;:11;:13::i;:::-;6803:30:::1;6830:1;6803:18;:30::i;:::-;6738:103::o:0;48822:301::-;5976:13;:11;:13::i;:::-;48971:23:::1;48979:9;48990:3;48971:7;:23::i;:::-;49005:15;49023:25;:15;:23;:25::i;:::-;49005:43;;49059:56;49076:7;49085:15;49102:12;49059:16;:56::i;:::-;6000:1;48822:301:::0;;;;:::o;6090:87::-;6136:7;6163:6;;;;;;;;;;;6156:13;;6090:87;:::o;32349:104::-;32405:13;32438:7;32431:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32349:104;:::o;33936:155::-;34031:52;34050:12;:10;:12::i;:::-;34064:8;34074;34031:18;:52::i;:::-;33936:155;;:::o;35056:323::-;35230:41;35249:12;:10;:12::i;:::-;35263:7;35230:18;:41::i;:::-;35222:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;35333:38;35347:4;35353:2;35357:7;35366:4;35333:13;:38::i;:::-;35056:323;;;;:::o;49339:196::-;49466:13;49504:23;49519:7;49504:14;:23::i;:::-;49497:30;;49339:196;;;:::o;34162:164::-;34259:4;34283:18;:25;34302:5;34283:25;;;;;;;;;;;;;;;:35;34309:8;34283:35;;;;;;;;;;;;;;;;;;;;;;;;;34276:42;;34162:164;;;;:::o;48579:235::-;5976:13;:11;:13::i;:::-;48655:27:::1;:15;:25;:27::i;:::-;48693:15;48711:25;:15;:23;:25::i;:::-;48693:43;;48747:22;48757:2;48761:7;48747:9;:22::i;:::-;48780:26;48793:7;48802:3;48780:12;:26::i;:::-;6000:1;48579:235:::0;;:::o;6996:201::-;5976:13;:11;:13::i;:::-;7105:1:::1;7085:22;;:8;:22;;;;7077:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7161:28;7180:8;7161:18;:28::i;:::-;6996:201:::0;:::o;47460:170::-;47562:4;47586:36;47610:11;47586:23;:36::i;:::-;47579:43;;47460:170;;;:::o;41668:135::-;41750:16;41758:7;41750;:16::i;:::-;41742:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;41668:135;:::o;4641:98::-;4694:7;4721:10;4714:17;;4641:98;:::o;40947:174::-;41049:2;41022:15;:24;41038:7;41022:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41105:7;41101:2;41067:46;;41076:23;41091:7;41076:14;:23::i;:::-;41067:46;;;;;;;;;;;;40947:174;;:::o;37180:264::-;37273:4;37290:13;37306:23;37321:7;37306:14;:23::i;:::-;37290:39;;37359:5;37348:16;;:7;:16;;;:52;;;;37368:32;37385:5;37392:7;37368:16;:32::i;:::-;37348:52;:87;;;;37428:7;37404:31;;:20;37416:7;37404:11;:20::i;:::-;:31;;;37348:87;37340:96;;;37180:264;;;;:::o;40203:625::-;40362:4;40335:31;;:23;40350:7;40335:14;:23::i;:::-;:31;;;40327:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;40441:1;40427:16;;:2;:16;;;;40419:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40497:39;40518:4;40524:2;40528:7;40497:20;:39::i;:::-;40601:29;40618:1;40622:7;40601:8;:29::i;:::-;40662:1;40643:9;:15;40653:4;40643:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40691:1;40674:9;:13;40684:2;40674:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40722:2;40703:7;:16;40711:7;40703:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40761:7;40757:2;40742:27;;40751:4;40742:27;;;;;;;;;;;;40782:38;40802:4;40808:2;40812:7;40782:19;:38::i;:::-;40203:625;;;:::o;22386:97::-;22444:6;22470:5;22463:12;;22386:97;:::o;6255:132::-;6330:12;:10;:12::i;:::-;6319:23;;:7;:5;:7::i;:::-;:23;;;6311:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6255:132::o;7357:191::-;7431:16;7450:6;;;;;;;;;;;7431:25;;7476:8;7467:6;;:17;;;;;;;;;;;;;;;;;;7531:8;7500:40;;7521:8;7500:40;;;;;;;;;;;;7357:191;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;23537:390::-;23705:17;:15;:17::i;:::-;23689:33;;:12;:33;;;;23681:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;23808:1;23788:22;;:8;:22;;;;23780:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23884:35;;;;;;;;23896:8;23884:35;;;;;;23906:12;23884:35;;;;;23855:17;:26;23873:7;23855:26;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23537:390;;;:::o;41264:315::-;41419:8;41410:17;;:5;:17;;;;41402:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41506:8;41468:18;:25;41487:5;41468:25;;;;;;;;;;;;;;;:35;41494:8;41468:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41552:8;41530:41;;41545:5;41530:41;;;41562:8;41530:41;;;;;;:::i;:::-;;;;;;;;41264:315;;;:::o;36260:313::-;36416:28;36426:4;36432:2;36436:7;36416:9;:28::i;:::-;36463:47;36486:4;36492:2;36496:7;36505:4;36463:22;:47::i;:::-;36455:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;36260:313;;;;:::o;44961:624::-;45034:13;45060:23;45075:7;45060:14;:23::i;:::-;45096;45122:10;:19;45133:7;45122:19;;;;;;;;;;;45096:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45152:18;45173:10;:8;:10::i;:::-;45152:31;;45281:1;45265:4;45259:18;:23;45255:72;;;45306:9;45299:16;;;;;;45255:72;45457:1;45437:9;45431:23;:27;45427:108;;;45506:4;45512:9;45489:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45475:48;;;;;;45427:108;45554:23;45569:7;45554:14;:23::i;:::-;45547:30;;;;44961:624;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;37786:110::-;37862:26;37872:2;37876:7;37862:26;;;;;;;;;;;;:9;:26::i;:::-;37786:110;;:::o;45741:217::-;45841:16;45849:7;45841;:16::i;:::-;45833:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;45941:9;45919:10;:19;45930:7;45919:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;45741:217;;:::o;31253:305::-;31355:4;31407:25;31392:40;;;:11;:40;;;;:105;;;;31464:33;31449:48;;;:11;:48;;;;31392:105;:158;;;;31514:36;31538:11;31514:23;:36::i;:::-;31392:158;31372:178;;31253:305;;;:::o;36886:127::-;36951:4;37003:1;36975:30;;:7;:16;36983:7;36975:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36968:37;;36886:127;;;:::o;43792:126::-;;;;:::o;44303:125::-;;;;:::o;42367:853::-;42521:4;42542:15;:2;:13;;;:15::i;:::-;42538:675;;;42594:2;42578:36;;;42615:12;:10;:12::i;:::-;42629:4;42635:7;42644:4;42578:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42574:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42836:1;42819:6;:13;:18;42815:328;;;42862:60;;;;;;;;;;:::i;:::-;;;;;;;;42815:328;43093:6;43087:13;43078:6;43074:2;43070:15;43063:38;42574:584;42710:41;;;42700:51;;;:6;:51;;;;42693:58;;;;;42538:675;43197:4;43190:11;;42367:853;;;;;;;:::o;48243:125::-;48295:13;48321:39;;;;;;;;;;;;;;;;;;;48243:125;:::o;32524:281::-;32597:13;32623:23;32638:7;32623:14;:23::i;:::-;32659:21;32683:10;:8;:10::i;:::-;32659:34;;32735:1;32717:7;32711:21;:25;:86;;;;;;;;;;;;;;;;;32763:7;32772:18;:7;:16;:18::i;:::-;32746:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32711:86;32704:93;;;32524:281;;;:::o;38123:319::-;38252:18;38258:2;38262:7;38252:5;:18::i;:::-;38303:53;38334:1;38338:2;38342:7;38351:4;38303:22;:53::i;:::-;38281:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;38123:319;;;:::o;21392:215::-;21494:4;21533:26;21518:41;;;:11;:41;;;;:81;;;;21563:36;21587:11;21563:23;:36::i;:::-;21518:81;21511:88;;21392:215;;;:::o;8788:326::-;8848:4;9105:1;9083:7;:19;;;:23;9076:30;;8788:326;;;:::o;1895:723::-;1951:13;2181:1;2172:5;:10;2168:53;;;2199:10;;;;;;;;;;;;;;;;;;;;;2168:53;2231:12;2246:5;2231:20;;2262:14;2287:78;2302:1;2294:4;:9;2287:78;;2320:8;;;;;:::i;:::-;;;;2351:2;2343:10;;;;;:::i;:::-;;;2287:78;;;2375:19;2407:6;2397:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2375:39;;2425:154;2441:1;2432:5;:10;2425:154;;2469:1;2459:11;;;;;:::i;:::-;;;2536:2;2528:5;:10;;;;:::i;:::-;2515:2;:24;;;;:::i;:::-;2502:39;;2485:6;2492;2485:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2565:2;2556:11;;;;;:::i;:::-;;;2425:154;;;2603:6;2589:21;;;;;1895:723;;;;:::o;38778:439::-;38872:1;38858:16;;:2;:16;;;;38850:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38931:16;38939:7;38931;:16::i;:::-;38930:17;38922:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38993:45;39022:1;39026:2;39030:7;38993:20;:45::i;:::-;39068:1;39051:9;:13;39061:2;39051:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39099:2;39080:7;:16;39088:7;39080:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39144:7;39140:2;39119:33;;39136:1;39119:33;;;;;;;;;;;;39165:44;39193:1;39197:2;39201:7;39165:19;:44::i;:::-;38778:439;;:::o;19842:157::-;19927:4;19966:25;19951:40;;;:11;:40;;;;19944:47;;19842:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:137::-;2054:5;2092:6;2079:20;2070:29;;2108:32;2134:5;2108:32;:::i;:::-;2060:86;;;;:::o;2152:262::-;2211:6;2260:2;2248:9;2239:7;2235:23;2231:32;2228:2;;;2276:1;2273;2266:12;2228:2;2319:1;2344:53;2389:7;2380:6;2369:9;2365:22;2344:53;:::i;:::-;2334:63;;2290:117;2218:196;;;;:::o;2420:407::-;2488:6;2496;2545:2;2533:9;2524:7;2520:23;2516:32;2513:2;;;2561:1;2558;2551:12;2513:2;2604:1;2629:53;2674:7;2665:6;2654:9;2650:22;2629:53;:::i;:::-;2619:63;;2575:117;2731:2;2757:53;2802:7;2793:6;2782:9;2778:22;2757:53;:::i;:::-;2747:63;;2702:118;2503:324;;;;;:::o;2833:552::-;2910:6;2918;2926;2975:2;2963:9;2954:7;2950:23;2946:32;2943:2;;;2991:1;2988;2981:12;2943:2;3034:1;3059:53;3104:7;3095:6;3084:9;3080:22;3059:53;:::i;:::-;3049:63;;3005:117;3161:2;3187:53;3232:7;3223:6;3212:9;3208:22;3187:53;:::i;:::-;3177:63;;3132:118;3289:2;3315:53;3360:7;3351:6;3340:9;3336:22;3315:53;:::i;:::-;3305:63;;3260:118;2933:452;;;;;:::o;3391:809::-;3486:6;3494;3502;3510;3559:3;3547:9;3538:7;3534:23;3530:33;3527:2;;;3576:1;3573;3566:12;3527:2;3619:1;3644:53;3689:7;3680:6;3669:9;3665:22;3644:53;:::i;:::-;3634:63;;3590:117;3746:2;3772:53;3817:7;3808:6;3797:9;3793:22;3772:53;:::i;:::-;3762:63;;3717:118;3874:2;3900:53;3945:7;3936:6;3925:9;3921:22;3900:53;:::i;:::-;3890:63;;3845:118;4030:2;4019:9;4015:18;4002:32;4061:18;4053:6;4050:30;4047:2;;;4093:1;4090;4083:12;4047:2;4121:62;4175:7;4166:6;4155:9;4151:22;4121:62;:::i;:::-;4111:72;;3973:220;3517:683;;;;;;;:::o;4206:401::-;4271:6;4279;4328:2;4316:9;4307:7;4303:23;4299:32;4296:2;;;4344:1;4341;4334:12;4296:2;4387:1;4412:53;4457:7;4448:6;4437:9;4433:22;4412:53;:::i;:::-;4402:63;;4358:117;4514:2;4540:50;4582:7;4573:6;4562:9;4558:22;4540:50;:::i;:::-;4530:60;;4485:115;4286:321;;;;;:::o;4613:520::-;4691:6;4699;4748:2;4736:9;4727:7;4723:23;4719:32;4716:2;;;4764:1;4761;4754:12;4716:2;4807:1;4832:53;4877:7;4868:6;4857:9;4853:22;4832:53;:::i;:::-;4822:63;;4778:117;4962:2;4951:9;4947:18;4934:32;4993:18;4985:6;4982:30;4979:2;;;5025:1;5022;5015:12;4979:2;5053:63;5108:7;5099:6;5088:9;5084:22;5053:63;:::i;:::-;5043:73;;4905:221;4706:427;;;;;:::o;5139:809::-;5234:6;5242;5250;5258;5307:3;5295:9;5286:7;5282:23;5278:33;5275:2;;;5324:1;5321;5314:12;5275:2;5367:1;5392:53;5437:7;5428:6;5417:9;5413:22;5392:53;:::i;:::-;5382:63;;5338:117;5522:2;5511:9;5507:18;5494:32;5553:18;5545:6;5542:30;5539:2;;;5585:1;5582;5575:12;5539:2;5613:63;5668:7;5659:6;5648:9;5644:22;5613:63;:::i;:::-;5603:73;;5465:221;5725:2;5751:53;5796:7;5787:6;5776:9;5772:22;5751:53;:::i;:::-;5741:63;;5696:118;5853:2;5879:52;5923:7;5914:6;5903:9;5899:22;5879:52;:::i;:::-;5869:62;;5824:117;5265:683;;;;;;;:::o;5954:407::-;6022:6;6030;6079:2;6067:9;6058:7;6054:23;6050:32;6047:2;;;6095:1;6092;6085:12;6047:2;6138:1;6163:53;6208:7;6199:6;6188:9;6184:22;6163:53;:::i;:::-;6153:63;;6109:117;6265:2;6291:53;6336:7;6327:6;6316:9;6312:22;6291:53;:::i;:::-;6281:63;;6236:118;6037:324;;;;;:::o;6367:260::-;6425:6;6474:2;6462:9;6453:7;6449:23;6445:32;6442:2;;;6490:1;6487;6480:12;6442:2;6533:1;6558:52;6602:7;6593:6;6582:9;6578:22;6558:52;:::i;:::-;6548:62;;6504:116;6432:195;;;;:::o;6633:282::-;6702:6;6751:2;6739:9;6730:7;6726:23;6722:32;6719:2;;;6767:1;6764;6757:12;6719:2;6810:1;6835:63;6890:7;6881:6;6870:9;6866:22;6835:63;:::i;:::-;6825:73;;6781:127;6709:206;;;;:::o;6921:262::-;6980:6;7029:2;7017:9;7008:7;7004:23;7000:32;6997:2;;;7045:1;7042;7035:12;6997:2;7088:1;7113:53;7158:7;7149:6;7138:9;7134:22;7113:53;:::i;:::-;7103:63;;7059:117;6987:196;;;;:::o;7189:407::-;7257:6;7265;7314:2;7302:9;7293:7;7289:23;7285:32;7282:2;;;7330:1;7327;7320:12;7282:2;7373:1;7398:53;7443:7;7434:6;7423:9;7419:22;7398:53;:::i;:::-;7388:63;;7344:117;7500:2;7526:53;7571:7;7562:6;7551:9;7547:22;7526:53;:::i;:::-;7516:63;;7471:118;7272:324;;;;;:::o;7602:118::-;7689:24;7707:5;7689:24;:::i;:::-;7684:3;7677:37;7667:53;;:::o;7726:109::-;7807:21;7822:5;7807:21;:::i;:::-;7802:3;7795:34;7785:50;;:::o;7841:360::-;7927:3;7955:38;7987:5;7955:38;:::i;:::-;8009:70;8072:6;8067:3;8009:70;:::i;:::-;8002:77;;8088:52;8133:6;8128:3;8121:4;8114:5;8110:16;8088:52;:::i;:::-;8165:29;8187:6;8165:29;:::i;:::-;8160:3;8156:39;8149:46;;7931:270;;;;;:::o;8207:364::-;8295:3;8323:39;8356:5;8323:39;:::i;:::-;8378:71;8442:6;8437:3;8378:71;:::i;:::-;8371:78;;8458:52;8503:6;8498:3;8491:4;8484:5;8480:16;8458:52;:::i;:::-;8535:29;8557:6;8535:29;:::i;:::-;8530:3;8526:39;8519:46;;8299:272;;;;;:::o;8577:377::-;8683:3;8711:39;8744:5;8711:39;:::i;:::-;8766:89;8848:6;8843:3;8766:89;:::i;:::-;8759:96;;8864:52;8909:6;8904:3;8897:4;8890:5;8886:16;8864:52;:::i;:::-;8941:6;8936:3;8932:16;8925:23;;8687:267;;;;;:::o;8960:366::-;9102:3;9123:67;9187:2;9182:3;9123:67;:::i;:::-;9116:74;;9199:93;9288:3;9199:93;:::i;:::-;9317:2;9312:3;9308:12;9301:19;;9106:220;;;:::o;9332:366::-;9474:3;9495:67;9559:2;9554:3;9495:67;:::i;:::-;9488:74;;9571:93;9660:3;9571:93;:::i;:::-;9689:2;9684:3;9680:12;9673:19;;9478:220;;;:::o;9704:366::-;9846:3;9867:67;9931:2;9926:3;9867:67;:::i;:::-;9860:74;;9943:93;10032:3;9943:93;:::i;:::-;10061:2;10056:3;10052:12;10045:19;;9850:220;;;:::o;10076:366::-;10218:3;10239:67;10303:2;10298:3;10239:67;:::i;:::-;10232:74;;10315:93;10404:3;10315:93;:::i;:::-;10433:2;10428:3;10424:12;10417:19;;10222:220;;;:::o;10448:366::-;10590:3;10611:67;10675:2;10670:3;10611:67;:::i;:::-;10604:74;;10687:93;10776:3;10687:93;:::i;:::-;10805:2;10800:3;10796:12;10789:19;;10594:220;;;:::o;10820:366::-;10962:3;10983:67;11047:2;11042:3;10983:67;:::i;:::-;10976:74;;11059:93;11148:3;11059:93;:::i;:::-;11177:2;11172:3;11168:12;11161:19;;10966:220;;;:::o;11192:366::-;11334:3;11355:67;11419:2;11414:3;11355:67;:::i;:::-;11348:74;;11431:93;11520:3;11431:93;:::i;:::-;11549:2;11544:3;11540:12;11533:19;;11338:220;;;:::o;11564:366::-;11706:3;11727:67;11791:2;11786:3;11727:67;:::i;:::-;11720:74;;11803:93;11892:3;11803:93;:::i;:::-;11921:2;11916:3;11912:12;11905:19;;11710:220;;;:::o;11936:366::-;12078:3;12099:67;12163:2;12158:3;12099:67;:::i;:::-;12092:74;;12175:93;12264:3;12175:93;:::i;:::-;12293:2;12288:3;12284:12;12277:19;;12082:220;;;:::o;12308:366::-;12450:3;12471:67;12535:2;12530:3;12471:67;:::i;:::-;12464:74;;12547:93;12636:3;12547:93;:::i;:::-;12665:2;12660:3;12656:12;12649:19;;12454:220;;;:::o;12680:366::-;12822:3;12843:67;12907:2;12902:3;12843:67;:::i;:::-;12836:74;;12919:93;13008:3;12919:93;:::i;:::-;13037:2;13032:3;13028:12;13021:19;;12826:220;;;:::o;13052:366::-;13194:3;13215:67;13279:2;13274:3;13215:67;:::i;:::-;13208:74;;13291:93;13380:3;13291:93;:::i;:::-;13409:2;13404:3;13400:12;13393:19;;13198:220;;;:::o;13424:366::-;13566:3;13587:67;13651:2;13646:3;13587:67;:::i;:::-;13580:74;;13663:93;13752:3;13663:93;:::i;:::-;13781:2;13776:3;13772:12;13765:19;;13570:220;;;:::o;13796:366::-;13938:3;13959:67;14023:2;14018:3;13959:67;:::i;:::-;13952:74;;14035:93;14124:3;14035:93;:::i;:::-;14153:2;14148:3;14144:12;14137:19;;13942:220;;;:::o;14168:366::-;14310:3;14331:67;14395:2;14390:3;14331:67;:::i;:::-;14324:74;;14407:93;14496:3;14407:93;:::i;:::-;14525:2;14520:3;14516:12;14509:19;;14314:220;;;:::o;14540:366::-;14682:3;14703:67;14767:2;14762:3;14703:67;:::i;:::-;14696:74;;14779:93;14868:3;14779:93;:::i;:::-;14897:2;14892:3;14888:12;14881:19;;14686:220;;;:::o;14912:118::-;14999:24;15017:5;14999:24;:::i;:::-;14994:3;14987:37;14977:53;;:::o;15036:435::-;15216:3;15238:95;15329:3;15320:6;15238:95;:::i;:::-;15231:102;;15350:95;15441:3;15432:6;15350:95;:::i;:::-;15343:102;;15462:3;15455:10;;15220:251;;;;;:::o;15477:222::-;15570:4;15608:2;15597:9;15593:18;15585:26;;15621:71;15689:1;15678:9;15674:17;15665:6;15621:71;:::i;:::-;15575:124;;;;:::o;15705:640::-;15900:4;15938:3;15927:9;15923:19;15915:27;;15952:71;16020:1;16009:9;16005:17;15996:6;15952:71;:::i;:::-;16033:72;16101:2;16090:9;16086:18;16077:6;16033:72;:::i;:::-;16115;16183:2;16172:9;16168:18;16159:6;16115:72;:::i;:::-;16234:9;16228:4;16224:20;16219:2;16208:9;16204:18;16197:48;16262:76;16333:4;16324:6;16262:76;:::i;:::-;16254:84;;15905:440;;;;;;;:::o;16351:332::-;16472:4;16510:2;16499:9;16495:18;16487:26;;16523:71;16591:1;16580:9;16576:17;16567:6;16523:71;:::i;:::-;16604:72;16672:2;16661:9;16657:18;16648:6;16604:72;:::i;:::-;16477:206;;;;;:::o;16689:210::-;16776:4;16814:2;16803:9;16799:18;16791:26;;16827:65;16889:1;16878:9;16874:17;16865:6;16827:65;:::i;:::-;16781:118;;;;:::o;16905:313::-;17018:4;17056:2;17045:9;17041:18;17033:26;;17105:9;17099:4;17095:20;17091:1;17080:9;17076:17;17069:47;17133:78;17206:4;17197:6;17133:78;:::i;:::-;17125:86;;17023:195;;;;:::o;17224:419::-;17390:4;17428:2;17417:9;17413:18;17405:26;;17477:9;17471:4;17467:20;17463:1;17452:9;17448:17;17441:47;17505:131;17631:4;17505:131;:::i;:::-;17497:139;;17395:248;;;:::o;17649:419::-;17815:4;17853:2;17842:9;17838:18;17830:26;;17902:9;17896:4;17892:20;17888:1;17877:9;17873:17;17866:47;17930:131;18056:4;17930:131;:::i;:::-;17922:139;;17820:248;;;:::o;18074:419::-;18240:4;18278:2;18267:9;18263:18;18255:26;;18327:9;18321:4;18317:20;18313:1;18302:9;18298:17;18291:47;18355:131;18481:4;18355:131;:::i;:::-;18347:139;;18245:248;;;:::o;18499:419::-;18665:4;18703:2;18692:9;18688:18;18680:26;;18752:9;18746:4;18742:20;18738:1;18727:9;18723:17;18716:47;18780:131;18906:4;18780:131;:::i;:::-;18772:139;;18670:248;;;:::o;18924:419::-;19090:4;19128:2;19117:9;19113:18;19105:26;;19177:9;19171:4;19167:20;19163:1;19152:9;19148:17;19141:47;19205:131;19331:4;19205:131;:::i;:::-;19197:139;;19095:248;;;:::o;19349:419::-;19515:4;19553:2;19542:9;19538:18;19530:26;;19602:9;19596:4;19592:20;19588:1;19577:9;19573:17;19566:47;19630:131;19756:4;19630:131;:::i;:::-;19622:139;;19520:248;;;:::o;19774:419::-;19940:4;19978:2;19967:9;19963:18;19955:26;;20027:9;20021:4;20017:20;20013:1;20002:9;19998:17;19991:47;20055:131;20181:4;20055:131;:::i;:::-;20047:139;;19945:248;;;:::o;20199:419::-;20365:4;20403:2;20392:9;20388:18;20380:26;;20452:9;20446:4;20442:20;20438:1;20427:9;20423:17;20416:47;20480:131;20606:4;20480:131;:::i;:::-;20472:139;;20370:248;;;:::o;20624:419::-;20790:4;20828:2;20817:9;20813:18;20805:26;;20877:9;20871:4;20867:20;20863:1;20852:9;20848:17;20841:47;20905:131;21031:4;20905:131;:::i;:::-;20897:139;;20795:248;;;:::o;21049:419::-;21215:4;21253:2;21242:9;21238:18;21230:26;;21302:9;21296:4;21292:20;21288:1;21277:9;21273:17;21266:47;21330:131;21456:4;21330:131;:::i;:::-;21322:139;;21220:248;;;:::o;21474:419::-;21640:4;21678:2;21667:9;21663:18;21655:26;;21727:9;21721:4;21717:20;21713:1;21702:9;21698:17;21691:47;21755:131;21881:4;21755:131;:::i;:::-;21747:139;;21645:248;;;:::o;21899:419::-;22065:4;22103:2;22092:9;22088:18;22080:26;;22152:9;22146:4;22142:20;22138:1;22127:9;22123:17;22116:47;22180:131;22306:4;22180:131;:::i;:::-;22172:139;;22070:248;;;:::o;22324:419::-;22490:4;22528:2;22517:9;22513:18;22505:26;;22577:9;22571:4;22567:20;22563:1;22552:9;22548:17;22541:47;22605:131;22731:4;22605:131;:::i;:::-;22597:139;;22495:248;;;:::o;22749:419::-;22915:4;22953:2;22942:9;22938:18;22930:26;;23002:9;22996:4;22992:20;22988:1;22977:9;22973:17;22966:47;23030:131;23156:4;23030:131;:::i;:::-;23022:139;;22920:248;;;:::o;23174:419::-;23340:4;23378:2;23367:9;23363:18;23355:26;;23427:9;23421:4;23417:20;23413:1;23402:9;23398:17;23391:47;23455:131;23581:4;23455:131;:::i;:::-;23447:139;;23345:248;;;:::o;23599:419::-;23765:4;23803:2;23792:9;23788:18;23780:26;;23852:9;23846:4;23842:20;23838:1;23827:9;23823:17;23816:47;23880:131;24006:4;23880:131;:::i;:::-;23872:139;;23770:248;;;:::o;24024:222::-;24117:4;24155:2;24144:9;24140:18;24132:26;;24168:71;24236:1;24225:9;24221:17;24212:6;24168:71;:::i;:::-;24122:124;;;;:::o;24252:129::-;24286:6;24313:20;;:::i;:::-;24303:30;;24342:33;24370:4;24362:6;24342:33;:::i;:::-;24293:88;;;:::o;24387:75::-;24420:6;24453:2;24447:9;24437:19;;24427:35;:::o;24468:307::-;24529:4;24619:18;24611:6;24608:30;24605:2;;;24641:18;;:::i;:::-;24605:2;24679:29;24701:6;24679:29;:::i;:::-;24671:37;;24763:4;24757;24753:15;24745:23;;24534:241;;;:::o;24781:308::-;24843:4;24933:18;24925:6;24922:30;24919:2;;;24955:18;;:::i;:::-;24919:2;24993:29;25015:6;24993:29;:::i;:::-;24985:37;;25077:4;25071;25067:15;25059:23;;24848:241;;;:::o;25095:98::-;25146:6;25180:5;25174:12;25164:22;;25153:40;;;:::o;25199:99::-;25251:6;25285:5;25279:12;25269:22;;25258:40;;;:::o;25304:168::-;25387:11;25421:6;25416:3;25409:19;25461:4;25456:3;25452:14;25437:29;;25399:73;;;;:::o;25478:169::-;25562:11;25596:6;25591:3;25584:19;25636:4;25631:3;25627:14;25612:29;;25574:73;;;;:::o;25653:148::-;25755:11;25792:3;25777:18;;25767:34;;;;:::o;25807:305::-;25847:3;25866:20;25884:1;25866:20;:::i;:::-;25861:25;;25900:20;25918:1;25900:20;:::i;:::-;25895:25;;26054:1;25986:66;25982:74;25979:1;25976:81;25973:2;;;26060:18;;:::i;:::-;25973:2;26104:1;26101;26097:9;26090:16;;25851:261;;;;:::o;26118:185::-;26158:1;26175:20;26193:1;26175:20;:::i;:::-;26170:25;;26209:20;26227:1;26209:20;:::i;:::-;26204:25;;26248:1;26238:2;;26253:18;;:::i;:::-;26238:2;26295:1;26292;26288:9;26283:14;;26160:143;;;;:::o;26309:348::-;26349:7;26372:20;26390:1;26372:20;:::i;:::-;26367:25;;26406:20;26424:1;26406:20;:::i;:::-;26401:25;;26594:1;26526:66;26522:74;26519:1;26516:81;26511:1;26504:9;26497:17;26493:105;26490:2;;;26601:18;;:::i;:::-;26490:2;26649:1;26646;26642:9;26631:20;;26357:300;;;;:::o;26663:191::-;26703:4;26723:20;26741:1;26723:20;:::i;:::-;26718:25;;26757:20;26775:1;26757:20;:::i;:::-;26752:25;;26796:1;26793;26790:8;26787:2;;;26801:18;;:::i;:::-;26787:2;26846:1;26843;26839:9;26831:17;;26708:146;;;;:::o;26860:96::-;26897:7;26926:24;26944:5;26926:24;:::i;:::-;26915:35;;26905:51;;;:::o;26962:90::-;26996:7;27039:5;27032:13;27025:21;27014:32;;27004:48;;;:::o;27058:149::-;27094:7;27134:66;27127:5;27123:78;27112:89;;27102:105;;;:::o;27213:126::-;27250:7;27290:42;27283:5;27279:54;27268:65;;27258:81;;;:::o;27345:77::-;27382:7;27411:5;27400:16;;27390:32;;;:::o;27428:109::-;27464:7;27504:26;27497:5;27493:38;27482:49;;27472:65;;;:::o;27543:154::-;27627:6;27622:3;27617;27604:30;27689:1;27680:6;27675:3;27671:16;27664:27;27594:103;;;:::o;27703:307::-;27771:1;27781:113;27795:6;27792:1;27789:13;27781:113;;;27880:1;27875:3;27871:11;27865:18;27861:1;27856:3;27852:11;27845:39;27817:2;27814:1;27810:10;27805:15;;27781:113;;;27912:6;27909:1;27906:13;27903:2;;;27992:1;27983:6;27978:3;27974:16;27967:27;27903:2;27752:258;;;;:::o;28016:320::-;28060:6;28097:1;28091:4;28087:12;28077:22;;28144:1;28138:4;28134:12;28165:18;28155:2;;28221:4;28213:6;28209:17;28199:27;;28155:2;28283;28275:6;28272:14;28252:18;28249:38;28246:2;;;28302:18;;:::i;:::-;28246:2;28067:269;;;;:::o;28342:281::-;28425:27;28447:4;28425:27;:::i;:::-;28417:6;28413:40;28555:6;28543:10;28540:22;28519:18;28507:10;28504:34;28501:62;28498:2;;;28566:18;;:::i;:::-;28498:2;28606:10;28602:2;28595:22;28385:238;;;:::o;28629:233::-;28668:3;28691:24;28709:5;28691:24;:::i;:::-;28682:33;;28737:66;28730:5;28727:77;28724:2;;;28807:18;;:::i;:::-;28724:2;28854:1;28847:5;28843:13;28836:20;;28672:190;;;:::o;28868:176::-;28900:1;28917:20;28935:1;28917:20;:::i;:::-;28912:25;;28951:20;28969:1;28951:20;:::i;:::-;28946:25;;28990:1;28980:2;;28995:18;;:::i;:::-;28980:2;29036:1;29033;29029:9;29024:14;;28902:142;;;;:::o;29050:180::-;29098:77;29095:1;29088:88;29195:4;29192:1;29185:15;29219:4;29216:1;29209:15;29236:180;29284:77;29281:1;29274:88;29381:4;29378:1;29371:15;29405:4;29402:1;29395:15;29422:180;29470:77;29467:1;29460:88;29567:4;29564:1;29557:15;29591:4;29588:1;29581:15;29608:180;29656:77;29653:1;29646:88;29753:4;29750:1;29743:15;29777:4;29774:1;29767:15;29794:102;29835:6;29886:2;29882:7;29877:2;29870:5;29866:14;29862:28;29852:38;;29842:54;;;:::o;29902:237::-;30042:34;30038:1;30030:6;30026:14;30019:58;30111:20;30106:2;30098:6;30094:15;30087:45;30008:131;:::o;30145:225::-;30285:34;30281:1;30273:6;30269:14;30262:58;30354:8;30349:2;30341:6;30337:15;30330:33;30251:119;:::o;30376:224::-;30516:34;30512:1;30504:6;30500:14;30493:58;30585:7;30580:2;30572:6;30568:15;30561:32;30482:118;:::o;30606:178::-;30746:30;30742:1;30734:6;30730:14;30723:54;30712:72;:::o;30790:223::-;30930:34;30926:1;30918:6;30914:14;30907:58;30999:6;30994:2;30986:6;30982:15;30975:31;30896:117;:::o;31019:175::-;31159:27;31155:1;31147:6;31143:14;31136:51;31125:69;:::o;31200:228::-;31340:34;31336:1;31328:6;31324:14;31317:58;31409:11;31404:2;31396:6;31392:15;31385:36;31306:122;:::o;31434:233::-;31574:34;31570:1;31562:6;31558:14;31551:58;31643:16;31638:2;31630:6;31626:15;31619:41;31540:127;:::o;31673:249::-;31813:34;31809:1;31801:6;31797:14;31790:58;31882:32;31877:2;31869:6;31865:15;31858:57;31779:143;:::o;31928:182::-;32068:34;32064:1;32056:6;32052:14;32045:58;32034:76;:::o;32116:182::-;32256:34;32252:1;32244:6;32240:14;32233:58;32222:76;:::o;32304:174::-;32444:26;32440:1;32432:6;32428:14;32421:50;32410:68;:::o;32484:220::-;32624:34;32620:1;32612:6;32608:14;32601:58;32693:3;32688:2;32680:6;32676:15;32669:28;32590:114;:::o;32710:177::-;32850:29;32846:1;32838:6;32834:14;32827:53;32816:71;:::o;32893:229::-;33033:34;33029:1;33021:6;33017:14;33010:58;33102:12;33097:2;33089:6;33085:15;33078:37;32999:123;:::o;33128:233::-;33268:34;33264:1;33256:6;33252:14;33245:58;33337:16;33332:2;33324:6;33320:15;33313:41;33234:127;:::o;33367:122::-;33440:24;33458:5;33440:24;:::i;:::-;33433:5;33430:35;33420:2;;33479:1;33476;33469:12;33420:2;33410:79;:::o;33495:116::-;33565:21;33580:5;33565:21;:::i;:::-;33558:5;33555:32;33545:2;;33601:1;33598;33591:12;33545:2;33535:76;:::o;33617:120::-;33689:23;33706:5;33689:23;:::i;:::-;33682:5;33679:34;33669:2;;33727:1;33724;33717:12;33669:2;33659:78;:::o;33743:122::-;33816:24;33834:5;33816:24;:::i;:::-;33809:5;33806:35;33796:2;;33855:1;33852;33845:12;33796:2;33786:79;:::o;33871:120::-;33943:23;33960:5;33943:23;:::i;:::-;33936:5;33933:34;33923:2;;33981:1;33978;33971:12;33923:2;33913:78;:::o

Swarm Source

ipfs://883e595d587a9ef3a50e90206421bd279698afc757375318afd7df69bd937b36
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.