ETH Price: $3,362.97 (+0.45%)

Token

TheTrash ()
 

Overview

Max Total Supply

1,701

Holders

773

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*v我50.eth
0xd24abbdb5f69e2270befe591447efe484360c47b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Trash can an epic item that activates mysterious monsters

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheTrash

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-19
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

library Base64 {
    string constant private B64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory _data) internal pure returns (string memory result) {
        if (_data.length == 0) return '';
        string memory _table = B64_ALPHABET;
        uint256 _encodedLen = 4 * ((_data.length + 2) / 3);
        result = new string(_encodedLen + 32);

        assembly {
            mstore(result, _encodedLen)
            let tablePtr := add(_table, 1)
            let dataPtr := _data
            let endPtr := add(dataPtr, mload(_data))
            let resultPtr := add(result, 32)

            for {} lt(dataPtr, endPtr) {}
            {
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
                resultPtr := add(resultPtr, 1)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
                resultPtr := add(resultPtr, 1)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))))
                resultPtr := add(resultPtr, 1)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))))
                resultPtr := add(resultPtr, 1)
            }

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

        return result;
    }
}


contract TheTrashrenderer {
    string public constant IMAGE_DATA =
        "data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAKAAD/4QMsaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA2LjAtYzAwMiA3OS4xNjQ0ODgsIDIwMjAvMDcvMTAtMjI6MDY6NTMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi4wIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERTc3N0NDN0VGQ0IxMUVDQTU2MEZBMUI3QzE0RkI5NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERTc3N0NDOEVGQ0IxMUVDQTU2MEZBMUI3QzE0RkI5NiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkRFNzc3Q0M1RUZDQjExRUNBNTYwRkExQjdDMTRGQjk2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRFNzc3Q0M2RUZDQjExRUNBNTYwRkExQjdDMTRGQjk2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAFBAQGRIZJxcXJzImHyYyLiYm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";

    function render() external pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(
                        abi.encodePacked(
                            '{"name":"The Trash",',
                            '"description":"An epic item that activates mysterious monsters!",',
                            '"image":"',
                            IMAGE_DATA,
                            '"}'
                        )
                    )
                )
            );
    }
}
// File: @openzeppelin/contracts/utils/Address.sol


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


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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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)


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


/**
 * @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.6.0) (token/common/ERC2981.sol)




/**
 * @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:
     *
     * - `tokenId` must be already minted.
     * - `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/ERC1155/IERC1155Receiver.sol


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

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)




/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)




/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


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



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

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

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol)









/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

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

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

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


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



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

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

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

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

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

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

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

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

// File: contracts/TheTrash.sol








interface IRenderer {
    function render() external view returns (string memory);
}

contract TheTrash is ERC1155, ERC2981, Ownable {
    uint32 public constant MAX_SUPPLY = 6000;

    address public _renderer;
    uint32 public _minted = 0;
    address public _allowedMinter;
    address public _burner;

    constructor(address renderer) ERC1155("") {
        _renderer = renderer;
        setFeeNumerator(750);
    }

    function mint(address to, uint32 amount) external {
        require(_allowedMinter == msg.sender, "TheTrash: ?");
        require(amount + _minted <= MAX_SUPPLY, "TheTrash: Exceed max supply");

        _minted += amount;
        _mint(to, 0, amount, "");
    }

    function airdrop(address[] memory tos, uint32[] memory amounts) external onlyOwner {
        require(tos.length == amounts.length);
        for (uint256 i = 0; i < amounts.length; i++) {
            _minted += amounts[i];
            require(_minted <= MAX_SUPPLY, "TheTrash: Exceed max supply");

            _mint(tos[i], 0, amounts[i], "");
        }
    }

    function burn(address who, uint32 amount) external {
        require(msg.sender == _burner, "TheTrash: ?");

        _burn(who, 0, amount);
    }

    function uri(uint256 id) public view override returns (string memory) {
        return IRenderer(_renderer).render();
    }

    function setMinter(address minter) external onlyOwner {
        _allowedMinter = minter;
    }

    function setBurner(address burner) external onlyOwner {
        _burner = burner;
    }

    function setRenderer(address renderer) external onlyOwner {
        _renderer = renderer;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC2981, ERC1155) returns (bool) {
        return
            interfaceId == type(IERC2981).interfaceId ||
            interfaceId == type(IERC1155).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function setFeeNumerator(uint96 feeNumerator) public onlyOwner {
        _setDefaultRoyalty(owner(), feeNumerator);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"renderer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_allowedMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_minted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_renderer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint32[]","name":"amounts","type":"uint32[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":"uint32","name":"amount","type":"uint32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"address","name":"burner","type":"address"}],"name":"setBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setFeeNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"renderer","type":"address"}],"name":"setRenderer","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526006805463ffffffff60a01b191690553480156200002157600080fd5b5060405162002d3538038062002d3583398101604081905262000044916200032c565b6040805160208101909152600081526200005e8162000099565b506200006a33620000b2565b600680546001600160a01b0319166001600160a01b038316179055620000926102ee62000104565b506200039b565b8051620000ae90600290602084019062000286565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b620001826200017b6005546001600160a01b031690565b8262000185565b50565b6127106001600160601b0382161115620001f55760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016200015b565b6001600160a01b0382166200024d5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200015b565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600355565b82805462000294906200035e565b90600052602060002090601f016020900481019282620002b8576000855562000303565b82601f10620002d357805160ff191683800117855562000303565b8280016001018555821562000303579182015b8281111562000303578251825591602001919060010190620002e6565b506200031192915062000315565b5090565b5b8082111562000311576000815560010162000316565b6000602082840312156200033f57600080fd5b81516001600160a01b03811681146200035757600080fd5b9392505050565b600181811c908216806200037357607f821691505b602082108114156200039557634e487b7160e01b600052602260045260246000fd5b50919050565b61298a80620003ab6000396000f3fe608060405234801561001057600080fd5b50600436106101975760003560e01c8063715018a6116100e3578063d35e29d71161008c578063f2fde38b11610066578063f2fde38b146103dd578063f79705ec146103f0578063fca3b5aa1461040357600080fd5b8063d35e29d71461037b578063e985e9c51461038e578063f242432a146103ca57600080fd5b8063a67561c7116100bd578063a67561c714610342578063a996d6ce14610355578063bdbd20a51461036857600080fd5b8063715018a6146103165780638da5cb5b1461031e578063a22cb4651461032f57600080fd5b80632eb2c2d61161014557806356d3163d1161011f57806356d3163d146102c5578063610936b9146102d8578063653a819e1461030357600080fd5b80632eb2c2d61461028957806332cb6b0c1461029c5780634e1273f4146102a557600080fd5b8063235c8fa711610176578063235c8fa7146102055780632a55205a1461021a5780632c19b7f31461024c57600080fd5b8062fdd58e1461019c57806301ffc9a7146101c25780630e89341c146101e5575b600080fd5b6101af6101aa366004611f47565b610416565b6040519081526020015b60405180910390f35b6101d56101d0366004611f9f565b6104bf565b60405190151581526020016101b9565b6101f86101f3366004611fc3565b610567565b6040516101b99190612038565b61021861021336600461205f565b610601565b005b61022d610228366004612092565b610671565b604080516001600160a01b0390931683526020830191909152016101b9565b6006546102749074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101b9565b610218610297366004612229565b61074e565b61027461177081565b6102b86102b3366004612340565b6107f0565b6040516101b991906123df565b6102186102d33660046123f2565b61092e565b6008546102eb906001600160a01b031681565b6040516001600160a01b0390911681526020016101b9565b61021861031136600461240d565b6109c2565b610218610a3a565b6005546001600160a01b03166102eb565b61021861033d36600461243b565b610aa0565b6006546102eb906001600160a01b031681565b6102186103633660046123f2565b610aab565b610218610376366004612477565b610b3f565b61021861038936600461205f565b610ce6565b6101d561039c366004612544565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102186103d836600461256e565b610e24565b6102186103eb3660046123f2565b610ebf565b6007546102eb906001600160a01b031681565b6102186104113660046123f2565b610f9e565b60006001600160a01b0383166104995760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061055257507fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000145b80610561575061056182611032565b92915050565b600654604080517fd607497a00000000000000000000000000000000000000000000000000000000815290516060926001600160a01b03169163d607497a916004808301926000929190829003018186803b1580156105c557600080fd5b505afa1580156105d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261056191908101906125d3565b6008546001600160a01b0316331461065b5760405162461bcd60e51b815260206004820152600b60248201527f54686554726173683a203f0000000000000000000000000000000000000000006044820152606401610490565b61066d8260008363ffffffff16611088565b5050565b60008281526004602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916107125750604080518082019091526003546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b602081015160009061271090610736906bffffffffffffffffffffffff1687612684565b61074091906126c1565b915196919550909350505050565b6001600160a01b03851633148061076a575061076a853361039c565b6107dc5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610490565b6107e9858585858561123c565b5050505050565b606081518351146108695760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610490565b6000835167ffffffffffffffff811115610885576108856120b4565b6040519080825280602002602001820160405280156108ae578160200160208202803683370190505b50905060005b8451811015610926576108f98582815181106108d2576108d26126fc565b60200260200101518583815181106108ec576108ec6126fc565b6020026020010151610416565b82828151811061090b5761090b6126fc565b602090810291909101015261091f8161272b565b90506108b4565b509392505050565b6005546001600160a01b031633146109885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610a1c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b610a37610a316005546001600160a01b031690565b826114da565b50565b6005546001600160a01b03163314610a945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b610a9e6000611605565b565b61066d33838361166f565b6005546001600160a01b03163314610b055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610b995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b8051825114610ba757600080fd5b60005b8151811015610ce157818181518110610bc557610bc56126fc565b6020026020010151600660148282829054906101000a900463ffffffff16610bed9190612764565b92506101000a81548163ffffffff021916908363ffffffff16021790555061177063ffffffff16600660149054906101000a900463ffffffff1663ffffffff161115610c7b5760405162461bcd60e51b815260206004820152601b60248201527f54686554726173683a20457863656564206d617820737570706c7900000000006044820152606401610490565b610ccf838281518110610c9057610c906126fc565b60200260200101516000848481518110610cac57610cac6126fc565b602002602001015163ffffffff1660405180602001604052806000815250611782565b80610cd98161272b565b915050610baa565b505050565b6007546001600160a01b03163314610d405760405162461bcd60e51b815260206004820152600b60248201527f54686554726173683a203f0000000000000000000000000000000000000000006044820152606401610490565b60065461177090610d6f9074010000000000000000000000000000000000000000900463ffffffff1683612764565b63ffffffff161115610dc35760405162461bcd60e51b815260206004820152601b60248201527f54686554726173683a20457863656564206d617820737570706c7900000000006044820152606401610490565b80600660148282829054906101000a900463ffffffff16610de49190612764565b92506101000a81548163ffffffff021916908363ffffffff16021790555061066d8260008363ffffffff1660405180602001604052806000815250611782565b6001600160a01b038516331480610e405750610e40853361039c565b610eb25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610490565b6107e985858585856118a9565b6005546001600160a01b03163314610f195760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b6001600160a01b038116610f955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610490565b610a3781611605565b6005546001600160a01b03163314610ff85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610561575061056182611a7f565b6001600160a01b0383166111045760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610490565b33600061111084611b62565b9050600061111d84611b62565b60408051602080820183526000918290528882528181528282206001600160a01b038b16835290522054909150848110156111bf5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610490565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090525b50505050505050565b81518351146112b35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610490565b6001600160a01b03841661132f5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610490565b3360005b845181101561146c576000858281518110611350576113506126fc565b60200260200101519050600085838151811061136e5761136e6126fc565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114145760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610490565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061145190849061278c565b92505081905550505050806114659061272b565b9050611333565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114bc9291906127a4565b60405180910390a46114d2818787878787611bad565b505050505050565b6127106bffffffffffffffffffffffff821611156115605760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610490565b6001600160a01b0382166115b65760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610490565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600355565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156116f75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610490565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166117fe5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610490565b33600061180a85611b62565b9050600061181785611b62565b90506000868152602081815260408083206001600160a01b038b1684529091528120805487929061184990849061278c565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461123383600089898989611dc1565b6001600160a01b0384166119255760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610490565b33600061193185611b62565b9050600061193e85611b62565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156119d75760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610490565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611a1490849061278c565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611a74848a8a8a8a8a611dc1565b505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480611b1257507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061056157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610561565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611b9c57611b9c6126fc565b602090810291909101015292915050565b6001600160a01b0384163b156114d2576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c8190611c0a90899089908890889088906004016127d2565b602060405180830381600087803b158015611c2457600080fd5b505af1925050508015611c54575060408051601f3d908101601f19168201909252611c5191810190612830565b60015b611d0a57611c6061284d565b806308c379a01415611c9a5750611c75612869565b80611c805750611c9c565b8060405162461bcd60e51b81526004016104909190612038565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610490565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112335760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610490565b6001600160a01b0384163b156114d2576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e6190611e1e9089908990889088908890600401612911565b602060405180830381600087803b158015611e3857600080fd5b505af1925050508015611e68575060408051601f3d908101601f19168201909252611e6591810190612830565b60015b611e7457611c6061284d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112335760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610490565b80356001600160a01b0381168114611f4257600080fd5b919050565b60008060408385031215611f5a57600080fd5b611f6383611f2b565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610a3757600080fd5b600060208284031215611fb157600080fd5b8135611fbc81611f71565b9392505050565b600060208284031215611fd557600080fd5b5035919050565b60005b83811015611ff7578181015183820152602001611fdf565b83811115612006576000848401525b50505050565b60008151808452612024816020860160208601611fdc565b601f01601f19169290920160200192915050565b602081526000611fbc602083018461200c565b803563ffffffff81168114611f4257600080fd5b6000806040838503121561207257600080fd5b61207b83611f2b565b91506120896020840161204b565b90509250929050565b600080604083850312156120a557600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715612109576121096120b4565b6040525050565b600067ffffffffffffffff82111561212a5761212a6120b4565b5060051b60200190565b600082601f83011261214557600080fd5b8135602061215282612110565b60405161215f82826120e3565b83815260059390931b850182019282810191508684111561217f57600080fd5b8286015b8481101561219a5780358352918301918301612183565b509695505050505050565b600067ffffffffffffffff8211156121bf576121bf6120b4565b50601f01601f191660200190565b600082601f8301126121de57600080fd5b81356121e9816121a5565b6040516121f682826120e3565b82815285602084870101111561220b57600080fd5b82602086016020830137600092810160200192909252509392505050565b600080600080600060a0868803121561224157600080fd5b61224a86611f2b565b945061225860208701611f2b565b9350604086013567ffffffffffffffff8082111561227557600080fd5b61228189838a01612134565b9450606088013591508082111561229757600080fd5b6122a389838a01612134565b935060808801359150808211156122b957600080fd5b506122c6888289016121cd565b9150509295509295909350565b600082601f8301126122e457600080fd5b813560206122f182612110565b6040516122fe82826120e3565b83815260059390931b850182019282810191508684111561231e57600080fd5b8286015b8481101561219a5761233381611f2b565b8352918301918301612322565b6000806040838503121561235357600080fd5b823567ffffffffffffffff8082111561236b57600080fd5b612377868387016122d3565b9350602085013591508082111561238d57600080fd5b5061239a85828601612134565b9150509250929050565b600081518084526020808501945080840160005b838110156123d4578151875295820195908201906001016123b8565b509495945050505050565b602081526000611fbc60208301846123a4565b60006020828403121561240457600080fd5b611fbc82611f2b565b60006020828403121561241f57600080fd5b81356bffffffffffffffffffffffff81168114611fbc57600080fd5b6000806040838503121561244e57600080fd5b61245783611f2b565b91506020830135801515811461246c57600080fd5b809150509250929050565b6000806040838503121561248a57600080fd5b823567ffffffffffffffff808211156124a257600080fd5b6124ae868387016122d3565b93506020915081850135818111156124c557600080fd5b85019050601f810186136124d857600080fd5b80356124e381612110565b6040516124f082826120e3565b82815260059290921b830184019184810191508883111561251057600080fd5b928401925b82841015612535576125268461204b565b82529284019290840190612515565b80955050505050509250929050565b6000806040838503121561255757600080fd5b61256083611f2b565b915061208960208401611f2b565b600080600080600060a0868803121561258657600080fd5b61258f86611f2b565b945061259d60208701611f2b565b93506040860135925060608601359150608086013567ffffffffffffffff8111156125c757600080fd5b6122c6888289016121cd565b6000602082840312156125e557600080fd5b815167ffffffffffffffff8111156125fc57600080fd5b8201601f8101841361260d57600080fd5b8051612618816121a5565b60405161262582826120e3565b82815286602084860101111561263a57600080fd5b61264b836020830160208701611fdc565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126bc576126bc612655565b500290565b6000826126f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561275d5761275d612655565b5060010190565b600063ffffffff80831681851680830382111561278357612783612655565b01949350505050565b6000821982111561279f5761279f612655565b500190565b6040815260006127b760408301856123a4565b82810360208401526127c981856123a4565b95945050505050565b60006001600160a01b03808816835280871660208401525060a060408301526127fe60a08301866123a4565b828103606084015261281081866123a4565b90508281036080840152612824818561200c565b98975050505050505050565b60006020828403121561284257600080fd5b8151611fbc81611f71565b600060033d11156128665760046000803e5060005160e01c5b90565b600060443d10156128775790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff81602484011181841117156128c557505050505090565b82850191508151818111156128dd5750505050505090565b843d87010160208285010111156128f75750505050505090565b612906602082860101876120e3565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261294960a083018461200c565b97965050505050505056fea264697066735822122027290b671baa7c0c2adb4ca8738cf05b0ee73ca942168abd1aa70c842fcb44c464736f6c634300080900330000000000000000000000007fc557c8d2f2fdf13d09cb7fc5f96c1cda6332a9

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101975760003560e01c8063715018a6116100e3578063d35e29d71161008c578063f2fde38b11610066578063f2fde38b146103dd578063f79705ec146103f0578063fca3b5aa1461040357600080fd5b8063d35e29d71461037b578063e985e9c51461038e578063f242432a146103ca57600080fd5b8063a67561c7116100bd578063a67561c714610342578063a996d6ce14610355578063bdbd20a51461036857600080fd5b8063715018a6146103165780638da5cb5b1461031e578063a22cb4651461032f57600080fd5b80632eb2c2d61161014557806356d3163d1161011f57806356d3163d146102c5578063610936b9146102d8578063653a819e1461030357600080fd5b80632eb2c2d61461028957806332cb6b0c1461029c5780634e1273f4146102a557600080fd5b8063235c8fa711610176578063235c8fa7146102055780632a55205a1461021a5780632c19b7f31461024c57600080fd5b8062fdd58e1461019c57806301ffc9a7146101c25780630e89341c146101e5575b600080fd5b6101af6101aa366004611f47565b610416565b6040519081526020015b60405180910390f35b6101d56101d0366004611f9f565b6104bf565b60405190151581526020016101b9565b6101f86101f3366004611fc3565b610567565b6040516101b99190612038565b61021861021336600461205f565b610601565b005b61022d610228366004612092565b610671565b604080516001600160a01b0390931683526020830191909152016101b9565b6006546102749074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101b9565b610218610297366004612229565b61074e565b61027461177081565b6102b86102b3366004612340565b6107f0565b6040516101b991906123df565b6102186102d33660046123f2565b61092e565b6008546102eb906001600160a01b031681565b6040516001600160a01b0390911681526020016101b9565b61021861031136600461240d565b6109c2565b610218610a3a565b6005546001600160a01b03166102eb565b61021861033d36600461243b565b610aa0565b6006546102eb906001600160a01b031681565b6102186103633660046123f2565b610aab565b610218610376366004612477565b610b3f565b61021861038936600461205f565b610ce6565b6101d561039c366004612544565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102186103d836600461256e565b610e24565b6102186103eb3660046123f2565b610ebf565b6007546102eb906001600160a01b031681565b6102186104113660046123f2565b610f9e565b60006001600160a01b0383166104995760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061055257507fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000145b80610561575061056182611032565b92915050565b600654604080517fd607497a00000000000000000000000000000000000000000000000000000000815290516060926001600160a01b03169163d607497a916004808301926000929190829003018186803b1580156105c557600080fd5b505afa1580156105d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261056191908101906125d3565b6008546001600160a01b0316331461065b5760405162461bcd60e51b815260206004820152600b60248201527f54686554726173683a203f0000000000000000000000000000000000000000006044820152606401610490565b61066d8260008363ffffffff16611088565b5050565b60008281526004602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916107125750604080518082019091526003546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b602081015160009061271090610736906bffffffffffffffffffffffff1687612684565b61074091906126c1565b915196919550909350505050565b6001600160a01b03851633148061076a575061076a853361039c565b6107dc5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610490565b6107e9858585858561123c565b5050505050565b606081518351146108695760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610490565b6000835167ffffffffffffffff811115610885576108856120b4565b6040519080825280602002602001820160405280156108ae578160200160208202803683370190505b50905060005b8451811015610926576108f98582815181106108d2576108d26126fc565b60200260200101518583815181106108ec576108ec6126fc565b6020026020010151610416565b82828151811061090b5761090b6126fc565b602090810291909101015261091f8161272b565b90506108b4565b509392505050565b6005546001600160a01b031633146109885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610a1c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b610a37610a316005546001600160a01b031690565b826114da565b50565b6005546001600160a01b03163314610a945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b610a9e6000611605565b565b61066d33838361166f565b6005546001600160a01b03163314610b055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610b995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b8051825114610ba757600080fd5b60005b8151811015610ce157818181518110610bc557610bc56126fc565b6020026020010151600660148282829054906101000a900463ffffffff16610bed9190612764565b92506101000a81548163ffffffff021916908363ffffffff16021790555061177063ffffffff16600660149054906101000a900463ffffffff1663ffffffff161115610c7b5760405162461bcd60e51b815260206004820152601b60248201527f54686554726173683a20457863656564206d617820737570706c7900000000006044820152606401610490565b610ccf838281518110610c9057610c906126fc565b60200260200101516000848481518110610cac57610cac6126fc565b602002602001015163ffffffff1660405180602001604052806000815250611782565b80610cd98161272b565b915050610baa565b505050565b6007546001600160a01b03163314610d405760405162461bcd60e51b815260206004820152600b60248201527f54686554726173683a203f0000000000000000000000000000000000000000006044820152606401610490565b60065461177090610d6f9074010000000000000000000000000000000000000000900463ffffffff1683612764565b63ffffffff161115610dc35760405162461bcd60e51b815260206004820152601b60248201527f54686554726173683a20457863656564206d617820737570706c7900000000006044820152606401610490565b80600660148282829054906101000a900463ffffffff16610de49190612764565b92506101000a81548163ffffffff021916908363ffffffff16021790555061066d8260008363ffffffff1660405180602001604052806000815250611782565b6001600160a01b038516331480610e405750610e40853361039c565b610eb25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610490565b6107e985858585856118a9565b6005546001600160a01b03163314610f195760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b6001600160a01b038116610f955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610490565b610a3781611605565b6005546001600160a01b03163314610ff85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610561575061056182611a7f565b6001600160a01b0383166111045760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610490565b33600061111084611b62565b9050600061111d84611b62565b60408051602080820183526000918290528882528181528282206001600160a01b038b16835290522054909150848110156111bf5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610490565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090525b50505050505050565b81518351146112b35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610490565b6001600160a01b03841661132f5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610490565b3360005b845181101561146c576000858281518110611350576113506126fc565b60200260200101519050600085838151811061136e5761136e6126fc565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114145760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610490565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061145190849061278c565b92505081905550505050806114659061272b565b9050611333565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114bc9291906127a4565b60405180910390a46114d2818787878787611bad565b505050505050565b6127106bffffffffffffffffffffffff821611156115605760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610490565b6001600160a01b0382166115b65760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610490565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600355565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156116f75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610490565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166117fe5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610490565b33600061180a85611b62565b9050600061181785611b62565b90506000868152602081815260408083206001600160a01b038b1684529091528120805487929061184990849061278c565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461123383600089898989611dc1565b6001600160a01b0384166119255760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610490565b33600061193185611b62565b9050600061193e85611b62565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156119d75760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610490565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611a1490849061278c565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611a74848a8a8a8a8a611dc1565b505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480611b1257507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061056157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610561565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611b9c57611b9c6126fc565b602090810291909101015292915050565b6001600160a01b0384163b156114d2576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c8190611c0a90899089908890889088906004016127d2565b602060405180830381600087803b158015611c2457600080fd5b505af1925050508015611c54575060408051601f3d908101601f19168201909252611c5191810190612830565b60015b611d0a57611c6061284d565b806308c379a01415611c9a5750611c75612869565b80611c805750611c9c565b8060405162461bcd60e51b81526004016104909190612038565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610490565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112335760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610490565b6001600160a01b0384163b156114d2576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e6190611e1e9089908990889088908890600401612911565b602060405180830381600087803b158015611e3857600080fd5b505af1925050508015611e68575060408051601f3d908101601f19168201909252611e6591810190612830565b60015b611e7457611c6061284d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112335760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610490565b80356001600160a01b0381168114611f4257600080fd5b919050565b60008060408385031215611f5a57600080fd5b611f6383611f2b565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610a3757600080fd5b600060208284031215611fb157600080fd5b8135611fbc81611f71565b9392505050565b600060208284031215611fd557600080fd5b5035919050565b60005b83811015611ff7578181015183820152602001611fdf565b83811115612006576000848401525b50505050565b60008151808452612024816020860160208601611fdc565b601f01601f19169290920160200192915050565b602081526000611fbc602083018461200c565b803563ffffffff81168114611f4257600080fd5b6000806040838503121561207257600080fd5b61207b83611f2b565b91506120896020840161204b565b90509250929050565b600080604083850312156120a557600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715612109576121096120b4565b6040525050565b600067ffffffffffffffff82111561212a5761212a6120b4565b5060051b60200190565b600082601f83011261214557600080fd5b8135602061215282612110565b60405161215f82826120e3565b83815260059390931b850182019282810191508684111561217f57600080fd5b8286015b8481101561219a5780358352918301918301612183565b509695505050505050565b600067ffffffffffffffff8211156121bf576121bf6120b4565b50601f01601f191660200190565b600082601f8301126121de57600080fd5b81356121e9816121a5565b6040516121f682826120e3565b82815285602084870101111561220b57600080fd5b82602086016020830137600092810160200192909252509392505050565b600080600080600060a0868803121561224157600080fd5b61224a86611f2b565b945061225860208701611f2b565b9350604086013567ffffffffffffffff8082111561227557600080fd5b61228189838a01612134565b9450606088013591508082111561229757600080fd5b6122a389838a01612134565b935060808801359150808211156122b957600080fd5b506122c6888289016121cd565b9150509295509295909350565b600082601f8301126122e457600080fd5b813560206122f182612110565b6040516122fe82826120e3565b83815260059390931b850182019282810191508684111561231e57600080fd5b8286015b8481101561219a5761233381611f2b565b8352918301918301612322565b6000806040838503121561235357600080fd5b823567ffffffffffffffff8082111561236b57600080fd5b612377868387016122d3565b9350602085013591508082111561238d57600080fd5b5061239a85828601612134565b9150509250929050565b600081518084526020808501945080840160005b838110156123d4578151875295820195908201906001016123b8565b509495945050505050565b602081526000611fbc60208301846123a4565b60006020828403121561240457600080fd5b611fbc82611f2b565b60006020828403121561241f57600080fd5b81356bffffffffffffffffffffffff81168114611fbc57600080fd5b6000806040838503121561244e57600080fd5b61245783611f2b565b91506020830135801515811461246c57600080fd5b809150509250929050565b6000806040838503121561248a57600080fd5b823567ffffffffffffffff808211156124a257600080fd5b6124ae868387016122d3565b93506020915081850135818111156124c557600080fd5b85019050601f810186136124d857600080fd5b80356124e381612110565b6040516124f082826120e3565b82815260059290921b830184019184810191508883111561251057600080fd5b928401925b82841015612535576125268461204b565b82529284019290840190612515565b80955050505050509250929050565b6000806040838503121561255757600080fd5b61256083611f2b565b915061208960208401611f2b565b600080600080600060a0868803121561258657600080fd5b61258f86611f2b565b945061259d60208701611f2b565b93506040860135925060608601359150608086013567ffffffffffffffff8111156125c757600080fd5b6122c6888289016121cd565b6000602082840312156125e557600080fd5b815167ffffffffffffffff8111156125fc57600080fd5b8201601f8101841361260d57600080fd5b8051612618816121a5565b60405161262582826120e3565b82815286602084860101111561263a57600080fd5b61264b836020830160208701611fdc565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126bc576126bc612655565b500290565b6000826126f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561275d5761275d612655565b5060010190565b600063ffffffff80831681851680830382111561278357612783612655565b01949350505050565b6000821982111561279f5761279f612655565b500190565b6040815260006127b760408301856123a4565b82810360208401526127c981856123a4565b95945050505050565b60006001600160a01b03808816835280871660208401525060a060408301526127fe60a08301866123a4565b828103606084015261281081866123a4565b90508281036080840152612824818561200c565b98975050505050505050565b60006020828403121561284257600080fd5b8151611fbc81611f71565b600060033d11156128665760046000803e5060005160e01c5b90565b600060443d10156128775790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff81602484011181841117156128c557505050505090565b82850191508151818111156128dd5750505050505090565b843d87010160208285010111156128f75750505050505090565b612906602082860101876120e3565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261294960a083018461200c565b97965050505050505056fea264697066735822122027290b671baa7c0c2adb4ca8738cf05b0ee73ca942168abd1aa70c842fcb44c464736f6c63430008090033

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

0000000000000000000000007fc557c8d2f2fdf13d09cb7fc5f96c1cda6332a9

-----Decoded View---------------
Arg [0] : renderer (address): 0x7FC557C8d2F2fDf13D09Cb7fc5F96c1cDA6332A9

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007fc557c8d2f2fdf13d09cb7fc5f96c1cda6332a9


Deployed Bytecode Sourcemap

57343:2033:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39319:231;;;;;;:::i;:::-;;:::i;:::-;;;620:25:1;;;608:2;593:18;39319:231:0;;;;;;;;58942:300;;;;;;:::i;:::-;;:::i;:::-;;;1253:14:1;;1246:22;1228:41;;1216:2;1201:18;58942:300:0;1088:187:1;58503:125:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58346:149::-;;;;;;:::i;:::-;;:::i;:::-;;26486:442;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3151:55:1;;;3133:74;;3238:2;3223:18;;3216:34;;;;3106:18;26486:442:0;2959:297:1;57477:25:0;;;;;;;;;;;;;;;3435:10:1;3423:23;;;3405:42;;3393:2;3378:18;57477:25:0;3261:192:1;41258:442:0;;;;;;:::i;:::-;;:::i;57397:40::-;;57433:4;57397:40;;39716:524;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58837:97::-;;;;;;:::i;:::-;;:::i;57545:22::-;;;;;-1:-1:-1;;;;;57545:22:0;;;;;;-1:-1:-1;;;;;8984:55:1;;;8966:74;;8954:2;8939:18;57545:22:0;8820:226:1;59250:123:0;;;;;;:::i;:::-;;:::i;56387:103::-;;;:::i;55736:87::-;55809:6;;-1:-1:-1;;;;;55809:6:0;55736:87;;40313:155;;;;;;:::i;:::-;;:::i;57446:24::-;;;;;-1:-1:-1;;;;;57446:24:0;;;58740:89;;;;;;:::i;:::-;;:::i;57971:367::-;;;;;;:::i;:::-;;:::i;57696:267::-;;;;;;:::i;:::-;;:::i;40540:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;40663:27:0;;;40639:4;40663:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;40540:168;40780:401;;;;;;:::i;:::-;;:::i;56645:201::-;;;;;;:::i;:::-;;:::i;57509:29::-;;;;;-1:-1:-1;;;;;57509:29:0;;;58636:96;;;;;;:::i;:::-;;:::i;39319:231::-;39405:7;-1:-1:-1;;;;;39433:21:0;;39425:77;;;;-1:-1:-1;;;39425:77:0;;11987:2:1;39425:77:0;;;11969:21:1;12026:2;12006:18;;;11999:30;12065:34;12045:18;;;12038:62;12136:13;12116:18;;;12109:41;12167:19;;39425:77:0;;;;;;;;;-1:-1:-1;39520:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;39520:22:0;;;;;;;;;;;;39319:231::o;58942:300::-;59045:4;59082:41;;;59097:26;59082:41;;:99;;-1:-1:-1;59140:41:0;;;59155:26;59140:41;59082:99;:152;;;;59198:36;59222:11;59198:23;:36::i;:::-;59062:172;58942:300;-1:-1:-1;;58942:300:0:o;58503:125::-;58601:9;;58591:29;;;;;;;;58558:13;;-1:-1:-1;;;;;58601:9:0;;58591:27;;:29;;;;;58601:9;;58591:29;;;;;;;58601:9;58591:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58591:29:0;;;;;;;;;;;;:::i;58346:149::-;58430:7;;-1:-1:-1;;;;;58430:7:0;58416:10;:21;58408:45;;;;-1:-1:-1;;;58408:45:0;;13094:2:1;58408:45:0;;;13076:21:1;13133:2;13113:18;;;13106:30;13172:13;13152:18;;;13145:41;13203:18;;58408:45:0;12892:335:1;58408:45:0;58466:21;58472:3;58477:1;58480:6;58466:21;;:5;:21::i;:::-;58346:149;;:::o;26486:442::-;26583:7;26641:27;;;:17;:27;;;;;;;;26612:56;;;;;;;;;-1:-1:-1;;;;;26612:56:0;;;;;;;;;;;;;;;;;;26583:7;;26681:92;;-1:-1:-1;26732:29:0;;;;;;;;;26742:19;26732:29;-1:-1:-1;;;;;26732:29:0;;;;;;;;;;;;;26681:92;26823:23;;;;26785:21;;27294:5;;26810:36;;26809:58;26810:36;:10;:36;:::i;:::-;26809:58;;;;:::i;:::-;26888:16;;;;;-1:-1:-1;26486:442:0;;-1:-1:-1;;;;26486:442:0:o;41258:::-;-1:-1:-1;;;;;41491:20:0;;37139:10;41491:20;;:60;;-1:-1:-1;41515:36:0;41532:4;37139:10;40540:168;:::i;41515:36::-;41469:160;;;;-1:-1:-1;;;41469:160:0;;14135:2:1;41469:160:0;;;14117:21:1;14174:2;14154:18;;;14147:30;14213:34;14193:18;;;14186:62;14284:20;14264:18;;;14257:48;14322:19;;41469:160:0;13933:414:1;41469:160:0;41640:52;41663:4;41669:2;41673:3;41678:7;41687:4;41640:22;:52::i;:::-;41258:442;;;;;:::o;39716:524::-;39872:16;39933:3;:10;39914:8;:15;:29;39906:83;;;;-1:-1:-1;;;39906:83:0;;14554:2:1;39906:83:0;;;14536:21:1;14593:2;14573:18;;;14566:30;14632:34;14612:18;;;14605:62;14703:11;14683:18;;;14676:39;14732:19;;39906:83:0;14352:405:1;39906:83:0;40002:30;40049:8;:15;40035:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40035:30:0;;40002:63;;40083:9;40078:122;40102:8;:15;40098:1;:19;40078:122;;;40158:30;40168:8;40177:1;40168:11;;;;;;;;:::i;:::-;;;;;;;40181:3;40185:1;40181:6;;;;;;;;:::i;:::-;;;;;;;40158:9;:30::i;:::-;40139:13;40153:1;40139:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;40119:3;;;:::i;:::-;;;40078:122;;;-1:-1:-1;40219:13:0;39716:524;-1:-1:-1;;;39716:524:0:o;58837:97::-;55809:6;;-1:-1:-1;;;;;55809:6:0;37139:10;55956:23;55948:68;;;;-1:-1:-1;;;55948:68:0;;15353:2:1;55948:68:0;;;15335:21:1;;;15372:18;;;15365:30;15431:34;15411:18;;;15404:62;15483:18;;55948:68:0;15151:356:1;55948:68:0;58906:9:::1;:20:::0;;;::::1;-1:-1:-1::0;;;;;58906:20:0;;;::::1;::::0;;;::::1;::::0;;58837:97::o;59250:123::-;55809:6;;-1:-1:-1;;;;;55809:6:0;37139:10;55956:23;55948:68;;;;-1:-1:-1;;;55948:68:0;;15353:2:1;55948:68:0;;;15335:21:1;;;15372:18;;;15365:30;15431:34;15411:18;;;15404:62;15483:18;;55948:68:0;15151:356:1;55948:68:0;59324:41:::1;59343:7;55809:6:::0;;-1:-1:-1;;;;;55809:6:0;;55736:87;59343:7:::1;59352:12;59324:18;:41::i;:::-;59250:123:::0;:::o;56387:103::-;55809:6;;-1:-1:-1;;;;;55809:6:0;37139:10;55956:23;55948:68;;;;-1:-1:-1;;;55948:68:0;;15353:2:1;55948:68:0;;;15335:21:1;;;15372:18;;;15365:30;15431:34;15411:18;;;15404:62;15483:18;;55948:68:0;15151:356:1;55948:68:0;56452:30:::1;56479:1;56452:18;:30::i;:::-;56387:103::o:0;40313:155::-;40408:52;37139:10;40441:8;40451;40408:18;:52::i;58740:89::-;55809:6;;-1:-1:-1;;;;;55809:6:0;37139:10;55956:23;55948:68;;;;-1:-1:-1;;;55948:68:0;;15353:2:1;55948:68:0;;;15335:21:1;;;15372:18;;;15365:30;15431:34;15411:18;;;15404:62;15483:18;;55948:68:0;15151:356:1;55948:68:0;58805:7:::1;:16:::0;;;::::1;-1:-1:-1::0;;;;;58805:16:0;;;::::1;::::0;;;::::1;::::0;;58740:89::o;57971:367::-;55809:6;;-1:-1:-1;;;;;55809:6:0;37139:10;55956:23;55948:68;;;;-1:-1:-1;;;55948:68:0;;15353:2:1;55948:68:0;;;15335:21:1;;;15372:18;;;15365:30;15431:34;15411:18;;;15404:62;15483:18;;55948:68:0;15151:356:1;55948:68:0;58087:7:::1;:14;58073:3;:10;:28;58065:37;;;::::0;::::1;;58118:9;58113:218;58137:7;:14;58133:1;:18;58113:218;;;58184:7;58192:1;58184:10;;;;;;;;:::i;:::-;;;;;;;58173:7;;:21;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57433:4;58217:21;;:7;;;;;;;;;;;:21;;;;58209:61;;;::::0;-1:-1:-1;;;58209:61:0;;15947:2:1;58209:61:0::1;::::0;::::1;15929:21:1::0;15986:2;15966:18;;;15959:30;16025:29;16005:18;;;15998:57;16072:18;;58209:61:0::1;15745:351:1::0;58209:61:0::1;58287:32;58293:3;58297:1;58293:6;;;;;;;;:::i;:::-;;;;;;;58301:1;58304:7;58312:1;58304:10;;;;;;;;:::i;:::-;;;;;;;58287:32;;;;;;;;;;;;;::::0;:5:::1;:32::i;:::-;58153:3:::0;::::1;::::0;::::1;:::i;:::-;;;;58113:218;;;;57971:367:::0;;:::o;57696:267::-;57765:14;;-1:-1:-1;;;;;57765:14:0;57783:10;57765:28;57757:52;;;;-1:-1:-1;;;57757:52:0;;13094:2:1;57757:52:0;;;13076:21:1;13133:2;13113:18;;;13106:30;13172:13;13152:18;;;13145:41;13203:18;;57757:52:0;12892:335:1;57757:52:0;57837:7;;57433:4;;57828:16;;57837:7;;;57828:30;57837:7;57828:6;:16;:::i;:::-;:30;;;;57820:70;;;;-1:-1:-1;;;57820:70:0;;15947:2:1;57820:70:0;;;15929:21:1;15986:2;15966:18;;;15959:30;16025:29;16005:18;;;15998:57;16072:18;;57820:70:0;15745:351:1;57820:70:0;57914:6;57903:7;;:17;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57931:24;57937:2;57941:1;57944:6;57931:24;;;;;;;;;;;;;;:5;:24::i;40780:401::-;-1:-1:-1;;;;;40988:20:0;;37139:10;40988:20;;:60;;-1:-1:-1;41012:36:0;41029:4;37139:10;40540:168;:::i;41012:36::-;40966:151;;;;-1:-1:-1;;;40966:151:0;;16303:2:1;40966:151:0;;;16285:21:1;16342:2;16322:18;;;16315:30;16381:34;16361:18;;;16354:62;16452:11;16432:18;;;16425:39;16481:19;;40966:151:0;16101:405:1;40966:151:0;41128:45;41146:4;41152:2;41156;41160:6;41168:4;41128:17;:45::i;56645:201::-;55809:6;;-1:-1:-1;;;;;55809:6:0;37139:10;55956:23;55948:68;;;;-1:-1:-1;;;55948:68:0;;15353:2:1;55948:68:0;;;15335:21:1;;;15372:18;;;15365:30;15431:34;15411:18;;;15404:62;15483:18;;55948:68:0;15151:356:1;55948:68:0;-1:-1:-1;;;;;56734:22:0;::::1;56726:73;;;::::0;-1:-1:-1;;;56726:73:0;;16713:2:1;56726:73:0::1;::::0;::::1;16695:21:1::0;16752:2;16732:18;;;16725:30;16791:34;16771:18;;;16764:62;16862:8;16842:18;;;16835:36;16888:19;;56726:73:0::1;16511:402:1::0;56726:73:0::1;56810:28;56829:8;56810:18;:28::i;58636:96::-:0;55809:6;;-1:-1:-1;;;;;55809:6:0;37139:10;55956:23;55948:68;;;;-1:-1:-1;;;55948:68:0;;15353:2:1;55948:68:0;;;15335:21:1;;;15372:18;;;15365:30;15431:34;15411:18;;;15404:62;15483:18;;55948:68:0;15151:356:1;55948:68:0;58701:14:::1;:23:::0;;;::::1;-1:-1:-1::0;;;;;58701:23:0;;;::::1;::::0;;;::::1;::::0;;58636:96::o;26216:215::-;26318:4;26342:41;;;26357:26;26342:41;;:81;;;26387:36;26411:11;26387:23;:36::i;48108:808::-;-1:-1:-1;;;;;48235:18:0;;48227:66;;;;-1:-1:-1;;;48227:66:0;;17120:2:1;48227:66:0;;;17102:21:1;17159:2;17139:18;;;17132:30;17198:34;17178:18;;;17171:62;17269:5;17249:18;;;17242:33;17292:19;;48227:66:0;16918:399:1;48227:66:0;37139:10;48306:16;48371:21;48389:2;48371:17;:21::i;:::-;48348:44;;48403:24;48430:25;48448:6;48430:17;:25::i;:::-;48468:66;;;;;;;;;-1:-1:-1;48468:66:0;;;;48569:13;;;;;;;;;-1:-1:-1;;;;;48569:19:0;;;;;;;;48403:52;;-1:-1:-1;48607:21:0;;;;48599:70;;;;-1:-1:-1;;;48599:70:0;;17524:2:1;48599:70:0;;;17506:21:1;17563:2;17543:18;;;17536:30;17602:34;17582:18;;;17575:62;17673:6;17653:18;;;17646:34;17697:19;;48599:70:0;17322:400:1;48599:70:0;48705:9;:13;;;;;;;;;;;-1:-1:-1;;;;;48705:19:0;;;;;;;;;;;;48727:20;;;48705:42;;48776:54;;17901:25:1;;;17942:18;;;17935:34;;;48705:19:0;;48776:54;;;;;;17874:18:1;48776:54:0;;;;;;;48843:65;;;;;;;;;48887:1;48843:65;;;48216:700;;;;48108:808;;;:::o;43496:1146::-;43723:7;:14;43709:3;:10;:28;43701:81;;;;-1:-1:-1;;;43701:81:0;;18182:2:1;43701:81:0;;;18164:21:1;18221:2;18201:18;;;18194:30;18260:34;18240:18;;;18233:62;18331:10;18311:18;;;18304:38;18359:19;;43701:81:0;17980:404:1;43701:81:0;-1:-1:-1;;;;;43801:16:0;;43793:66;;;;-1:-1:-1;;;43793:66:0;;18591:2:1;43793:66:0;;;18573:21:1;18630:2;18610:18;;;18603:30;18669:34;18649:18;;;18642:62;18740:7;18720:18;;;18713:35;18765:19;;43793:66:0;18389:401:1;43793:66:0;37139:10;43872:16;43989:421;44013:3;:10;44009:1;:14;43989:421;;;44045:10;44058:3;44062:1;44058:6;;;;;;;;:::i;:::-;;;;;;;44045:19;;44079:14;44096:7;44104:1;44096:10;;;;;;;;:::i;:::-;;;;;;;;;;;;44123:19;44145:13;;;;;;;;;;-1:-1:-1;;;;;44145:19:0;;;;;;;;;;;;44096:10;;-1:-1:-1;44187:21:0;;;;44179:76;;;;-1:-1:-1;;;44179:76:0;;18997:2:1;44179:76:0;;;18979:21:1;19036:2;19016:18;;;19009:30;19075:34;19055:18;;;19048:62;19146:12;19126:18;;;19119:40;19176:19;;44179:76:0;18795:406:1;44179:76:0;44299:9;:13;;;;;;;;;;;-1:-1:-1;;;;;44299:19:0;;;;;;;;;;44321:20;;;44299:42;;44371:17;;;;;;;:27;;44321:20;;44299:9;44371:27;;44321:20;;44371:27;:::i;:::-;;;;;;;;44030:380;;;44025:3;;;;:::i;:::-;;;43989:421;;;;44457:2;-1:-1:-1;;;;;44427:47:0;44451:4;-1:-1:-1;;;;;44427:47:0;44441:8;-1:-1:-1;;;;;44427:47:0;;44461:3;44466:7;44427:47;;;;;;;:::i;:::-;;;;;;;;44559:75;44595:8;44605:4;44611:2;44615:3;44620:7;44629:4;44559:35;:75::i;:::-;43690:952;43496:1146;;;;;:::o;27578:332::-;27294:5;27681:33;;;;;27673:88;;;;-1:-1:-1;;;27673:88:0;;20011:2:1;27673:88:0;;;19993:21:1;20050:2;20030:18;;;20023:30;20089:34;20069:18;;;20062:62;20160:12;20140:18;;;20133:40;20190:19;;27673:88:0;19809:406:1;27673:88:0;-1:-1:-1;;;;;27780:22:0;;27772:60;;;;-1:-1:-1;;;27772:60:0;;20422:2:1;27772:60:0;;;20404:21:1;20461:2;20441:18;;;20434:30;20500:27;20480:18;;;20473:55;20545:18;;27772:60:0;20220:349:1;27772:60:0;27867:35;;;;;;;;;-1:-1:-1;;;;;27867:35:0;;;;;;;;;;;;;;;;;27845:57;;;;;:19;:57;27578:332::o;57006:191::-;57099:6;;;-1:-1:-1;;;;;57116:17:0;;;;;;;;;;;57149:40;;57099:6;;;57116:17;57099:6;;57149:40;;57080:16;;57149:40;57069:128;57006:191;:::o;50230:331::-;50385:8;-1:-1:-1;;;;;50376:17:0;:5;-1:-1:-1;;;;;50376:17:0;;;50368:71;;;;-1:-1:-1;;;50368:71:0;;20776:2:1;50368:71:0;;;20758:21:1;20815:2;20795:18;;;20788:30;20854:34;20834:18;;;20827:62;20925:11;20905:18;;;20898:39;20954:19;;50368:71:0;20574:405:1;50368:71:0;-1:-1:-1;;;;;50450:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;50512:41;;1228::1;;;50512::0;;1201:18:1;50512:41:0;;;;;;;50230:331;;;:::o;45960:729::-;-1:-1:-1;;;;;46113:16:0;;46105:62;;;;-1:-1:-1;;;46105:62:0;;21186:2:1;46105:62:0;;;21168:21:1;21225:2;21205:18;;;21198:30;21264:34;21244:18;;;21237:62;21335:3;21315:18;;;21308:31;21356:19;;46105:62:0;20984:397:1;46105:62:0;37139:10;46180:16;46245:21;46263:2;46245:17;:21::i;:::-;46222:44;;46277:24;46304:25;46322:6;46304:17;:25::i;:::-;46277:52;;46421:9;:13;;;;;;;;;;;-1:-1:-1;;;;;46421:17:0;;;;;;;;;:27;;46442:6;;46421:9;:27;;46442:6;;46421:27;:::i;:::-;;;;-1:-1:-1;;46464:52:0;;;17901:25:1;;;17957:2;17942:18;;17935:34;;;-1:-1:-1;;;;;46464:52:0;;;;46497:1;;46464:52;;;;;;17874:18:1;46464:52:0;;;;;;;46607:74;46638:8;46656:1;46660:2;46664;46668:6;46676:4;46607:30;:74::i;42164:974::-;-1:-1:-1;;;;;42352:16:0;;42344:66;;;;-1:-1:-1;;;42344:66:0;;18591:2:1;42344:66:0;;;18573:21:1;18630:2;18610:18;;;18603:30;18669:34;18649:18;;;18642:62;18740:7;18720:18;;;18713:35;18765:19;;42344:66:0;18389:401:1;42344:66:0;37139:10;42423:16;42488:21;42506:2;42488:17;:21::i;:::-;42465:44;;42520:24;42547:25;42565:6;42547:17;:25::i;:::-;42520:52;;42658:19;42680:13;;;;;;;;;;;-1:-1:-1;;;;;42680:19:0;;;;;;;;;;42718:21;;;;42710:76;;;;-1:-1:-1;;;42710:76:0;;18997:2:1;42710:76:0;;;18979:21:1;19036:2;19016:18;;;19009:30;19075:34;19055:18;;;19048:62;19146:12;19126:18;;;19119:40;19176:19;;42710:76:0;18795:406:1;42710:76:0;42822:9;:13;;;;;;;;;;;-1:-1:-1;;;;;42822:19:0;;;;;;;;;;42844:20;;;42822:42;;42886:17;;;;;;;:27;;42844:20;;42822:9;42886:27;;42844:20;;42886:27;:::i;:::-;;;;-1:-1:-1;;42931:46:0;;;17901:25:1;;;17957:2;17942:18;;17935:34;;;-1:-1:-1;;;;;42931:46:0;;;;;;;;;;;;;;17874:18:1;42931:46:0;;;;;;;43062:68;43093:8;43103:4;43109:2;43113;43117:6;43125:4;43062:30;:68::i;:::-;42333:805;;;;42164:974;;;;;:::o;38342:310::-;38444:4;38481:41;;;38496:26;38481:41;;:110;;-1:-1:-1;38539:52:0;;;38554:37;38539:52;38481:110;:163;;;-1:-1:-1;24815:25:0;24800:40;;;;38608:36;24691:157;54494:198;54614:16;;;54628:1;54614:16;;;;;;;;;54560;;54589:22;;54614:16;;;;;;;;;;;;-1:-1:-1;54614:16:0;54589:41;;54652:7;54641:5;54647:1;54641:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;54679:5;54494:198;-1:-1:-1;;54494:198:0:o;53673:813::-;-1:-1:-1;;;;;53913:13:0;;15404:19;:23;53909:570;;53949:79;;;;;-1:-1:-1;;;;;53949:43:0;;;;;:79;;53993:8;;54003:4;;54009:3;;54014:7;;54023:4;;53949:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53949:79:0;;;;;;;;-1:-1:-1;;53949:79:0;;;;;;;;;;;;:::i;:::-;;;53945:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54341:6;54334:14;;-1:-1:-1;;;54334:14:0;;;;;;;;:::i;53945:523::-;;;54390:62;;-1:-1:-1;;;54390:62:0;;23617:2:1;54390:62:0;;;23599:21:1;23656:2;23636:18;;;23629:30;23695:34;23675:18;;;23668:62;23766:22;23746:18;;;23739:50;23806:19;;54390:62:0;23415:416:1;53945:523:0;54110:60;;;54122:48;54110:60;54106:159;;54195:50;;-1:-1:-1;;;54195:50:0;;24038:2:1;54195:50:0;;;24020:21:1;24077:2;24057:18;;;24050:30;24116:34;24096:18;;;24089:62;24187:10;24167:18;;;24160:38;24215:19;;54195:50:0;23836:404:1;52921:744:0;-1:-1:-1;;;;;53136:13:0;;15404:19;:23;53132:526;;53172:72;;;;;-1:-1:-1;;;;;53172:38:0;;;;;:72;;53211:8;;53221:4;;53227:2;;53231:6;;53239:4;;53172:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53172:72:0;;;;;;;;-1:-1:-1;;53172:72:0;;;;;;;;;;;;:::i;:::-;;;53168:479;;;;:::i;:::-;53294:55;;;53306:43;53294:55;53290:154;;53374:50;;-1:-1:-1;;;53374:50:0;;24038:2:1;53374:50:0;;;24020:21:1;24077:2;24057:18;;;24050:30;24116:34;24096:18;;;24089:62;24187:10;24167:18;;;24160:38;24215:19;;53374:50:0;23836:404:1;14:196;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;459:2;444:18;;;;431:32;;-1:-1:-1;;;215:254:1:o;656:177::-;741:66;734:5;730:78;723:5;720:89;710:117;;823:1;820;813:12;838:245;896:6;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1004:9;991:23;1023:30;1047:5;1023:30;:::i;:::-;1072:5;838:245;-1:-1:-1;;;838:245:1:o;1280:180::-;1339:6;1392:2;1380:9;1371:7;1367:23;1363:32;1360:52;;;1408:1;1405;1398:12;1360:52;-1:-1:-1;1431:23:1;;1280:180;-1:-1:-1;1280:180:1:o;1465:258::-;1537:1;1547:113;1561:6;1558:1;1555:13;1547:113;;;1637:11;;;1631:18;1618:11;;;1611:39;1583:2;1576:10;1547:113;;;1678:6;1675:1;1672:13;1669:48;;;1713:1;1704:6;1699:3;1695:16;1688:27;1669:48;;1465:258;;;:::o;1728:317::-;1770:3;1808:5;1802:12;1835:6;1830:3;1823:19;1851:63;1907:6;1900:4;1895:3;1891:14;1884:4;1877:5;1873:16;1851:63;:::i;:::-;1959:2;1947:15;-1:-1:-1;;1943:88:1;1934:98;;;;2034:4;1930:109;;1728:317;-1:-1:-1;;1728:317:1:o;2050:220::-;2199:2;2188:9;2181:21;2162:4;2219:45;2260:2;2249:9;2245:18;2237:6;2219:45;:::i;2275:163::-;2342:20;;2402:10;2391:22;;2381:33;;2371:61;;2428:1;2425;2418:12;2443:258;2510:6;2518;2571:2;2559:9;2550:7;2546:23;2542:32;2539:52;;;2587:1;2584;2577:12;2539:52;2610:29;2629:9;2610:29;:::i;:::-;2600:39;;2658:37;2691:2;2680:9;2676:18;2658:37;:::i;:::-;2648:47;;2443:258;;;;;:::o;2706:248::-;2774:6;2782;2835:2;2823:9;2814:7;2810:23;2806:32;2803:52;;;2851:1;2848;2841:12;2803:52;-1:-1:-1;;2874:23:1;;;2944:2;2929:18;;;2916:32;;-1:-1:-1;2706:248:1:o;3458:184::-;3510:77;3507:1;3500:88;3607:4;3604:1;3597:15;3631:4;3628:1;3621:15;3647:308;-1:-1:-1;;3748:2:1;3742:4;3738:13;3734:86;3726:6;3722:99;3887:6;3875:10;3872:22;3851:18;3839:10;3836:34;3833:62;3830:88;;;3898:18;;:::i;:::-;3934:2;3927:22;-1:-1:-1;;3647:308:1:o;3960:183::-;4020:4;4053:18;4045:6;4042:30;4039:56;;;4075:18;;:::i;:::-;-1:-1:-1;4120:1:1;4116:14;4132:4;4112:25;;3960:183::o;4148:724::-;4202:5;4255:3;4248:4;4240:6;4236:17;4232:27;4222:55;;4273:1;4270;4263:12;4222:55;4309:6;4296:20;4335:4;4358:43;4398:2;4358:43;:::i;:::-;4430:2;4424:9;4442:31;4470:2;4462:6;4442:31;:::i;:::-;4508:18;;;4600:1;4596:10;;;;4584:23;;4580:32;;;4542:15;;;;-1:-1:-1;4624:15:1;;;4621:35;;;4652:1;4649;4642:12;4621:35;4688:2;4680:6;4676:15;4700:142;4716:6;4711:3;4708:15;4700:142;;;4782:17;;4770:30;;4820:12;;;;4733;;4700:142;;;-1:-1:-1;4860:6:1;4148:724;-1:-1:-1;;;;;;4148:724:1:o;4877:245::-;4925:4;4958:18;4950:6;4947:30;4944:56;;;4980:18;;:::i;:::-;-1:-1:-1;5037:2:1;5025:15;-1:-1:-1;;5021:88:1;5111:4;5017:99;;4877:245::o;5127:508::-;5169:5;5222:3;5215:4;5207:6;5203:17;5199:27;5189:55;;5240:1;5237;5230:12;5189:55;5276:6;5263:20;5302:31;5330:2;5302:31;:::i;:::-;5362:2;5356:9;5374:31;5402:2;5394:6;5374:31;:::i;:::-;5429:2;5421:6;5414:18;5475:3;5468:4;5463:2;5455:6;5451:15;5447:26;5444:35;5441:55;;;5492:1;5489;5482:12;5441:55;5556:2;5549:4;5541:6;5537:17;5530:4;5522:6;5518:17;5505:54;5603:1;5579:15;;;5596:4;5575:26;5568:37;;;;-1:-1:-1;5583:6:1;5127:508;-1:-1:-1;;;5127:508:1:o;5640:943::-;5794:6;5802;5810;5818;5826;5879:3;5867:9;5858:7;5854:23;5850:33;5847:53;;;5896:1;5893;5886:12;5847:53;5919:29;5938:9;5919:29;:::i;:::-;5909:39;;5967:38;6001:2;5990:9;5986:18;5967:38;:::i;:::-;5957:48;;6056:2;6045:9;6041:18;6028:32;6079:18;6120:2;6112:6;6109:14;6106:34;;;6136:1;6133;6126:12;6106:34;6159:61;6212:7;6203:6;6192:9;6188:22;6159:61;:::i;:::-;6149:71;;6273:2;6262:9;6258:18;6245:32;6229:48;;6302:2;6292:8;6289:16;6286:36;;;6318:1;6315;6308:12;6286:36;6341:63;6396:7;6385:8;6374:9;6370:24;6341:63;:::i;:::-;6331:73;;6457:3;6446:9;6442:19;6429:33;6413:49;;6487:2;6477:8;6474:16;6471:36;;;6503:1;6500;6493:12;6471:36;;6526:51;6569:7;6558:8;6547:9;6543:24;6526:51;:::i;:::-;6516:61;;;5640:943;;;;;;;;:::o;6588:730::-;6642:5;6695:3;6688:4;6680:6;6676:17;6672:27;6662:55;;6713:1;6710;6703:12;6662:55;6749:6;6736:20;6775:4;6798:43;6838:2;6798:43;:::i;:::-;6870:2;6864:9;6882:31;6910:2;6902:6;6882:31;:::i;:::-;6948:18;;;7040:1;7036:10;;;;7024:23;;7020:32;;;6982:15;;;;-1:-1:-1;7064:15:1;;;7061:35;;;7092:1;7089;7082:12;7061:35;7128:2;7120:6;7116:15;7140:148;7156:6;7151:3;7148:15;7140:148;;;7222:23;7241:3;7222:23;:::i;:::-;7210:36;;7266:12;;;;7173;;7140:148;;7323:595;7441:6;7449;7502:2;7490:9;7481:7;7477:23;7473:32;7470:52;;;7518:1;7515;7508:12;7470:52;7558:9;7545:23;7587:18;7628:2;7620:6;7617:14;7614:34;;;7644:1;7641;7634:12;7614:34;7667:61;7720:7;7711:6;7700:9;7696:22;7667:61;:::i;:::-;7657:71;;7781:2;7770:9;7766:18;7753:32;7737:48;;7810:2;7800:8;7797:16;7794:36;;;7826:1;7823;7816:12;7794:36;;7849:63;7904:7;7893:8;7882:9;7878:24;7849:63;:::i;:::-;7839:73;;;7323:595;;;;;:::o;7923:435::-;7976:3;8014:5;8008:12;8041:6;8036:3;8029:19;8067:4;8096:2;8091:3;8087:12;8080:19;;8133:2;8126:5;8122:14;8154:1;8164:169;8178:6;8175:1;8172:13;8164:169;;;8239:13;;8227:26;;8273:12;;;;8308:15;;;;8200:1;8193:9;8164:169;;;-1:-1:-1;8349:3:1;;7923:435;-1:-1:-1;;;;;7923:435:1:o;8363:261::-;8542:2;8531:9;8524:21;8505:4;8562:56;8614:2;8603:9;8599:18;8591:6;8562:56;:::i;8629:186::-;8688:6;8741:2;8729:9;8720:7;8716:23;8712:32;8709:52;;;8757:1;8754;8747:12;8709:52;8780:29;8799:9;8780:29;:::i;9051:292::-;9109:6;9162:2;9150:9;9141:7;9137:23;9133:32;9130:52;;;9178:1;9175;9168:12;9130:52;9217:9;9204:23;9267:26;9260:5;9256:38;9249:5;9246:49;9236:77;;9309:1;9306;9299:12;9348:347;9413:6;9421;9474:2;9462:9;9453:7;9449:23;9445:32;9442:52;;;9490:1;9487;9480:12;9442:52;9513:29;9532:9;9513:29;:::i;:::-;9503:39;;9592:2;9581:9;9577:18;9564:32;9639:5;9632:13;9625:21;9618:5;9615:32;9605:60;;9661:1;9658;9651:12;9605:60;9684:5;9674:15;;;9348:347;;;;;:::o;9700:1204::-;9817:6;9825;9878:2;9866:9;9857:7;9853:23;9849:32;9846:52;;;9894:1;9891;9884:12;9846:52;9934:9;9921:23;9963:18;10004:2;9996:6;9993:14;9990:34;;;10020:1;10017;10010:12;9990:34;10043:61;10096:7;10087:6;10076:9;10072:22;10043:61;:::i;:::-;10033:71;;10123:2;10113:12;;10178:2;10167:9;10163:18;10150:32;10207:2;10197:8;10194:16;10191:36;;;10223:1;10220;10213:12;10191:36;10246:24;;;-1:-1:-1;10301:4:1;10293:13;;10289:27;-1:-1:-1;10279:55:1;;10330:1;10327;10320:12;10279:55;10366:2;10353:16;10388:43;10428:2;10388:43;:::i;:::-;10460:2;10454:9;10472:31;10500:2;10492:6;10472:31;:::i;:::-;10538:18;;;10626:1;10622:10;;;;10614:19;;10610:28;;;10572:15;;;;-1:-1:-1;10650:19:1;;;10647:39;;;10682:1;10679;10672:12;10647:39;10706:11;;;;10726:147;10742:6;10737:3;10734:15;10726:147;;;10808:22;10826:3;10808:22;:::i;:::-;10796:35;;10759:12;;;;10851;;;;10726:147;;;10892:6;10882:16;;;;;;;9700:1204;;;;;:::o;10909:260::-;10977:6;10985;11038:2;11026:9;11017:7;11013:23;11009:32;11006:52;;;11054:1;11051;11044:12;11006:52;11077:29;11096:9;11077:29;:::i;:::-;11067:39;;11125:38;11159:2;11148:9;11144:18;11125:38;:::i;11174:606::-;11278:6;11286;11294;11302;11310;11363:3;11351:9;11342:7;11338:23;11334:33;11331:53;;;11380:1;11377;11370:12;11331:53;11403:29;11422:9;11403:29;:::i;:::-;11393:39;;11451:38;11485:2;11474:9;11470:18;11451:38;:::i;:::-;11441:48;;11536:2;11525:9;11521:18;11508:32;11498:42;;11587:2;11576:9;11572:18;11559:32;11549:42;;11642:3;11631:9;11627:19;11614:33;11670:18;11662:6;11659:30;11656:50;;;11702:1;11699;11692:12;11656:50;11725:49;11766:7;11757:6;11746:9;11742:22;11725:49;:::i;12197:690::-;12277:6;12330:2;12318:9;12309:7;12305:23;12301:32;12298:52;;;12346:1;12343;12336:12;12298:52;12379:9;12373:16;12412:18;12404:6;12401:30;12398:50;;;12444:1;12441;12434:12;12398:50;12467:22;;12520:4;12512:13;;12508:27;-1:-1:-1;12498:55:1;;12549:1;12546;12539:12;12498:55;12578:2;12572:9;12600:31;12628:2;12600:31;:::i;:::-;12660:2;12654:9;12672:31;12700:2;12692:6;12672:31;:::i;:::-;12727:2;12719:6;12712:18;12767:7;12762:2;12757;12753;12749:11;12745:20;12742:33;12739:53;;;12788:1;12785;12778:12;12739:53;12801:55;12853:2;12848;12840:6;12836:15;12831:2;12827;12823:11;12801:55;:::i;:::-;12875:6;12197:690;-1:-1:-1;;;;;;12197:690:1:o;13232:184::-;13284:77;13281:1;13274:88;13381:4;13378:1;13371:15;13405:4;13402:1;13395:15;13421:228;13461:7;13587:1;13519:66;13515:74;13512:1;13509:81;13504:1;13497:9;13490:17;13486:105;13483:131;;;13594:18;;:::i;:::-;-1:-1:-1;13634:9:1;;13421:228::o;13654:274::-;13694:1;13720;13710:189;;13755:77;13752:1;13745:88;13856:4;13853:1;13846:15;13884:4;13881:1;13874:15;13710:189;-1:-1:-1;13913:9:1;;13654:274::o;14762:184::-;14814:77;14811:1;14804:88;14911:4;14908:1;14901:15;14935:4;14932:1;14925:15;14951:195;14990:3;15021:66;15014:5;15011:77;15008:103;;;15091:18;;:::i;:::-;-1:-1:-1;15138:1:1;15127:13;;14951:195::o;15512:228::-;15551:3;15579:10;15616:2;15613:1;15609:10;15646:2;15643:1;15639:10;15677:3;15673:2;15669:12;15664:3;15661:21;15658:47;;;15685:18;;:::i;:::-;15721:13;;15512:228;-1:-1:-1;;;;15512:228:1:o;19206:128::-;19246:3;19277:1;19273:6;19270:1;19267:13;19264:39;;;19283:18;;:::i;:::-;-1:-1:-1;19319:9:1;;19206:128::o;19339:465::-;19596:2;19585:9;19578:21;19559:4;19622:56;19674:2;19663:9;19659:18;19651:6;19622:56;:::i;:::-;19726:9;19718:6;19714:22;19709:2;19698:9;19694:18;19687:50;19754:44;19791:6;19783;19754:44;:::i;:::-;19746:52;19339:465;-1:-1:-1;;;;;19339:465:1:o;21386:850::-;21708:4;-1:-1:-1;;;;;21818:2:1;21810:6;21806:15;21795:9;21788:34;21870:2;21862:6;21858:15;21853:2;21842:9;21838:18;21831:43;;21910:3;21905:2;21894:9;21890:18;21883:31;21937:57;21989:3;21978:9;21974:19;21966:6;21937:57;:::i;:::-;22042:9;22034:6;22030:22;22025:2;22014:9;22010:18;22003:50;22076:44;22113:6;22105;22076:44;:::i;:::-;22062:58;;22169:9;22161:6;22157:22;22151:3;22140:9;22136:19;22129:51;22197:33;22223:6;22215;22197:33;:::i;:::-;22189:41;21386:850;-1:-1:-1;;;;;;;;21386:850:1:o;22241:249::-;22310:6;22363:2;22351:9;22342:7;22338:23;22334:32;22331:52;;;22379:1;22376;22369:12;22331:52;22411:9;22405:16;22430:30;22454:5;22430:30;:::i;22495:179::-;22530:3;22572:1;22554:16;22551:23;22548:120;;;22618:1;22615;22612;22597:23;-1:-1:-1;22655:1:1;22649:8;22644:3;22640:18;22548:120;22495:179;:::o;22679:731::-;22718:3;22760:4;22742:16;22739:26;22736:39;;;22679:731;:::o;22736:39::-;22802:2;22796:9;22824:66;22945:2;22927:16;22923:25;22920:1;22914:4;22899:50;22978:4;22972:11;23002:16;23037:18;23108:2;23101:4;23093:6;23089:17;23086:25;23081:2;23073:6;23070:14;23067:45;23064:58;;;23115:5;;;;;22679:731;:::o;23064:58::-;23152:6;23146:4;23142:17;23131:28;;23188:3;23182:10;23215:2;23207:6;23204:14;23201:27;;;23221:5;;;;;;22679:731;:::o;23201:27::-;23305:2;23286:16;23280:4;23276:27;23272:36;23265:4;23256:6;23251:3;23247:16;23243:27;23240:69;23237:82;;;23312:5;;;;;;22679:731;:::o;23237:82::-;23328:57;23379:4;23370:6;23362;23358:19;23354:30;23348:4;23328:57;:::i;:::-;-1:-1:-1;23401:3:1;;22679:731;-1:-1:-1;;;;;22679:731:1:o;24245:584::-;24467:4;-1:-1:-1;;;;;24577:2:1;24569:6;24565:15;24554:9;24547:34;24629:2;24621:6;24617:15;24612:2;24601:9;24597:18;24590:43;;24669:6;24664:2;24653:9;24649:18;24642:34;24712:6;24707:2;24696:9;24692:18;24685:34;24756:3;24750;24739:9;24735:19;24728:32;24777:46;24818:3;24807:9;24803:19;24795:6;24777:46;:::i;:::-;24769:54;24245:584;-1:-1:-1;;;;;;;24245:584:1:o

Swarm Source

ipfs://27290b671baa7c0c2adb4ca8738cf05b0ee73ca942168abd1aa70c842fcb44c4
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.