ETH Price: $2,294.13 (+0.27%)

Token

PunksRingers (PunksRingers)
 

Overview

Max Total Supply

3,000 PunksRingers

Holders

323

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PunksRingers
0x2a415bfd5efdece70ffed9d5cff60c9c3e4274fe
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:
PunksRingers

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-25
*/

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

// SPDX-License-Identifier: MIT

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

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

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

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

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

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

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

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

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


contract PunksRingers is ERC721A, Ownable {
    
    uint256 public immutable mintPrice = 0.001 ether;
    uint32 public immutable maxSupply = 3000;
    uint32 public immutable maxPerTx = 20;

    string  public uriPrefix = "ipfs://bafybeigrk4aw7tjoldxd2yddxi5ibe762uzuccbsw4bngxf3eo6xqddojm/";
    mapping(address => bool) public freeMinted;

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    constructor()
    ERC721A ("PunksRingers", "PunksRingers") {
    }

    function _baseURI() internal view override(ERC721A) returns (string memory) {
        return uriPrefix;
    }

    function setUriPrefix(string memory uri) public onlyOwner {
        uriPrefix = uri;
    }

    function _startTokenId() internal view virtual override(ERC721A) returns (uint256) {
        return 0;
    }
    
    function publicMint(uint32 amount) public payable callerIsUser{
        require(totalSupply() + amount <= maxSupply,"sold out");
        require(amount <= maxPerTx,"exceed max amount");
        if(freeMinted[msg.sender])
        {
            require(msg.value >= amount * mintPrice,"insufficient");
        }
        else 
        {
            freeMinted[msg.sender] = true;
            require(msg.value >= (amount-1) * mintPrice,"insufficient");
        }
        _safeMint(msg.sender, amount);
    }

    function getMintedFree() public view returns (bool){
        return freeMinted[msg.sender];
    }

    function withdraw() public onlyOwner {
        uint256 sendAmount = address(this).balance;

        address h = payable(msg.sender);

        bool success;

        (success, ) = h.call{value: sendAmount}("");
        require(success, "Transaction Unsuccessful");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405266038d7ea4c68000608090815250610bb863ffffffff1660a09063ffffffff16815250601463ffffffff1660c09063ffffffff1681525060405180608001604052806043815260200162003c2260439139600990816200006591906200048f565b503480156200007357600080fd5b506040518060400160405280600c81526020017f50756e6b7352696e6765727300000000000000000000000000000000000000008152506040518060400160405280600c81526020017f50756e6b7352696e6765727300000000000000000000000000000000000000008152508160029081620000f191906200048f565b5080600390816200010391906200048f565b50620001146200014260201b60201c565b60008190555050506200013c620001306200014760201b60201c565b6200014f60201b60201c565b62000576565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200029757607f821691505b602082108103620002ad57620002ac6200024f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002d8565b620003238683620002d8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003706200036a62000364846200033b565b62000345565b6200033b565b9050919050565b6000819050919050565b6200038c836200034f565b620003a46200039b8262000377565b848454620002e5565b825550505050565b600090565b620003bb620003ac565b620003c881848462000381565b505050565b5b81811015620003f057620003e4600082620003b1565b600181019050620003ce565b5050565b601f8211156200043f576200040981620002b3565b6200041484620002c8565b8101602085101562000424578190505b6200043c6200043385620002c8565b830182620003cd565b50505b505050565b600082821c905092915050565b6000620004646000198460080262000444565b1980831691505092915050565b60006200047f838362000451565b9150826002028217905092915050565b6200049a8262000215565b67ffffffffffffffff811115620004b657620004b562000220565b5b620004c282546200027e565b620004cf828285620003f4565b600060209050601f831160018114620005075760008415620004f2578287015190505b620004fe858262000471565b8655506200056e565b601f1984166200051786620002b3565b60005b8281101562000541578489015182556001820191506020850194506020810190506200051a565b868310156200056157848901516200055d601f89168262000451565b8355505b6001600288020188555050505b505050505050565b60805160a05160c051613660620005c26000396000818161110d01526113b6015260008181610f66015261108c015260008181610ab7015281816111ce015261129f01526136606000f3fe6080604052600436106101665760003560e01c80636e5cdc47116100d1578063b88d4fde1161008a578063e985e9c511610064578063e985e9c51461053e578063f151d7911461057b578063f2fde38b14610597578063f968adbe146105c057610166565b8063b88d4fde146104ad578063c87b56dd146104d6578063d5abeb011461051357610166565b80636e5cdc471461039d57806370a08231146103c85780637ec4a659146104055780638da5cb5b1461042e57806395d89b4114610459578063a22cb4651461048457610166565b8063389fcf0611610123578063389fcf061461028d5780633ccfd60b146102ca57806342842e0e146102e157806362b99ad41461030a5780636352211e146103355780636817c76c1461037257610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906125c5565b6105eb565b60405161019f919061260d565b60405180910390f35b3480156101b457600080fd5b506101bd6106cd565b6040516101ca91906126b8565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612710565b61075f565b604051610207919061277e565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906127c5565b6107db565b005b34801561024557600080fd5b5061024e6108e5565b60405161025b9190612814565b60405180910390f35b34801561027057600080fd5b5061028b6004803603810190610286919061282f565b6108fc565b005b34801561029957600080fd5b506102b460048036038101906102af9190612882565b61090c565b6040516102c1919061260d565b60405180910390f35b3480156102d657600080fd5b506102df61092c565b005b3480156102ed57600080fd5b506103086004803603810190610303919061282f565b6109f1565b005b34801561031657600080fd5b5061031f610a11565b60405161032c91906126b8565b60405180910390f35b34801561034157600080fd5b5061035c60048036038101906103579190612710565b610a9f565b604051610369919061277e565b60405180910390f35b34801561037e57600080fd5b50610387610ab5565b6040516103949190612814565b60405180910390f35b3480156103a957600080fd5b506103b2610ad9565b6040516103bf919061260d565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190612882565b610b2d565b6040516103fc9190612814565b60405180910390f35b34801561041157600080fd5b5061042c600480360381019061042791906129e4565b610bfc565b005b34801561043a57600080fd5b50610443610c17565b604051610450919061277e565b60405180910390f35b34801561046557600080fd5b5061046e610c41565b60405161047b91906126b8565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190612a59565b610cd3565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190612b3a565b610e4a565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190612710565b610ec6565b60405161050a91906126b8565b60405180910390f35b34801561051f57600080fd5b50610528610f64565b6040516105359190612bdc565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190612bf7565b610f88565b604051610572919061260d565b60405180910390f35b61059560048036038101906105909190612c63565b61101c565b005b3480156105a357600080fd5b506105be60048036038101906105b99190612882565b611331565b005b3480156105cc57600080fd5b506105d56113b4565b6040516105e29190612bdc565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106c657506106c5826113d8565b5b9050919050565b6060600280546106dc90612cbf565b80601f016020809104026020016040519081016040528092919081815260200182805461070890612cbf565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050905090565b600061076a82611442565b6107a0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e682610a9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361084d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086c611490565b73ffffffffffffffffffffffffffffffffffffffff161415801561089e575061089c81610897611490565b610f88565b155b156108d5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e0838383611498565b505050565b60006108ef61154a565b6001546000540303905090565b61090783838361154f565b505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610934611a3e565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff168360405161096490612d21565b60006040518083038185875af1925050503d80600081146109a1576040519150601f19603f3d011682016040523d82523d6000602084013e6109a6565b606091505b505080915050806109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390612d82565b60405180910390fd5b505050565b610a0c83838360405180602001604052806000815250610e4a565b505050565b60098054610a1e90612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4a90612cbf565b8015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b505050505081565b6000610aaa82611abc565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b94576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610c04611a3e565b8060099081610c139190612f4e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c5090612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7c90612cbf565b8015610cc95780601f10610c9e57610100808354040283529160200191610cc9565b820191906000526020600020905b815481529060010190602001808311610cac57829003601f168201915b5050505050905090565b610cdb611490565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610d4c611490565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610df9611490565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e3e919061260d565b60405180910390a35050565b610e5584848461154f565b610e748373ffffffffffffffffffffffffffffffffffffffff16611d4b565b8015610e895750610e8784848484611d6e565b155b15610ec0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610ed182611442565b610f07576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f11611ebe565b90506000815103610f315760405180602001604052806000815250610f5c565b80610f3b84611f50565b604051602001610f4c92919061305c565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461108a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611081906130cc565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff166110c06108e5565b6110ca919061311b565b111561110b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111029061319b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff16111561117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117190613207565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611245577f00000000000000000000000000000000000000000000000000000000000000008163ffffffff166111fe9190613227565b341015611240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611237906132b5565b60405180910390fd5b61131e565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f00000000000000000000000000000000000000000000000000000000000000006001826112cb91906132d5565b63ffffffff166112db9190613227565b34101561131d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611314906132b5565b60405180910390fd5b5b61132e338263ffffffff166120b0565b50565b611339611a3e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f9061337f565b60405180910390fd5b6113b1816120ce565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161144d61154a565b1115801561145c575060005482105b8015611489575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061155a82611abc565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611581611490565b73ffffffffffffffffffffffffffffffffffffffff1614806115b457506115b382600001516115ae611490565b610f88565b5b806115f957506115c2611490565b73ffffffffffffffffffffffffffffffffffffffff166115e18461075f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611632576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461169b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611701576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61170e8585856001612194565b61171e6000848460000151611498565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036119ce576000548110156119cd5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a37858585600161219a565b5050505050565b611a46611490565b73ffffffffffffffffffffffffffffffffffffffff16611a64610c17565b73ffffffffffffffffffffffffffffffffffffffff1614611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab1906133eb565b60405180910390fd5b565b611ac4612516565b600082905080611ad261154a565b11158015611ae1575060005481105b15611d14576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d1257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bf6578092505050611d46565b5b600115611d1157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d0c578092505050611d46565b611bf7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d94611490565b8786866040518563ffffffff1660e01b8152600401611db69493929190613460565b6020604051808303816000875af1925050508015611df257506040513d601f19601f82011682018060405250810190611def91906134c1565b60015b611e6b573d8060008114611e22576040519150601f19603f3d011682016040523d82523d6000602084013e611e27565b606091505b506000815103611e63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ecd90612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef990612cbf565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050905090565b606060008203611f97576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120ab565b600082905060005b60008214611fc9578080611fb2906134ee565b915050600a82611fc29190613565565b9150611f9f565b60008167ffffffffffffffff811115611fe557611fe46128b9565b5b6040519080825280601f01601f1916602001820160405280156120175781602001600182028036833780820191505090505b5090505b600085146120a4576001826120309190613596565b9150600a8561203f91906135ca565b603061204b919061311b565b60f81b818381518110612061576120606135fb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561209d9190613565565b945061201b565b8093505050505b919050565b6120ca8282604051806020016040528060008152506121a0565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121ad83838360016121b2565b505050565b600080549050600084036121f2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ff6000868387612194565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156123c957506123c88773ffffffffffffffffffffffffffffffffffffffff16611d4b565b5b1561248e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461243e6000888480600101955088611d6e565b612474576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036123cf57826000541461248957600080fd5b6124f9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361248f575b81600081905550505061250f600086838761219a565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125a28161256d565b81146125ad57600080fd5b50565b6000813590506125bf81612599565b92915050565b6000602082840312156125db576125da612563565b5b60006125e9848285016125b0565b91505092915050565b60008115159050919050565b612607816125f2565b82525050565b600060208201905061262260008301846125fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612662578082015181840152602081019050612647565b60008484015250505050565b6000601f19601f8301169050919050565b600061268a82612628565b6126948185612633565b93506126a4818560208601612644565b6126ad8161266e565b840191505092915050565b600060208201905081810360008301526126d2818461267f565b905092915050565b6000819050919050565b6126ed816126da565b81146126f857600080fd5b50565b60008135905061270a816126e4565b92915050565b60006020828403121561272657612725612563565b5b6000612734848285016126fb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127688261273d565b9050919050565b6127788161275d565b82525050565b6000602082019050612793600083018461276f565b92915050565b6127a28161275d565b81146127ad57600080fd5b50565b6000813590506127bf81612799565b92915050565b600080604083850312156127dc576127db612563565b5b60006127ea858286016127b0565b92505060206127fb858286016126fb565b9150509250929050565b61280e816126da565b82525050565b60006020820190506128296000830184612805565b92915050565b60008060006060848603121561284857612847612563565b5b6000612856868287016127b0565b9350506020612867868287016127b0565b9250506040612878868287016126fb565b9150509250925092565b60006020828403121561289857612897612563565b5b60006128a6848285016127b0565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128f18261266e565b810181811067ffffffffffffffff821117156129105761290f6128b9565b5b80604052505050565b6000612923612559565b905061292f82826128e8565b919050565b600067ffffffffffffffff82111561294f5761294e6128b9565b5b6129588261266e565b9050602081019050919050565b82818337600083830152505050565b600061298761298284612934565b612919565b9050828152602081018484840111156129a3576129a26128b4565b5b6129ae848285612965565b509392505050565b600082601f8301126129cb576129ca6128af565b5b81356129db848260208601612974565b91505092915050565b6000602082840312156129fa576129f9612563565b5b600082013567ffffffffffffffff811115612a1857612a17612568565b5b612a24848285016129b6565b91505092915050565b612a36816125f2565b8114612a4157600080fd5b50565b600081359050612a5381612a2d565b92915050565b60008060408385031215612a7057612a6f612563565b5b6000612a7e858286016127b0565b9250506020612a8f85828601612a44565b9150509250929050565b600067ffffffffffffffff821115612ab457612ab36128b9565b5b612abd8261266e565b9050602081019050919050565b6000612add612ad884612a99565b612919565b905082815260208101848484011115612af957612af86128b4565b5b612b04848285612965565b509392505050565b600082601f830112612b2157612b206128af565b5b8135612b31848260208601612aca565b91505092915050565b60008060008060808587031215612b5457612b53612563565b5b6000612b62878288016127b0565b9450506020612b73878288016127b0565b9350506040612b84878288016126fb565b925050606085013567ffffffffffffffff811115612ba557612ba4612568565b5b612bb187828801612b0c565b91505092959194509250565b600063ffffffff82169050919050565b612bd681612bbd565b82525050565b6000602082019050612bf16000830184612bcd565b92915050565b60008060408385031215612c0e57612c0d612563565b5b6000612c1c858286016127b0565b9250506020612c2d858286016127b0565b9150509250929050565b612c4081612bbd565b8114612c4b57600080fd5b50565b600081359050612c5d81612c37565b92915050565b600060208284031215612c7957612c78612563565b5b6000612c8784828501612c4e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd757607f821691505b602082108103612cea57612ce9612c90565b5b50919050565b600081905092915050565b50565b6000612d0b600083612cf0565b9150612d1682612cfb565b600082019050919050565b6000612d2c82612cfe565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000612d6c601883612633565b9150612d7782612d36565b602082019050919050565b60006020820190508181036000830152612d9b81612d5f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612e047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612dc7565b612e0e8683612dc7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612e4b612e46612e41846126da565b612e26565b6126da565b9050919050565b6000819050919050565b612e6583612e30565b612e79612e7182612e52565b848454612dd4565b825550505050565b600090565b612e8e612e81565b612e99818484612e5c565b505050565b5b81811015612ebd57612eb2600082612e86565b600181019050612e9f565b5050565b601f821115612f0257612ed381612da2565b612edc84612db7565b81016020851015612eeb578190505b612eff612ef785612db7565b830182612e9e565b50505b505050565b600082821c905092915050565b6000612f2560001984600802612f07565b1980831691505092915050565b6000612f3e8383612f14565b9150826002028217905092915050565b612f5782612628565b67ffffffffffffffff811115612f7057612f6f6128b9565b5b612f7a8254612cbf565b612f85828285612ec1565b600060209050601f831160018114612fb85760008415612fa6578287015190505b612fb08582612f32565b865550613018565b601f198416612fc686612da2565b60005b82811015612fee57848901518255600182019150602085019450602081019050612fc9565b8683101561300b5784890151613007601f891682612f14565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061303682612628565b6130408185613020565b9350613050818560208601612644565b80840191505092915050565b6000613068828561302b565b9150613074828461302b565b91508190509392505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006130b6601e83612633565b91506130c182613080565b602082019050919050565b600060208201905081810360008301526130e5816130a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613126826126da565b9150613131836126da565b9250828201905080821115613149576131486130ec565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b6000613185600883612633565b91506131908261314f565b602082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b7f657863656564206d617820616d6f756e74000000000000000000000000000000600082015250565b60006131f1601183612633565b91506131fc826131bb565b602082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b6000613232826126da565b915061323d836126da565b925082820261324b816126da565b91508282048414831517613262576132616130ec565b5b5092915050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b600061329f600c83612633565b91506132aa82613269565b602082019050919050565b600060208201905081810360008301526132ce81613292565b9050919050565b60006132e082612bbd565b91506132eb83612bbd565b9250828203905063ffffffff811115613307576133066130ec565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613369602683612633565b91506133748261330d565b604082019050919050565b600060208201905081810360008301526133988161335c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133d5602083612633565b91506133e08261339f565b602082019050919050565b60006020820190508181036000830152613404816133c8565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006134328261340b565b61343c8185613416565b935061344c818560208601612644565b6134558161266e565b840191505092915050565b6000608082019050613475600083018761276f565b613482602083018661276f565b61348f6040830185612805565b81810360608301526134a18184613427565b905095945050505050565b6000815190506134bb81612599565b92915050565b6000602082840312156134d7576134d6612563565b5b60006134e5848285016134ac565b91505092915050565b60006134f9826126da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361352b5761352a6130ec565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613570826126da565b915061357b836126da565b92508261358b5761358a613536565b5b828204905092915050565b60006135a1826126da565b91506135ac836126da565b92508282039050818111156135c4576135c36130ec565b5b92915050565b60006135d5826126da565b91506135e0836126da565b9250826135f0576135ef613536565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220f2362afb4410acb95d0f12eb34f90be280d515cc41d6c21ca4b2d5f088e1125f64736f6c63430008120033697066733a2f2f6261667962656967726b34617737746a6f6c64786432796464786935696265373632757a75636362737734626e67786633656f36787164646f6a6d2f

Deployed Bytecode

0x6080604052600436106101665760003560e01c80636e5cdc47116100d1578063b88d4fde1161008a578063e985e9c511610064578063e985e9c51461053e578063f151d7911461057b578063f2fde38b14610597578063f968adbe146105c057610166565b8063b88d4fde146104ad578063c87b56dd146104d6578063d5abeb011461051357610166565b80636e5cdc471461039d57806370a08231146103c85780637ec4a659146104055780638da5cb5b1461042e57806395d89b4114610459578063a22cb4651461048457610166565b8063389fcf0611610123578063389fcf061461028d5780633ccfd60b146102ca57806342842e0e146102e157806362b99ad41461030a5780636352211e146103355780636817c76c1461037257610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906125c5565b6105eb565b60405161019f919061260d565b60405180910390f35b3480156101b457600080fd5b506101bd6106cd565b6040516101ca91906126b8565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612710565b61075f565b604051610207919061277e565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906127c5565b6107db565b005b34801561024557600080fd5b5061024e6108e5565b60405161025b9190612814565b60405180910390f35b34801561027057600080fd5b5061028b6004803603810190610286919061282f565b6108fc565b005b34801561029957600080fd5b506102b460048036038101906102af9190612882565b61090c565b6040516102c1919061260d565b60405180910390f35b3480156102d657600080fd5b506102df61092c565b005b3480156102ed57600080fd5b506103086004803603810190610303919061282f565b6109f1565b005b34801561031657600080fd5b5061031f610a11565b60405161032c91906126b8565b60405180910390f35b34801561034157600080fd5b5061035c60048036038101906103579190612710565b610a9f565b604051610369919061277e565b60405180910390f35b34801561037e57600080fd5b50610387610ab5565b6040516103949190612814565b60405180910390f35b3480156103a957600080fd5b506103b2610ad9565b6040516103bf919061260d565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190612882565b610b2d565b6040516103fc9190612814565b60405180910390f35b34801561041157600080fd5b5061042c600480360381019061042791906129e4565b610bfc565b005b34801561043a57600080fd5b50610443610c17565b604051610450919061277e565b60405180910390f35b34801561046557600080fd5b5061046e610c41565b60405161047b91906126b8565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190612a59565b610cd3565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190612b3a565b610e4a565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190612710565b610ec6565b60405161050a91906126b8565b60405180910390f35b34801561051f57600080fd5b50610528610f64565b6040516105359190612bdc565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190612bf7565b610f88565b604051610572919061260d565b60405180910390f35b61059560048036038101906105909190612c63565b61101c565b005b3480156105a357600080fd5b506105be60048036038101906105b99190612882565b611331565b005b3480156105cc57600080fd5b506105d56113b4565b6040516105e29190612bdc565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106c657506106c5826113d8565b5b9050919050565b6060600280546106dc90612cbf565b80601f016020809104026020016040519081016040528092919081815260200182805461070890612cbf565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050905090565b600061076a82611442565b6107a0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e682610a9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361084d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086c611490565b73ffffffffffffffffffffffffffffffffffffffff161415801561089e575061089c81610897611490565b610f88565b155b156108d5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e0838383611498565b505050565b60006108ef61154a565b6001546000540303905090565b61090783838361154f565b505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610934611a3e565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff168360405161096490612d21565b60006040518083038185875af1925050503d80600081146109a1576040519150601f19603f3d011682016040523d82523d6000602084013e6109a6565b606091505b505080915050806109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390612d82565b60405180910390fd5b505050565b610a0c83838360405180602001604052806000815250610e4a565b505050565b60098054610a1e90612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4a90612cbf565b8015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b505050505081565b6000610aaa82611abc565b600001519050919050565b7f00000000000000000000000000000000000000000000000000038d7ea4c6800081565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b94576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610c04611a3e565b8060099081610c139190612f4e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c5090612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7c90612cbf565b8015610cc95780601f10610c9e57610100808354040283529160200191610cc9565b820191906000526020600020905b815481529060010190602001808311610cac57829003601f168201915b5050505050905090565b610cdb611490565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610d4c611490565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610df9611490565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e3e919061260d565b60405180910390a35050565b610e5584848461154f565b610e748373ffffffffffffffffffffffffffffffffffffffff16611d4b565b8015610e895750610e8784848484611d6e565b155b15610ec0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610ed182611442565b610f07576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f11611ebe565b90506000815103610f315760405180602001604052806000815250610f5c565b80610f3b84611f50565b604051602001610f4c92919061305c565b6040516020818303038152906040525b915050919050565b7f0000000000000000000000000000000000000000000000000000000000000bb881565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461108a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611081906130cc565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000bb863ffffffff168163ffffffff166110c06108e5565b6110ca919061311b565b111561110b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111029061319b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000001463ffffffff168163ffffffff16111561117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117190613207565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611245577f00000000000000000000000000000000000000000000000000038d7ea4c680008163ffffffff166111fe9190613227565b341015611240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611237906132b5565b60405180910390fd5b61131e565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f00000000000000000000000000000000000000000000000000038d7ea4c680006001826112cb91906132d5565b63ffffffff166112db9190613227565b34101561131d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611314906132b5565b60405180910390fd5b5b61132e338263ffffffff166120b0565b50565b611339611a3e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f9061337f565b60405180910390fd5b6113b1816120ce565b50565b7f000000000000000000000000000000000000000000000000000000000000001481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161144d61154a565b1115801561145c575060005482105b8015611489575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061155a82611abc565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611581611490565b73ffffffffffffffffffffffffffffffffffffffff1614806115b457506115b382600001516115ae611490565b610f88565b5b806115f957506115c2611490565b73ffffffffffffffffffffffffffffffffffffffff166115e18461075f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611632576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461169b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611701576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61170e8585856001612194565b61171e6000848460000151611498565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036119ce576000548110156119cd5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a37858585600161219a565b5050505050565b611a46611490565b73ffffffffffffffffffffffffffffffffffffffff16611a64610c17565b73ffffffffffffffffffffffffffffffffffffffff1614611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab1906133eb565b60405180910390fd5b565b611ac4612516565b600082905080611ad261154a565b11158015611ae1575060005481105b15611d14576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d1257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bf6578092505050611d46565b5b600115611d1157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d0c578092505050611d46565b611bf7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d94611490565b8786866040518563ffffffff1660e01b8152600401611db69493929190613460565b6020604051808303816000875af1925050508015611df257506040513d601f19601f82011682018060405250810190611def91906134c1565b60015b611e6b573d8060008114611e22576040519150601f19603f3d011682016040523d82523d6000602084013e611e27565b606091505b506000815103611e63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ecd90612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef990612cbf565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050905090565b606060008203611f97576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120ab565b600082905060005b60008214611fc9578080611fb2906134ee565b915050600a82611fc29190613565565b9150611f9f565b60008167ffffffffffffffff811115611fe557611fe46128b9565b5b6040519080825280601f01601f1916602001820160405280156120175781602001600182028036833780820191505090505b5090505b600085146120a4576001826120309190613596565b9150600a8561203f91906135ca565b603061204b919061311b565b60f81b818381518110612061576120606135fb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561209d9190613565565b945061201b565b8093505050505b919050565b6120ca8282604051806020016040528060008152506121a0565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121ad83838360016121b2565b505050565b600080549050600084036121f2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ff6000868387612194565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156123c957506123c88773ffffffffffffffffffffffffffffffffffffffff16611d4b565b5b1561248e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461243e6000888480600101955088611d6e565b612474576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036123cf57826000541461248957600080fd5b6124f9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361248f575b81600081905550505061250f600086838761219a565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125a28161256d565b81146125ad57600080fd5b50565b6000813590506125bf81612599565b92915050565b6000602082840312156125db576125da612563565b5b60006125e9848285016125b0565b91505092915050565b60008115159050919050565b612607816125f2565b82525050565b600060208201905061262260008301846125fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612662578082015181840152602081019050612647565b60008484015250505050565b6000601f19601f8301169050919050565b600061268a82612628565b6126948185612633565b93506126a4818560208601612644565b6126ad8161266e565b840191505092915050565b600060208201905081810360008301526126d2818461267f565b905092915050565b6000819050919050565b6126ed816126da565b81146126f857600080fd5b50565b60008135905061270a816126e4565b92915050565b60006020828403121561272657612725612563565b5b6000612734848285016126fb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127688261273d565b9050919050565b6127788161275d565b82525050565b6000602082019050612793600083018461276f565b92915050565b6127a28161275d565b81146127ad57600080fd5b50565b6000813590506127bf81612799565b92915050565b600080604083850312156127dc576127db612563565b5b60006127ea858286016127b0565b92505060206127fb858286016126fb565b9150509250929050565b61280e816126da565b82525050565b60006020820190506128296000830184612805565b92915050565b60008060006060848603121561284857612847612563565b5b6000612856868287016127b0565b9350506020612867868287016127b0565b9250506040612878868287016126fb565b9150509250925092565b60006020828403121561289857612897612563565b5b60006128a6848285016127b0565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128f18261266e565b810181811067ffffffffffffffff821117156129105761290f6128b9565b5b80604052505050565b6000612923612559565b905061292f82826128e8565b919050565b600067ffffffffffffffff82111561294f5761294e6128b9565b5b6129588261266e565b9050602081019050919050565b82818337600083830152505050565b600061298761298284612934565b612919565b9050828152602081018484840111156129a3576129a26128b4565b5b6129ae848285612965565b509392505050565b600082601f8301126129cb576129ca6128af565b5b81356129db848260208601612974565b91505092915050565b6000602082840312156129fa576129f9612563565b5b600082013567ffffffffffffffff811115612a1857612a17612568565b5b612a24848285016129b6565b91505092915050565b612a36816125f2565b8114612a4157600080fd5b50565b600081359050612a5381612a2d565b92915050565b60008060408385031215612a7057612a6f612563565b5b6000612a7e858286016127b0565b9250506020612a8f85828601612a44565b9150509250929050565b600067ffffffffffffffff821115612ab457612ab36128b9565b5b612abd8261266e565b9050602081019050919050565b6000612add612ad884612a99565b612919565b905082815260208101848484011115612af957612af86128b4565b5b612b04848285612965565b509392505050565b600082601f830112612b2157612b206128af565b5b8135612b31848260208601612aca565b91505092915050565b60008060008060808587031215612b5457612b53612563565b5b6000612b62878288016127b0565b9450506020612b73878288016127b0565b9350506040612b84878288016126fb565b925050606085013567ffffffffffffffff811115612ba557612ba4612568565b5b612bb187828801612b0c565b91505092959194509250565b600063ffffffff82169050919050565b612bd681612bbd565b82525050565b6000602082019050612bf16000830184612bcd565b92915050565b60008060408385031215612c0e57612c0d612563565b5b6000612c1c858286016127b0565b9250506020612c2d858286016127b0565b9150509250929050565b612c4081612bbd565b8114612c4b57600080fd5b50565b600081359050612c5d81612c37565b92915050565b600060208284031215612c7957612c78612563565b5b6000612c8784828501612c4e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd757607f821691505b602082108103612cea57612ce9612c90565b5b50919050565b600081905092915050565b50565b6000612d0b600083612cf0565b9150612d1682612cfb565b600082019050919050565b6000612d2c82612cfe565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000612d6c601883612633565b9150612d7782612d36565b602082019050919050565b60006020820190508181036000830152612d9b81612d5f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612e047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612dc7565b612e0e8683612dc7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612e4b612e46612e41846126da565b612e26565b6126da565b9050919050565b6000819050919050565b612e6583612e30565b612e79612e7182612e52565b848454612dd4565b825550505050565b600090565b612e8e612e81565b612e99818484612e5c565b505050565b5b81811015612ebd57612eb2600082612e86565b600181019050612e9f565b5050565b601f821115612f0257612ed381612da2565b612edc84612db7565b81016020851015612eeb578190505b612eff612ef785612db7565b830182612e9e565b50505b505050565b600082821c905092915050565b6000612f2560001984600802612f07565b1980831691505092915050565b6000612f3e8383612f14565b9150826002028217905092915050565b612f5782612628565b67ffffffffffffffff811115612f7057612f6f6128b9565b5b612f7a8254612cbf565b612f85828285612ec1565b600060209050601f831160018114612fb85760008415612fa6578287015190505b612fb08582612f32565b865550613018565b601f198416612fc686612da2565b60005b82811015612fee57848901518255600182019150602085019450602081019050612fc9565b8683101561300b5784890151613007601f891682612f14565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061303682612628565b6130408185613020565b9350613050818560208601612644565b80840191505092915050565b6000613068828561302b565b9150613074828461302b565b91508190509392505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006130b6601e83612633565b91506130c182613080565b602082019050919050565b600060208201905081810360008301526130e5816130a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613126826126da565b9150613131836126da565b9250828201905080821115613149576131486130ec565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b6000613185600883612633565b91506131908261314f565b602082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b7f657863656564206d617820616d6f756e74000000000000000000000000000000600082015250565b60006131f1601183612633565b91506131fc826131bb565b602082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b6000613232826126da565b915061323d836126da565b925082820261324b816126da565b91508282048414831517613262576132616130ec565b5b5092915050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b600061329f600c83612633565b91506132aa82613269565b602082019050919050565b600060208201905081810360008301526132ce81613292565b9050919050565b60006132e082612bbd565b91506132eb83612bbd565b9250828203905063ffffffff811115613307576133066130ec565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613369602683612633565b91506133748261330d565b604082019050919050565b600060208201905081810360008301526133988161335c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133d5602083612633565b91506133e08261339f565b602082019050919050565b60006020820190508181036000830152613404816133c8565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006134328261340b565b61343c8185613416565b935061344c818560208601612644565b6134558161266e565b840191505092915050565b6000608082019050613475600083018761276f565b613482602083018661276f565b61348f6040830185612805565b81810360608301526134a18184613427565b905095945050505050565b6000815190506134bb81612599565b92915050565b6000602082840312156134d7576134d6612563565b5b60006134e5848285016134ac565b91505092915050565b60006134f9826126da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361352b5761352a6130ec565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613570826126da565b915061357b836126da565b92508261358b5761358a613536565b5b828204905092915050565b60006135a1826126da565b91506135ac836126da565b92508282039050818111156135c4576135c36130ec565b5b92915050565b60006135d5826126da565b91506135e0836126da565b9250826135f0576135ef613536565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220f2362afb4410acb95d0f12eb34f90be280d515cc41d6c21ca4b2d5f088e1125f64736f6c63430008120033

Deployed Bytecode Sourcemap

46111:1816:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28615:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32000:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33503:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33066:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27864:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34360:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46417:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47646:278;;;;;;;;;;;;;:::i;:::-;;34601:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46314:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31809:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46166:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47539:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28984:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46792:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4802:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32169:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33779:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34857:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32344:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46221:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34129:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47014:517;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5254:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46268:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28615:305;28717:4;28769:25;28754:40;;;:11;:40;;;;:105;;;;28826:33;28811:48;;;:11;:48;;;;28754:105;:158;;;;28876:36;28900:11;28876:23;:36::i;:::-;28754:158;28734:178;;28615:305;;;:::o;32000:100::-;32054:13;32087:5;32080:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32000:100;:::o;33503:204::-;33571:7;33596:16;33604:7;33596;:16::i;:::-;33591:64;;33621:34;;;;;;;;;;;;;;33591:64;33675:15;:24;33691:7;33675:24;;;;;;;;;;;;;;;;;;;;;33668:31;;33503:204;;;:::o;33066:371::-;33139:13;33155:24;33171:7;33155:15;:24::i;:::-;33139:40;;33200:5;33194:11;;:2;:11;;;33190:48;;33214:24;;;;;;;;;;;;;;33190:48;33271:5;33255:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33281:37;33298:5;33305:12;:10;:12::i;:::-;33281:16;:37::i;:::-;33280:38;33255:63;33251:138;;;33342:35;;;;;;;;;;;;;;33251:138;33401:28;33410:2;33414:7;33423:5;33401:8;:28::i;:::-;33128:309;33066:371;;:::o;27864:303::-;27908:7;28133:15;:13;:15::i;:::-;28118:12;;28102:13;;:28;:46;28095:53;;27864:303;:::o;34360:170::-;34494:28;34504:4;34510:2;34514:7;34494:9;:28::i;:::-;34360:170;;;:::o;46417:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;47646:278::-;4688:13;:11;:13::i;:::-;47694:18:::1;47715:21;47694:42;;47749:9;47769:10;47749:31;;47793:12;47832:1;:6;;47846:10;47832:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47818:43;;;;;47880:7;47872:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;47683:241;;;47646:278::o:0;34601:185::-;34739:39;34756:4;34762:2;34766:7;34739:39;;;;;;;;;;;;:16;:39::i;:::-;34601:185;;;:::o;46314:96::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31809:124::-;31873:7;31900:20;31912:7;31900:11;:20::i;:::-;:25;;;31893:32;;31809:124;;;:::o;46166:48::-;;;:::o;47539:99::-;47585:4;47608:10;:22;47619:10;47608:22;;;;;;;;;;;;;;;;;;;;;;;;;47601:29;;47539:99;:::o;28984:206::-;29048:7;29089:1;29072:19;;:5;:19;;;29068:60;;29100:28;;;;;;;;;;;;;;29068:60;29154:12;:19;29167:5;29154:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29146:36;;29139:43;;28984:206;;;:::o;46792:92::-;4688:13;:11;:13::i;:::-;46873:3:::1;46861:9;:15;;;;;;:::i;:::-;;46792:92:::0;:::o;4802:87::-;4848:7;4875:6;;;;;;;;;;;4868:13;;4802:87;:::o;32169:104::-;32225:13;32258:7;32251:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32169:104;:::o;33779:279::-;33882:12;:10;:12::i;:::-;33870:24;;:8;:24;;;33866:54;;33903:17;;;;;;;;;;;;;;33866:54;33978:8;33933:18;:32;33952:12;:10;:12::i;:::-;33933:32;;;;;;;;;;;;;;;:42;33966:8;33933:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34031:8;34002:48;;34017:12;:10;:12::i;:::-;34002:48;;;34041:8;34002:48;;;;;;:::i;:::-;;;;;;;;33779:279;;:::o;34857:369::-;35024:28;35034:4;35040:2;35044:7;35024:9;:28::i;:::-;35067:15;:2;:13;;;:15::i;:::-;:76;;;;;35087:56;35118:4;35124:2;35128:7;35137:5;35087:30;:56::i;:::-;35086:57;35067:76;35063:156;;;35167:40;;;;;;;;;;;;;;35063:156;34857:369;;;;:::o;32344:318::-;32417:13;32448:16;32456:7;32448;:16::i;:::-;32443:59;;32473:29;;;;;;;;;;;;;;32443:59;32515:21;32539:10;:8;:10::i;:::-;32515:34;;32592:1;32573:7;32567:21;:26;:87;;;;;;;;;;;;;;;;;32620:7;32629:18;:7;:16;:18::i;:::-;32603:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32567:87;32560:94;;;32344:318;;;:::o;46221:40::-;;;:::o;34129:164::-;34226:4;34250:18;:25;34269:5;34250:25;;;;;;;;;;;;;;;:35;34276:8;34250:35;;;;;;;;;;;;;;;;;;;;;;;;;34243:42;;34129:164;;;;:::o;47014:517::-;46524:10;46511:23;;:9;:23;;;46503:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47121:9:::1;47095:35;;47111:6;47095:22;;:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;47087:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47171:8;47161:18;;:6;:18;;;;47153:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;47214:10;:22;47225:10;47214:22;;;;;;;;;;;;;;;;;;;;;;;;;47211:273;;;47292:9;47283:6;:18;;;;;;:::i;:::-;47270:9;:31;;47262:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47211:273;;;47394:4;47369:10;:22;47380:10;47369:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47447:9;47442:1;47435:6;:8;;;;:::i;:::-;47434:22;;;;;;:::i;:::-;47421:9;:35;;47413:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;47211:273;47494:29;47504:10;47516:6;47494:29;;:9;:29::i;:::-;47014:517:::0;:::o;5254:201::-;4688:13;:11;:13::i;:::-;5363:1:::1;5343:22;;:8;:22;;::::0;5335:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5419:28;5438:8;5419:18;:28::i;:::-;5254:201:::0;:::o;46268:37::-;;;:::o;17202:157::-;17287:4;17326:25;17311:40;;;:11;:40;;;;17304:47;;17202:157;;;:::o;35481:187::-;35538:4;35581:7;35562:15;:13;:15::i;:::-;:26;;:53;;;;;35602:13;;35592:7;:23;35562:53;:98;;;;;35633:11;:20;35645:7;35633:20;;;;;;;;;;;:27;;;;;;;;;;;;35632:28;35562:98;35555:105;;35481:187;;;:::o;3353:98::-;3406:7;3433:10;3426:17;;3353:98;:::o;43095:196::-;43237:2;43210:15;:24;43226:7;43210:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43275:7;43271:2;43255:28;;43264:5;43255:28;;;;;;;;;;;;43095:196;;;:::o;46892:110::-;46966:7;46892:110;:::o;38597:2112::-;38712:35;38750:20;38762:7;38750:11;:20::i;:::-;38712:58;;38783:22;38825:13;:18;;;38809:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;38860:50;38877:13;:18;;;38897:12;:10;:12::i;:::-;38860:16;:50::i;:::-;38809:101;:154;;;;38951:12;:10;:12::i;:::-;38927:36;;:20;38939:7;38927:11;:20::i;:::-;:36;;;38809:154;38783:181;;38982:17;38977:66;;39008:35;;;;;;;;;;;;;;38977:66;39080:4;39058:26;;:13;:18;;;:26;;;39054:67;;39093:28;;;;;;;;;;;;;;39054:67;39150:1;39136:16;;:2;:16;;;39132:52;;39161:23;;;;;;;;;;;;;;39132:52;39197:43;39219:4;39225:2;39229:7;39238:1;39197:21;:43::i;:::-;39305:49;39322:1;39326:7;39335:13;:18;;;39305:8;:49::i;:::-;39680:1;39650:12;:18;39663:4;39650:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39724:1;39696:12;:16;39709:2;39696:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39770:2;39742:11;:20;39754:7;39742:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;39832:15;39787:11;:20;39799:7;39787:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;40100:19;40132:1;40122:7;:11;40100:33;;40193:1;40152:43;;:11;:24;40164:11;40152:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40148:445;;40377:13;;40363:11;:27;40359:219;;;40447:13;:18;;;40415:11;:24;40427:11;40415:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40530:13;:28;;;40488:11;:24;40500:11;40488:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40359:219;40148:445;39625:979;40640:7;40636:2;40621:27;;40630:4;40621:27;;;;;;;;;;;;40659:42;40680:4;40686:2;40690:7;40699:1;40659:20;:42::i;:::-;38701:2008;;38597:2112;;;:::o;4967:132::-;5042:12;:10;:12::i;:::-;5031:23;;:7;:5;:7::i;:::-;:23;;;5023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4967:132::o;30639:1108::-;30700:21;;:::i;:::-;30734:12;30749:7;30734:22;;30817:4;30798:15;:13;:15::i;:::-;:23;;:47;;;;;30832:13;;30825:4;:20;30798:47;30794:886;;;30866:31;30900:11;:17;30912:4;30900:17;;;;;;;;;;;30866:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30941:9;:16;;;30936:729;;31012:1;30986:28;;:9;:14;;;:28;;;30982:101;;31050:9;31043:16;;;;;;30982:101;31385:261;31392:4;31385:261;;;31425:6;;;;;;;;31470:11;:17;31482:4;31470:17;;;;;;;;;;;31458:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31544:1;31518:28;;:9;:14;;;:28;;;31514:109;;31586:9;31579:16;;;;;;31514:109;31385:261;;;30936:729;30847:833;30794:886;31708:31;;;;;;;;;;;;;;30639:1108;;;;:::o;7046:326::-;7106:4;7363:1;7341:7;:19;;;:23;7334:30;;7046:326;;;:::o;43783:667::-;43946:4;43983:2;43967:36;;;44004:12;:10;:12::i;:::-;44018:4;44024:7;44033:5;43967:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43963:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44218:1;44201:6;:13;:18;44197:235;;44247:40;;;;;;;;;;;;;;44197:235;44390:6;44384:13;44375:6;44371:2;44367:15;44360:38;43963:480;44096:45;;;44086:55;;;:6;:55;;;;44079:62;;;43783:667;;;;;;:::o;46673:111::-;46734:13;46767:9;46760:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46673:111;:::o;607:723::-;663:13;893:1;884:5;:10;880:53;;911:10;;;;;;;;;;;;;;;;;;;;;880:53;943:12;958:5;943:20;;974:14;999:78;1014:1;1006:4;:9;999:78;;1032:8;;;;;:::i;:::-;;;;1063:2;1055:10;;;;;:::i;:::-;;;999:78;;;1087:19;1119:6;1109:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1087:39;;1137:154;1153:1;1144:5;:10;1137:154;;1181:1;1171:11;;;;;:::i;:::-;;;1248:2;1240:5;:10;;;;:::i;:::-;1227:2;:24;;;;:::i;:::-;1214:39;;1197:6;1204;1197:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1277:2;1268:11;;;;;:::i;:::-;;;1137:154;;;1315:6;1301:21;;;;;607:723;;;;:::o;35676:104::-;35745:27;35755:2;35759:8;35745:27;;;;;;;;;;;;:9;:27::i;:::-;35676:104;;:::o;5615:191::-;5689:16;5708:6;;;;;;;;;;;5689:25;;5734:8;5725:6;;:17;;;;;;;;;;;;;;;;;;5789:8;5758:40;;5779:8;5758:40;;;;;;;;;;;;5678:128;5615:191;:::o;45098:159::-;;;;;:::o;45916:158::-;;;;;:::o;36143:163::-;36266:32;36272:2;36276:8;36286:5;36293:4;36266:5;:32::i;:::-;36143:163;;;:::o;36565:1778::-;36704:20;36727:13;;36704:36;;36829:1;36817:8;:13;36813:44;;36839:18;;;;;;;;;;;;;;36813:44;36870:61;36900:1;36904:2;36908:12;36922:8;36870:21;:61::i;:::-;37243:8;37208:12;:16;37221:2;37208:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37307:8;37267:12;:16;37280:2;37267:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37366:2;37333:11;:25;37345:12;37333:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37433:15;37383:11;:25;37395:12;37383:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37466:20;37489:12;37466:35;;37516:11;37545:8;37530:12;:23;37516:37;;37574:4;:23;;;;;37582:15;:2;:13;;;:15::i;:::-;37574:23;37570:641;;;37618:314;37674:12;37670:2;37649:38;;37666:1;37649:38;;;;;;;;;;;;37715:69;37754:1;37758:2;37762:14;;;;;;37778:5;37715:30;:69::i;:::-;37710:174;;37820:40;;;;;;;;;;;;;;37710:174;37927:3;37911:12;:19;37618:314;;38013:12;37996:13;;:29;37992:43;;38027:8;;;37992:43;37570:641;;;38076:120;38132:14;;;;;;38128:2;38107:40;;38124:1;38107:40;;;;;;;;;;;;38191:3;38175:12;:19;38076:120;;37570:641;38241:12;38225:13;:28;;;;37183:1082;;38275:60;38304:1;38308:2;38312:12;38326:8;38275:20;:60::i;:::-;36693:1650;36565:1778;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:93::-;11647:7;11687:10;11680:5;11676:22;11665:33;;11611:93;;;:::o;11710:115::-;11795:23;11812:5;11795:23;:::i;:::-;11790:3;11783:36;11710:115;;:::o;11831:218::-;11922:4;11960:2;11949:9;11945:18;11937:26;;11973:69;12039:1;12028:9;12024:17;12015:6;11973:69;:::i;:::-;11831:218;;;;:::o;12055:474::-;12123:6;12131;12180:2;12168:9;12159:7;12155:23;12151:32;12148:119;;;12186:79;;:::i;:::-;12148:119;12306:1;12331:53;12376:7;12367:6;12356:9;12352:22;12331:53;:::i;:::-;12321:63;;12277:117;12433:2;12459:53;12504:7;12495:6;12484:9;12480:22;12459:53;:::i;:::-;12449:63;;12404:118;12055:474;;;;;:::o;12535:120::-;12607:23;12624:5;12607:23;:::i;:::-;12600:5;12597:34;12587:62;;12645:1;12642;12635:12;12587:62;12535:120;:::o;12661:137::-;12706:5;12744:6;12731:20;12722:29;;12760:32;12786:5;12760:32;:::i;:::-;12661:137;;;;:::o;12804:327::-;12862:6;12911:2;12899:9;12890:7;12886:23;12882:32;12879:119;;;12917:79;;:::i;:::-;12879:119;13037:1;13062:52;13106:7;13097:6;13086:9;13082:22;13062:52;:::i;:::-;13052:62;;13008:116;12804:327;;;;:::o;13137:180::-;13185:77;13182:1;13175:88;13282:4;13279:1;13272:15;13306:4;13303:1;13296:15;13323:320;13367:6;13404:1;13398:4;13394:12;13384:22;;13451:1;13445:4;13441:12;13472:18;13462:81;;13528:4;13520:6;13516:17;13506:27;;13462:81;13590:2;13582:6;13579:14;13559:18;13556:38;13553:84;;13609:18;;:::i;:::-;13553:84;13374:269;13323:320;;;:::o;13649:147::-;13750:11;13787:3;13772:18;;13649:147;;;;:::o;13802:114::-;;:::o;13922:398::-;14081:3;14102:83;14183:1;14178:3;14102:83;:::i;:::-;14095:90;;14194:93;14283:3;14194:93;:::i;:::-;14312:1;14307:3;14303:11;14296:18;;13922:398;;;:::o;14326:379::-;14510:3;14532:147;14675:3;14532:147;:::i;:::-;14525:154;;14696:3;14689:10;;14326:379;;;:::o;14711:174::-;14851:26;14847:1;14839:6;14835:14;14828:50;14711:174;:::o;14891:366::-;15033:3;15054:67;15118:2;15113:3;15054:67;:::i;:::-;15047:74;;15130:93;15219:3;15130:93;:::i;:::-;15248:2;15243:3;15239:12;15232:19;;14891:366;;;:::o;15263:419::-;15429:4;15467:2;15456:9;15452:18;15444:26;;15516:9;15510:4;15506:20;15502:1;15491:9;15487:17;15480:47;15544:131;15670:4;15544:131;:::i;:::-;15536:139;;15263:419;;;:::o;15688:141::-;15737:4;15760:3;15752:11;;15783:3;15780:1;15773:14;15817:4;15814:1;15804:18;15796:26;;15688:141;;;:::o;15835:93::-;15872:6;15919:2;15914;15907:5;15903:14;15899:23;15889:33;;15835:93;;;:::o;15934:107::-;15978:8;16028:5;16022:4;16018:16;15997:37;;15934:107;;;;:::o;16047:393::-;16116:6;16166:1;16154:10;16150:18;16189:97;16219:66;16208:9;16189:97;:::i;:::-;16307:39;16337:8;16326:9;16307:39;:::i;:::-;16295:51;;16379:4;16375:9;16368:5;16364:21;16355:30;;16428:4;16418:8;16414:19;16407:5;16404:30;16394:40;;16123:317;;16047:393;;;;;:::o;16446:60::-;16474:3;16495:5;16488:12;;16446:60;;;:::o;16512:142::-;16562:9;16595:53;16613:34;16622:24;16640:5;16622:24;:::i;:::-;16613:34;:::i;:::-;16595:53;:::i;:::-;16582:66;;16512:142;;;:::o;16660:75::-;16703:3;16724:5;16717:12;;16660:75;;;:::o;16741:269::-;16851:39;16882:7;16851:39;:::i;:::-;16912:91;16961:41;16985:16;16961:41;:::i;:::-;16953:6;16946:4;16940:11;16912:91;:::i;:::-;16906:4;16899:105;16817:193;16741:269;;;:::o;17016:73::-;17061:3;17016:73;:::o;17095:189::-;17172:32;;:::i;:::-;17213:65;17271:6;17263;17257:4;17213:65;:::i;:::-;17148:136;17095:189;;:::o;17290:186::-;17350:120;17367:3;17360:5;17357:14;17350:120;;;17421:39;17458:1;17451:5;17421:39;:::i;:::-;17394:1;17387:5;17383:13;17374:22;;17350:120;;;17290:186;;:::o;17482:543::-;17583:2;17578:3;17575:11;17572:446;;;17617:38;17649:5;17617:38;:::i;:::-;17701:29;17719:10;17701:29;:::i;:::-;17691:8;17687:44;17884:2;17872:10;17869:18;17866:49;;;17905:8;17890:23;;17866:49;17928:80;17984:22;18002:3;17984:22;:::i;:::-;17974:8;17970:37;17957:11;17928:80;:::i;:::-;17587:431;;17572:446;17482:543;;;:::o;18031:117::-;18085:8;18135:5;18129:4;18125:16;18104:37;;18031:117;;;;:::o;18154:169::-;18198:6;18231:51;18279:1;18275:6;18267:5;18264:1;18260:13;18231:51;:::i;:::-;18227:56;18312:4;18306;18302:15;18292:25;;18205:118;18154:169;;;;:::o;18328:295::-;18404:4;18550:29;18575:3;18569:4;18550:29;:::i;:::-;18542:37;;18612:3;18609:1;18605:11;18599:4;18596:21;18588:29;;18328:295;;;;:::o;18628:1395::-;18745:37;18778:3;18745:37;:::i;:::-;18847:18;18839:6;18836:30;18833:56;;;18869:18;;:::i;:::-;18833:56;18913:38;18945:4;18939:11;18913:38;:::i;:::-;18998:67;19058:6;19050;19044:4;18998:67;:::i;:::-;19092:1;19116:4;19103:17;;19148:2;19140:6;19137:14;19165:1;19160:618;;;;19822:1;19839:6;19836:77;;;19888:9;19883:3;19879:19;19873:26;19864:35;;19836:77;19939:67;19999:6;19992:5;19939:67;:::i;:::-;19933:4;19926:81;19795:222;19130:887;;19160:618;19212:4;19208:9;19200:6;19196:22;19246:37;19278:4;19246:37;:::i;:::-;19305:1;19319:208;19333:7;19330:1;19327:14;19319:208;;;19412:9;19407:3;19403:19;19397:26;19389:6;19382:42;19463:1;19455:6;19451:14;19441:24;;19510:2;19499:9;19495:18;19482:31;;19356:4;19353:1;19349:12;19344:17;;19319:208;;;19555:6;19546:7;19543:19;19540:179;;;19613:9;19608:3;19604:19;19598:26;19656:48;19698:4;19690:6;19686:17;19675:9;19656:48;:::i;:::-;19648:6;19641:64;19563:156;19540:179;19765:1;19761;19753:6;19749:14;19745:22;19739:4;19732:36;19167:611;;;19130:887;;18720:1303;;;18628:1395;;:::o;20029:148::-;20131:11;20168:3;20153:18;;20029:148;;;;:::o;20183:390::-;20289:3;20317:39;20350:5;20317:39;:::i;:::-;20372:89;20454:6;20449:3;20372:89;:::i;:::-;20365:96;;20470:65;20528:6;20523:3;20516:4;20509:5;20505:16;20470:65;:::i;:::-;20560:6;20555:3;20551:16;20544:23;;20293:280;20183:390;;;;:::o;20579:435::-;20759:3;20781:95;20872:3;20863:6;20781:95;:::i;:::-;20774:102;;20893:95;20984:3;20975:6;20893:95;:::i;:::-;20886:102;;21005:3;20998:10;;20579:435;;;;;:::o;21020:180::-;21160:32;21156:1;21148:6;21144:14;21137:56;21020:180;:::o;21206:366::-;21348:3;21369:67;21433:2;21428:3;21369:67;:::i;:::-;21362:74;;21445:93;21534:3;21445:93;:::i;:::-;21563:2;21558:3;21554:12;21547:19;;21206:366;;;:::o;21578:419::-;21744:4;21782:2;21771:9;21767:18;21759:26;;21831:9;21825:4;21821:20;21817:1;21806:9;21802:17;21795:47;21859:131;21985:4;21859:131;:::i;:::-;21851:139;;21578:419;;;:::o;22003:180::-;22051:77;22048:1;22041:88;22148:4;22145:1;22138:15;22172:4;22169:1;22162:15;22189:191;22229:3;22248:20;22266:1;22248:20;:::i;:::-;22243:25;;22282:20;22300:1;22282:20;:::i;:::-;22277:25;;22325:1;22322;22318:9;22311:16;;22346:3;22343:1;22340:10;22337:36;;;22353:18;;:::i;:::-;22337:36;22189:191;;;;:::o;22386:158::-;22526:10;22522:1;22514:6;22510:14;22503:34;22386:158;:::o;22550:365::-;22692:3;22713:66;22777:1;22772:3;22713:66;:::i;:::-;22706:73;;22788:93;22877:3;22788:93;:::i;:::-;22906:2;22901:3;22897:12;22890:19;;22550:365;;;:::o;22921:419::-;23087:4;23125:2;23114:9;23110:18;23102:26;;23174:9;23168:4;23164:20;23160:1;23149:9;23145:17;23138:47;23202:131;23328:4;23202:131;:::i;:::-;23194:139;;22921:419;;;:::o;23346:167::-;23486:19;23482:1;23474:6;23470:14;23463:43;23346:167;:::o;23519:366::-;23661:3;23682:67;23746:2;23741:3;23682:67;:::i;:::-;23675:74;;23758:93;23847:3;23758:93;:::i;:::-;23876:2;23871:3;23867:12;23860:19;;23519:366;;;:::o;23891:419::-;24057:4;24095:2;24084:9;24080:18;24072:26;;24144:9;24138:4;24134:20;24130:1;24119:9;24115:17;24108:47;24172:131;24298:4;24172:131;:::i;:::-;24164:139;;23891:419;;;:::o;24316:410::-;24356:7;24379:20;24397:1;24379:20;:::i;:::-;24374:25;;24413:20;24431:1;24413:20;:::i;:::-;24408:25;;24468:1;24465;24461:9;24490:30;24508:11;24490:30;:::i;:::-;24479:41;;24669:1;24660:7;24656:15;24653:1;24650:22;24630:1;24623:9;24603:83;24580:139;;24699:18;;:::i;:::-;24580:139;24364:362;24316:410;;;;:::o;24732:162::-;24872:14;24868:1;24860:6;24856:14;24849:38;24732:162;:::o;24900:366::-;25042:3;25063:67;25127:2;25122:3;25063:67;:::i;:::-;25056:74;;25139:93;25228:3;25139:93;:::i;:::-;25257:2;25252:3;25248:12;25241:19;;24900:366;;;:::o;25272:419::-;25438:4;25476:2;25465:9;25461:18;25453:26;;25525:9;25519:4;25515:20;25511:1;25500:9;25496:17;25489:47;25553:131;25679:4;25553:131;:::i;:::-;25545:139;;25272:419;;;:::o;25697:200::-;25736:4;25756:19;25773:1;25756:19;:::i;:::-;25751:24;;25789:19;25806:1;25789:19;:::i;:::-;25784:24;;25832:1;25829;25825:9;25817:17;;25856:10;25850:4;25847:20;25844:46;;;25870:18;;:::i;:::-;25844:46;25697:200;;;;:::o;25903:225::-;26043:34;26039:1;26031:6;26027:14;26020:58;26112:8;26107:2;26099:6;26095:15;26088:33;25903:225;:::o;26134:366::-;26276:3;26297:67;26361:2;26356:3;26297:67;:::i;:::-;26290:74;;26373:93;26462:3;26373:93;:::i;:::-;26491:2;26486:3;26482:12;26475:19;;26134:366;;;:::o;26506:419::-;26672:4;26710:2;26699:9;26695:18;26687:26;;26759:9;26753:4;26749:20;26745:1;26734:9;26730:17;26723:47;26787:131;26913:4;26787:131;:::i;:::-;26779:139;;26506:419;;;:::o;26931:182::-;27071:34;27067:1;27059:6;27055:14;27048:58;26931:182;:::o;27119:366::-;27261:3;27282:67;27346:2;27341:3;27282:67;:::i;:::-;27275:74;;27358:93;27447:3;27358:93;:::i;:::-;27476:2;27471:3;27467:12;27460:19;;27119:366;;;:::o;27491:419::-;27657:4;27695:2;27684:9;27680:18;27672:26;;27744:9;27738:4;27734:20;27730:1;27719:9;27715:17;27708:47;27772:131;27898:4;27772:131;:::i;:::-;27764:139;;27491:419;;;:::o;27916:98::-;27967:6;28001:5;27995:12;27985:22;;27916:98;;;:::o;28020:168::-;28103:11;28137:6;28132:3;28125:19;28177:4;28172:3;28168:14;28153:29;;28020:168;;;;:::o;28194:373::-;28280:3;28308:38;28340:5;28308:38;:::i;:::-;28362:70;28425:6;28420:3;28362:70;:::i;:::-;28355:77;;28441:65;28499:6;28494:3;28487:4;28480:5;28476:16;28441:65;:::i;:::-;28531:29;28553:6;28531:29;:::i;:::-;28526:3;28522:39;28515:46;;28284:283;28194:373;;;;:::o;28573:640::-;28768:4;28806:3;28795:9;28791:19;28783:27;;28820:71;28888:1;28877:9;28873:17;28864:6;28820:71;:::i;:::-;28901:72;28969:2;28958:9;28954:18;28945:6;28901:72;:::i;:::-;28983;29051:2;29040:9;29036:18;29027:6;28983:72;:::i;:::-;29102:9;29096:4;29092:20;29087:2;29076:9;29072:18;29065:48;29130:76;29201:4;29192:6;29130:76;:::i;:::-;29122:84;;28573:640;;;;;;;:::o;29219:141::-;29275:5;29306:6;29300:13;29291:22;;29322:32;29348:5;29322:32;:::i;:::-;29219:141;;;;:::o;29366:349::-;29435:6;29484:2;29472:9;29463:7;29459:23;29455:32;29452:119;;;29490:79;;:::i;:::-;29452:119;29610:1;29635:63;29690:7;29681:6;29670:9;29666:22;29635:63;:::i;:::-;29625:73;;29581:127;29366:349;;;;:::o;29721:233::-;29760:3;29783:24;29801:5;29783:24;:::i;:::-;29774:33;;29829:66;29822:5;29819:77;29816:103;;29899:18;;:::i;:::-;29816:103;29946:1;29939:5;29935:13;29928:20;;29721:233;;;:::o;29960:180::-;30008:77;30005:1;29998:88;30105:4;30102:1;30095:15;30129:4;30126:1;30119:15;30146:185;30186:1;30203:20;30221:1;30203:20;:::i;:::-;30198:25;;30237:20;30255:1;30237:20;:::i;:::-;30232:25;;30276:1;30266:35;;30281:18;;:::i;:::-;30266:35;30323:1;30320;30316:9;30311:14;;30146:185;;;;:::o;30337:194::-;30377:4;30397:20;30415:1;30397:20;:::i;:::-;30392:25;;30431:20;30449:1;30431:20;:::i;:::-;30426:25;;30475:1;30472;30468:9;30460:17;;30499:1;30493:4;30490:11;30487:37;;;30504:18;;:::i;:::-;30487:37;30337:194;;;;:::o;30537:176::-;30569:1;30586:20;30604:1;30586:20;:::i;:::-;30581:25;;30620:20;30638:1;30620:20;:::i;:::-;30615:25;;30659:1;30649:35;;30664:18;;:::i;:::-;30649:35;30705:1;30702;30698:9;30693:14;;30537:176;;;;:::o;30719:180::-;30767:77;30764:1;30757:88;30864:4;30861:1;30854:15;30888:4;30885:1;30878:15

Swarm Source

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