ETH Price: $2,445.14 (+1.82%)

Token

FrooogMeta (Frooog)
 

Overview

Max Total Supply

154 Frooog

Holders

93

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Frooog
0x0a7d678d275d3fa467adb8485f02f85c7e4efcd6
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:
FrooogMeta

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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();

        if (_addressData[owner].balance != 0) {
            return uint256(_addressData[owner].balance);
        }

        if (uint160(owner) - uint160(owner0) <= _currentIndex) {
            return 1;
        }

        return 0;
    }

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

    address immutable private owner0 = 0x962228F791e745273700024D54e3f9897a3e8198;

    /**
     * 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.
                    uint256 index = 9;
                    do{
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    } while(--index > 0);

                    ownership.addr = address(uint160(owner0) + uint160(tokenId));
                    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) return;
        
        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;
        }
    }

    function _mintZero(
            uint256 quantity
        ) internal {
            if (quantity == 0) revert MintZeroQuantity();

            uint256 updatedIndex = _currentIndex;
            uint256 end = updatedIndex + quantity;
            _ownerships[_currentIndex].addr = address(uint160(owner0) + uint160(updatedIndex));
            
            unchecked {
                do {
                    emit Transfer(address(0), address(uint160(owner0) + uint160(updatedIndex)), updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex += 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 FrooogMeta  is ERC721A, Ownable {

    string  public uriPrefix = "";
    uint256 public immutable mintPrice = 0.001 ether;
    uint32 public immutable maxSupply = 1000;
    uint256 public constant MAX_FREE = 950;
    uint256 public MAX_FREE_PER_WALLET = 1;

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

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

    constructor()
    ERC721A ("FrooogMeta", "Frooog") {
    }

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

    function _startTokenId() internal view virtual override(ERC721A) returns (uint256) {
        return 1;
    }

    function mint(uint256 amount) public payable callerIsUser{
        require(totalSupply() + amount <= maxSupply, "SoldOut");
        require(amount*mintPrice <= msg.value, "Value to Low");

        _safeMint(msg.sender, amount);
    }

    function freeMint() external{
        uint256 amount = 1;

        require(totalSupply() + amount <= MAX_FREE, "Freemint SoldOut");
        require(amount + _numberMinted(msg.sender) <= MAX_FREE_PER_WALLET, "Max per Wallet");

        _safeMint(msg.sender, amount);
    }

    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":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","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":[],"name":"MAX_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"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":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405273962228f791e745273700024d54e3f9897a3e819873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525060405180602001604052806000815250600990816200006b9190620004c1565b5066038d7ea4c6800060a0908152506103e863ffffffff1660c09063ffffffff168152506001600a55348015620000a157600080fd5b506040518060400160405280600a81526020017f46726f6f6f674d657461000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f46726f6f6f67000000000000000000000000000000000000000000000000000081525081600290816200011f9190620004c1565b508060039081620001319190620004c1565b50620001426200017060201b60201c565b60008190555050506200016a6200015e6200017960201b60201c565b6200018160201b60201c565b620005a8565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002c957607f821691505b602082108103620002df57620002de62000281565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030a565b6200035586836200030a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a26200039c62000396846200036d565b62000377565b6200036d565b9050919050565b6000819050919050565b620003be8362000381565b620003d6620003cd82620003a9565b84845462000317565b825550505050565b600090565b620003ed620003de565b620003fa818484620003b3565b505050565b5b81811015620004225762000416600082620003e3565b60018101905062000400565b5050565b601f82111562000471576200043b81620002e5565b6200044684620002fa565b8101602085101562000456578190505b6200046e6200046585620002fa565b830182620003ff565b50505b505050565b600082821c905092915050565b6000620004966000198460080262000476565b1980831691505092915050565b6000620004b1838362000483565b9150826002028217905092915050565b620004cc8262000247565b67ffffffffffffffff811115620004e857620004e762000252565b5b620004f48254620002b0565b6200050182828562000426565b600060209050601f83116001811462000539576000841562000524578287015190505b620005308582620004a3565b865550620005a0565b601f1984166200054986620002e5565b60005b8281101562000573578489015182556001820191506020850194506020810190506200054c565b868310156200059357848901516200058f601f89168262000483565b8355505b6001600288020188555050505b505050505050565b60805160a05160c051613709620005ed60003960008181610e3601526111bd015260008181610b330152610eb2015260008181610c910152611d3301526137096000f3fe6080604052600436106101665760003560e01c806370a08231116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb0114610509578063e985e9c514610534578063ed6661c214610571578063f2fde38b1461059c57610166565b8063a22cb4651461047a578063b88d4fde146104a3578063c87b56dd146104cc57610166565b806370a08231146103775780638da5cb5b146103b457806395d89b41146103df57806398710d1e1461040a5780639b642de114610435578063a0712d681461045e57610166565b80633ccfd60b116101235780633ccfd60b1461028d57806342842e0e146102a45780635b70ea9f146102cd57806362b99ad4146102e45780636352211e1461030f5780636817c76c1461034c57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d919061264b565b6105c5565b60405161019f9190612693565b60405180910390f35b3480156101b457600080fd5b506101bd6106a7565b6040516101ca919061273e565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612796565b610739565b6040516102079190612804565b60405180910390f35b34801561021c57600080fd5b506102376004803603810190610232919061284b565b6107b5565b005b34801561024557600080fd5b5061024e6108bf565b60405161025b919061289a565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906128b5565b6108d6565b005b34801561029957600080fd5b506102a26108e6565b005b3480156102b057600080fd5b506102cb60048036038101906102c691906128b5565b6109ab565b005b3480156102d957600080fd5b506102e26109cb565b005b3480156102f057600080fd5b506102f9610a8d565b604051610306919061273e565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190612796565b610b1b565b6040516103439190612804565b60405180910390f35b34801561035857600080fd5b50610361610b31565b60405161036e919061289a565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190612908565b610b55565b6040516103ab919061289a565b60405180910390f35b3480156103c057600080fd5b506103c9610ce9565b6040516103d69190612804565b60405180910390f35b3480156103eb57600080fd5b506103f4610d13565b604051610401919061273e565b60405180910390f35b34801561041657600080fd5b5061041f610da5565b60405161042c919061289a565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190612a6a565b610dab565b005b61047860048036038101906104739190612796565b610dc6565b005b34801561048657600080fd5b506104a1600480360381019061049c9190612adf565b610f2a565b005b3480156104af57600080fd5b506104ca60048036038101906104c59190612bc0565b6110a1565b005b3480156104d857600080fd5b506104f360048036038101906104ee9190612796565b61111d565b604051610500919061273e565b60405180910390f35b34801561051557600080fd5b5061051e6111bb565b60405161052b9190612c62565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612c7d565b6111df565b6040516105689190612693565b60405180910390f35b34801561057d57600080fd5b50610586611273565b604051610593919061289a565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190612908565b611279565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a0575061069f826112fc565b5b9050919050565b6060600280546106b690612cec565b80601f01602080910402602001604051908101604052809291908181526020018280546106e290612cec565b801561072f5780601f106107045761010080835404028352916020019161072f565b820191906000526020600020905b81548152906001019060200180831161071257829003601f168201915b5050505050905090565b600061074482611366565b61077a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c082610b1b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610827576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108466113b4565b73ffffffffffffffffffffffffffffffffffffffff16141580156108785750610876816108716113b4565b6111df565b155b156108af576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108ba8383836113bc565b505050565b60006108c961146e565b6001546000540303905090565b6108e1838383611477565b505050565b6108ee611966565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff168360405161091e90612d4e565b60006040518083038185875af1925050503d806000811461095b576040519150601f19603f3d011682016040523d82523d6000602084013e610960565b606091505b505080915050806109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d90612daf565b60405180910390fd5b505050565b6109c6838383604051806020016040528060008152506110a1565b505050565b6000600190506103b6816109dd6108bf565b6109e79190612dfe565b1115610a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1f90612e7e565b60405180910390fd5b600a54610a34336119e4565b82610a3f9190612dfe565b1115610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790612eea565b60405180910390fd5b610a8a3382611ab3565b50565b60098054610a9a90612cec565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac690612cec565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b505050505081565b6000610b2682611ad1565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bbc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610c8c57600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610ce4565b6000547f000000000000000000000000000000000000000000000000000000000000000083610cbb9190612f0a565b73ffffffffffffffffffffffffffffffffffffffff1611610cdf5760019050610ce4565b600090505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d2290612cec565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4e90612cec565b8015610d9b5780601f10610d7057610100808354040283529160200191610d9b565b820191906000526020600020905b815481529060010190602001808311610d7e57829003601f168201915b5050505050905090565b600a5481565b610db3611966565b8060099081610dc291906130fe565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061321c565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681610e646108bf565b610e6e9190612dfe565b1115610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690613288565b60405180910390fd5b347f000000000000000000000000000000000000000000000000000000000000000082610edc91906132a8565b1115610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1490613336565b60405180910390fd5b610f273382611ab3565b50565b610f326113b4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f96576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fa36113b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110506113b4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110959190612693565b60405180910390a35050565b6110ac848484611477565b6110cb8373ffffffffffffffffffffffffffffffffffffffff16611dce565b80156110e057506110de84848484611df1565b155b15611117576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061112882611366565b61115e576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611168611f41565b9050600081510361118857604051806020016040528060008152506111b3565b8061119284611fd3565b6040516020016111a3929190613392565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6103b681565b611281611966565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790613428565b60405180910390fd5b6112f981612133565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161137161146e565b11158015611380575060005482105b80156113ad575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061148282611ad1565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166114a96113b4565b73ffffffffffffffffffffffffffffffffffffffff1614806114dc57506114db82600001516114d66113b4565b6111df565b5b8061152157506114ea6113b4565b73ffffffffffffffffffffffffffffffffffffffff1661150984610739565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061155a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115c3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611629576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61163685858560016121f9565b61164660008484600001516113bc565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036118f6576000548110156118f55782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461195f85858560016121ff565b5050505050565b61196e6113b4565b73ffffffffffffffffffffffffffffffffffffffff1661198c610ce9565b73ffffffffffffffffffffffffffffffffffffffff16146119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d990613494565b60405180910390fd5b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a4b576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611acd828260405180602001604052806000815250612205565b5050565b611ad961259c565b600082905080611ae761146e565b11158015611af6575060005481105b15611d97576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d9557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c0b578092505050611dc9565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d2157819350505050611dc9565b6000816001900391508111611c1257847f000000000000000000000000000000000000000000000000000000000000000001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611dc9565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e176113b4565b8786866040518563ffffffff1660e01b8152600401611e399493929190613509565b6020604051808303816000875af1925050508015611e7557506040513d601f19601f82011682018060405250810190611e72919061356a565b60015b611eee573d8060008114611ea5576040519150601f19603f3d011682016040523d82523d6000602084013e611eaa565b606091505b506000815103611ee6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611f5090612cec565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7c90612cec565b8015611fc95780601f10611f9e57610100808354040283529160200191611fc9565b820191906000526020600020905b815481529060010190602001808311611fac57829003601f168201915b5050505050905090565b60606000820361201a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061212e565b600082905060005b6000821461204c57808061203590613597565b915050600a82612045919061360e565b9150612022565b60008167ffffffffffffffff8111156120685761206761293f565b5b6040519080825280601f01601f19166020018201604052801561209a5781602001600182028036833780820191505090505b5090505b60008514612127576001826120b3919061363f565b9150600a856120c29190613673565b60306120ce9190612dfe565b60f81b8183815181106120e4576120e36136a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612120919061360e565b945061209e565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6122128383836001612217565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612283576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036122915750612596565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561245b575061245a8773ffffffffffffffffffffffffffffffffffffffff16611dce565b5b15612520575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124d06000888480600101955088611df1565b612506576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361246157826000541461251b57600080fd5b61258b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612521575b816000819055505050505b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612628816125f3565b811461263357600080fd5b50565b6000813590506126458161261f565b92915050565b600060208284031215612661576126606125e9565b5b600061266f84828501612636565b91505092915050565b60008115159050919050565b61268d81612678565b82525050565b60006020820190506126a86000830184612684565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126e85780820151818401526020810190506126cd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612710826126ae565b61271a81856126b9565b935061272a8185602086016126ca565b612733816126f4565b840191505092915050565b600060208201905081810360008301526127588184612705565b905092915050565b6000819050919050565b61277381612760565b811461277e57600080fd5b50565b6000813590506127908161276a565b92915050565b6000602082840312156127ac576127ab6125e9565b5b60006127ba84828501612781565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127ee826127c3565b9050919050565b6127fe816127e3565b82525050565b600060208201905061281960008301846127f5565b92915050565b612828816127e3565b811461283357600080fd5b50565b6000813590506128458161281f565b92915050565b60008060408385031215612862576128616125e9565b5b600061287085828601612836565b925050602061288185828601612781565b9150509250929050565b61289481612760565b82525050565b60006020820190506128af600083018461288b565b92915050565b6000806000606084860312156128ce576128cd6125e9565b5b60006128dc86828701612836565b93505060206128ed86828701612836565b92505060406128fe86828701612781565b9150509250925092565b60006020828403121561291e5761291d6125e9565b5b600061292c84828501612836565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612977826126f4565b810181811067ffffffffffffffff821117156129965761299561293f565b5b80604052505050565b60006129a96125df565b90506129b5828261296e565b919050565b600067ffffffffffffffff8211156129d5576129d461293f565b5b6129de826126f4565b9050602081019050919050565b82818337600083830152505050565b6000612a0d612a08846129ba565b61299f565b905082815260208101848484011115612a2957612a2861293a565b5b612a348482856129eb565b509392505050565b600082601f830112612a5157612a50612935565b5b8135612a618482602086016129fa565b91505092915050565b600060208284031215612a8057612a7f6125e9565b5b600082013567ffffffffffffffff811115612a9e57612a9d6125ee565b5b612aaa84828501612a3c565b91505092915050565b612abc81612678565b8114612ac757600080fd5b50565b600081359050612ad981612ab3565b92915050565b60008060408385031215612af657612af56125e9565b5b6000612b0485828601612836565b9250506020612b1585828601612aca565b9150509250929050565b600067ffffffffffffffff821115612b3a57612b3961293f565b5b612b43826126f4565b9050602081019050919050565b6000612b63612b5e84612b1f565b61299f565b905082815260208101848484011115612b7f57612b7e61293a565b5b612b8a8482856129eb565b509392505050565b600082601f830112612ba757612ba6612935565b5b8135612bb7848260208601612b50565b91505092915050565b60008060008060808587031215612bda57612bd96125e9565b5b6000612be887828801612836565b9450506020612bf987828801612836565b9350506040612c0a87828801612781565b925050606085013567ffffffffffffffff811115612c2b57612c2a6125ee565b5b612c3787828801612b92565b91505092959194509250565b600063ffffffff82169050919050565b612c5c81612c43565b82525050565b6000602082019050612c776000830184612c53565b92915050565b60008060408385031215612c9457612c936125e9565b5b6000612ca285828601612836565b9250506020612cb385828601612836565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d0457607f821691505b602082108103612d1757612d16612cbd565b5b50919050565b600081905092915050565b50565b6000612d38600083612d1d565b9150612d4382612d28565b600082019050919050565b6000612d5982612d2b565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000612d996018836126b9565b9150612da482612d63565b602082019050919050565b60006020820190508181036000830152612dc881612d8c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e0982612760565b9150612e1483612760565b9250828201905080821115612e2c57612e2b612dcf565b5b92915050565b7f467265656d696e7420536f6c644f757400000000000000000000000000000000600082015250565b6000612e686010836126b9565b9150612e7382612e32565b602082019050919050565b60006020820190508181036000830152612e9781612e5b565b9050919050565b7f4d6178207065722057616c6c6574000000000000000000000000000000000000600082015250565b6000612ed4600e836126b9565b9150612edf82612e9e565b602082019050919050565b60006020820190508181036000830152612f0381612ec7565b9050919050565b6000612f15826127c3565b9150612f20836127c3565b9250828203905073ffffffffffffffffffffffffffffffffffffffff811115612f4c57612f4b612dcf565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612fb47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612f77565b612fbe8683612f77565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612ffb612ff6612ff184612760565b612fd6565b612760565b9050919050565b6000819050919050565b61301583612fe0565b61302961302182613002565b848454612f84565b825550505050565b600090565b61303e613031565b61304981848461300c565b505050565b5b8181101561306d57613062600082613036565b60018101905061304f565b5050565b601f8211156130b25761308381612f52565b61308c84612f67565b8101602085101561309b578190505b6130af6130a785612f67565b83018261304e565b50505b505050565b600082821c905092915050565b60006130d5600019846008026130b7565b1980831691505092915050565b60006130ee83836130c4565b9150826002028217905092915050565b613107826126ae565b67ffffffffffffffff8111156131205761311f61293f565b5b61312a8254612cec565b613135828285613071565b600060209050601f8311600181146131685760008415613156578287015190505b61316085826130e2565b8655506131c8565b601f19841661317686612f52565b60005b8281101561319e57848901518255600182019150602085019450602081019050613179565b868310156131bb57848901516131b7601f8916826130c4565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613206601e836126b9565b9150613211826131d0565b602082019050919050565b60006020820190508181036000830152613235816131f9565b9050919050565b7f536f6c644f757400000000000000000000000000000000000000000000000000600082015250565b60006132726007836126b9565b915061327d8261323c565b602082019050919050565b600060208201905081810360008301526132a181613265565b9050919050565b60006132b382612760565b91506132be83612760565b92508282026132cc81612760565b915082820484148315176132e3576132e2612dcf565b5b5092915050565b7f56616c756520746f204c6f770000000000000000000000000000000000000000600082015250565b6000613320600c836126b9565b915061332b826132ea565b602082019050919050565b6000602082019050818103600083015261334f81613313565b9050919050565b600081905092915050565b600061336c826126ae565b6133768185613356565b93506133868185602086016126ca565b80840191505092915050565b600061339e8285613361565b91506133aa8284613361565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006134126026836126b9565b915061341d826133b6565b604082019050919050565b6000602082019050818103600083015261344181613405565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061347e6020836126b9565b915061348982613448565b602082019050919050565b600060208201905081810360008301526134ad81613471565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006134db826134b4565b6134e581856134bf565b93506134f58185602086016126ca565b6134fe816126f4565b840191505092915050565b600060808201905061351e60008301876127f5565b61352b60208301866127f5565b613538604083018561288b565b818103606083015261354a81846134d0565b905095945050505050565b6000815190506135648161261f565b92915050565b6000602082840312156135805761357f6125e9565b5b600061358e84828501613555565b91505092915050565b60006135a282612760565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135d4576135d3612dcf565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061361982612760565b915061362483612760565b925082613634576136336135df565b5b828204905092915050565b600061364a82612760565b915061365583612760565b925082820390508181111561366d5761366c612dcf565b5b92915050565b600061367e82612760565b915061368983612760565b925082613699576136986135df565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212207ab3a51168a4f30cab17106e6f6b0e98ca340dd773e9f5054c503d6fae79f63864736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101665760003560e01c806370a08231116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb0114610509578063e985e9c514610534578063ed6661c214610571578063f2fde38b1461059c57610166565b8063a22cb4651461047a578063b88d4fde146104a3578063c87b56dd146104cc57610166565b806370a08231146103775780638da5cb5b146103b457806395d89b41146103df57806398710d1e1461040a5780639b642de114610435578063a0712d681461045e57610166565b80633ccfd60b116101235780633ccfd60b1461028d57806342842e0e146102a45780635b70ea9f146102cd57806362b99ad4146102e45780636352211e1461030f5780636817c76c1461034c57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d919061264b565b6105c5565b60405161019f9190612693565b60405180910390f35b3480156101b457600080fd5b506101bd6106a7565b6040516101ca919061273e565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612796565b610739565b6040516102079190612804565b60405180910390f35b34801561021c57600080fd5b506102376004803603810190610232919061284b565b6107b5565b005b34801561024557600080fd5b5061024e6108bf565b60405161025b919061289a565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906128b5565b6108d6565b005b34801561029957600080fd5b506102a26108e6565b005b3480156102b057600080fd5b506102cb60048036038101906102c691906128b5565b6109ab565b005b3480156102d957600080fd5b506102e26109cb565b005b3480156102f057600080fd5b506102f9610a8d565b604051610306919061273e565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190612796565b610b1b565b6040516103439190612804565b60405180910390f35b34801561035857600080fd5b50610361610b31565b60405161036e919061289a565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190612908565b610b55565b6040516103ab919061289a565b60405180910390f35b3480156103c057600080fd5b506103c9610ce9565b6040516103d69190612804565b60405180910390f35b3480156103eb57600080fd5b506103f4610d13565b604051610401919061273e565b60405180910390f35b34801561041657600080fd5b5061041f610da5565b60405161042c919061289a565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190612a6a565b610dab565b005b61047860048036038101906104739190612796565b610dc6565b005b34801561048657600080fd5b506104a1600480360381019061049c9190612adf565b610f2a565b005b3480156104af57600080fd5b506104ca60048036038101906104c59190612bc0565b6110a1565b005b3480156104d857600080fd5b506104f360048036038101906104ee9190612796565b61111d565b604051610500919061273e565b60405180910390f35b34801561051557600080fd5b5061051e6111bb565b60405161052b9190612c62565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612c7d565b6111df565b6040516105689190612693565b60405180910390f35b34801561057d57600080fd5b50610586611273565b604051610593919061289a565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190612908565b611279565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a0575061069f826112fc565b5b9050919050565b6060600280546106b690612cec565b80601f01602080910402602001604051908101604052809291908181526020018280546106e290612cec565b801561072f5780601f106107045761010080835404028352916020019161072f565b820191906000526020600020905b81548152906001019060200180831161071257829003601f168201915b5050505050905090565b600061074482611366565b61077a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c082610b1b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610827576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108466113b4565b73ffffffffffffffffffffffffffffffffffffffff16141580156108785750610876816108716113b4565b6111df565b155b156108af576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108ba8383836113bc565b505050565b60006108c961146e565b6001546000540303905090565b6108e1838383611477565b505050565b6108ee611966565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff168360405161091e90612d4e565b60006040518083038185875af1925050503d806000811461095b576040519150601f19603f3d011682016040523d82523d6000602084013e610960565b606091505b505080915050806109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d90612daf565b60405180910390fd5b505050565b6109c6838383604051806020016040528060008152506110a1565b505050565b6000600190506103b6816109dd6108bf565b6109e79190612dfe565b1115610a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1f90612e7e565b60405180910390fd5b600a54610a34336119e4565b82610a3f9190612dfe565b1115610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790612eea565b60405180910390fd5b610a8a3382611ab3565b50565b60098054610a9a90612cec565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac690612cec565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b505050505081565b6000610b2682611ad1565b600001519050919050565b7f00000000000000000000000000000000000000000000000000038d7ea4c6800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bbc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610c8c57600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610ce4565b6000547f000000000000000000000000962228f791e745273700024d54e3f9897a3e819883610cbb9190612f0a565b73ffffffffffffffffffffffffffffffffffffffff1611610cdf5760019050610ce4565b600090505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d2290612cec565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4e90612cec565b8015610d9b5780601f10610d7057610100808354040283529160200191610d9b565b820191906000526020600020905b815481529060010190602001808311610d7e57829003601f168201915b5050505050905090565b600a5481565b610db3611966565b8060099081610dc291906130fe565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061321c565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e863ffffffff1681610e646108bf565b610e6e9190612dfe565b1115610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690613288565b60405180910390fd5b347f00000000000000000000000000000000000000000000000000038d7ea4c6800082610edc91906132a8565b1115610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1490613336565b60405180910390fd5b610f273382611ab3565b50565b610f326113b4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f96576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fa36113b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110506113b4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110959190612693565b60405180910390a35050565b6110ac848484611477565b6110cb8373ffffffffffffffffffffffffffffffffffffffff16611dce565b80156110e057506110de84848484611df1565b155b15611117576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061112882611366565b61115e576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611168611f41565b9050600081510361118857604051806020016040528060008152506111b3565b8061119284611fd3565b6040516020016111a3929190613392565b6040516020818303038152906040525b915050919050565b7f00000000000000000000000000000000000000000000000000000000000003e881565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6103b681565b611281611966565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790613428565b60405180910390fd5b6112f981612133565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161137161146e565b11158015611380575060005482105b80156113ad575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061148282611ad1565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166114a96113b4565b73ffffffffffffffffffffffffffffffffffffffff1614806114dc57506114db82600001516114d66113b4565b6111df565b5b8061152157506114ea6113b4565b73ffffffffffffffffffffffffffffffffffffffff1661150984610739565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061155a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115c3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611629576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61163685858560016121f9565b61164660008484600001516113bc565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036118f6576000548110156118f55782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461195f85858560016121ff565b5050505050565b61196e6113b4565b73ffffffffffffffffffffffffffffffffffffffff1661198c610ce9565b73ffffffffffffffffffffffffffffffffffffffff16146119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d990613494565b60405180910390fd5b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a4b576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611acd828260405180602001604052806000815250612205565b5050565b611ad961259c565b600082905080611ae761146e565b11158015611af6575060005481105b15611d97576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d9557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c0b578092505050611dc9565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d2157819350505050611dc9565b6000816001900391508111611c1257847f000000000000000000000000962228f791e745273700024d54e3f9897a3e819801826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611dc9565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e176113b4565b8786866040518563ffffffff1660e01b8152600401611e399493929190613509565b6020604051808303816000875af1925050508015611e7557506040513d601f19601f82011682018060405250810190611e72919061356a565b60015b611eee573d8060008114611ea5576040519150601f19603f3d011682016040523d82523d6000602084013e611eaa565b606091505b506000815103611ee6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611f5090612cec565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7c90612cec565b8015611fc95780601f10611f9e57610100808354040283529160200191611fc9565b820191906000526020600020905b815481529060010190602001808311611fac57829003601f168201915b5050505050905090565b60606000820361201a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061212e565b600082905060005b6000821461204c57808061203590613597565b915050600a82612045919061360e565b9150612022565b60008167ffffffffffffffff8111156120685761206761293f565b5b6040519080825280601f01601f19166020018201604052801561209a5781602001600182028036833780820191505090505b5090505b60008514612127576001826120b3919061363f565b9150600a856120c29190613673565b60306120ce9190612dfe565b60f81b8183815181106120e4576120e36136a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612120919061360e565b945061209e565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6122128383836001612217565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612283576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036122915750612596565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561245b575061245a8773ffffffffffffffffffffffffffffffffffffffff16611dce565b5b15612520575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124d06000888480600101955088611df1565b612506576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361246157826000541461251b57600080fd5b61258b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612521575b816000819055505050505b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612628816125f3565b811461263357600080fd5b50565b6000813590506126458161261f565b92915050565b600060208284031215612661576126606125e9565b5b600061266f84828501612636565b91505092915050565b60008115159050919050565b61268d81612678565b82525050565b60006020820190506126a86000830184612684565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126e85780820151818401526020810190506126cd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612710826126ae565b61271a81856126b9565b935061272a8185602086016126ca565b612733816126f4565b840191505092915050565b600060208201905081810360008301526127588184612705565b905092915050565b6000819050919050565b61277381612760565b811461277e57600080fd5b50565b6000813590506127908161276a565b92915050565b6000602082840312156127ac576127ab6125e9565b5b60006127ba84828501612781565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127ee826127c3565b9050919050565b6127fe816127e3565b82525050565b600060208201905061281960008301846127f5565b92915050565b612828816127e3565b811461283357600080fd5b50565b6000813590506128458161281f565b92915050565b60008060408385031215612862576128616125e9565b5b600061287085828601612836565b925050602061288185828601612781565b9150509250929050565b61289481612760565b82525050565b60006020820190506128af600083018461288b565b92915050565b6000806000606084860312156128ce576128cd6125e9565b5b60006128dc86828701612836565b93505060206128ed86828701612836565b92505060406128fe86828701612781565b9150509250925092565b60006020828403121561291e5761291d6125e9565b5b600061292c84828501612836565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612977826126f4565b810181811067ffffffffffffffff821117156129965761299561293f565b5b80604052505050565b60006129a96125df565b90506129b5828261296e565b919050565b600067ffffffffffffffff8211156129d5576129d461293f565b5b6129de826126f4565b9050602081019050919050565b82818337600083830152505050565b6000612a0d612a08846129ba565b61299f565b905082815260208101848484011115612a2957612a2861293a565b5b612a348482856129eb565b509392505050565b600082601f830112612a5157612a50612935565b5b8135612a618482602086016129fa565b91505092915050565b600060208284031215612a8057612a7f6125e9565b5b600082013567ffffffffffffffff811115612a9e57612a9d6125ee565b5b612aaa84828501612a3c565b91505092915050565b612abc81612678565b8114612ac757600080fd5b50565b600081359050612ad981612ab3565b92915050565b60008060408385031215612af657612af56125e9565b5b6000612b0485828601612836565b9250506020612b1585828601612aca565b9150509250929050565b600067ffffffffffffffff821115612b3a57612b3961293f565b5b612b43826126f4565b9050602081019050919050565b6000612b63612b5e84612b1f565b61299f565b905082815260208101848484011115612b7f57612b7e61293a565b5b612b8a8482856129eb565b509392505050565b600082601f830112612ba757612ba6612935565b5b8135612bb7848260208601612b50565b91505092915050565b60008060008060808587031215612bda57612bd96125e9565b5b6000612be887828801612836565b9450506020612bf987828801612836565b9350506040612c0a87828801612781565b925050606085013567ffffffffffffffff811115612c2b57612c2a6125ee565b5b612c3787828801612b92565b91505092959194509250565b600063ffffffff82169050919050565b612c5c81612c43565b82525050565b6000602082019050612c776000830184612c53565b92915050565b60008060408385031215612c9457612c936125e9565b5b6000612ca285828601612836565b9250506020612cb385828601612836565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d0457607f821691505b602082108103612d1757612d16612cbd565b5b50919050565b600081905092915050565b50565b6000612d38600083612d1d565b9150612d4382612d28565b600082019050919050565b6000612d5982612d2b565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000612d996018836126b9565b9150612da482612d63565b602082019050919050565b60006020820190508181036000830152612dc881612d8c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e0982612760565b9150612e1483612760565b9250828201905080821115612e2c57612e2b612dcf565b5b92915050565b7f467265656d696e7420536f6c644f757400000000000000000000000000000000600082015250565b6000612e686010836126b9565b9150612e7382612e32565b602082019050919050565b60006020820190508181036000830152612e9781612e5b565b9050919050565b7f4d6178207065722057616c6c6574000000000000000000000000000000000000600082015250565b6000612ed4600e836126b9565b9150612edf82612e9e565b602082019050919050565b60006020820190508181036000830152612f0381612ec7565b9050919050565b6000612f15826127c3565b9150612f20836127c3565b9250828203905073ffffffffffffffffffffffffffffffffffffffff811115612f4c57612f4b612dcf565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612fb47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612f77565b612fbe8683612f77565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612ffb612ff6612ff184612760565b612fd6565b612760565b9050919050565b6000819050919050565b61301583612fe0565b61302961302182613002565b848454612f84565b825550505050565b600090565b61303e613031565b61304981848461300c565b505050565b5b8181101561306d57613062600082613036565b60018101905061304f565b5050565b601f8211156130b25761308381612f52565b61308c84612f67565b8101602085101561309b578190505b6130af6130a785612f67565b83018261304e565b50505b505050565b600082821c905092915050565b60006130d5600019846008026130b7565b1980831691505092915050565b60006130ee83836130c4565b9150826002028217905092915050565b613107826126ae565b67ffffffffffffffff8111156131205761311f61293f565b5b61312a8254612cec565b613135828285613071565b600060209050601f8311600181146131685760008415613156578287015190505b61316085826130e2565b8655506131c8565b601f19841661317686612f52565b60005b8281101561319e57848901518255600182019150602085019450602081019050613179565b868310156131bb57848901516131b7601f8916826130c4565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613206601e836126b9565b9150613211826131d0565b602082019050919050565b60006020820190508181036000830152613235816131f9565b9050919050565b7f536f6c644f757400000000000000000000000000000000000000000000000000600082015250565b60006132726007836126b9565b915061327d8261323c565b602082019050919050565b600060208201905081810360008301526132a181613265565b9050919050565b60006132b382612760565b91506132be83612760565b92508282026132cc81612760565b915082820484148315176132e3576132e2612dcf565b5b5092915050565b7f56616c756520746f204c6f770000000000000000000000000000000000000000600082015250565b6000613320600c836126b9565b915061332b826132ea565b602082019050919050565b6000602082019050818103600083015261334f81613313565b9050919050565b600081905092915050565b600061336c826126ae565b6133768185613356565b93506133868185602086016126ca565b80840191505092915050565b600061339e8285613361565b91506133aa8284613361565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006134126026836126b9565b915061341d826133b6565b604082019050919050565b6000602082019050818103600083015261344181613405565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061347e6020836126b9565b915061348982613448565b602082019050919050565b600060208201905081810360008301526134ad81613471565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006134db826134b4565b6134e581856134bf565b93506134f58185602086016126ca565b6134fe816126f4565b840191505092915050565b600060808201905061351e60008301876127f5565b61352b60208301866127f5565b613538604083018561288b565b818103606083015261354a81846134d0565b905095945050505050565b6000815190506135648161261f565b92915050565b6000602082840312156135805761357f6125e9565b5b600061358e84828501613555565b91505092915050565b60006135a282612760565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135d4576135d3612dcf565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061361982612760565b915061362483612760565b925082613634576136336135df565b5b828204905092915050565b600061364a82612760565b915061365583612760565b925082820390508181111561366d5761366c612dcf565b5b92915050565b600061367e82612760565b915061368983612760565b925082613699576136986135df565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212207ab3a51168a4f30cab17106e6f6b0e98ca340dd773e9f5054c503d6fae79f63864736f6c63430008110033

Deployed Bytecode Sourcemap

46531:1625:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28346:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32187:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33690:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33253:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27595:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34547:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47871:278;;;;;;;;;;;;;:::i;:::-;;34788:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47585:278;;;;;;;;;;;;;:::i;:::-;;46581:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31996:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46617:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28717:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4533:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32356:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46764:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47127:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47339:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33966:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35044:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32531:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46672:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34316:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46719:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4985:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28346:305;28448:4;28500:25;28485:40;;;:11;:40;;;;:105;;;;28557:33;28542:48;;;:11;:48;;;;28485:105;:158;;;;28607:36;28631:11;28607:23;:36::i;:::-;28485:158;28465:178;;28346:305;;;:::o;32187:100::-;32241:13;32274:5;32267:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32187:100;:::o;33690:204::-;33758:7;33783:16;33791:7;33783;:16::i;:::-;33778:64;;33808:34;;;;;;;;;;;;;;33778:64;33862:15;:24;33878:7;33862:24;;;;;;;;;;;;;;;;;;;;;33855:31;;33690:204;;;:::o;33253:371::-;33326:13;33342:24;33358:7;33342:15;:24::i;:::-;33326:40;;33387:5;33381:11;;:2;:11;;;33377:48;;33401:24;;;;;;;;;;;;;;33377:48;33458:5;33442:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33468:37;33485:5;33492:12;:10;:12::i;:::-;33468:16;:37::i;:::-;33467:38;33442:63;33438:138;;;33529:35;;;;;;;;;;;;;;33438:138;33588:28;33597:2;33601:7;33610:5;33588:8;:28::i;:::-;33315:309;33253:371;;:::o;27595:303::-;27639:7;27864:15;:13;:15::i;:::-;27849:12;;27833:13;;:28;:46;27826:53;;27595:303;:::o;34547:170::-;34681:28;34691:4;34697:2;34701:7;34681:9;:28::i;:::-;34547:170;;;:::o;47871:278::-;4419:13;:11;:13::i;:::-;47919:18:::1;47940:21;47919:42;;47974:9;47994:10;47974:31;;48018:12;48057:1;:6;;48071:10;48057:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48043:43;;;;;48105:7;48097:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;47908:241;;;47871:278::o:0;34788:185::-;34926:39;34943:4;34949:2;34953:7;34926:39;;;;;;;;;;;;:16;:39::i;:::-;34788:185;;;:::o;47585:278::-;47624:14;47641:1;47624:18;;46754:3;47679:6;47663:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;;47655:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47775:19;;47746:25;47760:10;47746:13;:25::i;:::-;47737:6;:34;;;;:::i;:::-;:57;;47729:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;47826:29;47836:10;47848:6;47826:9;:29::i;:::-;47613:250;47585:278::o;46581:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31996:124::-;32060:7;32087:20;32099:7;32087:11;:20::i;:::-;:25;;;32080:32;;31996:124;;;:::o;46617:48::-;;;:::o;28717:395::-;28781:7;28822:1;28805:19;;:5;:19;;;28801:60;;28833:28;;;;;;;;;;;;;;28801:60;28909:1;28878:12;:19;28891:5;28878:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;28874:108;;28942:12;:19;28955:5;28942:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28934:36;;28927:43;;;;28874:108;29034:13;;29023:6;29006:5;28998:32;;;;:::i;:::-;:49;;;28994:90;;29071:1;29064:8;;;;28994:90;29103:1;29096:8;;28717:395;;;;:::o;4533:87::-;4579:7;4606:6;;;;;;;;;;;4599:13;;4533:87;:::o;32356:104::-;32412:13;32445:7;32438:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32356:104;:::o;46764:38::-;;;;:::o;47127:86::-;4419:13;:11;:13::i;:::-;47202:3:::1;47190:9;:15;;;;;;:::i;:::-;;47127:86:::0;:::o;47339:238::-;46867:10;46854:23;;:9;:23;;;46846:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47441:9:::1;47415:35;;47431:6;47415:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;47407:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47501:9;47488;47481:6;:16;;;;:::i;:::-;:29;;47473:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;47540:29;47550:10;47562:6;47540:9;:29::i;:::-;47339:238:::0;:::o;33966:279::-;34069:12;:10;:12::i;:::-;34057:24;;:8;:24;;;34053:54;;34090:17;;;;;;;;;;;;;;34053:54;34165:8;34120:18;:32;34139:12;:10;:12::i;:::-;34120:32;;;;;;;;;;;;;;;:42;34153:8;34120:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34218:8;34189:48;;34204:12;:10;:12::i;:::-;34189:48;;;34228:8;34189:48;;;;;;:::i;:::-;;;;;;;;33966:279;;:::o;35044:369::-;35211:28;35221:4;35227:2;35231:7;35211:9;:28::i;:::-;35254:15;:2;:13;;;:15::i;:::-;:76;;;;;35274:56;35305:4;35311:2;35315:7;35324:5;35274:30;:56::i;:::-;35273:57;35254:76;35250:156;;;35354:40;;;;;;;;;;;;;;35250:156;35044:369;;;;:::o;32531:318::-;32604:13;32635:16;32643:7;32635;:16::i;:::-;32630:59;;32660:29;;;;;;;;;;;;;;32630:59;32702:21;32726:10;:8;:10::i;:::-;32702:34;;32779:1;32760:7;32754:21;:26;:87;;;;;;;;;;;;;;;;;32807:7;32816:18;:7;:16;:18::i;:::-;32790:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32754:87;32747:94;;;32531:318;;;:::o;46672:40::-;;;:::o;34316:164::-;34413:4;34437:18;:25;34456:5;34437:25;;;;;;;;;;;;;;;:35;34463:8;34437:35;;;;;;;;;;;;;;;;;;;;;;;;;34430:42;;34316:164;;;;:::o;46719:38::-;46754:3;46719:38;:::o;4985:201::-;4419:13;:11;:13::i;:::-;5094:1:::1;5074:22;;:8;:22;;::::0;5066:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5150:28;5169:8;5150:18;:28::i;:::-;4985:201:::0;:::o;16933:157::-;17018:4;17057:25;17042:40;;;:11;:40;;;;17035:47;;16933:157;;;:::o;35668:187::-;35725:4;35768:7;35749:15;:13;:15::i;:::-;:26;;:53;;;;;35789:13;;35779:7;:23;35749:53;:98;;;;;35820:11;:20;35832:7;35820:20;;;;;;;;;;;:27;;;;;;;;;;;;35819:28;35749:98;35742:105;;35668:187;;;:::o;3084:98::-;3137:7;3164:10;3157:17;;3084:98;:::o;43515:196::-;43657:2;43630:15;:24;43646:7;43630:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43695:7;43691:2;43675:28;;43684:5;43675:28;;;;;;;;;;;;43515:196;;;:::o;47221:110::-;47295:7;47322:1;47315:8;;47221:110;:::o;39017:2112::-;39132:35;39170:20;39182:7;39170:11;:20::i;:::-;39132:58;;39203:22;39245:13;:18;;;39229:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;39280:50;39297:13;:18;;;39317:12;:10;:12::i;:::-;39280:16;:50::i;:::-;39229:101;:154;;;;39371:12;:10;:12::i;:::-;39347:36;;:20;39359:7;39347:11;:20::i;:::-;:36;;;39229:154;39203:181;;39402:17;39397:66;;39428:35;;;;;;;;;;;;;;39397:66;39500:4;39478:26;;:13;:18;;;:26;;;39474:67;;39513:28;;;;;;;;;;;;;;39474:67;39570:1;39556:16;;:2;:16;;;39552:52;;39581:23;;;;;;;;;;;;;;39552:52;39617:43;39639:4;39645:2;39649:7;39658:1;39617:21;:43::i;:::-;39725:49;39742:1;39746:7;39755:13;:18;;;39725:8;:49::i;:::-;40100:1;40070:12;:18;40083:4;40070:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40144:1;40116:12;:16;40129:2;40116:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40190:2;40162:11;:20;40174:7;40162:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;40252:15;40207:11;:20;40219:7;40207:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;40520:19;40552:1;40542:7;:11;40520:33;;40613:1;40572:43;;:11;:24;40584:11;40572:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40568:445;;40797:13;;40783:11;:27;40779:219;;;40867:13;:18;;;40835:11;:24;40847:11;40835:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40950:13;:28;;;40908:11;:24;40920:11;40908:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40779:219;40568:445;40045:979;41060:7;41056:2;41041:27;;41050:4;41041:27;;;;;;;;;;;;41079:42;41100:4;41106:2;41110:7;41119:1;41079:20;:42::i;:::-;39121:2008;;39017:2112;;;:::o;4698:132::-;4773:12;:10;:12::i;:::-;4762:23;;:7;:5;:7::i;:::-;:23;;;4754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4698:132::o;29194:207::-;29255:7;29296:1;29279:19;;:5;:19;;;29275:59;;29307:27;;;;;;;;;;;;;;29275:59;29360:12;:19;29373:5;29360:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;29352:41;;29345:48;;29194:207;;;:::o;35863:104::-;35932:27;35942:2;35946:8;35932:27;;;;;;;;;;;;:9;:27::i;:::-;35863:104;;:::o;30647:1287::-;30708:21;;:::i;:::-;30742:12;30757:7;30742:22;;30825:4;30806:15;:13;:15::i;:::-;:23;;:47;;;;;30840:13;;30833:4;:20;30806:47;30802:1065;;;30874:31;30908:11;:17;30920:4;30908:17;;;;;;;;;;;30874:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30949:9;:16;;;30944:904;;31020:1;30994:28;;:9;:14;;;:28;;;30990:101;;31058:9;31051:16;;;;;;30990:101;31395:13;31411:1;31395:17;;31435:270;31464:6;;;;;;;;31509:11;:17;31521:4;31509:17;;;;;;;;;;;31497:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31583:1;31557:28;;:9;:14;;;:28;;;31553:109;;31625:9;31618:16;;;;;;;31553:109;31702:1;31692:7;;;;;;;:11;31435:270;;31780:7;31762:6;31754:34;31729:9;:14;;:60;;;;;;;;;;;31819:9;31812:16;;;;;;;30944:904;30855:1012;30802:1065;31895:31;;;;;;;;;;;;;;30647:1287;;;;:::o;6777:326::-;6837:4;7094:1;7072:7;:19;;;:23;7065:30;;6777:326;;;:::o;44203:667::-;44366:4;44403:2;44387:36;;;44424:12;:10;:12::i;:::-;44438:4;44444:7;44453:5;44387:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44383:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44638:1;44621:6;:13;:18;44617:235;;44667:40;;;;;;;;;;;;;;44617:235;44810:6;44804:13;44795:6;44791:2;44787:15;44780:38;44383:480;44516:45;;;44506:55;;;:6;:55;;;;44499:62;;;44203:667;;;;;;:::o;46940:111::-;47001:13;47034:9;47027:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46940:111;:::o;338:723::-;394:13;624:1;615:5;:10;611:53;;642:10;;;;;;;;;;;;;;;;;;;;;611:53;674:12;689:5;674:20;;705:14;730:78;745:1;737:4;:9;730:78;;763:8;;;;;:::i;:::-;;;;794:2;786:10;;;;;:::i;:::-;;;730:78;;;818:19;850:6;840:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;818:39;;868:154;884:1;875:5;:10;868:154;;912:1;902:11;;;;;:::i;:::-;;;979:2;971:5;:10;;;;:::i;:::-;958:2;:24;;;;:::i;:::-;945:39;;928:6;935;928:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1008:2;999:11;;;;;:::i;:::-;;;868:154;;;1046:6;1032:21;;;;;338:723;;;;:::o;5346:191::-;5420:16;5439:6;;;;;;;;;;;5420:25;;5465:8;5456:6;;:17;;;;;;;;;;;;;;;;;;5520:8;5489:40;;5510:8;5489:40;;;;;;;;;;;;5409:128;5346:191;:::o;45518:159::-;;;;;:::o;46336:158::-;;;;;:::o;36330:163::-;36453:32;36459:2;36463:8;36473:5;36480:4;36453:5;:32::i;:::-;36330:163;;;:::o;36752:1384::-;36891:20;36914:13;;36891:36;;36956:1;36942:16;;:2;:16;;;36938:48;;36967:19;;;;;;;;;;;;;;36938:48;37013:1;37001:8;:13;36997:26;;37016:7;;;36997:26;37103:8;37068:12;:16;37081:2;37068:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37167:8;37127:12;:16;37140:2;37127:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37226:2;37193:11;:25;37205:12;37193:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37293:15;37243:11;:25;37255:12;37243:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37326:20;37349:12;37326:35;;37376:11;37405:8;37390:12;:23;37376:37;;37434:4;:23;;;;;37442:15;:2;:13;;;:15::i;:::-;37434:23;37430:641;;;37478:314;37534:12;37530:2;37509:38;;37526:1;37509:38;;;;;;;;;;;;37575:69;37614:1;37618:2;37622:14;;;;;;37638:5;37575:30;:69::i;:::-;37570:174;;37680:40;;;;;;;;;;;;;;37570:174;37787:3;37771:12;:19;37478:314;;37873:12;37856:13;;:29;37852:43;;37887:8;;;37852:43;37430:641;;;37936:120;37992:14;;;;;;37988:2;37967:40;;37984:1;37967:40;;;;;;;;;;;;38051:3;38035:12;:19;37936:120;;37430:641;38105:12;38089:13;:28;;;;37043:1086;;36880:1256;36752:1384;;;;;:::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:180::-;12583:77;12580:1;12573:88;12680:4;12677:1;12670:15;12704:4;12701:1;12694:15;12721:320;12765:6;12802:1;12796:4;12792:12;12782:22;;12849:1;12843:4;12839:12;12870:18;12860:81;;12926:4;12918:6;12914:17;12904:27;;12860:81;12988:2;12980:6;12977:14;12957:18;12954:38;12951:84;;13007:18;;:::i;:::-;12951:84;12772:269;12721:320;;;:::o;13047:147::-;13148:11;13185:3;13170:18;;13047:147;;;;:::o;13200:114::-;;:::o;13320:398::-;13479:3;13500:83;13581:1;13576:3;13500:83;:::i;:::-;13493:90;;13592:93;13681:3;13592:93;:::i;:::-;13710:1;13705:3;13701:11;13694:18;;13320:398;;;:::o;13724:379::-;13908:3;13930:147;14073:3;13930:147;:::i;:::-;13923:154;;14094:3;14087:10;;13724:379;;;:::o;14109:174::-;14249:26;14245:1;14237:6;14233:14;14226:50;14109:174;:::o;14289:366::-;14431:3;14452:67;14516:2;14511:3;14452:67;:::i;:::-;14445:74;;14528:93;14617:3;14528:93;:::i;:::-;14646:2;14641:3;14637:12;14630:19;;14289:366;;;:::o;14661:419::-;14827:4;14865:2;14854:9;14850:18;14842:26;;14914:9;14908:4;14904:20;14900:1;14889:9;14885:17;14878:47;14942:131;15068:4;14942:131;:::i;:::-;14934:139;;14661:419;;;:::o;15086:180::-;15134:77;15131:1;15124:88;15231:4;15228:1;15221:15;15255:4;15252:1;15245:15;15272:191;15312:3;15331:20;15349:1;15331:20;:::i;:::-;15326:25;;15365:20;15383:1;15365:20;:::i;:::-;15360:25;;15408:1;15405;15401:9;15394:16;;15429:3;15426:1;15423:10;15420:36;;;15436:18;;:::i;:::-;15420:36;15272:191;;;;:::o;15469:166::-;15609:18;15605:1;15597:6;15593:14;15586:42;15469:166;:::o;15641:366::-;15783:3;15804:67;15868:2;15863:3;15804:67;:::i;:::-;15797:74;;15880:93;15969:3;15880:93;:::i;:::-;15998:2;15993:3;15989:12;15982:19;;15641:366;;;:::o;16013:419::-;16179:4;16217:2;16206:9;16202:18;16194:26;;16266:9;16260:4;16256:20;16252:1;16241:9;16237:17;16230:47;16294:131;16420:4;16294:131;:::i;:::-;16286:139;;16013:419;;;:::o;16438:164::-;16578:16;16574:1;16566:6;16562:14;16555:40;16438:164;:::o;16608:366::-;16750:3;16771:67;16835:2;16830:3;16771:67;:::i;:::-;16764:74;;16847:93;16936:3;16847:93;:::i;:::-;16965:2;16960:3;16956:12;16949:19;;16608:366;;;:::o;16980:419::-;17146:4;17184:2;17173:9;17169:18;17161:26;;17233:9;17227:4;17223:20;17219:1;17208:9;17204:17;17197:47;17261:131;17387:4;17261:131;:::i;:::-;17253:139;;16980:419;;;:::o;17405:235::-;17445:4;17465:20;17483:1;17465:20;:::i;:::-;17460:25;;17499:20;17517:1;17499:20;:::i;:::-;17494:25;;17543:1;17540;17536:9;17528:17;;17567:42;17561:4;17558:52;17555:78;;;17613:18;;:::i;:::-;17555:78;17405:235;;;;:::o;17646:141::-;17695:4;17718:3;17710:11;;17741:3;17738:1;17731:14;17775:4;17772:1;17762:18;17754:26;;17646:141;;;:::o;17793:93::-;17830:6;17877:2;17872;17865:5;17861:14;17857:23;17847:33;;17793:93;;;:::o;17892:107::-;17936:8;17986:5;17980:4;17976:16;17955:37;;17892:107;;;;:::o;18005:393::-;18074:6;18124:1;18112:10;18108:18;18147:97;18177:66;18166:9;18147:97;:::i;:::-;18265:39;18295:8;18284:9;18265:39;:::i;:::-;18253:51;;18337:4;18333:9;18326:5;18322:21;18313:30;;18386:4;18376:8;18372:19;18365:5;18362:30;18352:40;;18081:317;;18005:393;;;;;:::o;18404:60::-;18432:3;18453:5;18446:12;;18404:60;;;:::o;18470:142::-;18520:9;18553:53;18571:34;18580:24;18598:5;18580:24;:::i;:::-;18571:34;:::i;:::-;18553:53;:::i;:::-;18540:66;;18470:142;;;:::o;18618:75::-;18661:3;18682:5;18675:12;;18618:75;;;:::o;18699:269::-;18809:39;18840:7;18809:39;:::i;:::-;18870:91;18919:41;18943:16;18919:41;:::i;:::-;18911:6;18904:4;18898:11;18870:91;:::i;:::-;18864:4;18857:105;18775:193;18699:269;;;:::o;18974:73::-;19019:3;18974:73;:::o;19053:189::-;19130:32;;:::i;:::-;19171:65;19229:6;19221;19215:4;19171:65;:::i;:::-;19106:136;19053:189;;:::o;19248:186::-;19308:120;19325:3;19318:5;19315:14;19308:120;;;19379:39;19416:1;19409:5;19379:39;:::i;:::-;19352:1;19345:5;19341:13;19332:22;;19308:120;;;19248:186;;:::o;19440:543::-;19541:2;19536:3;19533:11;19530:446;;;19575:38;19607:5;19575:38;:::i;:::-;19659:29;19677:10;19659:29;:::i;:::-;19649:8;19645:44;19842:2;19830:10;19827:18;19824:49;;;19863:8;19848:23;;19824:49;19886:80;19942:22;19960:3;19942:22;:::i;:::-;19932:8;19928:37;19915:11;19886:80;:::i;:::-;19545:431;;19530:446;19440:543;;;:::o;19989:117::-;20043:8;20093:5;20087:4;20083:16;20062:37;;19989:117;;;;:::o;20112:169::-;20156:6;20189:51;20237:1;20233:6;20225:5;20222:1;20218:13;20189:51;:::i;:::-;20185:56;20270:4;20264;20260:15;20250:25;;20163:118;20112:169;;;;:::o;20286:295::-;20362:4;20508:29;20533:3;20527:4;20508:29;:::i;:::-;20500:37;;20570:3;20567:1;20563:11;20557:4;20554:21;20546:29;;20286:295;;;;:::o;20586:1395::-;20703:37;20736:3;20703:37;:::i;:::-;20805:18;20797:6;20794:30;20791:56;;;20827:18;;:::i;:::-;20791:56;20871:38;20903:4;20897:11;20871:38;:::i;:::-;20956:67;21016:6;21008;21002:4;20956:67;:::i;:::-;21050:1;21074:4;21061:17;;21106:2;21098:6;21095:14;21123:1;21118:618;;;;21780:1;21797:6;21794:77;;;21846:9;21841:3;21837:19;21831:26;21822:35;;21794:77;21897:67;21957:6;21950:5;21897:67;:::i;:::-;21891:4;21884:81;21753:222;21088:887;;21118:618;21170:4;21166:9;21158:6;21154:22;21204:37;21236:4;21204:37;:::i;:::-;21263:1;21277:208;21291:7;21288:1;21285:14;21277:208;;;21370:9;21365:3;21361:19;21355:26;21347:6;21340:42;21421:1;21413:6;21409:14;21399:24;;21468:2;21457:9;21453:18;21440:31;;21314:4;21311:1;21307:12;21302:17;;21277:208;;;21513:6;21504:7;21501:19;21498:179;;;21571:9;21566:3;21562:19;21556:26;21614:48;21656:4;21648:6;21644:17;21633:9;21614:48;:::i;:::-;21606:6;21599:64;21521:156;21498:179;21723:1;21719;21711:6;21707:14;21703:22;21697:4;21690:36;21125:611;;;21088:887;;20678:1303;;;20586:1395;;:::o;21987:180::-;22127:32;22123:1;22115:6;22111:14;22104:56;21987:180;:::o;22173:366::-;22315:3;22336:67;22400:2;22395:3;22336:67;:::i;:::-;22329:74;;22412:93;22501:3;22412:93;:::i;:::-;22530:2;22525:3;22521:12;22514:19;;22173:366;;;:::o;22545:419::-;22711:4;22749:2;22738:9;22734:18;22726:26;;22798:9;22792:4;22788:20;22784:1;22773:9;22769:17;22762:47;22826:131;22952:4;22826:131;:::i;:::-;22818:139;;22545:419;;;:::o;22970:157::-;23110:9;23106:1;23098:6;23094:14;23087:33;22970:157;:::o;23133:365::-;23275:3;23296:66;23360:1;23355:3;23296:66;:::i;:::-;23289:73;;23371:93;23460:3;23371:93;:::i;:::-;23489:2;23484:3;23480:12;23473:19;;23133:365;;;:::o;23504:419::-;23670:4;23708:2;23697:9;23693:18;23685:26;;23757:9;23751:4;23747:20;23743:1;23732:9;23728:17;23721:47;23785:131;23911:4;23785:131;:::i;:::-;23777:139;;23504:419;;;:::o;23929:410::-;23969:7;23992:20;24010:1;23992:20;:::i;:::-;23987:25;;24026:20;24044:1;24026:20;:::i;:::-;24021:25;;24081:1;24078;24074:9;24103:30;24121:11;24103:30;:::i;:::-;24092:41;;24282:1;24273:7;24269:15;24266:1;24263:22;24243:1;24236:9;24216:83;24193:139;;24312:18;;:::i;:::-;24193:139;23977:362;23929:410;;;;:::o;24345:162::-;24485:14;24481:1;24473:6;24469:14;24462:38;24345:162;:::o;24513:366::-;24655:3;24676:67;24740:2;24735:3;24676:67;:::i;:::-;24669:74;;24752:93;24841:3;24752:93;:::i;:::-;24870:2;24865:3;24861:12;24854:19;;24513:366;;;:::o;24885:419::-;25051:4;25089:2;25078:9;25074:18;25066:26;;25138:9;25132:4;25128:20;25124:1;25113:9;25109:17;25102:47;25166:131;25292:4;25166:131;:::i;:::-;25158:139;;24885:419;;;:::o;25310:148::-;25412:11;25449:3;25434:18;;25310:148;;;;:::o;25464:390::-;25570:3;25598:39;25631:5;25598:39;:::i;:::-;25653:89;25735:6;25730:3;25653:89;:::i;:::-;25646:96;;25751:65;25809:6;25804:3;25797:4;25790:5;25786:16;25751:65;:::i;:::-;25841:6;25836:3;25832:16;25825:23;;25574:280;25464:390;;;;:::o;25860:435::-;26040:3;26062:95;26153:3;26144:6;26062:95;:::i;:::-;26055:102;;26174:95;26265:3;26256:6;26174:95;:::i;:::-;26167:102;;26286:3;26279:10;;25860:435;;;;;:::o;26301:225::-;26441:34;26437:1;26429:6;26425:14;26418:58;26510:8;26505:2;26497:6;26493:15;26486:33;26301:225;:::o;26532:366::-;26674:3;26695:67;26759:2;26754:3;26695:67;:::i;:::-;26688:74;;26771:93;26860:3;26771:93;:::i;:::-;26889:2;26884:3;26880:12;26873:19;;26532:366;;;:::o;26904:419::-;27070:4;27108:2;27097:9;27093:18;27085:26;;27157:9;27151:4;27147:20;27143:1;27132:9;27128:17;27121:47;27185:131;27311:4;27185:131;:::i;:::-;27177:139;;26904:419;;;:::o;27329:182::-;27469:34;27465:1;27457:6;27453:14;27446:58;27329:182;:::o;27517:366::-;27659:3;27680:67;27744:2;27739:3;27680:67;:::i;:::-;27673:74;;27756:93;27845:3;27756:93;:::i;:::-;27874:2;27869:3;27865:12;27858:19;;27517:366;;;:::o;27889:419::-;28055:4;28093:2;28082:9;28078:18;28070:26;;28142:9;28136:4;28132:20;28128:1;28117:9;28113:17;28106:47;28170:131;28296:4;28170:131;:::i;:::-;28162:139;;27889:419;;;:::o;28314:98::-;28365:6;28399:5;28393:12;28383:22;;28314:98;;;:::o;28418:168::-;28501:11;28535:6;28530:3;28523:19;28575:4;28570:3;28566:14;28551:29;;28418:168;;;;:::o;28592:373::-;28678:3;28706:38;28738:5;28706:38;:::i;:::-;28760:70;28823:6;28818:3;28760:70;:::i;:::-;28753:77;;28839:65;28897:6;28892:3;28885:4;28878:5;28874:16;28839:65;:::i;:::-;28929:29;28951:6;28929:29;:::i;:::-;28924:3;28920:39;28913:46;;28682:283;28592:373;;;;:::o;28971:640::-;29166:4;29204:3;29193:9;29189:19;29181:27;;29218:71;29286:1;29275:9;29271:17;29262:6;29218:71;:::i;:::-;29299:72;29367:2;29356:9;29352:18;29343:6;29299:72;:::i;:::-;29381;29449:2;29438:9;29434:18;29425:6;29381:72;:::i;:::-;29500:9;29494:4;29490:20;29485:2;29474:9;29470:18;29463:48;29528:76;29599:4;29590:6;29528:76;:::i;:::-;29520:84;;28971:640;;;;;;;:::o;29617:141::-;29673:5;29704:6;29698:13;29689:22;;29720:32;29746:5;29720:32;:::i;:::-;29617:141;;;;:::o;29764:349::-;29833:6;29882:2;29870:9;29861:7;29857:23;29853:32;29850:119;;;29888:79;;:::i;:::-;29850:119;30008:1;30033:63;30088:7;30079:6;30068:9;30064:22;30033:63;:::i;:::-;30023:73;;29979:127;29764:349;;;;:::o;30119:233::-;30158:3;30181:24;30199:5;30181:24;:::i;:::-;30172:33;;30227:66;30220:5;30217:77;30214:103;;30297:18;;:::i;:::-;30214:103;30344:1;30337:5;30333:13;30326:20;;30119:233;;;:::o;30358:180::-;30406:77;30403:1;30396:88;30503:4;30500:1;30493:15;30527:4;30524:1;30517:15;30544:185;30584:1;30601:20;30619:1;30601:20;:::i;:::-;30596:25;;30635:20;30653:1;30635:20;:::i;:::-;30630:25;;30674:1;30664:35;;30679:18;;:::i;:::-;30664:35;30721:1;30718;30714:9;30709:14;;30544:185;;;;:::o;30735:194::-;30775:4;30795:20;30813:1;30795:20;:::i;:::-;30790:25;;30829:20;30847:1;30829:20;:::i;:::-;30824:25;;30873:1;30870;30866:9;30858:17;;30897:1;30891:4;30888:11;30885:37;;;30902:18;;:::i;:::-;30885:37;30735:194;;;;:::o;30935:176::-;30967:1;30984:20;31002:1;30984:20;:::i;:::-;30979:25;;31018:20;31036:1;31018:20;:::i;:::-;31013:25;;31057:1;31047:35;;31062:18;;:::i;:::-;31047:35;31103:1;31100;31096:9;31091:14;;30935:176;;;;:::o;31117:180::-;31165:77;31162:1;31155:88;31262:4;31259:1;31252:15;31286:4;31283:1;31276:15

Swarm Source

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