ETH Price: $3,188.43 (+3.74%)

Token

Asteroids (ASTR)
 

Overview

Max Total Supply

1,555 ASTR

Holders

1,180

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x6a9ca64ddd28c05ecf7db54b944128f254ded612
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Asset

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-08
*/

// SPDX-License-Identifier: MIT

/*
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░  ░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░      ░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░        ░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░            ░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░              ░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░                ░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░        ░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░        ░░░░░░░░        ░░░░░░░░░░░░░░
░░░░░░░░░░░░            ░░            ░░░░░░░░░░░░░
░░░░░░░░░░░             ░░              ░░░░░░░░░░░
░░░░░░░░░░              ░░               ░░░░░░░░░░
░░░░░░░░░              ░░░░               ░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░█▀▀░░░░░░█▀█░░░░░░▀█▀░░░░░░█▀▀░░░░░░█▀▀░░░░░░
░░░░░░█▀▀░░░░░░█▀█░░░░░░░█░░░░░░░█▀▀░░░░░░▀▀█░░░░░░
░░░░░░▀░░░░░░░░▀░▀░░░░░░░▀░░░░░░░▀▀▀░░░░░░▀▀▀░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░             Asset v1.0.6            ░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
*/

// File: contracts/IERC2981Royalties.sol

pragma solidity ^0.8.0;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}
// File: contracts/IOperatorFilterRegistry.sol

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator)
        external
        view
        returns (bool);

    function register(address registrant) external;

    function registerAndSubscribe(address registrant, address subscription)
        external;

    function registerAndCopyEntries(
        address registrant,
        address registrantToCopy
    ) external;

    function unregister(address addr) external;

    function updateOperator(
        address registrant,
        address operator,
        bool filtered
    ) external;

    function updateOperators(
        address registrant,
        address[] calldata operators,
        bool filtered
    ) external;

    function updateCodeHash(
        address registrant,
        bytes32 codehash,
        bool filtered
    ) external;

    function updateCodeHashes(
        address registrant,
        bytes32[] calldata codeHashes,
        bool filtered
    ) external;

    function subscribe(address registrant, address registrantToSubscribe)
        external;

    function unsubscribe(address registrant, bool copyExistingEntries) external;

    function subscriptionOf(address addr) external returns (address registrant);

    function subscribers(address registrant)
        external
        returns (address[] memory);

    function subscriberAt(address registrant, uint256 index)
        external
        returns (address);

    function copyEntriesOf(address registrant, address registrantToCopy)
        external;

    function isOperatorFiltered(address registrant, address operator)
        external
        returns (bool);

    function isCodeHashOfFiltered(address registrant, address operatorWithCode)
        external
        returns (bool);

    function isCodeHashFiltered(address registrant, bytes32 codeHash)
        external
        returns (bool);

    function filteredOperators(address addr)
        external
        returns (address[] memory);

    function filteredCodeHashes(address addr)
        external
        returns (bytes32[] memory);

    function filteredOperatorAt(address registrant, uint256 index)
        external
        returns (address);

    function filteredCodeHashAt(address registrant, uint256 index)
        external
        returns (bytes32);

    function isRegistered(address addr) external returns (bool);

    function codeHashOf(address addr) external returns (bytes32);
}

// File: contracts/OperatorFilterer.sol

pragma solidity ^0.8.13;

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(
                    address(this),
                    subscriptionOrRegistrantToCopy
                );
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(
                        address(this),
                        subscriptionOrRegistrantToCopy
                    );
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    msg.sender
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    operator
                )
            ) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}
// File: contracts/RevokableOperatorFilterer.sol

pragma solidity ^0.8.13;

/**
 * @title  RevokableOperatorFilterer
 * @notice This contract is meant to allow contracts to permanently opt out of the OperatorFilterRegistry. The Registry
 *         itself has an "unregister" function, but if the contract is ownable, the owner can re-register at any point.
 *         As implemented, this abstract contract allows the contract owner to toggle the
 *         isOperatorFilterRegistryRevoked flag in order to permanently bypass the OperatorFilterRegistry checks.
 */
abstract contract RevokableOperatorFilterer is OperatorFilterer {
    error OnlyOwner();
    error AlreadyRevoked();

    bool private _isOperatorFilterRegistryRevoked;

    modifier onlyAllowedOperator(address from) override {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (
            !_isOperatorFilterRegistryRevoked &&
            address(OPERATOR_FILTER_REGISTRY).code.length > 0
        ) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    msg.sender
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) override {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (
            !_isOperatorFilterRegistryRevoked &&
            address(OPERATOR_FILTER_REGISTRY).code.length > 0
        ) {
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    operator
                )
            ) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }

    /**
     * @notice Disable the isOperatorFilterRegistryRevoked flag. OnlyOwner.
     */
    function revokeOperatorFilterRegistry() external {
        if (msg.sender != owner()) {
            revert OnlyOwner();
        }
        if (_isOperatorFilterRegistryRevoked) {
            revert AlreadyRevoked();
        }
        _isOperatorFilterRegistryRevoked = true;
    }

    function isOperatorFilterRegistryRevoked() public view returns (bool) {
        return _isOperatorFilterRegistryRevoked;
    }

    /**
     * @dev assume the contract has an owner, but leave specific Ownable implementation up to inheriting contract
     */
    function owner() public view virtual returns (address);
}
// File: contracts/RevokableDefaultOperatorFilterer.sol

pragma solidity ^0.8.13;

/**
 * @title  RevokableDefaultOperatorFilterer
 * @notice Inherits from RevokableOperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract RevokableDefaultOperatorFilterer is
    RevokableOperatorFilterer
{
    address constant DEFAULT_SUBSCRIPTION =
        address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: @openzeppelin/contracts/utils/Strings.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(
        bytes32 indexed role,
        bytes32 indexed previousAdminRole,
        bytes32 indexed newAdminRole
    );

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account)
        external
        view
        returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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

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

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

// File: contracts/ERC2981Base.sol

pragma solidity ^0.8.0;

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is ERC165, IERC2981Royalties {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}
// File: contracts/ERC2981ContractWideRoyalties.sol

pragma solidity ^0.8.0;

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
/// @dev This implementation has the same royalties for each and every tokens
abstract contract ERC2981ContractWideRoyalties is ERC2981Base {
    RoyaltyInfo private _royalties;

    /// @dev Sets token royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setRoyalties(address recipient, uint256 value) internal {
        require(value <= 10000, "ERC2981Royalties: Too high");
        _royalties = RoyaltyInfo(recipient, uint24(value));
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        RoyaltyInfo memory royalties = _royalties;
        receiver = royalties.recipient;
        royaltyAmount = (value * royalties.amount) / 10000;
    }
}
// File: @openzeppelin/contracts/access/AccessControl.sol

// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role)
        public
        view
        virtual
        override
        returns (bytes32)
    {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account)
        public
        virtual
        override
        onlyRole(getRoleAdmin(role))
    {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account)
        public
        virtual
        override
        onlyRole(getRoleAdmin(role))
    {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account)
        public
        virtual
        override
    {
        require(
            account == _msgSender(),
            "AccessControl: can only renounce roles for self"
        );

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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

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

pragma solidity ^0.8.0;

/**
 * @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 (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

/**
 * @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: address zero is not a valid owner"
        );
        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 token 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: caller is not token 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}.
     *
     * 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 _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`
     *
     * Emits a {TransferSingle} event.
     *
     * 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}.
     *
     * Emits a {TransferBatch} event.
     *
     * 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 an {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 `ids` and `amounts` 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: contracts/Asset.sol

pragma solidity ^0.8.16;

contract Asset is
    ERC1155,
    AccessControl,
    Ownable,
    RevokableDefaultOperatorFilterer,
    ERC2981ContractWideRoyalties
{
    string public name; // Token name.
    string public symbol; // Shorthand identifer.
    string public contractURI_; // Link to contract-level metadata.
    uint256 public royalty; // Royalty % 10000 = 100%.
    address private podContract; // Pod contract address.
    bool public paused = false; // Revert calls to critical funcs.

    // Efficient method to prevent >1 token per pilot.
    mapping(address => bool) public pilotAddr;

    // Tokens requiring unique IDs.
    mapping(uint256 => bool) public uid;

    constructor(
        address root_,
        string memory name_,
        string memory symbol_,
        string memory cURI_,
        string memory uri_,
        uint256 royalty_
    ) ERC1155(uri_) {
        _setupRole(DEFAULT_ADMIN_ROLE, root_);
        name = name_;
        symbol = symbol_;
        contractURI_ = cURI_;
        royalty = royalty_;
    }

    /*
     * @dev
     *      Write pod contract address for modifer allocation.
     * @params
     *      _podContract - Address of pod contract.
     */
    function setPodContract(address _podContract) external onlyAdmin {
        podContract = _podContract;
    }

    /*
     * @dev
     *      Modifier restricts func calls to addresses under admin role only.
     */
    modifier onlyAdmin() {
        require(
            hasRole(DEFAULT_ADMIN_ROLE, msg.sender),
            "Restricted to admins."
        );
        _;
    }

    /*
     * @dev
     *      Modifier restricts func calls to pod contract.
     */
    modifier onlyPodContract() {
        require(msg.sender == podContract);
        _;
    }

    /*
     * @dev
     *      Write contract activity switch.
     */
    function setPaused(bool _paused) external onlyAdmin {
        paused = _paused;
    }

    /*
     * @dev
     *      Read collection-level metadata.
     */
    function contractURI() public view returns (string memory) {
        return contractURI_;
    }

    /*
     * @dev
     *      Write collection-level metadata.
     * @params
     *      _contracturi - Link to contract-level JSON metadata.
     */
    function setContractURI(string memory _contracturi) external onlyAdmin {
        contractURI_ = _contracturi;
    }

    /*
     * @dev
     *      Read royalty fee set.
     */
    function getRoyaltyFee() public view returns (uint256) {
        return royalty;
    }

    /*
     * @dev
     *      Write royalty fee.
     * @params
     *      _recipient - Target address to receive the royalty fee.
     *      _value - Basis point royalty %.
     */
    function setRoyalties(address _recipient, uint256 _value)
        external
        onlyAdmin
    {
        _setRoyalties(_recipient, _value);
    }

    /*
     * @dev
     *       Write URI across tokens ({id} substition recommended).

     *       Note that no event emitted (as per ERC1155 standard)
     *       because these URIs cannot be meaningfully represented
     *       by a uri event in this function.

     * @params
     *      _uri - New URI to set across all tokens.
    
     */
    function setURI(string memory _uri) external onlyAdmin {
        _setURI(_uri);
    }

    /*
     * @dev
     *      Automatic transfer of assets by Pod assigned pilots.

     * @params
     *      _id - Ids of assets to be allocated.
     *      _pilot - Address of pilot to allocate to.
     
     * @mods
     *      onlyPodContract - Only the Pod contract can call successfully.

     */
    function fatesAssetTransfer(uint256 _id, address _pilot)
        external
        onlyPodContract
    {
        require(!paused, "Exodus is on hold.");

        // Pod must be non-fungible.
        require(uid[_id] == false, "Asset already claimed.");

        // New pilot check; not allocated asset previously.
        require(pilotAddr[_pilot] == false, "Address already owns the asset.");

        // New pilot now becomes registered as to not be able to again.
        pilotAddr[_pilot] = true;

        // Asset ID claimed.
        uid[_id] = true;

        // Pilot allocated asset by ID specificed in allowlist, and subsequently Pod contract call to distribute.
        _mint(_pilot, _id, 1, bytes(""));
    }

    /*
     * @dev
     *      Ensure marketplaces don't bypass creator royalty.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        uint256 amount,
        bytes memory data
    ) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    function owner()
        public
        view
        virtual
        override(Ownable, RevokableOperatorFilterer)
        returns (address)
    {
        return Ownable.owner();
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC1155, AccessControl, ERC2981Base)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"root_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"cURI_","type":"string"},{"internalType":"string","name":"uri_","type":"string"},{"internalType":"uint256","name":"royalty_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyRevoked","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_pilot","type":"address"}],"name":"fatesAssetTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoyaltyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"isOperatorFilterRegistryRevoked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pilotAddr","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"tokenId","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":"string","name":"_contracturi","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_podContract","type":"address"}],"name":"setPodContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

6080604052600a805460ff60a01b191690553480156200001e57600080fd5b5060405162002efc38038062002efc8339810160408190526200004191620003f4565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600183620000648162000201565b50620000703362000213565b6daaeb6d7670e522a718067333cd4e3b15620001b55780156200010357604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620000e457600080fd5b505af1158015620000f9573d6000803e3d6000fd5b50505050620001b5565b6001600160a01b03821615620001545760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000c9565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200019b57600080fd5b505af1158015620001b0573d6000803e3d6000fd5b505050505b50620001c5905060008762000265565b6006620001d3868262000558565b506007620001e2858262000558565b506008620001f1848262000558565b5060095550620006249350505050565b60026200020f828262000558565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008281526003602090815260408083206001600160a01b03851684529091529020546200020f908390839060ff166200020f5760008281526003602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620002ce3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b03811681146200032a57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200035757600080fd5b81516001600160401b03808211156200037457620003746200032f565b604051601f8301601f19908116603f011681019082821181831017156200039f576200039f6200032f565b81604052838152602092508683858801011115620003bc57600080fd5b600091505b83821015620003e05785820183015181830184015290820190620003c1565b600093810190920192909252949350505050565b60008060008060008060c087890312156200040e57600080fd5b620004198762000312565b60208801519096506001600160401b03808211156200043757600080fd5b620004458a838b0162000345565b965060408901519150808211156200045c57600080fd5b6200046a8a838b0162000345565b955060608901519150808211156200048157600080fd5b6200048f8a838b0162000345565b94506080890151915080821115620004a657600080fd5b50620004b589828a0162000345565b92505060a087015190509295509295509295565b600181811c90821680620004de57607f821691505b602082108103620004ff57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200055357600081815260208120601f850160051c810160208610156200052e5750805b601f850160051c820191505b818110156200054f578281556001016200053a565b5050505b505050565b81516001600160401b038111156200057457620005746200032f565b6200058c81620005858454620004c9565b8462000505565b602080601f831160018114620005c45760008415620005ab5750858301515b600019600386901b1c1916600185901b1785556200054f565b600085815260208120601f198616915b82811015620005f557888601518255948401946001909101908401620005d4565b5085821015620006145787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6128c880620006346000396000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c80636fd020b511610125578063a217fddf116100ad578063e8a3d4851161007c578063e8a3d485146104b4578063e985e9c5146104bc578063ecba222a146104f8578063f242432a1461050a578063f2fde38b1461051d57600080fd5b8063a217fddf14610473578063a22cb4651461047b578063d547741f1461048e578063db779f3b146104a157600080fd5b80638c7ea24b116100f45780638c7ea24b1461042a5780638da5cb5b1461043d57806391d1485414610445578063938e3d7b1461045857806395d89b411461046b57600080fd5b80636fd020b5146103e4578063710a1e4814610407578063715018a61461041a578063820bdcdc1461042257600080fd5b80632eb2c2d6116101a857806341f434341161017757806341f43434146103585780634e1273f414610385578063570a6502146103a55780635c975abb146103c85780635ef9432a146103dc57600080fd5b80632eb2c2d6146103175780632f2ff15d1461032a57806335a6907a1461033d57806336568abe1461034557600080fd5b80630e89341c116101ef5780630e89341c1461029357806316c38b3c146102a6578063248a9ca3146102b957806329ee566c146102dc5780632a55205a146102e557600080fd5b8062fdd58e1461022057806301ffc9a71461024657806302fe53051461026957806306fdde031461027e575b600080fd5b61023361022e366004611d94565b610530565b6040519081526020015b60405180910390f35b610259610254366004611dd4565b6105c9565b604051901515815260200161023d565b61027c610277366004611e92565b6105d4565b005b610286610607565b60405161023d9190611f33565b6102866102a1366004611f46565b610695565b61027c6102b4366004611f6d565b610729565b6102336102c7366004611f46565b60009081526003602052604090206001015490565b61023360095481565b6102f86102f3366004611f8a565b61076e565b604080516001600160a01b03909316835260208301919091520161023d565b61027c610325366004612061565b6107c3565b61027c61033836600461210b565b6108bb565b6102866108e5565b61027c61035336600461210b565b6108f2565b61036d6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b03909116815260200161023d565b610398610393366004612137565b610970565b60405161023d9190612233565b6102596103b3366004612246565b600b6020526000908152604090205460ff1681565b600a5461025990600160a01b900460ff1681565b61027c610a9a565b6102596103f2366004611f46565b600c6020526000908152604090205460ff1681565b61027c610415366004612246565b610b13565b61027c610b5c565b600954610233565b61027c610438366004611d94565b610b70565b61036d610ba1565b61025961045336600461210b565b610bba565b61027c610466366004611e92565b610be5565b610286610c18565b610233600081565b61027c610489366004612261565b610c25565b61027c61049c36600461210b565b610d02565b61027c6104af36600461210b565b610d27565b610286610ea4565b6102596104ca366004612298565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b600454600160a01b900460ff16610259565b61027c6105183660046122c2565b610f36565b61027c61052b366004612246565b611021565b60006001600160a01b0383166105a05760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006105c382611097565b6105df600033610bba565b6105fb5760405162461bcd60e51b815260040161059790612327565b610604816110bc565b50565b6006805461061490612356565b80601f016020809104026020016040519081016040528092919081815260200182805461064090612356565b801561068d5780601f106106625761010080835404028352916020019161068d565b820191906000526020600020905b81548152906001019060200180831161067057829003601f168201915b505050505081565b6060600280546106a490612356565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090612356565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b50505050509050919050565b610734600033610bba565b6107505760405162461bcd60e51b815260040161059790612327565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b604080518082019091526005546001600160a01b038116808352600160a01b90910462ffffff16602083018190529091600091612710906107af90866123a6565b6107b991906123c5565b9150509250929050565b6004548590600160a01b900460ff161580156107ed57506daaeb6d7670e522a718067333cd4e3b15155b156108a657336001600160a01b038216036108145761080f86868686866110c8565b6108b3565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610863573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088791906123e7565b6108a657604051633b79c77360e21b8152336004820152602401610597565b6108b386868686866110c8565b505050505050565b6000828152600360205260409020600101546108d681611114565b6108e0838361111e565b505050565b6008805461061490612356565b6001600160a01b03811633146109625760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610597565b61096c82826111a4565b5050565b606081518351146109d55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610597565b6000835167ffffffffffffffff8111156109f1576109f1611df1565b604051908082528060200260200182016040528015610a1a578160200160208202803683370190505b50905060005b8451811015610a9257610a65858281518110610a3e57610a3e612404565b6020026020010151858381518110610a5857610a58612404565b6020026020010151610530565b828281518110610a7757610a77612404565b6020908102919091010152610a8b8161241a565b9050610a20565b509392505050565b610aa2610ba1565b6001600160a01b0316336001600160a01b031614610ad357604051635fc483c560e01b815260040160405180910390fd5b600454600160a01b900460ff1615610afe5760405163905e710760e01b815260040160405180910390fd5b6004805460ff60a01b1916600160a01b179055565b610b1e600033610bba565b610b3a5760405162461bcd60e51b815260040161059790612327565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610b6461120b565b610b6e600061126a565b565b610b7b600033610bba565b610b975760405162461bcd60e51b815260040161059790612327565b61096c82826112bc565b6000610bb56004546001600160a01b031690565b905090565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610bf0600033610bba565b610c0c5760405162461bcd60e51b815260040161059790612327565b600861096c8282612479565b6007805461061490612356565b6004548290600160a01b900460ff16158015610c4f57506daaeb6d7670e522a718067333cd4e3b15155b15610cf857604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd091906123e7565b610cf857604051633b79c77360e21b81526001600160a01b0382166004820152602401610597565b6108e08383611358565b600082815260036020526040902060010154610d1d81611114565b6108e083836111a4565b600a546001600160a01b03163314610d3e57600080fd5b600a54600160a01b900460ff1615610d8d5760405162461bcd60e51b815260206004820152601260248201527122bc37b23ab99034b99037b7103437b6321760711b6044820152606401610597565b6000828152600c602052604090205460ff1615610de55760405162461bcd60e51b815260206004820152601660248201527520b9b9b2ba1030b63932b0b23c9031b630b4b6b2b21760511b6044820152606401610597565b6001600160a01b0381166000908152600b602052604090205460ff1615610e4e5760405162461bcd60e51b815260206004820152601f60248201527f4164647265737320616c7265616479206f776e73207468652061737365742e006044820152606401610597565b6001600160a01b0381166000908152600b602090815260408083208054600160ff199182168117909255868552600c8452828520805490911682179055815192830190915291815261096c918391859190611363565b606060088054610eb390612356565b80601f0160208091040260200160405190810160405280929190818152602001828054610edf90612356565b8015610f2c5780601f10610f0157610100808354040283529160200191610f2c565b820191906000526020600020905b815481529060010190602001808311610f0f57829003601f168201915b5050505050905090565b6004548590600160a01b900460ff16158015610f6057506daaeb6d7670e522a718067333cd4e3b15155b1561101457336001600160a01b03821603610f825761080f8686868686611477565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906123e7565b61101457604051633b79c77360e21b8152336004820152602401610597565b6108b38686868686611477565b61102961120b565b6001600160a01b03811661108e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610597565b6106048161126a565b60006001600160e01b0319821663152a902d60e11b14806105c357506105c3826114bc565b600261096c8282612479565b6001600160a01b0385163314806110e457506110e485336104ca565b6111005760405162461bcd60e51b815260040161059790612539565b61110d85858585856114e1565b5050505050565b61060481336116b6565b6111288282610bba565b61096c5760008281526003602090815260408083206001600160a01b03851684529091529020805460ff191660011790556111603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6111ae8282610bba565b1561096c5760008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b33611214610ba1565b6001600160a01b031614610b6e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610597565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61271081111561130e5760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f20686967680000000000006044820152606401610597565b604080518082019091526001600160a01b0390921680835262ffffff909116602090920182905260058054600160a01b9093026001600160b81b0319909316909117919091179055565b61096c33838361171a565b6001600160a01b0384166113c35760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610597565b3360006113cf856117fa565b905060006113dc856117fa565b90506000868152602081815260408083206001600160a01b038b1684529091528120805487929061140e908490612588565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461146e83600089898989611845565b50505050505050565b6001600160a01b038516331480611493575061149385336104ca565b6114af5760405162461bcd60e51b815260040161059790612539565b61110d85858585856119a0565b60006001600160e01b03198216637965db0b60e01b14806105c357506105c382611aca565b81518351146115435760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610597565b6001600160a01b0384166115695760405162461bcd60e51b81526004016105979061259b565b3360005b845181101561165057600085828151811061158a5761158a612404565b6020026020010151905060008583815181106115a8576115a8612404565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156115f85760405162461bcd60e51b8152600401610597906125e0565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611635908490612588565b92505081905550505050806116499061241a565b905061156d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516116a092919061262a565b60405180910390a46108b3818787878787611b1a565b6116c08282610bba565b61096c576116d8816001600160a01b03166014611bd5565b6116e3836020611bd5565b6040516020016116f4929190612658565b60408051601f198184030181529082905262461bcd60e51b825261059791600401611f33565b816001600160a01b0316836001600160a01b03160361178d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610597565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061183457611834612404565b602090810291909101015292915050565b6001600160a01b0384163b156108b35760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061188990899089908890889088906004016126cd565b6020604051808303816000875af19250505080156118c4575060408051601f3d908101601f191682019092526118c191810190612712565b60015b611970576118d061272f565b806308c379a00361190957506118e461274b565b806118ef575061190b565b8060405162461bcd60e51b81526004016105979190611f33565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610597565b6001600160e01b0319811663f23a6e6160e01b1461146e5760405162461bcd60e51b8152600401610597906127d5565b6001600160a01b0384166119c65760405162461bcd60e51b81526004016105979061259b565b3360006119d2856117fa565b905060006119df856117fa565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015611a225760405162461bcd60e51b8152600401610597906125e0565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611a5f908490612588565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611abf848a8a8a8a8a611845565b505050505050505050565b60006001600160e01b03198216636cdb3d1360e11b1480611afb57506001600160e01b031982166303a24d0760e21b145b806105c357506301ffc9a760e01b6001600160e01b03198316146105c3565b6001600160a01b0384163b156108b35760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611b5e908990899088908890889060040161281d565b6020604051808303816000875af1925050508015611b99575060408051601f3d908101601f19168201909252611b9691810190612712565b60015b611ba5576118d061272f565b6001600160e01b0319811663bc197c8160e01b1461146e5760405162461bcd60e51b8152600401610597906127d5565b60606000611be48360026123a6565b611bef906002612588565b67ffffffffffffffff811115611c0757611c07611df1565b6040519080825280601f01601f191660200182016040528015611c31576020820181803683370190505b509050600360fc1b81600081518110611c4c57611c4c612404565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611c7b57611c7b612404565b60200101906001600160f81b031916908160001a9053506000611c9f8460026123a6565b611caa906001612588565b90505b6001811115611d22576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611cde57611cde612404565b1a60f81b828281518110611cf457611cf4612404565b60200101906001600160f81b031916908160001a90535060049490941c93611d1b8161287b565b9050611cad565b508315611d715760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610597565b9392505050565b80356001600160a01b0381168114611d8f57600080fd5b919050565b60008060408385031215611da757600080fd5b611db083611d78565b946020939093013593505050565b6001600160e01b03198116811461060457600080fd5b600060208284031215611de657600080fd5b8135611d7181611dbe565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611e2d57611e2d611df1565b6040525050565b600067ffffffffffffffff831115611e4e57611e4e611df1565b604051611e65601f8501601f191660200182611e07565b809150838152848484011115611e7a57600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611ea457600080fd5b813567ffffffffffffffff811115611ebb57600080fd5b8201601f81018413611ecc57600080fd5b611edb84823560208401611e34565b949350505050565b60005b83811015611efe578181015183820152602001611ee6565b50506000910152565b60008151808452611f1f816020860160208601611ee3565b601f01601f19169290920160200192915050565b602081526000611d716020830184611f07565b600060208284031215611f5857600080fd5b5035919050565b801515811461060457600080fd5b600060208284031215611f7f57600080fd5b8135611d7181611f5f565b60008060408385031215611f9d57600080fd5b50508035926020909101359150565b600067ffffffffffffffff821115611fc657611fc6611df1565b5060051b60200190565b600082601f830112611fe157600080fd5b81356020611fee82611fac565b604051611ffb8282611e07565b83815260059390931b850182019282810191508684111561201b57600080fd5b8286015b84811015612036578035835291830191830161201f565b509695505050505050565b600082601f83011261205257600080fd5b611d7183833560208501611e34565b600080600080600060a0868803121561207957600080fd5b61208286611d78565b945061209060208701611d78565b9350604086013567ffffffffffffffff808211156120ad57600080fd5b6120b989838a01611fd0565b945060608801359150808211156120cf57600080fd5b6120db89838a01611fd0565b935060808801359150808211156120f157600080fd5b506120fe88828901612041565b9150509295509295909350565b6000806040838503121561211e57600080fd5b8235915061212e60208401611d78565b90509250929050565b6000806040838503121561214a57600080fd5b823567ffffffffffffffff8082111561216257600080fd5b818501915085601f83011261217657600080fd5b8135602061218382611fac565b6040516121908282611e07565b83815260059390931b85018201928281019150898411156121b057600080fd5b948201945b838610156121d5576121c686611d78565b825294820194908201906121b5565b965050860135925050808211156121eb57600080fd5b506107b985828601611fd0565b600081518084526020808501945080840160005b838110156122285781518752958201959082019060010161220c565b509495945050505050565b602081526000611d7160208301846121f8565b60006020828403121561225857600080fd5b611d7182611d78565b6000806040838503121561227457600080fd5b61227d83611d78565b9150602083013561228d81611f5f565b809150509250929050565b600080604083850312156122ab57600080fd5b6122b483611d78565b915061212e60208401611d78565b600080600080600060a086880312156122da57600080fd5b6122e386611d78565b94506122f160208701611d78565b93506040860135925060608601359150608086013567ffffffffffffffff81111561231b57600080fd5b6120fe88828901612041565b6020808252601590820152742932b9ba3934b1ba32b2103a379030b236b4b7399760591b604082015260600190565b600181811c9082168061236a57607f821691505b60208210810361238a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156123c0576123c0612390565b500290565b6000826123e257634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156123f957600080fd5b8151611d7181611f5f565b634e487b7160e01b600052603260045260246000fd5b60006001820161242c5761242c612390565b5060010190565b601f8211156108e057600081815260208120601f850160051c8101602086101561245a5750805b601f850160051c820191505b818110156108b357828155600101612466565b815167ffffffffffffffff81111561249357612493611df1565b6124a7816124a18454612356565b84612433565b602080601f8311600181146124dc57600084156124c45750858301515b600019600386901b1c1916600185901b1785556108b3565b600085815260208120601f198616915b8281101561250b578886015182559484019460019091019084016124ec565b50858210156125295787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b808201808211156105c3576105c3612390565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061263d60408301856121f8565b828103602084015261264f81856121f8565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612690816017850160208801611ee3565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516126c1816028840160208801611ee3565b01602801949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061270790830184611f07565b979650505050505050565b60006020828403121561272457600080fd5b8151611d7181611dbe565b600060033d11156127485760046000803e5060005160e01c5b90565b600060443d10156127595790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561278957505050505090565b82850191508151818111156127a15750505050505090565b843d87010160208285010111156127bb5750505050505090565b6127ca60208286010187611e07565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612849908301866121f8565b828103606084015261285b81866121f8565b9050828103608084015261286f8185611f07565b98975050505050505050565b60008161288a5761288a612390565b50600019019056fea264697066735822122062849c2b77975443bc1021d6a9bc452e30f06242a4d2adce715df8848d0092a364736f6c63430008100033000000000000000000000000c0f26f847002066a0ed9817fc7f2599553f8a16e00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000941737465726f69647300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004415354520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021b5760003560e01c80636fd020b511610125578063a217fddf116100ad578063e8a3d4851161007c578063e8a3d485146104b4578063e985e9c5146104bc578063ecba222a146104f8578063f242432a1461050a578063f2fde38b1461051d57600080fd5b8063a217fddf14610473578063a22cb4651461047b578063d547741f1461048e578063db779f3b146104a157600080fd5b80638c7ea24b116100f45780638c7ea24b1461042a5780638da5cb5b1461043d57806391d1485414610445578063938e3d7b1461045857806395d89b411461046b57600080fd5b80636fd020b5146103e4578063710a1e4814610407578063715018a61461041a578063820bdcdc1461042257600080fd5b80632eb2c2d6116101a857806341f434341161017757806341f43434146103585780634e1273f414610385578063570a6502146103a55780635c975abb146103c85780635ef9432a146103dc57600080fd5b80632eb2c2d6146103175780632f2ff15d1461032a57806335a6907a1461033d57806336568abe1461034557600080fd5b80630e89341c116101ef5780630e89341c1461029357806316c38b3c146102a6578063248a9ca3146102b957806329ee566c146102dc5780632a55205a146102e557600080fd5b8062fdd58e1461022057806301ffc9a71461024657806302fe53051461026957806306fdde031461027e575b600080fd5b61023361022e366004611d94565b610530565b6040519081526020015b60405180910390f35b610259610254366004611dd4565b6105c9565b604051901515815260200161023d565b61027c610277366004611e92565b6105d4565b005b610286610607565b60405161023d9190611f33565b6102866102a1366004611f46565b610695565b61027c6102b4366004611f6d565b610729565b6102336102c7366004611f46565b60009081526003602052604090206001015490565b61023360095481565b6102f86102f3366004611f8a565b61076e565b604080516001600160a01b03909316835260208301919091520161023d565b61027c610325366004612061565b6107c3565b61027c61033836600461210b565b6108bb565b6102866108e5565b61027c61035336600461210b565b6108f2565b61036d6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b03909116815260200161023d565b610398610393366004612137565b610970565b60405161023d9190612233565b6102596103b3366004612246565b600b6020526000908152604090205460ff1681565b600a5461025990600160a01b900460ff1681565b61027c610a9a565b6102596103f2366004611f46565b600c6020526000908152604090205460ff1681565b61027c610415366004612246565b610b13565b61027c610b5c565b600954610233565b61027c610438366004611d94565b610b70565b61036d610ba1565b61025961045336600461210b565b610bba565b61027c610466366004611e92565b610be5565b610286610c18565b610233600081565b61027c610489366004612261565b610c25565b61027c61049c36600461210b565b610d02565b61027c6104af36600461210b565b610d27565b610286610ea4565b6102596104ca366004612298565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b600454600160a01b900460ff16610259565b61027c6105183660046122c2565b610f36565b61027c61052b366004612246565b611021565b60006001600160a01b0383166105a05760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006105c382611097565b6105df600033610bba565b6105fb5760405162461bcd60e51b815260040161059790612327565b610604816110bc565b50565b6006805461061490612356565b80601f016020809104026020016040519081016040528092919081815260200182805461064090612356565b801561068d5780601f106106625761010080835404028352916020019161068d565b820191906000526020600020905b81548152906001019060200180831161067057829003601f168201915b505050505081565b6060600280546106a490612356565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090612356565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b50505050509050919050565b610734600033610bba565b6107505760405162461bcd60e51b815260040161059790612327565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b604080518082019091526005546001600160a01b038116808352600160a01b90910462ffffff16602083018190529091600091612710906107af90866123a6565b6107b991906123c5565b9150509250929050565b6004548590600160a01b900460ff161580156107ed57506daaeb6d7670e522a718067333cd4e3b15155b156108a657336001600160a01b038216036108145761080f86868686866110c8565b6108b3565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610863573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088791906123e7565b6108a657604051633b79c77360e21b8152336004820152602401610597565b6108b386868686866110c8565b505050505050565b6000828152600360205260409020600101546108d681611114565b6108e0838361111e565b505050565b6008805461061490612356565b6001600160a01b03811633146109625760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610597565b61096c82826111a4565b5050565b606081518351146109d55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610597565b6000835167ffffffffffffffff8111156109f1576109f1611df1565b604051908082528060200260200182016040528015610a1a578160200160208202803683370190505b50905060005b8451811015610a9257610a65858281518110610a3e57610a3e612404565b6020026020010151858381518110610a5857610a58612404565b6020026020010151610530565b828281518110610a7757610a77612404565b6020908102919091010152610a8b8161241a565b9050610a20565b509392505050565b610aa2610ba1565b6001600160a01b0316336001600160a01b031614610ad357604051635fc483c560e01b815260040160405180910390fd5b600454600160a01b900460ff1615610afe5760405163905e710760e01b815260040160405180910390fd5b6004805460ff60a01b1916600160a01b179055565b610b1e600033610bba565b610b3a5760405162461bcd60e51b815260040161059790612327565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610b6461120b565b610b6e600061126a565b565b610b7b600033610bba565b610b975760405162461bcd60e51b815260040161059790612327565b61096c82826112bc565b6000610bb56004546001600160a01b031690565b905090565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610bf0600033610bba565b610c0c5760405162461bcd60e51b815260040161059790612327565b600861096c8282612479565b6007805461061490612356565b6004548290600160a01b900460ff16158015610c4f57506daaeb6d7670e522a718067333cd4e3b15155b15610cf857604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd091906123e7565b610cf857604051633b79c77360e21b81526001600160a01b0382166004820152602401610597565b6108e08383611358565b600082815260036020526040902060010154610d1d81611114565b6108e083836111a4565b600a546001600160a01b03163314610d3e57600080fd5b600a54600160a01b900460ff1615610d8d5760405162461bcd60e51b815260206004820152601260248201527122bc37b23ab99034b99037b7103437b6321760711b6044820152606401610597565b6000828152600c602052604090205460ff1615610de55760405162461bcd60e51b815260206004820152601660248201527520b9b9b2ba1030b63932b0b23c9031b630b4b6b2b21760511b6044820152606401610597565b6001600160a01b0381166000908152600b602052604090205460ff1615610e4e5760405162461bcd60e51b815260206004820152601f60248201527f4164647265737320616c7265616479206f776e73207468652061737365742e006044820152606401610597565b6001600160a01b0381166000908152600b602090815260408083208054600160ff199182168117909255868552600c8452828520805490911682179055815192830190915291815261096c918391859190611363565b606060088054610eb390612356565b80601f0160208091040260200160405190810160405280929190818152602001828054610edf90612356565b8015610f2c5780601f10610f0157610100808354040283529160200191610f2c565b820191906000526020600020905b815481529060010190602001808311610f0f57829003601f168201915b5050505050905090565b6004548590600160a01b900460ff16158015610f6057506daaeb6d7670e522a718067333cd4e3b15155b1561101457336001600160a01b03821603610f825761080f8686868686611477565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906123e7565b61101457604051633b79c77360e21b8152336004820152602401610597565b6108b38686868686611477565b61102961120b565b6001600160a01b03811661108e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610597565b6106048161126a565b60006001600160e01b0319821663152a902d60e11b14806105c357506105c3826114bc565b600261096c8282612479565b6001600160a01b0385163314806110e457506110e485336104ca565b6111005760405162461bcd60e51b815260040161059790612539565b61110d85858585856114e1565b5050505050565b61060481336116b6565b6111288282610bba565b61096c5760008281526003602090815260408083206001600160a01b03851684529091529020805460ff191660011790556111603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6111ae8282610bba565b1561096c5760008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b33611214610ba1565b6001600160a01b031614610b6e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610597565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61271081111561130e5760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f20686967680000000000006044820152606401610597565b604080518082019091526001600160a01b0390921680835262ffffff909116602090920182905260058054600160a01b9093026001600160b81b0319909316909117919091179055565b61096c33838361171a565b6001600160a01b0384166113c35760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610597565b3360006113cf856117fa565b905060006113dc856117fa565b90506000868152602081815260408083206001600160a01b038b1684529091528120805487929061140e908490612588565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461146e83600089898989611845565b50505050505050565b6001600160a01b038516331480611493575061149385336104ca565b6114af5760405162461bcd60e51b815260040161059790612539565b61110d85858585856119a0565b60006001600160e01b03198216637965db0b60e01b14806105c357506105c382611aca565b81518351146115435760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610597565b6001600160a01b0384166115695760405162461bcd60e51b81526004016105979061259b565b3360005b845181101561165057600085828151811061158a5761158a612404565b6020026020010151905060008583815181106115a8576115a8612404565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156115f85760405162461bcd60e51b8152600401610597906125e0565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611635908490612588565b92505081905550505050806116499061241a565b905061156d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516116a092919061262a565b60405180910390a46108b3818787878787611b1a565b6116c08282610bba565b61096c576116d8816001600160a01b03166014611bd5565b6116e3836020611bd5565b6040516020016116f4929190612658565b60408051601f198184030181529082905262461bcd60e51b825261059791600401611f33565b816001600160a01b0316836001600160a01b03160361178d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610597565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061183457611834612404565b602090810291909101015292915050565b6001600160a01b0384163b156108b35760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061188990899089908890889088906004016126cd565b6020604051808303816000875af19250505080156118c4575060408051601f3d908101601f191682019092526118c191810190612712565b60015b611970576118d061272f565b806308c379a00361190957506118e461274b565b806118ef575061190b565b8060405162461bcd60e51b81526004016105979190611f33565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610597565b6001600160e01b0319811663f23a6e6160e01b1461146e5760405162461bcd60e51b8152600401610597906127d5565b6001600160a01b0384166119c65760405162461bcd60e51b81526004016105979061259b565b3360006119d2856117fa565b905060006119df856117fa565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015611a225760405162461bcd60e51b8152600401610597906125e0565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611a5f908490612588565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611abf848a8a8a8a8a611845565b505050505050505050565b60006001600160e01b03198216636cdb3d1360e11b1480611afb57506001600160e01b031982166303a24d0760e21b145b806105c357506301ffc9a760e01b6001600160e01b03198316146105c3565b6001600160a01b0384163b156108b35760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611b5e908990899088908890889060040161281d565b6020604051808303816000875af1925050508015611b99575060408051601f3d908101601f19168201909252611b9691810190612712565b60015b611ba5576118d061272f565b6001600160e01b0319811663bc197c8160e01b1461146e5760405162461bcd60e51b8152600401610597906127d5565b60606000611be48360026123a6565b611bef906002612588565b67ffffffffffffffff811115611c0757611c07611df1565b6040519080825280601f01601f191660200182016040528015611c31576020820181803683370190505b509050600360fc1b81600081518110611c4c57611c4c612404565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611c7b57611c7b612404565b60200101906001600160f81b031916908160001a9053506000611c9f8460026123a6565b611caa906001612588565b90505b6001811115611d22576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611cde57611cde612404565b1a60f81b828281518110611cf457611cf4612404565b60200101906001600160f81b031916908160001a90535060049490941c93611d1b8161287b565b9050611cad565b508315611d715760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610597565b9392505050565b80356001600160a01b0381168114611d8f57600080fd5b919050565b60008060408385031215611da757600080fd5b611db083611d78565b946020939093013593505050565b6001600160e01b03198116811461060457600080fd5b600060208284031215611de657600080fd5b8135611d7181611dbe565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611e2d57611e2d611df1565b6040525050565b600067ffffffffffffffff831115611e4e57611e4e611df1565b604051611e65601f8501601f191660200182611e07565b809150838152848484011115611e7a57600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611ea457600080fd5b813567ffffffffffffffff811115611ebb57600080fd5b8201601f81018413611ecc57600080fd5b611edb84823560208401611e34565b949350505050565b60005b83811015611efe578181015183820152602001611ee6565b50506000910152565b60008151808452611f1f816020860160208601611ee3565b601f01601f19169290920160200192915050565b602081526000611d716020830184611f07565b600060208284031215611f5857600080fd5b5035919050565b801515811461060457600080fd5b600060208284031215611f7f57600080fd5b8135611d7181611f5f565b60008060408385031215611f9d57600080fd5b50508035926020909101359150565b600067ffffffffffffffff821115611fc657611fc6611df1565b5060051b60200190565b600082601f830112611fe157600080fd5b81356020611fee82611fac565b604051611ffb8282611e07565b83815260059390931b850182019282810191508684111561201b57600080fd5b8286015b84811015612036578035835291830191830161201f565b509695505050505050565b600082601f83011261205257600080fd5b611d7183833560208501611e34565b600080600080600060a0868803121561207957600080fd5b61208286611d78565b945061209060208701611d78565b9350604086013567ffffffffffffffff808211156120ad57600080fd5b6120b989838a01611fd0565b945060608801359150808211156120cf57600080fd5b6120db89838a01611fd0565b935060808801359150808211156120f157600080fd5b506120fe88828901612041565b9150509295509295909350565b6000806040838503121561211e57600080fd5b8235915061212e60208401611d78565b90509250929050565b6000806040838503121561214a57600080fd5b823567ffffffffffffffff8082111561216257600080fd5b818501915085601f83011261217657600080fd5b8135602061218382611fac565b6040516121908282611e07565b83815260059390931b85018201928281019150898411156121b057600080fd5b948201945b838610156121d5576121c686611d78565b825294820194908201906121b5565b965050860135925050808211156121eb57600080fd5b506107b985828601611fd0565b600081518084526020808501945080840160005b838110156122285781518752958201959082019060010161220c565b509495945050505050565b602081526000611d7160208301846121f8565b60006020828403121561225857600080fd5b611d7182611d78565b6000806040838503121561227457600080fd5b61227d83611d78565b9150602083013561228d81611f5f565b809150509250929050565b600080604083850312156122ab57600080fd5b6122b483611d78565b915061212e60208401611d78565b600080600080600060a086880312156122da57600080fd5b6122e386611d78565b94506122f160208701611d78565b93506040860135925060608601359150608086013567ffffffffffffffff81111561231b57600080fd5b6120fe88828901612041565b6020808252601590820152742932b9ba3934b1ba32b2103a379030b236b4b7399760591b604082015260600190565b600181811c9082168061236a57607f821691505b60208210810361238a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156123c0576123c0612390565b500290565b6000826123e257634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156123f957600080fd5b8151611d7181611f5f565b634e487b7160e01b600052603260045260246000fd5b60006001820161242c5761242c612390565b5060010190565b601f8211156108e057600081815260208120601f850160051c8101602086101561245a5750805b601f850160051c820191505b818110156108b357828155600101612466565b815167ffffffffffffffff81111561249357612493611df1565b6124a7816124a18454612356565b84612433565b602080601f8311600181146124dc57600084156124c45750858301515b600019600386901b1c1916600185901b1785556108b3565b600085815260208120601f198616915b8281101561250b578886015182559484019460019091019084016124ec565b50858210156125295787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b808201808211156105c3576105c3612390565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061263d60408301856121f8565b828103602084015261264f81856121f8565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612690816017850160208801611ee3565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516126c1816028840160208801611ee3565b01602801949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061270790830184611f07565b979650505050505050565b60006020828403121561272457600080fd5b8151611d7181611dbe565b600060033d11156127485760046000803e5060005160e01c5b90565b600060443d10156127595790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561278957505050505090565b82850191508151818111156127a15750505050505090565b843d87010160208285010111156127bb5750505050505090565b6127ca60208286010187611e07565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612849908301866121f8565b828103606084015261285b81866121f8565b9050828103608084015261286f8185611f07565b98975050505050505050565b60008161288a5761288a612390565b50600019019056fea264697066735822122062849c2b77975443bc1021d6a9bc452e30f06242a4d2adce715df8848d0092a364736f6c63430008100033

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

000000000000000000000000c0f26f847002066a0ed9817fc7f2599553f8a16e00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000941737465726f69647300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004415354520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : root_ (address): 0xc0F26f847002066A0Ed9817fc7F2599553f8A16e
Arg [1] : name_ (string): Asteroids
Arg [2] : symbol_ (string): ASTR
Arg [3] : cURI_ (string):
Arg [4] : uri_ (string):
Arg [5] : royalty_ (uint256): 500

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000c0f26f847002066a0ed9817fc7f2599553f8a16e
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [7] : 41737465726f6964730000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 4153545200000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

69800:5814:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53146:317;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;53146:317:0;;;;;;;;75371:240;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;75371:240:0;1019:187:1;73115:87:0;;;;;;:::i;:::-;;:::i;:::-;;69947:18;;;:::i;:::-;;;;;;;:::i;52890:105::-;;;;;;:::i;:::-;;:::i;71683:87::-;;;;;;:::i;:::-;;:::i;39403:181::-;;;;;;:::i;:::-;39522:7;39554:12;;;:6;:12;;;;;:22;;;;39403:181;70107:22;;;;;;34548:321;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4649:32:1;;;4631:51;;4713:2;4698:18;;4691:34;;;;4604:18;34548:321:0;4457:274:1;74862:302:0;;;;;;:::i;:::-;;:::i;39894:188::-;;;;;;:::i;:::-;;:::i;70038:26::-;;;:::i;41120:287::-;;;;;;:::i;:::-;;:::i;6770:143::-;;6870:42;6770:143;;;;;-1:-1:-1;;;;;7281:32:1;;;7263:51;;7251:2;7236:18;6770:143:0;7086:234:1;53629:561:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70348:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;70222:26;;;;;-1:-1:-1;;;70222:26:0;;;;;;11682:287;;;:::i;70435:35::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;71021:110;;;;;;:::i;:::-;;:::i;21324:103::-;;;:::i;72306:88::-;72379:7;;72306:88;;72594:152;;;;;;:::i;:::-;;:::i;75172:191::-;;;:::i;37813:197::-;;;;;;:::i;:::-;;:::i;72116:117::-;;;;;;:::i;:::-;;:::i;69987:20::-;;;:::i;36842:49::-;;36887:4;36842:49;;74366:208;;;;;;:::i;:::-;;:::i;40375:190::-;;;;;;:::i;:::-;;:::i;73528:737::-;;;;;;:::i;:::-;;:::i;71853:97::-;;;:::i;54522:218::-;;;;;;:::i;:::-;-1:-1:-1;;;;;54695:27:0;;;54666:4;54695:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;54522:218;11977:128;12065:32;;-1:-1:-1;;;12065:32:0;;;;11977:128;;74582:272;;;;;;:::i;:::-;;:::i;21582:238::-;;;;;;:::i;:::-;;:::i;53146:317::-;53277:7;-1:-1:-1;;;;;53324:21:0;;53302:113;;;;-1:-1:-1;;;53302:113:0;;11300:2:1;53302:113:0;;;11282:21:1;11339:2;11319:18;;;11312:30;11378:34;11358:18;;;11351:62;-1:-1:-1;;;11429:18:1;;;11422:40;11479:19;;53302:113:0;;;;;;;;;-1:-1:-1;53433:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;53433:22:0;;;;;;;;;;53146:317;;;;;:::o;75371:240::-;75538:4;75567:36;75591:11;75567:23;:36::i;73115:87::-;71302:39;36887:4;71330:10;71302:7;:39::i;:::-;71280:110;;;;-1:-1:-1;;;71280:110:0;;;;;;;:::i;:::-;73181:13:::1;73189:4;73181:7;:13::i;:::-;73115:87:::0;:::o;69947:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52890:105::-;52950:13;52983:4;52976:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52890:105;;;:::o;71683:87::-;71302:39;36887:4;71330:10;71302:7;:39::i;:::-;71280:110;;;;-1:-1:-1;;;71280:110:0;;;;;;;:::i;:::-;71746:6:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;71746:16:0::1;-1:-1:-1::0;;;;71746:16:0;;::::1;::::0;;;::::1;::::0;;71683:87::o;34548:321::-;34718:41;;;;;;;;;34749:10;34718:41;-1:-1:-1;;;;;34718:41:0;;;;;-1:-1:-1;;;34718:41:0;;;;;;;;;;;;;-1:-1:-1;;34856:5:0;;34828:24;;:5;:24;:::i;:::-;34827:34;;;;:::i;:::-;34811:50;;34707:162;34548:321;;;;;:::o;74862:302::-;10273:32;;75082:4;;-1:-1:-1;;;10273:32:0;;;;10272:33;:99;;;;-1:-1:-1;6870:42:0;10322:45;:49;;10272:99;10254:706;;;10621:10;-1:-1:-1;;;;;10613:18:0;;;10609:85;;75099:57:::1;75127:4;75133:2;75137:3;75142:7;75151:4;75099:27;:57::i;:::-;10672:7:::0;;10609:85;10731:130;;-1:-1:-1;;;10731:130:0;;10804:4;10731:130;;;12983:34:1;10832:10:0;13033:18:1;;;13026:43;6870:42:0;;10731;;12918:18:1;;10731:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10708:241;;10903:30;;-1:-1:-1;;;10903:30:0;;10922:10;10903:30;;;7263:51:1;7236:18;;10903:30:0;7086:234:1;10708:241:0;75099:57:::1;75127:4;75133:2;75137:3;75142:7;75151:4;75099:27;:57::i;:::-;74862:302:::0;;;;;;:::o;39894:188::-;39522:7;39554:12;;;:6;:12;;;;;:22;;;37333:16;37344:4;37333:10;:16::i;:::-;40049:25:::1;40060:4;40066:7;40049:10;:25::i;:::-;39894:188:::0;;;:::o;70038:26::-;;;;;;;:::i;41120:287::-;-1:-1:-1;;;;;41262:23:0;;19286:10;41262:23;41240:120;;;;-1:-1:-1;;;41240:120:0;;13532:2:1;41240:120:0;;;13514:21:1;13571:2;13551:18;;;13544:30;13610:34;13590:18;;;13583:62;-1:-1:-1;;;13661:18:1;;;13654:45;13716:19;;41240:120:0;13330:411:1;41240:120:0;41373:26;41385:4;41391:7;41373:11;:26::i;:::-;41120:287;;:::o;53629:561::-;53785:16;53860:3;:10;53841:8;:15;:29;53819:120;;;;-1:-1:-1;;;53819:120:0;;13948:2:1;53819:120:0;;;13930:21:1;13987:2;13967:18;;;13960:30;14026:34;14006:18;;;13999:62;-1:-1:-1;;;14077:18:1;;;14070:39;14126:19;;53819:120:0;13746:405:1;53819:120:0;53952:30;53999:8;:15;53985:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53985:30:0;;53952:63;;54033:9;54028:122;54052:8;:15;54048:1;:19;54028:122;;;54108:30;54118:8;54127:1;54118:11;;;;;;;;:::i;:::-;;;;;;;54131:3;54135:1;54131:6;;;;;;;;:::i;:::-;;;;;;;54108:9;:30::i;:::-;54089:13;54103:1;54089:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;54069:3;;;:::i;:::-;;;54028:122;;;-1:-1:-1;54169:13:0;53629:561;-1:-1:-1;;;53629:561:0:o;11682:287::-;11760:7;:5;:7::i;:::-;-1:-1:-1;;;;;11746:21:0;:10;-1:-1:-1;;;;;11746:21:0;;11742:72;;11791:11;;-1:-1:-1;;;11791:11:0;;;;;;;;;;;11742:72;11828:32;;-1:-1:-1;;;11828:32:0;;;;11824:88;;;11884:16;;-1:-1:-1;;;11884:16:0;;;;;;;;;;;11824:88;11922:32;:39;;-1:-1:-1;;;;11922:39:0;-1:-1:-1;;;11922:39:0;;;11682:287::o;71021:110::-;71302:39;36887:4;71330:10;71302:7;:39::i;:::-;71280:110;;;;-1:-1:-1;;;71280:110:0;;;;;;;:::i;:::-;71097:11:::1;:26:::0;;-1:-1:-1;;;;;;71097:26:0::1;-1:-1:-1::0;;;;;71097:26:0;;;::::1;::::0;;;::::1;::::0;;71021:110::o;21324:103::-;20562:13;:11;:13::i;:::-;21389:30:::1;21416:1;21389:18;:30::i;:::-;21324:103::o:0;72594:152::-;71302:39;36887:4;71330:10;71302:7;:39::i;:::-;71280:110;;;;-1:-1:-1;;;71280:110:0;;;;;;;:::i;:::-;72705:33:::1;72719:10;72731:6;72705:13;:33::i;75172:191::-:0;75308:7;75340:15;20749:6;;-1:-1:-1;;;;;20749:6:0;;20676:87;75340:15;75333:22;;75172:191;:::o;37813:197::-;37944:4;37973:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;37973:29:0;;;;;;;;;;;;;;;37813:197::o;72116:117::-;71302:39;36887:4;71330:10;71302:7;:39::i;:::-;71280:110;;;;-1:-1:-1;;;71280:110:0;;;;;;;:::i;:::-;72198:12:::1;:27;72213:12:::0;72198;:27:::1;:::i;69987:20::-:0;;;;;;;:::i;74366:208::-;11187:32;;74497:8;;-1:-1:-1;;;11187:32:0;;;;11186:33;:99;;;;-1:-1:-1;6870:42:0;11236:45;:49;;11186:99;11168:392;;;11335:128;;-1:-1:-1;;;11335:128:0;;11408:4;11335:128;;;12983:34:1;-1:-1:-1;;;;;13053:15:1;;13033:18;;;13026:43;6870:42:0;;11335;;12918:18:1;;11335:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11312:237;;11505:28;;-1:-1:-1;;;11505:28:0;;-1:-1:-1;;;;;7281:32:1;;11505:28:0;;;7263:51:1;7236:18;;11505:28:0;7086:234:1;11312:237:0;74523:43:::1;74547:8;74557;74523:23;:43::i;40375:190::-:0;39522:7;39554:12;;;:6;:12;;;;;:22;;;37333:16;37344:4;37333:10;:16::i;:::-;40531:26:::1;40543:4;40549:7;40531:11;:26::i;73528:737::-:0;71568:11;;-1:-1:-1;;;;;71568:11:0;71554:10;:25;71546:34;;;;;;73653:6:::1;::::0;-1:-1:-1;;;73653:6:0;::::1;;;73652:7;73644:38;;;::::0;-1:-1:-1;;;73644:38:0;;16834:2:1;73644:38:0::1;::::0;::::1;16816:21:1::0;16873:2;16853:18;;;16846:30;-1:-1:-1;;;16892:18:1;;;16885:48;16950:18;;73644:38:0::1;16632:342:1::0;73644:38:0::1;73741:8;::::0;;;:3:::1;:8;::::0;;;;;::::1;;:17;73733:52;;;::::0;-1:-1:-1;;;73733:52:0;;17181:2:1;73733:52:0::1;::::0;::::1;17163:21:1::0;17220:2;17200:18;;;17193:30;-1:-1:-1;;;17239:18:1;;;17232:52;17301:18;;73733:52:0::1;16979:346:1::0;73733:52:0::1;-1:-1:-1::0;;;;;73867:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;;::::1;;:26;73859:70;;;::::0;-1:-1:-1;;;73859:70:0;;17532:2:1;73859:70:0::1;::::0;::::1;17514:21:1::0;17571:2;17551:18;;;17544:30;17610:33;17590:18;;;17583:61;17661:18;;73859:70:0::1;17330:355:1::0;73859:70:0::1;-1:-1:-1::0;;;;;74015:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;;;;:24;;74035:4:::1;-1:-1:-1::0;;74015:24:0;;::::1;::::0;::::1;::::0;;;74082:8;;;:3:::1;:8:::0;;;;;:15;;;;::::1;::::0;::::1;::::0;;74247:9;;;;::::1;::::0;;;;;;74225:32:::1;::::0;74015:17;;74082:8;;74035:4;74225:5:::1;:32::i;71853:97::-:0;71897:13;71930:12;71923:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71853:97;:::o;74582:272::-;10273:32;;74774:4;;-1:-1:-1;;;10273:32:0;;;;10272:33;:99;;;;-1:-1:-1;6870:42:0;10322:45;:49;;10272:99;10254:706;;;10621:10;-1:-1:-1;;;;;10613:18:0;;;10609:85;;74791:55:::1;74814:4;74820:2;74824:7;74833:6;74841:4;74791:22;:55::i;10609:85::-:0;10731:130;;-1:-1:-1;;;10731:130:0;;10804:4;10731:130;;;12983:34:1;10832:10:0;13033:18:1;;;13026:43;6870:42:0;;10731;;12918:18:1;;10731:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10708:241;;10903:30;;-1:-1:-1;;;10903:30:0;;10922:10;10903:30;;;7263:51:1;7236:18;;10903:30:0;7086:234:1;10708:241:0;74791:55:::1;74814:4;74820:2;74824:7;74833:6;74841:4;74791:22;:55::i;21582:238::-:0;20562:13;:11;:13::i;:::-;-1:-1:-1;;;;;21685:22:0;::::1;21663:110;;;::::0;-1:-1:-1;;;21663:110:0;;17892:2:1;21663:110:0::1;::::0;::::1;17874:21:1::0;17931:2;17911:18;;;17904:30;17970:34;17950:18;;;17943:62;-1:-1:-1;;;18021:18:1;;;18014:36;18067:19;;21663:110:0::1;17690:402:1::0;21663:110:0::1;21784:28;21803:8;21784:18;:28::i;33508:283::-:0;33638:4;-1:-1:-1;;;;;;33680:50:0;;-1:-1:-1;;;33680:50:0;;:103;;;33747:36;33771:11;33747:23;:36::i;59733:88::-;59800:4;:13;59807:6;59800:4;:13;:::i;55296:439::-;-1:-1:-1;;;;;55529:20:0;;19286:10;55529:20;;:60;;-1:-1:-1;55553:36:0;55570:4;19286:10;54522:218;:::i;55553:36::-;55507:157;;;;-1:-1:-1;;;55507:157:0;;;;;;;:::i;:::-;55675:52;55698:4;55704:2;55708:3;55713:7;55722:4;55675:22;:52::i;:::-;55296:439;;;;;:::o;38314:105::-;38381:30;38392:4;19286:10;38381;:30::i;42786:238::-;42870:22;42878:4;42884:7;42870;:22::i;:::-;42865:152;;42909:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;42909:29:0;;;;;;;;;:36;;-1:-1:-1;;42909:36:0;42941:4;42909:36;;;42992:12;19286:10;;19206:98;42992:12;-1:-1:-1;;;;;42965:40:0;42983:7;-1:-1:-1;;;;;42965:40:0;42977:4;42965:40;;;;;;;;;;42786:238;;:::o;43204:239::-;43288:22;43296:4;43302:7;43288;:22::i;:::-;43284:152;;;43359:5;43327:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;43327:29:0;;;;;;;;;;:37;;-1:-1:-1;;43327:37:0;;;43384:40;19286:10;;43327:12;;43384:40;;43359:5;43384:40;43204:239;;:::o;20841:132::-;19286:10;20905:7;:5;:7::i;:::-;-1:-1:-1;;;;;20905:23:0;;20897:68;;;;-1:-1:-1;;;20897:68:0;;18715:2:1;20897:68:0;;;18697:21:1;;;18734:18;;;18727:30;18793:34;18773:18;;;18766:62;18845:18;;20897:68:0;18513:356:1;21980:191:0;22073:6;;;-1:-1:-1;;;;;22090:17:0;;;-1:-1:-1;;;;;;22090:17:0;;;;;;;22123:40;;22073:6;;;22090:17;22073:6;;22123:40;;22054:16;;22123:40;22043:128;21980:191;:::o;34302:199::-;34396:5;34387;:14;;34379:53;;;;-1:-1:-1;;;34379:53:0;;19076:2:1;34379:53:0;;;19058:21:1;19115:2;19095:18;;;19088:30;19154:28;19134:18;;;19127:56;19200:18;;34379:53:0;18874:350:1;34379:53:0;34456:37;;;;;;;;;-1:-1:-1;;;;;34456:37:0;;;;;;;;;;;;;;;;;34443:10;:50;;-1:-1:-1;;;34443:50:0;;;-1:-1:-1;;;;;;34443:50:0;;;;;;;;;;;;34302:199::o;54263:187::-;54390:52;19286:10;54423:8;54433;54390:18;:52::i;60207:818::-;-1:-1:-1;;;;;60360:16:0;;60352:62;;;;-1:-1:-1;;;60352:62:0;;19431:2:1;60352:62:0;;;19413:21:1;19470:2;19450:18;;;19443:30;19509:34;19489:18;;;19482:62;-1:-1:-1;;;19560:18:1;;;19553:31;19601:19;;60352:62:0;19229:397:1;60352:62:0;19286:10;60427:16;60492:21;60510:2;60492:17;:21::i;:::-;60469:44;;60524:24;60551:25;60569:6;60551:17;:25::i;:::-;60524:52;;60668:9;:13;;;;;;;;;;;-1:-1:-1;;;;;60668:17:0;;;;;;;;;:27;;60689:6;;60668:9;:27;;60689:6;;60668:27;:::i;:::-;;;;-1:-1:-1;;60711:52:0;;;19935:25:1;;;19991:2;19976:18;;19969:34;;;-1:-1:-1;;;;;60711:52:0;;;;60744:1;;60711:52;;;;;;19908:18:1;60711:52:0;;;;;;;60854:163;60899:8;60930:1;60947:2;60964;60981:6;61002:4;60854:30;:163::i;:::-;60341:684;;;60207:818;;;;:::o;54812:407::-;-1:-1:-1;;;;;55020:20:0;;19286:10;55020:20;;:60;;-1:-1:-1;55044:36:0;55061:4;19286:10;54522:218;:::i;55044:36::-;54998:157;;;;-1:-1:-1;;;54998:157:0;;;;;;;:::i;:::-;55166:45;55184:4;55190:2;55194;55198:6;55206:4;55166:17;:45::i;37441:280::-;37571:4;-1:-1:-1;;;;;;37613:47:0;;-1:-1:-1;;;37613:47:0;;:100;;;37677:36;37701:11;37677:23;:36::i;57568:1321::-;57809:7;:14;57795:3;:10;:28;57773:118;;;;-1:-1:-1;;;57773:118:0;;20216:2:1;57773:118:0;;;20198:21:1;20255:2;20235:18;;;20228:30;20294:34;20274:18;;;20267:62;-1:-1:-1;;;20345:18:1;;;20338:38;20393:19;;57773:118:0;20014:404:1;57773:118:0;-1:-1:-1;;;;;57910:16:0;;57902:66;;;;-1:-1:-1;;;57902:66:0;;;;;;;:::i;:::-;19286:10;57981:16;58098:470;58122:3;:10;58118:1;:14;58098:470;;;58154:10;58167:3;58171:1;58167:6;;;;;;;;:::i;:::-;;;;;;;58154:19;;58188:14;58205:7;58213:1;58205:10;;;;;;;;:::i;:::-;;;;;;;;;;;;58232:19;58254:13;;;;;;;;;;-1:-1:-1;;;;;58254:19:0;;;;;;;;;;;;58205:10;;-1:-1:-1;58314:21:0;;;;58288:125;;;;-1:-1:-1;;;58288:125:0;;;;;;;:::i;:::-;58457:9;:13;;;;;;;;;;;-1:-1:-1;;;;;58457:19:0;;;;;;;;;;58479:20;;;58457:42;;58529:17;;;;;;;:27;;58479:20;;58457:9;58529:27;;58479:20;;58529:27;:::i;:::-;;;;;;;;58139:429;;;58134:3;;;;:::i;:::-;;;58098:470;;;;58615:2;-1:-1:-1;;;;;58585:47:0;58609:4;-1:-1:-1;;;;;58585:47:0;58599:8;-1:-1:-1;;;;;58585:47:0;;58619:3;58624:7;58585:47;;;;;;;:::i;:::-;;;;;;;;58717:164;58767:8;58790:4;58809:2;58826:3;58844:7;58866:4;58717:35;:164::i;38709:505::-;38798:22;38806:4;38812:7;38798;:22::i;:::-;38793:414;;38986:41;39014:7;-1:-1:-1;;;;;38986:41:0;39024:2;38986:19;:41::i;:::-;39100:38;39128:4;39135:2;39100:19;:38::i;:::-;38891:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;38891:270:0;;;;;;;;;;-1:-1:-1;;;38837:358:0;;;;;;;:::i;64921:331::-;65076:8;-1:-1:-1;;;;;65067:17:0;:5;-1:-1:-1;;;;;65067:17:0;;65059:71;;;;-1:-1:-1;;;65059:71:0;;22729:2:1;65059:71:0;;;22711:21:1;22768:2;22748:18;;;22741:30;22807:34;22787:18;;;22780:62;-1:-1:-1;;;22858:18:1;;;22851:39;22907:19;;65059:71:0;22527:405:1;65059:71:0;-1:-1:-1;;;;;65141:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;65141:46:0;;;;;;;;;;65203:41;;1159::1;;;65203::0;;1132:18:1;65203:41:0;;;;;;;64921:331;;;:::o;69503:230::-;69655:16;;;69669:1;69655:16;;;;;;;;;69596;;69630:22;;69655:16;;;;;;;;;;;;-1:-1:-1;69655:16:0;69630:41;;69693:7;69682:5;69688:1;69682:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;69720:5;69503:230;-1:-1:-1;;69503:230:0:o;67614:898::-;-1:-1:-1;;;;;67829:13:0;;23704:19;:23;67825:680;;67882:196;;-1:-1:-1;;;67882:196:0;;-1:-1:-1;;;;;67882:38:0;;;;;:196;;67943:8;;67974:4;;68001:2;;68026:6;;68055:4;;67882:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67882:196:0;;;;;;;;-1:-1:-1;;67882:196:0;;;;;;;;;;;;:::i;:::-;;;67861:633;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;68367:6;68360:14;;-1:-1:-1;;;68360:14:0;;;;;;;;:::i;67861:633::-;;;68416:62;;-1:-1:-1;;;68416:62:0;;24819:2:1;68416:62:0;;;24801:21:1;24858:2;24838:18;;;24831:30;24897:34;24877:18;;;24870:62;-1:-1:-1;;;24948:18:1;;;24941:50;25008:19;;68416:62:0;24617:416:1;67861:633:0;-1:-1:-1;;;;;;68141:55:0;;-1:-1:-1;;;68141:55:0;68137:154;;68221:50;;-1:-1:-1;;;68221:50:0;;;;;;;:::i;56199:1011::-;-1:-1:-1;;;;;56387:16:0;;56379:66;;;;-1:-1:-1;;;56379:66:0;;;;;;;:::i;:::-;19286:10;56458:16;56523:21;56541:2;56523:17;:21::i;:::-;56500:44;;56555:24;56582:25;56600:6;56582:17;:25::i;:::-;56555:52;;56693:19;56715:13;;;;;;;;;;;-1:-1:-1;;;;;56715:19:0;;;;;;;;;;56767:21;;;;56745:113;;;;-1:-1:-1;;;56745:113:0;;;;;;;:::i;:::-;56894:9;:13;;;;;;;;;;;-1:-1:-1;;;;;56894:19:0;;;;;;;;;;56916:20;;;56894:42;;56958:17;;;;;;;:27;;56916:20;;56894:9;56958:27;;56916:20;;56958:27;:::i;:::-;;;;-1:-1:-1;;57003:46:0;;;19935:25:1;;;19991:2;19976:18;;19969:34;;;-1:-1:-1;;;;;57003:46:0;;;;;;;;;;;;;;19908:18:1;57003:46:0;;;;;;;57134:68;57165:8;57175:4;57181:2;57185;57189:6;57197:4;57134:30;:68::i;:::-;56368:842;;;;56199:1011;;;;;:::o;52119:360::-;52266:4;-1:-1:-1;;;;;;52308:41:0;;-1:-1:-1;;;52308:41:0;;:110;;-1:-1:-1;;;;;;;52366:52:0;;-1:-1:-1;;;52366:52:0;52308:110;:163;;;-1:-1:-1;;;;;;;;;;33131:40:0;;;52435:36;32972:207;68520:975;-1:-1:-1;;;;;68760:13:0;;23704:19;:23;68756:732;;68813:203;;-1:-1:-1;;;68813:203:0;;-1:-1:-1;;;;;68813:43:0;;;;;:203;;68879:8;;68910:4;;68937:3;;68963:7;;68993:4;;68813:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68813:203:0;;;;;;;;-1:-1:-1;;68813:203:0;;;;;;;;;;;;:::i;:::-;;;68792:685;;;;:::i;:::-;-1:-1:-1;;;;;;69101:60:0;;-1:-1:-1;;;69101:60:0;69075:199;;69204:50;;-1:-1:-1;;;69204:50:0;;;;;;;:::i;14563:483::-;14665:13;14696:19;14728:10;14732:6;14728:1;:10;:::i;:::-;:14;;14741:1;14728:14;:::i;:::-;14718:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14718:25:0;;14696:47;;-1:-1:-1;;;14754:6:0;14761:1;14754:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;14754:15:0;;;;;;;;;-1:-1:-1;;;14780:6:0;14787:1;14780:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;14780:15:0;;;;;;;;-1:-1:-1;14811:9:0;14823:10;14827:6;14823:1;:10;:::i;:::-;:14;;14836:1;14823:14;:::i;:::-;14811:26;;14806:135;14843:1;14839;:5;14806:135;;;-1:-1:-1;;;14891:5:0;14899:3;14891:11;14878:25;;;;;;;:::i;:::-;;;;14866:6;14873:1;14866:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;14866:37:0;;;;;;;;-1:-1:-1;14928:1:0;14918:11;;;;;14846:3;;;:::i;:::-;;;14806:135;;;-1:-1:-1;14959:10:0;;14951:55;;;;-1:-1:-1;;;14951:55:0;;26622:2:1;14951:55:0;;;26604:21:1;;;26641:18;;;26634:30;26700:34;26680:18;;;26673:62;26752:18;;14951:55:0;26420:356:1;14951:55:0;15031:6;14563:483;-1:-1:-1;;;14563:483:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;1488:18;1473:34;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:469::-;1662:5;1696:18;1688:6;1685:30;1682:56;;;1718:18;;:::i;:::-;1767:2;1761:9;1779:69;1836:2;1815:15;;-1:-1:-1;;1811:29:1;1842:4;1807:40;1761:9;1779:69;:::i;:::-;1866:6;1857:15;;1896:6;1888;1881:22;1936:3;1927:6;1922:3;1918:16;1915:25;1912:45;;;1953:1;1950;1943:12;1912:45;2003:6;1998:3;1991:4;1983:6;1979:17;1966:44;2058:1;2051:4;2042:6;2034;2030:19;2026:30;2019:41;;1597:469;;;;;:::o;2071:451::-;2140:6;2193:2;2181:9;2172:7;2168:23;2164:32;2161:52;;;2209:1;2206;2199:12;2161:52;2249:9;2236:23;2282:18;2274:6;2271:30;2268:50;;;2314:1;2311;2304:12;2268:50;2337:22;;2390:4;2382:13;;2378:27;-1:-1:-1;2368:55:1;;2419:1;2416;2409:12;2368:55;2442:74;2508:7;2503:2;2490:16;2485:2;2481;2477:11;2442:74;:::i;:::-;2432:84;2071:451;-1:-1:-1;;;;2071:451:1:o;2527:250::-;2612:1;2622:113;2636:6;2633:1;2630:13;2622:113;;;2712:11;;;2706:18;2693:11;;;2686:39;2658:2;2651:10;2622:113;;;-1:-1:-1;;2769:1:1;2751:16;;2744:27;2527:250::o;2782:271::-;2824:3;2862:5;2856:12;2889:6;2884:3;2877:19;2905:76;2974:6;2967:4;2962:3;2958:14;2951:4;2944:5;2940:16;2905:76;:::i;:::-;3035:2;3014:15;-1:-1:-1;;3010:29:1;3001:39;;;;3042:4;2997:50;;2782:271;-1:-1:-1;;2782:271:1:o;3058:220::-;3207:2;3196:9;3189:21;3170:4;3227:45;3268:2;3257:9;3253:18;3245:6;3227:45;:::i;3283:180::-;3342:6;3395:2;3383:9;3374:7;3370:23;3366:32;3363:52;;;3411:1;3408;3401:12;3363:52;-1:-1:-1;3434:23:1;;3283:180;-1:-1:-1;3283:180:1:o;3468:118::-;3554:5;3547:13;3540:21;3533:5;3530:32;3520:60;;3576:1;3573;3566:12;3591:241;3647:6;3700:2;3688:9;3679:7;3675:23;3671:32;3668:52;;;3716:1;3713;3706:12;3668:52;3755:9;3742:23;3774:28;3796:5;3774:28;:::i;4204:248::-;4272:6;4280;4333:2;4321:9;4312:7;4308:23;4304:32;4301:52;;;4349:1;4346;4339:12;4301:52;-1:-1:-1;;4372:23:1;;;4442:2;4427:18;;;4414:32;;-1:-1:-1;4204:248:1:o;4736:183::-;4796:4;4829:18;4821:6;4818:30;4815:56;;;4851:18;;:::i;:::-;-1:-1:-1;4896:1:1;4892:14;4908:4;4888:25;;4736:183::o;4924:724::-;4978:5;5031:3;5024:4;5016:6;5012:17;5008:27;4998:55;;5049:1;5046;5039:12;4998:55;5085:6;5072:20;5111:4;5134:43;5174:2;5134:43;:::i;:::-;5206:2;5200:9;5218:31;5246:2;5238:6;5218:31;:::i;:::-;5284:18;;;5376:1;5372:10;;;;5360:23;;5356:32;;;5318:15;;;;-1:-1:-1;5400:15:1;;;5397:35;;;5428:1;5425;5418:12;5397:35;5464:2;5456:6;5452:15;5476:142;5492:6;5487:3;5484:15;5476:142;;;5558:17;;5546:30;;5596:12;;;;5509;;5476:142;;;-1:-1:-1;5636:6:1;4924:724;-1:-1:-1;;;;;;4924:724:1:o;5653:221::-;5695:5;5748:3;5741:4;5733:6;5729:17;5725:27;5715:55;;5766:1;5763;5756:12;5715:55;5788:80;5864:3;5855:6;5842:20;5835:4;5827:6;5823:17;5788:80;:::i;5879:943::-;6033:6;6041;6049;6057;6065;6118:3;6106:9;6097:7;6093:23;6089:33;6086:53;;;6135:1;6132;6125:12;6086:53;6158:29;6177:9;6158:29;:::i;:::-;6148:39;;6206:38;6240:2;6229:9;6225:18;6206:38;:::i;:::-;6196:48;;6295:2;6284:9;6280:18;6267:32;6318:18;6359:2;6351:6;6348:14;6345:34;;;6375:1;6372;6365:12;6345:34;6398:61;6451:7;6442:6;6431:9;6427:22;6398:61;:::i;:::-;6388:71;;6512:2;6501:9;6497:18;6484:32;6468:48;;6541:2;6531:8;6528:16;6525:36;;;6557:1;6554;6547:12;6525:36;6580:63;6635:7;6624:8;6613:9;6609:24;6580:63;:::i;:::-;6570:73;;6696:3;6685:9;6681:19;6668:33;6652:49;;6726:2;6716:8;6713:16;6710:36;;;6742:1;6739;6732:12;6710:36;;6765:51;6808:7;6797:8;6786:9;6782:24;6765:51;:::i;:::-;6755:61;;;5879:943;;;;;;;;:::o;6827:254::-;6895:6;6903;6956:2;6944:9;6935:7;6931:23;6927:32;6924:52;;;6972:1;6969;6962:12;6924:52;7008:9;6995:23;6985:33;;7037:38;7071:2;7060:9;7056:18;7037:38;:::i;:::-;7027:48;;6827:254;;;;;:::o;7325:1208::-;7443:6;7451;7504:2;7492:9;7483:7;7479:23;7475:32;7472:52;;;7520:1;7517;7510:12;7472:52;7560:9;7547:23;7589:18;7630:2;7622:6;7619:14;7616:34;;;7646:1;7643;7636:12;7616:34;7684:6;7673:9;7669:22;7659:32;;7729:7;7722:4;7718:2;7714:13;7710:27;7700:55;;7751:1;7748;7741:12;7700:55;7787:2;7774:16;7809:4;7832:43;7872:2;7832:43;:::i;:::-;7904:2;7898:9;7916:31;7944:2;7936:6;7916:31;:::i;:::-;7982:18;;;8070:1;8066:10;;;;8058:19;;8054:28;;;8016:15;;;;-1:-1:-1;8094:19:1;;;8091:39;;;8126:1;8123;8116:12;8091:39;8150:11;;;;8170:148;8186:6;8181:3;8178:15;8170:148;;;8252:23;8271:3;8252:23;:::i;:::-;8240:36;;8203:12;;;;8296;;;;8170:148;;;8337:6;-1:-1:-1;;8381:18:1;;8368:32;;-1:-1:-1;;8412:16:1;;;8409:36;;;8441:1;8438;8431:12;8409:36;;8464:63;8519:7;8508:8;8497:9;8493:24;8464:63;:::i;8538:435::-;8591:3;8629:5;8623:12;8656:6;8651:3;8644:19;8682:4;8711:2;8706:3;8702:12;8695:19;;8748:2;8741:5;8737:14;8769:1;8779:169;8793:6;8790:1;8787:13;8779:169;;;8854:13;;8842:26;;8888:12;;;;8923:15;;;;8815:1;8808:9;8779:169;;;-1:-1:-1;8964:3:1;;8538:435;-1:-1:-1;;;;;8538:435:1:o;8978:261::-;9157:2;9146:9;9139:21;9120:4;9177:56;9229:2;9218:9;9214:18;9206:6;9177:56;:::i;9244:186::-;9303:6;9356:2;9344:9;9335:7;9331:23;9327:32;9324:52;;;9372:1;9369;9362:12;9324:52;9395:29;9414:9;9395:29;:::i;9643:315::-;9708:6;9716;9769:2;9757:9;9748:7;9744:23;9740:32;9737:52;;;9785:1;9782;9775:12;9737:52;9808:29;9827:9;9808:29;:::i;:::-;9798:39;;9887:2;9876:9;9872:18;9859:32;9900:28;9922:5;9900:28;:::i;:::-;9947:5;9937:15;;;9643:315;;;;;:::o;10222:260::-;10290:6;10298;10351:2;10339:9;10330:7;10326:23;10322:32;10319:52;;;10367:1;10364;10357:12;10319:52;10390:29;10409:9;10390:29;:::i;:::-;10380:39;;10438:38;10472:2;10461:9;10457:18;10438:38;:::i;10487:606::-;10591:6;10599;10607;10615;10623;10676:3;10664:9;10655:7;10651:23;10647:33;10644:53;;;10693:1;10690;10683:12;10644:53;10716:29;10735:9;10716:29;:::i;:::-;10706:39;;10764:38;10798:2;10787:9;10783:18;10764:38;:::i;:::-;10754:48;;10849:2;10838:9;10834:18;10821:32;10811:42;;10900:2;10889:9;10885:18;10872:32;10862:42;;10955:3;10944:9;10940:19;10927:33;10983:18;10975:6;10972:30;10969:50;;;11015:1;11012;11005:12;10969:50;11038:49;11079:7;11070:6;11059:9;11055:22;11038:49;:::i;11509:345::-;11711:2;11693:21;;;11750:2;11730:18;;;11723:30;-1:-1:-1;;;11784:2:1;11769:18;;11762:51;11845:2;11830:18;;11509:345::o;11859:380::-;11938:1;11934:12;;;;11981;;;12002:61;;12056:4;12048:6;12044:17;12034:27;;12002:61;12109:2;12101:6;12098:14;12078:18;12075:38;12072:161;;12155:10;12150:3;12146:20;12143:1;12136:31;12190:4;12187:1;12180:15;12218:4;12215:1;12208:15;12072:161;;11859:380;;;:::o;12244:127::-;12305:10;12300:3;12296:20;12293:1;12286:31;12336:4;12333:1;12326:15;12360:4;12357:1;12350:15;12376:168;12416:7;12482:1;12478;12474:6;12470:14;12467:1;12464:21;12459:1;12452:9;12445:17;12441:45;12438:71;;;12489:18;;:::i;:::-;-1:-1:-1;12529:9:1;;12376:168::o;12549:217::-;12589:1;12615;12605:132;;12659:10;12654:3;12650:20;12647:1;12640:31;12694:4;12691:1;12684:15;12722:4;12719:1;12712:15;12605:132;-1:-1:-1;12751:9:1;;12549:217::o;13080:245::-;13147:6;13200:2;13188:9;13179:7;13175:23;13171:32;13168:52;;;13216:1;13213;13206:12;13168:52;13248:9;13242:16;13267:28;13289:5;13267:28;:::i;14156:127::-;14217:10;14212:3;14208:20;14205:1;14198:31;14248:4;14245:1;14238:15;14272:4;14269:1;14262:15;14288:135;14327:3;14348:17;;;14345:43;;14368:18;;:::i;:::-;-1:-1:-1;14415:1:1;14404:13;;14288:135::o;14554:545::-;14656:2;14651:3;14648:11;14645:448;;;14692:1;14717:5;14713:2;14706:17;14762:4;14758:2;14748:19;14832:2;14820:10;14816:19;14813:1;14809:27;14803:4;14799:38;14868:4;14856:10;14853:20;14850:47;;;-1:-1:-1;14891:4:1;14850:47;14946:2;14941:3;14937:12;14934:1;14930:20;14924:4;14920:31;14910:41;;15001:82;15019:2;15012:5;15009:13;15001:82;;;15064:17;;;15045:1;15034:13;15001:82;;15275:1352;15401:3;15395:10;15428:18;15420:6;15417:30;15414:56;;;15450:18;;:::i;:::-;15479:97;15569:6;15529:38;15561:4;15555:11;15529:38;:::i;:::-;15523:4;15479:97;:::i;:::-;15631:4;;15695:2;15684:14;;15712:1;15707:663;;;;16414:1;16431:6;16428:89;;;-1:-1:-1;16483:19:1;;;16477:26;16428:89;-1:-1:-1;;15232:1:1;15228:11;;;15224:24;15220:29;15210:40;15256:1;15252:11;;;15207:57;16530:81;;15677:944;;15707:663;14501:1;14494:14;;;14538:4;14525:18;;-1:-1:-1;;15743:20:1;;;15861:236;15875:7;15872:1;15869:14;15861:236;;;15964:19;;;15958:26;15943:42;;16056:27;;;;16024:1;16012:14;;;;15891:19;;15861:236;;;15865:3;16125:6;16116:7;16113:19;16110:201;;;16186:19;;;16180:26;-1:-1:-1;;16269:1:1;16265:14;;;16281:3;16261:24;16257:37;16253:42;16238:58;16223:74;;16110:201;-1:-1:-1;;;;;16357:1:1;16341:14;;;16337:22;16324:36;;-1:-1:-1;15275:1352:1:o;18097:411::-;18299:2;18281:21;;;18338:2;18318:18;;;18311:30;18377:34;18372:2;18357:18;;18350:62;-1:-1:-1;;;18443:2:1;18428:18;;18421:45;18498:3;18483:19;;18097:411::o;19631:125::-;19696:9;;;19717:10;;;19714:36;;;19730:18;;:::i;20423:401::-;20625:2;20607:21;;;20664:2;20644:18;;;20637:30;20703:34;20698:2;20683:18;;20676:62;-1:-1:-1;;;20769:2:1;20754:18;;20747:35;20814:3;20799:19;;20423:401::o;20829:406::-;21031:2;21013:21;;;21070:2;21050:18;;;21043:30;21109:34;21104:2;21089:18;;21082:62;-1:-1:-1;;;21175:2:1;21160:18;;21153:40;21225:3;21210:19;;20829:406::o;21240:465::-;21497:2;21486:9;21479:21;21460:4;21523:56;21575:2;21564:9;21560:18;21552:6;21523:56;:::i;:::-;21627:9;21619:6;21615:22;21610:2;21599:9;21595:18;21588:50;21655:44;21692:6;21684;21655:44;:::i;:::-;21647:52;21240:465;-1:-1:-1;;;;;21240:465:1:o;21710:812::-;22121:25;22116:3;22109:38;22091:3;22176:6;22170:13;22192:75;22260:6;22255:2;22250:3;22246:12;22239:4;22231:6;22227:17;22192:75;:::i;:::-;-1:-1:-1;;;22326:2:1;22286:16;;;22318:11;;;22311:40;22376:13;;22398:76;22376:13;22460:2;22452:11;;22445:4;22433:17;;22398:76;:::i;:::-;22494:17;22513:2;22490:26;;21710:812;-1:-1:-1;;;;21710:812:1:o;22937:561::-;-1:-1:-1;;;;;23234:15:1;;;23216:34;;23286:15;;23281:2;23266:18;;23259:43;23333:2;23318:18;;23311:34;;;23376:2;23361:18;;23354:34;;;23196:3;23419;23404:19;;23397:32;;;23159:4;;23446:46;;23472:19;;23464:6;23446:46;:::i;:::-;23438:54;22937:561;-1:-1:-1;;;;;;;22937:561:1:o;23503:249::-;23572:6;23625:2;23613:9;23604:7;23600:23;23596:32;23593:52;;;23641:1;23638;23631:12;23593:52;23673:9;23667:16;23692:30;23716:5;23692:30;:::i;23757:179::-;23792:3;23834:1;23816:16;23813:23;23810:120;;;23880:1;23877;23874;23859:23;-1:-1:-1;23917:1:1;23911:8;23906:3;23902:18;23810:120;23757:179;:::o;23941:671::-;23980:3;24022:4;24004:16;24001:26;23998:39;;;23941:671;:::o;23998:39::-;24064:2;24058:9;-1:-1:-1;;24129:16:1;24125:25;;24122:1;24058:9;24101:50;24180:4;24174:11;24204:16;24239:18;24310:2;24303:4;24295:6;24291:17;24288:25;24283:2;24275:6;24272:14;24269:45;24266:58;;;24317:5;;;;;23941:671;:::o;24266:58::-;24354:6;24348:4;24344:17;24333:28;;24390:3;24384:10;24417:2;24409:6;24406:14;24403:27;;;24423:5;;;;;;23941:671;:::o;24403:27::-;24507:2;24488:16;24482:4;24478:27;24474:36;24467:4;24458:6;24453:3;24449:16;24445:27;24442:69;24439:82;;;24514:5;;;;;;23941:671;:::o;24439:82::-;24530:57;24581:4;24572:6;24564;24560:19;24556:30;24550:4;24530:57;:::i;:::-;-1:-1:-1;24603:3:1;;23941:671;-1:-1:-1;;;;;23941:671:1:o;25038:404::-;25240:2;25222:21;;;25279:2;25259:18;;;25252:30;25318:34;25313:2;25298:18;;25291:62;-1:-1:-1;;;25384:2:1;25369:18;;25362:38;25432:3;25417:19;;25038:404::o;25447:827::-;-1:-1:-1;;;;;25844:15:1;;;25826:34;;25896:15;;25891:2;25876:18;;25869:43;25806:3;25943:2;25928:18;;25921:31;;;25769:4;;25975:57;;26012:19;;26004:6;25975:57;:::i;:::-;26080:9;26072:6;26068:22;26063:2;26052:9;26048:18;26041:50;26114:44;26151:6;26143;26114:44;:::i;:::-;26100:58;;26207:9;26199:6;26195:22;26189:3;26178:9;26174:19;26167:51;26235:33;26261:6;26253;26235:33;:::i;:::-;26227:41;25447:827;-1:-1:-1;;;;;;;;25447:827:1:o;26279:136::-;26318:3;26346:5;26336:39;;26355:18;;:::i;:::-;-1:-1:-1;;;26391:18:1;;26279:136::o

Swarm Source

ipfs://62849c2b77975443bc1021d6a9bc452e30f06242a4d2adce715df8848d0092a3
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.