ETH Price: $2,450.59 (-1.17%)

Toxic Turtles (TT)
 

Overview

TokenID

1750

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
ToxicTurtles

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.4;

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



pragma solidity ^0.8.4;


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




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


   

pragma solidity ^0.8.0;


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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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





// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

// 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 v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



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


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity >=0.8.4 <0.9.0;




contract ToxicTurtles is ERC721A, Ownable, ReentrancyGuard, ERC2981 {

  using Strings for uint256;

  string public uriPrefix = '';
  string public uriSuffix = '.json';
  
  uint256 public presalePrice;
  uint256 public publicPrice;
  uint256 public maxSupply;
  uint256 public maxPresale;
  uint256 public maxPublic; 
  uint256 public maxMintAmountPerTx;

  address public signerAddress;
  address public constant proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;

  mapping(address => uint256) public preSaleListCounter;
  mapping(address => uint256) public publicCounter;

  uint256 public saleStatus;

  constructor() ERC721A("Toxic Turtles", "TT") {
    _setDefaultRoyalty(0xD31e11a3620Ec6e4409A4A811d862034e54b8C77, 500);
    presalePrice = 0 ether;
    publicPrice = 0.03 ether;
    maxSupply = 5000;
    maxPresale = 1;
    maxPublic = 5;
    maxMintAmountPerTx = 5;    
    signerAddress = 0x7C6B970eF4E98E973830735a3eE89c2BAA8A1b1C;
    setUriPrefix("https://gateway.pinata.cloud/ipfs/Qmbhv5d1sajQuuj91wB8GBCX3E5D5ZkmtGmw87zW6nQZVG/");
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(tx.origin == msg.sender, "The caller is another contract");
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  }


  function whitelistMint(bytes memory sig) public payable mintCompliance(1) {
    require(saleStatus == 1, "The whitelist sale is not enabled!");
    require(verify(sig, _msgSender()), "Sorry, but you are not in WL");
    require(msg.value >= presalePrice, 'Insufficient funds!');
    require(preSaleListCounter[_msgSender()] + 1 <= maxPresale,"Exceeded max available to purchase");
    preSaleListCounter[_msgSender()] += 1;
    _safeMint(_msgSender(), 1);
  }

  function publicMint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(saleStatus==2, 'Public mint disabled');
    require(msg.value >= publicPrice * _mintAmount, 'Insufficient funds!');
    require(publicCounter[_msgSender()] + _mintAmount <= maxPublic,"exceeds max per address");
    publicCounter[_msgSender()] += _mintAmount;
    _safeMint(_msgSender(), _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _safeMint(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = _startTokenId();
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId < maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

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

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI,_tokenId.toString(), uriSuffix))
        : '';
  }


//*******************ADMIN AREA********************

  function setSignerAddress(address newSigner) public onlyOwner {
      signerAddress = newSigner;
  }

  function setPresalePrice(uint256 _cost) public onlyOwner {
    presalePrice = _cost;
  }

    function setPublicPrice(uint256 _cost) public onlyOwner {
    publicPrice = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

    function setMaxPresale(uint256 _maxMintAmountPresale) public onlyOwner {
    maxPresale = _maxMintAmountPresale;
  }

    function setMaxPublic(uint256 _maxMintAmountPublic) public onlyOwner {
    maxPublic = _maxMintAmountPublic;
  }

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

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }


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

  function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) public {
      _setDefaultRoyalty(_receiver, _feeNumerator);
  }

  function setSaleStatus(uint256 _status) public onlyOwner {
    saleStatus = _status;
  }

  function withdraw() public onlyOwner nonReentrant {

   (bool hs, ) = payable(0x2399e46f0103E3c1266A3e4e672CE806FB9E6d60).call{value: address(this).balance * 6 / 100}('');
    require(hs);

    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
  }

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

//*****************************OPENSEA PROXY*********************************

  function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }


//*****************************SIGNATURE*********************************

function getMessageHash(address _message) public pure returns(bytes32) 
{ 
    return keccak256(abi.encodePacked(_message)); 
} 
 
function getMessageHashEth(bytes32 _sender) public pure returns(bytes32) 
{ 
    bytes memory prefix = "\x19Ethereum Signed Message:\n32"; 
    return keccak256(abi.encodePacked(prefix,_sender)); 
} 
 
function verify(bytes memory _signature, address sender) public view returns(bool) 
{ 
    bytes32 messageHas = getMessageHash(sender); 
    bytes32 messageHashEth = getMessageHashEth(messageHas);     
    return recoverSigner(messageHashEth, _signature) == signerAddress; 
 
} 
 
function recoverSigner(bytes32 _messageHash, bytes memory _signature) public pure returns (address) 
{ 
    (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); 
    return ecrecover(_messageHash, v ,r, s); 
} 
 
function splitSignature(bytes memory _sig) public pure returns (bytes32 r, bytes32 s, uint8 v) 
{ 
    require(_sig.length == 65, "invalid signature length"); 
     
    assembly { 
        r := mload(add(_sig, 32)) 
        s := mload(add(_sig, 64)) 
        v := byte(0, mload(add(_sig, 96))) 
    } 
} 


}

contract OwnableDelegateProxy { }
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

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":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_message","type":"address"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_sender","type":"bytes32"}],"name":"getMessageHashEth","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleListCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_messageHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPresale","type":"uint256"}],"name":"setMaxPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPublic","type":"uint256"}],"name":"setMaxPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"stateMutability":"pure","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":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"address","name":"sender","type":"address"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600c9162000344565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a91600d9162000344565b503480156200005857600080fd5b506040518060400160405280600d81526020016c546f78696320547572746c657360981b81525060405180604001604052806002815260200161151560f21b8152508160029080519060200190620000b292919062000344565b508051620000c890600390602084019062000344565b5050600160005550620000db3362000178565b60016009556200010273d31e11a3620ec6e4409a4a811d862034e54b8c776101f4620001ca565b6000600e55666a94d74f430000600f55611388601055600160115560056012819055601355601480546001600160a01b031916737c6b970ef4e98e973830735a3ee89c2baa8a1b1c17905560408051608081019091526051808252620001729190620031926020830139620002cf565b62000427565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b03821611156200023e5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620002965760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000235565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6008546001600160a01b031633146200032b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000235565b80516200034090600c90602084019062000344565b5050565b8280546200035290620003ea565b90600052602060002090601f016020900481019282620003765760008555620003c1565b82601f106200039157805160ff1916838001178555620003c1565b82800160010185558215620003c1579182015b82811115620003c1578251825591602001919060010190620003a4565b50620003cf929150620003d3565b5090565b5b80821115620003cf5760008155600101620003d4565b600181811c90821680620003ff57607f821691505b602082108114156200042157634e487b7160e01b600052602260045260246000fd5b50919050565b612d5b80620004376000396000f3fe6080604052600436106102e35760003560e01c80636352211e11610190578063b071401b116100dc578063d5abeb0111610095578063f29f15af1161006f578063f29f15af146108e2578063f2fde38b14610902578063f9020e3314610922578063fbdb84941461093857600080fd5b8063d5abeb011461088c578063e985e9c5146108a2578063efbd73f4146108c257600080fd5b8063b071401b146107b7578063b88d4fde146107d7578063c07a28f3146107f7578063c627525514610824578063c87b56dd14610844578063cd7c03261461086457600080fd5b80638da5cb5b1161014957806397aba7f91161012357806397aba7f914610723578063a22cb46514610743578063a7bb580314610763578063a945bf80146107a157600080fd5b80638da5cb5b146106da57806394354fd0146106f857806395d89b411461070e57600080fd5b80636352211e14610622578063656f7d951461064257806370a082311461066f578063715018a61461068f5780637dc42975146106a45780637ec4a659146106ba57600080fd5b80632142ab291161024f5780633ccfd60b11610208578063438b6300116101e2578063438b6300146105ab5780635503a0e8146105d85780635b7633d0146105ed57806362b99ad41461060d57600080fd5b80633ccfd60b146105565780633d3ac1b51461056b57806342842e0e1461058b57600080fd5b80632142ab291461049b57806323b872dd146104b15780632a55205a146104d15780632db11544146105105780633549345e1461052357806337bc4c0b1461054357600080fd5b8063095ea7b3116102a1578063095ea7b3146103dd57806311923e75146103fd57806316ba10e01461041d57806318160ddd1461043d5780631bbc1afa1461045b5780631f5ac1b21461047b57600080fd5b80620e7fa8146102e857806301ffc9a71461031157806304634d8d14610341578063046dc1661461036357806306fdde0314610383578063081812fc146103a5575b600080fd5b3480156102f457600080fd5b506102fe600e5481565b6040519081526020015b60405180910390f35b34801561031d57600080fd5b5061033161032c366004612800565b610958565b6040519015158152602001610308565b34801561034d57600080fd5b5061036161035c36600461276c565b61099e565b005b34801561036f57600080fd5b5061036161037e366004612613565b6109ac565b34801561038f57600080fd5b50610398610a01565b6040516103089190612ae5565b3480156103b157600080fd5b506103c56103c03660046127a4565b610a93565b6040516001600160a01b039091168152602001610308565b3480156103e957600080fd5b506103616103f8366004612741565b610ad7565b34801561040957600080fd5b506102fe6104183660046127a4565b610b65565b34801561042957600080fd5b506103616104383660046128ca565b610bd1565b34801561044957600080fd5b506102fe600154600054036000190190565b34801561046757600080fd5b506103616104763660046127a4565b610c0e565b34801561048757600080fd5b506102fe610496366004612613565b610c3d565b3480156104a757600080fd5b506102fe60115481565b3480156104bd57600080fd5b506103616104cc366004612667565b610c7c565b3480156104dd57600080fd5b506104f16104ec366004612933565b610c87565b604080516001600160a01b039093168352602083019190915201610308565b61036161051e3660046127a4565b610d33565b34801561052f57600080fd5b5061036161053e3660046127a4565b610ef5565b610361610551366004612838565b610f24565b34801561056257600080fd5b50610361611153565b34801561057757600080fd5b5061033161058636600461286a565b6112cc565b34801561059757600080fd5b506103616105a6366004612667565b611311565b3480156105b757600080fd5b506105cb6105c6366004612613565b61132c565b6040516103089190612aa1565b3480156105e457600080fd5b50610398611427565b3480156105f957600080fd5b506014546103c5906001600160a01b031681565b34801561061957600080fd5b506103986114b5565b34801561062e57600080fd5b506103c561063d3660046127a4565b6114c2565b34801561064e57600080fd5b506102fe61065d366004612613565b60156020526000908152604090205481565b34801561067b57600080fd5b506102fe61068a366004612613565b6114d4565b34801561069b57600080fd5b50610361611522565b3480156106b057600080fd5b506102fe60125481565b3480156106c657600080fd5b506103616106d53660046128ca565b611558565b3480156106e657600080fd5b506008546001600160a01b03166103c5565b34801561070457600080fd5b506102fe60135481565b34801561071a57600080fd5b50610398611595565b34801561072f57600080fd5b506103c561073e3660046127bc565b6115a4565b34801561074f57600080fd5b5061036161075e366004612710565b611623565b34801561076f57600080fd5b5061078361077e366004612838565b6116b9565b60408051938452602084019290925260ff1690820152606001610308565b3480156107ad57600080fd5b506102fe600f5481565b3480156107c357600080fd5b506103616107d23660046127a4565b61172d565b3480156107e357600080fd5b506103616107f23660046126a7565b61175c565b34801561080357600080fd5b506102fe610812366004612613565b60166020526000908152604090205481565b34801561083057600080fd5b5061036161083f3660046127a4565b6117ad565b34801561085057600080fd5b5061039861085f3660046127a4565b6117dc565b34801561087057600080fd5b506103c573a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561089857600080fd5b506102fe60105481565b3480156108ae57600080fd5b506103316108bd36600461262f565b6118aa565b3480156108ce57600080fd5b506103616108dd36600461290f565b611989565b3480156108ee57600080fd5b506103616108fd3660046127a4565b611a48565b34801561090e57600080fd5b5061036161091d366004612613565b611a77565b34801561092e57600080fd5b506102fe60175481565b34801561094457600080fd5b506103616109533660046127a4565b611b12565b60006001600160e01b0319821663152a902d60e11b148061098957506001600160e01b031982166380ac58cd60e01b145b80610998575061099882611b41565b92915050565b6109a88282611b66565b5050565b6008546001600160a01b031633146109df5760405162461bcd60e51b81526004016109d690612b5d565b60405180910390fd5b601480546001600160a01b0319166001600160a01b0392909216919091179055565b606060028054610a1090612c4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3c90612c4e565b8015610a895780601f10610a5e57610100808354040283529160200191610a89565b820191906000526020600020905b815481529060010190602001808311610a6c57829003601f168201915b5050505050905090565b6000610a9e82611c63565b610abb576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ae2826114c2565b9050806001600160a01b0316836001600160a01b03161415610b175760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b375750610b3581336118aa565b155b15610b55576040516367d9dca160e11b815260040160405180910390fd5b610b60838383611c9c565b505050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090508083604051602001610bb3929190612980565b60405160208183030381529060405280519060200120915050919050565b6008546001600160a01b03163314610bfb5760405162461bcd60e51b81526004016109d690612b5d565b80516109a890600d9060208401906124e6565b6008546001600160a01b03163314610c385760405162461bcd60e51b81526004016109d690612b5d565b601155565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b610b60838383611cf8565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610cfc575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610d1b906001600160601b031687612bec565b610d259190612bd8565b915196919550909350505050565b80323314610d535760405162461bcd60e51b81526004016109d690612b26565b600081118015610d6557506013548111155b610d815760405162461bcd60e51b81526004016109d690612af8565b60105481610d96600154600054036000190190565b610da09190612bc0565b1115610dbe5760405162461bcd60e51b81526004016109d690612b92565b601754600214610e075760405162461bcd60e51b8152602060048201526014602482015273141d589b1a58c81b5a5b9d08191a5cd8589b195960621b60448201526064016109d6565b81600f54610e159190612bec565b341015610e5a5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109d6565b60125433600090815260166020526040902054610e78908490612bc0565b1115610ec65760405162461bcd60e51b815260206004820152601760248201527f65786365656473206d617820706572206164647265737300000000000000000060448201526064016109d6565b3360009081526016602052604081208054849290610ee5908490612bc0565b909155506109a890503383611f0c565b6008546001600160a01b03163314610f1f5760405162461bcd60e51b81526004016109d690612b5d565b600e55565b6001323314610f455760405162461bcd60e51b81526004016109d690612b26565b600081118015610f5757506013548111155b610f735760405162461bcd60e51b81526004016109d690612af8565b60105481610f88600154600054036000190190565b610f929190612bc0565b1115610fb05760405162461bcd60e51b81526004016109d690612b92565b60175460011461100d5760405162461bcd60e51b815260206004820152602260248201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604482015261642160f01b60648201526084016109d6565b61101782336112cc565b6110635760405162461bcd60e51b815260206004820152601c60248201527f536f7272792c2062757420796f7520617265206e6f7420696e20574c0000000060448201526064016109d6565b600e543410156110ab5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109d6565b601154336000908152601560205260409020546110c9906001612bc0565b11156111225760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b60648201526084016109d6565b336000908152601560205260408120805460019290611142908490612bc0565b909155506109a89050336001611f0c565b6008546001600160a01b0316331461117d5760405162461bcd60e51b81526004016109d690612b5d565b600260095414156111d05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109d6565b60026009556000732399e46f0103e3c1266a3e4e672ce806fb9e6d6060646111f9476006612bec565b6112039190612bd8565b604051600081818185875af1925050503d806000811461123f576040519150601f19603f3d011682016040523d82523d6000602084013e611244565b606091505b505090508061125257600080fd5b60006112666008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146112b0576040519150601f19603f3d011682016040523d82523d6000602084013e6112b5565b606091505b50509050806112c357600080fd5b50506001600955565b6000806112d883610c3d565b905060006112e582610b65565b6014549091506001600160a01b03166112fe82876115a4565b6001600160a01b03161495945050505050565b610b608383836040518060200160405280600081525061175c565b60606000611339836114d4565b90506000816001600160401b0381111561136357634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561138c578160200160208202803683370190505b509050600160005b83811080156113a4575060105482105b1561141d5760006113b4836114c2565b9050866001600160a01b0316816001600160a01b0316141561140a57828483815181106113f157634e487b7160e01b600052603260045260246000fd5b60209081029190910101528161140681612c89565b9250505b8261141481612c89565b93505050611394565b5090949350505050565b600d805461143490612c4e565b80601f016020809104026020016040519081016040528092919081815260200182805461146090612c4e565b80156114ad5780601f10611482576101008083540402835291602001916114ad565b820191906000526020600020905b81548152906001019060200180831161149057829003601f168201915b505050505081565b600c805461143490612c4e565b60006114cd82611f26565b5192915050565b60006001600160a01b0382166114fd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461154c5760405162461bcd60e51b81526004016109d690612b5d565b611556600061204d565b565b6008546001600160a01b031633146115825760405162461bcd60e51b81526004016109d690612b5d565b80516109a890600c9060208401906124e6565b606060038054610a1090612c4e565b6000806000806115b3856116b9565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa15801561160e573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6001600160a01b03821633141561164d5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000806000835160411461170f5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016109d6565b50505060208101516040820151606090920151909260009190911a90565b6008546001600160a01b031633146117575760405162461bcd60e51b81526004016109d690612b5d565b601355565b611767848484611cf8565b6001600160a01b0383163b1515801561178957506117878484848461209f565b155b156117a7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117d75760405162461bcd60e51b81526004016109d690612b5d565b600f55565b60606117e782611c63565b61184b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d6565b6000611855612196565b9050600081511161187557604051806020016040528060008152506118a3565b8061187f846121a5565b600d604051602001611893939291906129a2565b6040516020818303038152906040525b9392505050565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b15801561190657600080fd5b505afa15801561191a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193e91906128ae565b6001600160a01b03161415611957576001915050610998565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b813233146119a95760405162461bcd60e51b81526004016109d690612b26565b6000811180156119bb57506013548111155b6119d75760405162461bcd60e51b81526004016109d690612af8565b601054816119ec600154600054036000190190565b6119f69190612bc0565b1115611a145760405162461bcd60e51b81526004016109d690612b92565b6008546001600160a01b03163314611a3e5760405162461bcd60e51b81526004016109d690612b5d565b610b608284611f0c565b6008546001600160a01b03163314611a725760405162461bcd60e51b81526004016109d690612b5d565b601755565b6008546001600160a01b03163314611aa15760405162461bcd60e51b81526004016109d690612b5d565b6001600160a01b038116611b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d6565b611b0f8161204d565b50565b6008546001600160a01b03163314611b3c5760405162461bcd60e51b81526004016109d690612b5d565b601255565b60006001600160e01b0319821663152a902d60e11b14806109985750610998826122be565b6127106001600160601b0382161115611bd45760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109d6565b6001600160a01b038216611c2a5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109d6565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b600081600111158015611c77575060005482105b8015610998575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611d0382611f26565b80519091506000906001600160a01b0316336001600160a01b03161480611d3157508151611d3190336118aa565b80611d4c575033611d4184610a93565b6001600160a01b0316145b905080611d6c57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611da15760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611dc857604051633a954ecd60e21b815260040160405180910390fd5b611dd86000848460000151611c9c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611ec257600054811015611ec257825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6109a882826040518060200160405280600081525061230e565b60408051606081018252600080825260208201819052918101919091528180600111158015611f56575060005481105b1561203457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120325780516001600160a01b031615611fc9579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561202d579392505050565b611fc9565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906120d4903390899088908890600401612a64565b602060405180830381600087803b1580156120ee57600080fd5b505af192505050801561211e575060408051601f3d908101601f1916820190925261211b9181019061281c565b60015b612179573d80801561214c576040519150601f19603f3d011682016040523d82523d6000602084013e612151565b606091505b508051612171576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600c8054610a1090612c4e565b6060816121c95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121f357806121dd81612c89565b91506121ec9050600a83612bd8565b91506121cd565b6000816001600160401b0381111561221b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612245576020820181803683370190505b5090505b84156119815761225a600183612c0b565b9150612267600a86612ca4565b612272906030612bc0565b60f81b81838151811061229557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122b7600a86612bd8565b9450612249565b60006001600160e01b031982166380ac58cd60e01b14806122ef57506001600160e01b03198216635b5e139f60e01b145b8061099857506301ffc9a760e01b6001600160e01b0319831614610998565b610b6083838360016000546001600160a01b03851661233f57604051622e076360e81b815260040160405180910390fd5b8361235d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561240e57506001600160a01b0387163b15155b15612497575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461245f600088848060010195508861209f565b61247c576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561241457826000541461249257600080fd5b6124dd565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612498575b50600055611f05565b8280546124f290612c4e565b90600052602060002090601f016020900481019282612514576000855561255a565b82601f1061252d57805160ff191683800117855561255a565b8280016001018555821561255a579182015b8281111561255a57825182559160200191906001019061253f565b5061256692915061256a565b5090565b5b80821115612566576000815560010161256b565b60006001600160401b038084111561259957612599612ce4565b604051601f8501601f19908116603f011681019082821181831017156125c1576125c1612ce4565b816040528093508581528686860111156125da57600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112612604578081fd5b6118a38383356020850161257f565b600060208284031215612624578081fd5b81356118a381612cfa565b60008060408385031215612641578081fd5b823561264c81612cfa565b9150602083013561265c81612cfa565b809150509250929050565b60008060006060848603121561267b578081fd5b833561268681612cfa565b9250602084013561269681612cfa565b929592945050506040919091013590565b600080600080608085870312156126bc578081fd5b84356126c781612cfa565b935060208501356126d781612cfa565b92506040850135915060608501356001600160401b038111156126f8578182fd5b612704878288016125f4565b91505092959194509250565b60008060408385031215612722578182fd5b823561272d81612cfa565b91506020830135801515811461265c578182fd5b60008060408385031215612753578182fd5b823561275e81612cfa565b946020939093013593505050565b6000806040838503121561277e578182fd5b823561278981612cfa565b915060208301356001600160601b038116811461265c578182fd5b6000602082840312156127b5578081fd5b5035919050565b600080604083850312156127ce578182fd5b8235915060208301356001600160401b038111156127ea578182fd5b6127f6858286016125f4565b9150509250929050565b600060208284031215612811578081fd5b81356118a381612d0f565b60006020828403121561282d578081fd5b81516118a381612d0f565b600060208284031215612849578081fd5b81356001600160401b0381111561285e578182fd5b611981848285016125f4565b6000806040838503121561287c578182fd5b82356001600160401b03811115612891578283fd5b61289d858286016125f4565b925050602083013561265c81612cfa565b6000602082840312156128bf578081fd5b81516118a381612cfa565b6000602082840312156128db578081fd5b81356001600160401b038111156128f0578182fd5b8201601f81018413612900578182fd5b6119818482356020840161257f565b60008060408385031215612921578182fd5b82359150602083013561265c81612cfa565b60008060408385031215612945578182fd5b50508035926020909101359150565b6000815180845261296c816020860160208601612c22565b601f01601f19169290920160200192915050565b60008351612992818460208801612c22565b9190910191825250602001919050565b6000845160206129b58285838a01612c22565b8551918401916129c88184848a01612c22565b85549201918390600181811c90808316806129e457607f831692505b858310811415612a0257634e487b7160e01b88526022600452602488fd5b808015612a165760018114612a2757612a53565b60ff19851688528388019550612a53565b60008b815260209020895b85811015612a4b5781548a820152908401908801612a32565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a9790830184612954565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ad957835183529284019291840191600101612abd565b50909695505050505050565b6020815260006118a36020830184612954565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60008219821115612bd357612bd3612cb8565b500190565b600082612be757612be7612cce565b500490565b6000816000190483118215151615612c0657612c06612cb8565b500290565b600082821015612c1d57612c1d612cb8565b500390565b60005b83811015612c3d578181015183820152602001612c25565b838111156117a75750506000910152565b600181811c90821680612c6257607f821691505b60208210811415612c8357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c9d57612c9d612cb8565b5060010190565b600082612cb357612cb3612cce565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611b0f57600080fd5b6001600160e01b031981168114611b0f57600080fdfea264697066735822122024fb94025b58b55e87d3abae056200c339ee424a26aee6370646619d2f0e173364736f6c6343000804003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d62687635643173616a5175756a39317742384742435833453544355a6b6d74476d7738377a57366e515a56472f

Deployed Bytecode

0x6080604052600436106102e35760003560e01c80636352211e11610190578063b071401b116100dc578063d5abeb0111610095578063f29f15af1161006f578063f29f15af146108e2578063f2fde38b14610902578063f9020e3314610922578063fbdb84941461093857600080fd5b8063d5abeb011461088c578063e985e9c5146108a2578063efbd73f4146108c257600080fd5b8063b071401b146107b7578063b88d4fde146107d7578063c07a28f3146107f7578063c627525514610824578063c87b56dd14610844578063cd7c03261461086457600080fd5b80638da5cb5b1161014957806397aba7f91161012357806397aba7f914610723578063a22cb46514610743578063a7bb580314610763578063a945bf80146107a157600080fd5b80638da5cb5b146106da57806394354fd0146106f857806395d89b411461070e57600080fd5b80636352211e14610622578063656f7d951461064257806370a082311461066f578063715018a61461068f5780637dc42975146106a45780637ec4a659146106ba57600080fd5b80632142ab291161024f5780633ccfd60b11610208578063438b6300116101e2578063438b6300146105ab5780635503a0e8146105d85780635b7633d0146105ed57806362b99ad41461060d57600080fd5b80633ccfd60b146105565780633d3ac1b51461056b57806342842e0e1461058b57600080fd5b80632142ab291461049b57806323b872dd146104b15780632a55205a146104d15780632db11544146105105780633549345e1461052357806337bc4c0b1461054357600080fd5b8063095ea7b3116102a1578063095ea7b3146103dd57806311923e75146103fd57806316ba10e01461041d57806318160ddd1461043d5780631bbc1afa1461045b5780631f5ac1b21461047b57600080fd5b80620e7fa8146102e857806301ffc9a71461031157806304634d8d14610341578063046dc1661461036357806306fdde0314610383578063081812fc146103a5575b600080fd5b3480156102f457600080fd5b506102fe600e5481565b6040519081526020015b60405180910390f35b34801561031d57600080fd5b5061033161032c366004612800565b610958565b6040519015158152602001610308565b34801561034d57600080fd5b5061036161035c36600461276c565b61099e565b005b34801561036f57600080fd5b5061036161037e366004612613565b6109ac565b34801561038f57600080fd5b50610398610a01565b6040516103089190612ae5565b3480156103b157600080fd5b506103c56103c03660046127a4565b610a93565b6040516001600160a01b039091168152602001610308565b3480156103e957600080fd5b506103616103f8366004612741565b610ad7565b34801561040957600080fd5b506102fe6104183660046127a4565b610b65565b34801561042957600080fd5b506103616104383660046128ca565b610bd1565b34801561044957600080fd5b506102fe600154600054036000190190565b34801561046757600080fd5b506103616104763660046127a4565b610c0e565b34801561048757600080fd5b506102fe610496366004612613565b610c3d565b3480156104a757600080fd5b506102fe60115481565b3480156104bd57600080fd5b506103616104cc366004612667565b610c7c565b3480156104dd57600080fd5b506104f16104ec366004612933565b610c87565b604080516001600160a01b039093168352602083019190915201610308565b61036161051e3660046127a4565b610d33565b34801561052f57600080fd5b5061036161053e3660046127a4565b610ef5565b610361610551366004612838565b610f24565b34801561056257600080fd5b50610361611153565b34801561057757600080fd5b5061033161058636600461286a565b6112cc565b34801561059757600080fd5b506103616105a6366004612667565b611311565b3480156105b757600080fd5b506105cb6105c6366004612613565b61132c565b6040516103089190612aa1565b3480156105e457600080fd5b50610398611427565b3480156105f957600080fd5b506014546103c5906001600160a01b031681565b34801561061957600080fd5b506103986114b5565b34801561062e57600080fd5b506103c561063d3660046127a4565b6114c2565b34801561064e57600080fd5b506102fe61065d366004612613565b60156020526000908152604090205481565b34801561067b57600080fd5b506102fe61068a366004612613565b6114d4565b34801561069b57600080fd5b50610361611522565b3480156106b057600080fd5b506102fe60125481565b3480156106c657600080fd5b506103616106d53660046128ca565b611558565b3480156106e657600080fd5b506008546001600160a01b03166103c5565b34801561070457600080fd5b506102fe60135481565b34801561071a57600080fd5b50610398611595565b34801561072f57600080fd5b506103c561073e3660046127bc565b6115a4565b34801561074f57600080fd5b5061036161075e366004612710565b611623565b34801561076f57600080fd5b5061078361077e366004612838565b6116b9565b60408051938452602084019290925260ff1690820152606001610308565b3480156107ad57600080fd5b506102fe600f5481565b3480156107c357600080fd5b506103616107d23660046127a4565b61172d565b3480156107e357600080fd5b506103616107f23660046126a7565b61175c565b34801561080357600080fd5b506102fe610812366004612613565b60166020526000908152604090205481565b34801561083057600080fd5b5061036161083f3660046127a4565b6117ad565b34801561085057600080fd5b5061039861085f3660046127a4565b6117dc565b34801561087057600080fd5b506103c573a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561089857600080fd5b506102fe60105481565b3480156108ae57600080fd5b506103316108bd36600461262f565b6118aa565b3480156108ce57600080fd5b506103616108dd36600461290f565b611989565b3480156108ee57600080fd5b506103616108fd3660046127a4565b611a48565b34801561090e57600080fd5b5061036161091d366004612613565b611a77565b34801561092e57600080fd5b506102fe60175481565b34801561094457600080fd5b506103616109533660046127a4565b611b12565b60006001600160e01b0319821663152a902d60e11b148061098957506001600160e01b031982166380ac58cd60e01b145b80610998575061099882611b41565b92915050565b6109a88282611b66565b5050565b6008546001600160a01b031633146109df5760405162461bcd60e51b81526004016109d690612b5d565b60405180910390fd5b601480546001600160a01b0319166001600160a01b0392909216919091179055565b606060028054610a1090612c4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3c90612c4e565b8015610a895780601f10610a5e57610100808354040283529160200191610a89565b820191906000526020600020905b815481529060010190602001808311610a6c57829003601f168201915b5050505050905090565b6000610a9e82611c63565b610abb576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ae2826114c2565b9050806001600160a01b0316836001600160a01b03161415610b175760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b375750610b3581336118aa565b155b15610b55576040516367d9dca160e11b815260040160405180910390fd5b610b60838383611c9c565b505050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090508083604051602001610bb3929190612980565b60405160208183030381529060405280519060200120915050919050565b6008546001600160a01b03163314610bfb5760405162461bcd60e51b81526004016109d690612b5d565b80516109a890600d9060208401906124e6565b6008546001600160a01b03163314610c385760405162461bcd60e51b81526004016109d690612b5d565b601155565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b610b60838383611cf8565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610cfc575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610d1b906001600160601b031687612bec565b610d259190612bd8565b915196919550909350505050565b80323314610d535760405162461bcd60e51b81526004016109d690612b26565b600081118015610d6557506013548111155b610d815760405162461bcd60e51b81526004016109d690612af8565b60105481610d96600154600054036000190190565b610da09190612bc0565b1115610dbe5760405162461bcd60e51b81526004016109d690612b92565b601754600214610e075760405162461bcd60e51b8152602060048201526014602482015273141d589b1a58c81b5a5b9d08191a5cd8589b195960621b60448201526064016109d6565b81600f54610e159190612bec565b341015610e5a5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109d6565b60125433600090815260166020526040902054610e78908490612bc0565b1115610ec65760405162461bcd60e51b815260206004820152601760248201527f65786365656473206d617820706572206164647265737300000000000000000060448201526064016109d6565b3360009081526016602052604081208054849290610ee5908490612bc0565b909155506109a890503383611f0c565b6008546001600160a01b03163314610f1f5760405162461bcd60e51b81526004016109d690612b5d565b600e55565b6001323314610f455760405162461bcd60e51b81526004016109d690612b26565b600081118015610f5757506013548111155b610f735760405162461bcd60e51b81526004016109d690612af8565b60105481610f88600154600054036000190190565b610f929190612bc0565b1115610fb05760405162461bcd60e51b81526004016109d690612b92565b60175460011461100d5760405162461bcd60e51b815260206004820152602260248201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604482015261642160f01b60648201526084016109d6565b61101782336112cc565b6110635760405162461bcd60e51b815260206004820152601c60248201527f536f7272792c2062757420796f7520617265206e6f7420696e20574c0000000060448201526064016109d6565b600e543410156110ab5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109d6565b601154336000908152601560205260409020546110c9906001612bc0565b11156111225760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b60648201526084016109d6565b336000908152601560205260408120805460019290611142908490612bc0565b909155506109a89050336001611f0c565b6008546001600160a01b0316331461117d5760405162461bcd60e51b81526004016109d690612b5d565b600260095414156111d05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109d6565b60026009556000732399e46f0103e3c1266a3e4e672ce806fb9e6d6060646111f9476006612bec565b6112039190612bd8565b604051600081818185875af1925050503d806000811461123f576040519150601f19603f3d011682016040523d82523d6000602084013e611244565b606091505b505090508061125257600080fd5b60006112666008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146112b0576040519150601f19603f3d011682016040523d82523d6000602084013e6112b5565b606091505b50509050806112c357600080fd5b50506001600955565b6000806112d883610c3d565b905060006112e582610b65565b6014549091506001600160a01b03166112fe82876115a4565b6001600160a01b03161495945050505050565b610b608383836040518060200160405280600081525061175c565b60606000611339836114d4565b90506000816001600160401b0381111561136357634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561138c578160200160208202803683370190505b509050600160005b83811080156113a4575060105482105b1561141d5760006113b4836114c2565b9050866001600160a01b0316816001600160a01b0316141561140a57828483815181106113f157634e487b7160e01b600052603260045260246000fd5b60209081029190910101528161140681612c89565b9250505b8261141481612c89565b93505050611394565b5090949350505050565b600d805461143490612c4e565b80601f016020809104026020016040519081016040528092919081815260200182805461146090612c4e565b80156114ad5780601f10611482576101008083540402835291602001916114ad565b820191906000526020600020905b81548152906001019060200180831161149057829003601f168201915b505050505081565b600c805461143490612c4e565b60006114cd82611f26565b5192915050565b60006001600160a01b0382166114fd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461154c5760405162461bcd60e51b81526004016109d690612b5d565b611556600061204d565b565b6008546001600160a01b031633146115825760405162461bcd60e51b81526004016109d690612b5d565b80516109a890600c9060208401906124e6565b606060038054610a1090612c4e565b6000806000806115b3856116b9565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa15801561160e573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6001600160a01b03821633141561164d5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000806000835160411461170f5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016109d6565b50505060208101516040820151606090920151909260009190911a90565b6008546001600160a01b031633146117575760405162461bcd60e51b81526004016109d690612b5d565b601355565b611767848484611cf8565b6001600160a01b0383163b1515801561178957506117878484848461209f565b155b156117a7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117d75760405162461bcd60e51b81526004016109d690612b5d565b600f55565b60606117e782611c63565b61184b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d6565b6000611855612196565b9050600081511161187557604051806020016040528060008152506118a3565b8061187f846121a5565b600d604051602001611893939291906129a2565b6040516020818303038152906040525b9392505050565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b15801561190657600080fd5b505afa15801561191a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193e91906128ae565b6001600160a01b03161415611957576001915050610998565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b813233146119a95760405162461bcd60e51b81526004016109d690612b26565b6000811180156119bb57506013548111155b6119d75760405162461bcd60e51b81526004016109d690612af8565b601054816119ec600154600054036000190190565b6119f69190612bc0565b1115611a145760405162461bcd60e51b81526004016109d690612b92565b6008546001600160a01b03163314611a3e5760405162461bcd60e51b81526004016109d690612b5d565b610b608284611f0c565b6008546001600160a01b03163314611a725760405162461bcd60e51b81526004016109d690612b5d565b601755565b6008546001600160a01b03163314611aa15760405162461bcd60e51b81526004016109d690612b5d565b6001600160a01b038116611b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d6565b611b0f8161204d565b50565b6008546001600160a01b03163314611b3c5760405162461bcd60e51b81526004016109d690612b5d565b601255565b60006001600160e01b0319821663152a902d60e11b14806109985750610998826122be565b6127106001600160601b0382161115611bd45760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109d6565b6001600160a01b038216611c2a5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109d6565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b600081600111158015611c77575060005482105b8015610998575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611d0382611f26565b80519091506000906001600160a01b0316336001600160a01b03161480611d3157508151611d3190336118aa565b80611d4c575033611d4184610a93565b6001600160a01b0316145b905080611d6c57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611da15760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611dc857604051633a954ecd60e21b815260040160405180910390fd5b611dd86000848460000151611c9c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611ec257600054811015611ec257825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6109a882826040518060200160405280600081525061230e565b60408051606081018252600080825260208201819052918101919091528180600111158015611f56575060005481105b1561203457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120325780516001600160a01b031615611fc9579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561202d579392505050565b611fc9565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906120d4903390899088908890600401612a64565b602060405180830381600087803b1580156120ee57600080fd5b505af192505050801561211e575060408051601f3d908101601f1916820190925261211b9181019061281c565b60015b612179573d80801561214c576040519150601f19603f3d011682016040523d82523d6000602084013e612151565b606091505b508051612171576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600c8054610a1090612c4e565b6060816121c95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121f357806121dd81612c89565b91506121ec9050600a83612bd8565b91506121cd565b6000816001600160401b0381111561221b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612245576020820181803683370190505b5090505b84156119815761225a600183612c0b565b9150612267600a86612ca4565b612272906030612bc0565b60f81b81838151811061229557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122b7600a86612bd8565b9450612249565b60006001600160e01b031982166380ac58cd60e01b14806122ef57506001600160e01b03198216635b5e139f60e01b145b8061099857506301ffc9a760e01b6001600160e01b0319831614610998565b610b6083838360016000546001600160a01b03851661233f57604051622e076360e81b815260040160405180910390fd5b8361235d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561240e57506001600160a01b0387163b15155b15612497575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461245f600088848060010195508861209f565b61247c576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561241457826000541461249257600080fd5b6124dd565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612498575b50600055611f05565b8280546124f290612c4e565b90600052602060002090601f016020900481019282612514576000855561255a565b82601f1061252d57805160ff191683800117855561255a565b8280016001018555821561255a579182015b8281111561255a57825182559160200191906001019061253f565b5061256692915061256a565b5090565b5b80821115612566576000815560010161256b565b60006001600160401b038084111561259957612599612ce4565b604051601f8501601f19908116603f011681019082821181831017156125c1576125c1612ce4565b816040528093508581528686860111156125da57600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112612604578081fd5b6118a38383356020850161257f565b600060208284031215612624578081fd5b81356118a381612cfa565b60008060408385031215612641578081fd5b823561264c81612cfa565b9150602083013561265c81612cfa565b809150509250929050565b60008060006060848603121561267b578081fd5b833561268681612cfa565b9250602084013561269681612cfa565b929592945050506040919091013590565b600080600080608085870312156126bc578081fd5b84356126c781612cfa565b935060208501356126d781612cfa565b92506040850135915060608501356001600160401b038111156126f8578182fd5b612704878288016125f4565b91505092959194509250565b60008060408385031215612722578182fd5b823561272d81612cfa565b91506020830135801515811461265c578182fd5b60008060408385031215612753578182fd5b823561275e81612cfa565b946020939093013593505050565b6000806040838503121561277e578182fd5b823561278981612cfa565b915060208301356001600160601b038116811461265c578182fd5b6000602082840312156127b5578081fd5b5035919050565b600080604083850312156127ce578182fd5b8235915060208301356001600160401b038111156127ea578182fd5b6127f6858286016125f4565b9150509250929050565b600060208284031215612811578081fd5b81356118a381612d0f565b60006020828403121561282d578081fd5b81516118a381612d0f565b600060208284031215612849578081fd5b81356001600160401b0381111561285e578182fd5b611981848285016125f4565b6000806040838503121561287c578182fd5b82356001600160401b03811115612891578283fd5b61289d858286016125f4565b925050602083013561265c81612cfa565b6000602082840312156128bf578081fd5b81516118a381612cfa565b6000602082840312156128db578081fd5b81356001600160401b038111156128f0578182fd5b8201601f81018413612900578182fd5b6119818482356020840161257f565b60008060408385031215612921578182fd5b82359150602083013561265c81612cfa565b60008060408385031215612945578182fd5b50508035926020909101359150565b6000815180845261296c816020860160208601612c22565b601f01601f19169290920160200192915050565b60008351612992818460208801612c22565b9190910191825250602001919050565b6000845160206129b58285838a01612c22565b8551918401916129c88184848a01612c22565b85549201918390600181811c90808316806129e457607f831692505b858310811415612a0257634e487b7160e01b88526022600452602488fd5b808015612a165760018114612a2757612a53565b60ff19851688528388019550612a53565b60008b815260209020895b85811015612a4b5781548a820152908401908801612a32565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a9790830184612954565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ad957835183529284019291840191600101612abd565b50909695505050505050565b6020815260006118a36020830184612954565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60008219821115612bd357612bd3612cb8565b500190565b600082612be757612be7612cce565b500490565b6000816000190483118215151615612c0657612c06612cb8565b500290565b600082821015612c1d57612c1d612cb8565b500390565b60005b83811015612c3d578181015183820152602001612c25565b838111156117a75750506000910152565b600181811c90821680612c6257607f821691505b60208210811415612c8357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c9d57612c9d612cb8565b5060010190565b600082612cb357612cb3612cce565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611b0f57600080fd5b6001600160e01b031981168114611b0f57600080fdfea264697066735822122024fb94025b58b55e87d3abae056200c339ee424a26aee6370646619d2f0e173364736f6c63430008040033

Deployed Bytecode Sourcemap

52771:7282:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52953:27;;;;;;;;;;;;;;;;;;;12040:25:1;;;12028:2;12013:18;52953:27:0;;;;;;;;57313:299;;;;;;;;;;-1:-1:-1;57313:299:0;;;;;:::i;:::-;;:::i;:::-;;;11867:14:1;;11860:22;11842:41;;11830:2;11815:18;57313:299:0;11797:92:1;57618:134:0;;;;;;;;;;-1:-1:-1;57618:134:0;;;;;:::i;:::-;;:::i;:::-;;56415:102;;;;;;;;;;-1:-1:-1;56415:102:0;;;;;:::i;:::-;;:::i;38614:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40117:204::-;;;;;;;;;;-1:-1:-1;40117:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10246:32:1;;;10228:51;;10216:2;10201:18;40117:204:0;10183:102:1;39680:371:0;;;;;;;;;;-1:-1:-1;39680:371:0;;;;;:::i;:::-;;:::i;59007:202::-;;;;;;;;;;-1:-1:-1;59007:202:0;;;;;:::i;:::-;;:::i;57205:100::-;;;;;;;;;;-1:-1:-1;57205:100:0;;;;;:::i;:::-;;:::i;34478:303::-;;;;;;;;;;;;55965:1;34732:12;34522:7;34716:13;:28;-1:-1:-1;;34716:46:0;;34478:303;56853:118;;;;;;;;;;-1:-1:-1;56853:118:0;;;;;:::i;:::-;;:::i;58871:130::-;;;;;;;;;;-1:-1:-1;58871:130:0;;;;;:::i;:::-;;:::i;53045:25::-;;;;;;;;;;;;;;;;40974:170;;;;;;;;;;-1:-1:-1;40974:170:0;;;;;:::i;:::-;;:::i;4062:442::-;;;;;;;;;;-1:-1:-1;4062:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10975:32:1;;;10957:51;;11039:2;11024:18;;11017:34;;;;10930:18;4062:442:0;10912:145:1;54660:408:0;;;;;;:::i;:::-;;:::i;56523:90::-;;;;;;;;;;-1:-1:-1;56523:90:0;;;;;:::i;:::-;;:::i;54188:466::-;;;;;;:::i;:::-;;:::i;57854:292::-;;;;;;;;;;;;;:::i;59215:283::-;;;;;;;;;;-1:-1:-1;59215:283:0;;;;;:::i;:::-;;:::i;41215:185::-;;;;;;;;;;-1:-1:-1;41215:185:0;;;;;:::i;:::-;;:::i;55237:630::-;;;;;;;;;;-1:-1:-1;55237:630:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52911:33::-;;;;;;;;;;;;;:::i;53145:28::-;;;;;;;;;;-1:-1:-1;53145:28:0;;;;-1:-1:-1;;;;;53145:28:0;;;52878;;;;;;;;;;;;;:::i;38423:124::-;;;;;;;;;;-1:-1:-1;38423:124:0;;;;;:::i;:::-;;:::i;53274:53::-;;;;;;;;;;-1:-1:-1;53274:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;35598:206;;;;;;;;;;-1:-1:-1;35598:206:0;;;;;:::i;:::-;;:::i;13989:103::-;;;;;;;;;;;;;:::i;53075:24::-;;;;;;;;;;;;;;;;57099:100;;;;;;;;;;-1:-1:-1;57099:100:0;;;;;:::i;:::-;;:::i;13338:87::-;;;;;;;;;;-1:-1:-1;13411:6:0;;-1:-1:-1;;;;;13411:6:0;13338:87;;53105:33;;;;;;;;;;;;;;;;38783:104;;;;;;;;;;;;;:::i;59504:222::-;;;;;;;;;;-1:-1:-1;59504:222:0;;;;;:::i;:::-;;:::i;40393:279::-;;;;;;;;;;-1:-1:-1;40393:279:0;;;;;:::i;:::-;;:::i;59732:313::-;;;;;;;;;;-1:-1:-1;59732:313:0;;;;;:::i;:::-;;:::i;:::-;;;;12274:25:1;;;12330:2;12315:18;;12308:34;;;;12390:4;12378:17;12358:18;;;12351:45;12262:2;12247:18;59732:313:0;12229:173:1;52985:26:0;;;;;;;;;;;;;;;;56715:130;;;;;;;;;;-1:-1:-1;56715:130:0;;;;;:::i;:::-;;:::i;41471:369::-;;;;;;;;;;-1:-1:-1;41471:369:0;;;;;:::i;:::-;;:::i;53332:48::-;;;;;;;;;;-1:-1:-1;53332:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;56621:88;;;;;;;;;;-1:-1:-1;56621:88:0;;;;;:::i;:::-;;:::i;55980:372::-;;;;;;;;;;-1:-1:-1;55980:372:0;;;;;:::i;:::-;;:::i;53178:89::-;;;;;;;;;;;;53225:42;53178:89;;53016:24;;;;;;;;;;;;;;;;58343:445;;;;;;;;;;-1:-1:-1;58343:445:0;;;;;:::i;:::-;;:::i;55076:155::-;;;;;;;;;;-1:-1:-1;55076:155:0;;;;;:::i;:::-;;:::i;57758:90::-;;;;;;;;;;-1:-1:-1;57758:90:0;;;;;:::i;:::-;;:::i;14247:201::-;;;;;;;;;;-1:-1:-1;14247:201:0;;;;;:::i;:::-;;:::i;53387:25::-;;;;;;;;;;;;;;;;56979:114;;;;;;;;;;-1:-1:-1;56979:114:0;;;;;:::i;:::-;;:::i;57313:299::-;57416:4;-1:-1:-1;;;;;;57453:41:0;;-1:-1:-1;;;57453:41:0;;:98;;-1:-1:-1;;;;;;;57511:40:0;;-1:-1:-1;;;57511:40:0;57453:98;:151;;;;57568:36;57592:11;57568:23;:36::i;:::-;57433:171;57313:299;-1:-1:-1;;57313:299:0:o;57618:134::-;57702:44;57721:9;57732:13;57702:18;:44::i;:::-;57618:134;;:::o;56415:102::-;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;;;;;;;;;56486:13:::1;:25:::0;;-1:-1:-1;;;;;;56486:25:0::1;-1:-1:-1::0;;;;;56486:25:0;;;::::1;::::0;;;::::1;::::0;;56415:102::o;38614:100::-;38668:13;38701:5;38694:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38614:100;:::o;40117:204::-;40185:7;40210:16;40218:7;40210;:16::i;:::-;40205:64;;40235:34;;-1:-1:-1;;;40235:34:0;;;;;;;;;;;40205:64;-1:-1:-1;40289:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40289:24:0;;40117:204::o;39680:371::-;39753:13;39769:24;39785:7;39769:15;:24::i;:::-;39753:40;;39814:5;-1:-1:-1;;;;;39808:11:0;:2;-1:-1:-1;;;;;39808:11:0;;39804:48;;;39828:24;;-1:-1:-1;;;39828:24:0;;;;;;;;;;;39804:48;12142:10;-1:-1:-1;;;;;39869:21:0;;;;;;:63;;-1:-1:-1;39895:37:0;39912:5;12142:10;58343:445;:::i;39895:37::-;39894:38;39869:63;39865:138;;;39956:35;;-1:-1:-1;;;39956:35:0;;;;;;;;;;;39865:138;40015:28;40024:2;40028:7;40037:5;40015:8;:28::i;:::-;39680:371;;;:::o;59007:202::-;59071:7;59090:19;:56;;;;;;;;;;;;;;;;;;;59188:6;59195:7;59171:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59161:43;;;;;;59154:50;;;59007:202;;;:::o;57205:100::-;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;57277:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;56853:118::-:0;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;56931:10:::1;:34:::0;56853:118::o;58871:130::-;58969:26;;-1:-1:-1;;7876:2:1;7872:15;;;7868:53;58969:26:0;;;7856:66:1;58933:7:0;;7938:12:1;;58969:26:0;;;;;;;;;;;;58959:37;;;;;;58952:44;;58871:130;;;:::o;40974:170::-;41108:28;41118:4;41124:2;41128:7;41108:9;:28::i;4062:442::-;4159:7;4217:27;;;:17;:27;;;;;;;;4188:56;;;;;;;;;-1:-1:-1;;;;;4188:56:0;;;;;-1:-1:-1;;;4188:56:0;;;-1:-1:-1;;;;;4188:56:0;;;;;;;;4159:7;;4257:92;;-1:-1:-1;4308:29:0;;;;;;;;;4318:19;4308:29;-1:-1:-1;;;;;4308:29:0;;;;-1:-1:-1;;;4308:29:0;;-1:-1:-1;;;;;4308:29:0;;;;;4257:92;4399:23;;;;4361:21;;4870:5;;4386:36;;-1:-1:-1;;;;;4386:36:0;:10;:36;:::i;:::-;4385:58;;;;:::i;:::-;4464:16;;;;;-1:-1:-1;4062:442:0;;-1:-1:-1;;;;4062:442:0:o;54660:408::-;54731:11;53936:9;53949:10;53936:23;53928:66;;;;-1:-1:-1;;;53928:66:0;;;;;;;:::i;:::-;54023:1;54009:11;:15;:52;;;;;54043:18;;54028:11;:33;;54009:52;54001:85;;;;-1:-1:-1;;;54001:85:0;;;;;;;:::i;:::-;54132:9;;54117:11;54101:13;55965:1;34732:12;34522:7;34716:13;:28;-1:-1:-1;;34716:46:0;;34478:303;54101:13;:27;;;;:::i;:::-;:40;;54093:73;;;;-1:-1:-1;;;54093:73:0;;;;;;;:::i;:::-;54759:10:::1;;54771:1;54759:13;54751:46;;;::::0;-1:-1:-1;;;54751:46:0;;15837:2:1;54751:46:0::1;::::0;::::1;15819:21:1::0;15876:2;15856:18;;;15849:30;-1:-1:-1;;;15895:18:1;;;15888:50;15955:18;;54751:46:0::1;15809:170:1::0;54751:46:0::1;54839:11;54825;;:25;;;;:::i;:::-;54812:9;:38;;54804:70;;;::::0;-1:-1:-1;;;54804:70:0;;18819:2:1;54804:70:0::1;::::0;::::1;18801:21:1::0;18858:2;18838:18;;;18831:30;-1:-1:-1;;;18877:18:1;;;18870:49;18936:18;;54804:70:0::1;18791:169:1::0;54804:70:0::1;54934:9;::::0;12142:10;54889:27:::1;::::0;;;:13:::1;:27;::::0;;;;;:41:::1;::::0;54919:11;;54889:41:::1;:::i;:::-;:54;;54881:89;;;::::0;-1:-1:-1;;;54881:89:0;;13992:2:1;54881:89:0::1;::::0;::::1;13974:21:1::0;14031:2;14011:18;;;14004:30;14070:25;14050:18;;;14043:53;14113:18;;54881:89:0::1;13964:173:1::0;54881:89:0::1;12142:10:::0;54977:27:::1;::::0;;;:13:::1;:27;::::0;;;;:42;;55008:11;;54977:27;:42:::1;::::0;55008:11;;54977:42:::1;:::i;:::-;::::0;;;-1:-1:-1;55026:36:0::1;::::0;-1:-1:-1;12142:10:0;55050:11:::1;55026:9;:36::i;56523:90::-:0;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;56587:12:::1;:20:::0;56523:90::o;54188:466::-;54259:1;53936:9;53949:10;53936:23;53928:66;;;;-1:-1:-1;;;53928:66:0;;;;;;;:::i;:::-;54023:1;54009:11;:15;:52;;;;;54043:18;;54028:11;:33;;54009:52;54001:85;;;;-1:-1:-1;;;54001:85:0;;;;;;;:::i;:::-;54132:9;;54117:11;54101:13;55965:1;34732:12;34522:7;34716:13;:28;-1:-1:-1;;34716:46:0;;34478:303;54101:13;:27;;;;:::i;:::-;:40;;54093:73;;;;-1:-1:-1;;;54093:73:0;;;;;;;:::i;:::-;54277:10:::1;;54291:1;54277:15;54269:62;;;::::0;-1:-1:-1;;;54269:62:0;;16938:2:1;54269:62:0::1;::::0;::::1;16920:21:1::0;16977:2;16957:18;;;16950:30;17016:34;16996:18;;;16989:62;-1:-1:-1;;;17067:18:1;;;17060:32;17109:19;;54269:62:0::1;16910:224:1::0;54269:62:0::1;54346:25;54353:3:::0;12142:10;59215:283;:::i;54346:25::-:1;54338:66;;;::::0;-1:-1:-1;;;54338:66:0;;14703:2:1;54338:66:0::1;::::0;::::1;14685:21:1::0;14742:2;14722:18;;;14715:30;14781;14761:18;;;14754:58;14829:18;;54338:66:0::1;14675:178:1::0;54338:66:0::1;54432:12;;54419:9;:25;;54411:57;;;::::0;-1:-1:-1;;;54411:57:0;;18819:2:1;54411:57:0::1;::::0;::::1;18801:21:1::0;18858:2;18838:18;;;18831:30;-1:-1:-1;;;18877:18:1;;;18870:49;18936:18;;54411:57:0::1;18791:169:1::0;54411:57:0::1;54523:10;::::0;12142;54483:32:::1;::::0;;;:18:::1;:32;::::0;;;;;:36:::1;::::0;54518:1:::1;54483:36;:::i;:::-;:50;;54475:96;;;::::0;-1:-1:-1;;;54475:96:0;;16186:2:1;54475:96:0::1;::::0;::::1;16168:21:1::0;16225:2;16205:18;;;16198:30;16264:34;16244:18;;;16237:62;-1:-1:-1;;;16315:18:1;;;16308:32;16357:19;;54475:96:0::1;16158:224:1::0;54475:96:0::1;12142:10:::0;54578:32:::1;::::0;;;:18:::1;:32;::::0;;;;:37;;54614:1:::1;::::0;54578:32;:37:::1;::::0;54614:1;;54578:37:::1;:::i;:::-;::::0;;;-1:-1:-1;54622:26:0::1;::::0;-1:-1:-1;12142:10:0;54646:1:::1;54622:9;:26::i;57854:292::-:0;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;8312:1:::1;8910:7;;:19;;8902:63;;;::::0;-1:-1:-1;;;8902:63:0;;18105:2:1;8902:63:0::1;::::0;::::1;18087:21:1::0;18144:2;18124:18;;;18117:30;18183:33;18163:18;;;18156:61;18234:18;;8902:63:0::1;18077:181:1::0;8902:63:0::1;8312:1;9043:7;:18:::0;57913:7:::2;57934:42;58018:3;57990:25;:21;58014:1;57990:25;:::i;:::-;:31;;;;:::i;:::-;57926:100;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57912:114;;;58041:2;58033:11;;;::::0;::::2;;58054:7;58075;13411:6:::0;;-1:-1:-1;;;;;13411:6:0;;13338:87;58075:7:::2;-1:-1:-1::0;;;;;58067:21:0::2;58096;58067:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58053:69;;;58137:2;58129:11;;;::::0;::::2;;-1:-1:-1::0;;8268:1:0::1;9222:7;:22:::0;57854:292::o;59215:283::-;59292:4;59308:18;59329:22;59344:6;59329:14;:22::i;:::-;59308:43;;59359:22;59384:29;59402:10;59384:17;:29::i;:::-;59477:13;;59359:54;;-1:-1:-1;;;;;;59477:13:0;59432:41;59359:54;59462:10;59432:13;:41::i;:::-;-1:-1:-1;;;;;59432:58:0;;;59215:283;-1:-1:-1;;;;;59215:283:0:o;41215:185::-;41353:39;41370:4;41376:2;41380:7;41353:39;;;;;;;;;;;;:16;:39::i;55237:630::-;55297:16;55322:23;55348:17;55358:6;55348:9;:17::i;:::-;55322:43;;55372:30;55419:15;-1:-1:-1;;;;;55405:30:0;;;;;-1:-1:-1;;;55405:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55405:30:0;-1:-1:-1;55372:63:0;-1:-1:-1;55965:1:0;55442:22;55525:308;55550:15;55532;:33;:63;;;;;55586:9;;55569:14;:26;55532:63;55525:308;;;55606:25;55634:23;55642:14;55634:7;:23::i;:::-;55606:51;;55693:6;-1:-1:-1;;;;;55672:27:0;:17;-1:-1:-1;;;;;55672:27:0;;55668:131;;;55745:14;55712:13;55726:15;55712:30;;;;;;-1:-1:-1;;;55712:30:0;;;;;;;;;;;;;;;;;;:47;55772:17;;;;:::i;:::-;;;;55668:131;55809:16;;;;:::i;:::-;;;;55525:308;;;;-1:-1:-1;55848:13:0;;55237:630;-1:-1:-1;;;;55237:630:0:o;52911:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52878:28::-;;;;;;;:::i;38423:124::-;38487:7;38514:20;38526:7;38514:11;:20::i;:::-;:25;;38423:124;-1:-1:-1;;38423:124:0:o;35598:206::-;35662:7;-1:-1:-1;;;;;35686:19:0;;35682:60;;35714:28;;-1:-1:-1;;;35714:28:0;;;;;;;;;;;35682:60;-1:-1:-1;;;;;;35768:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;35768:27:0;;35598:206::o;13989:103::-;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;14054:30:::1;14081:1;14054:18;:30::i;:::-;13989:103::o:0;57099:100::-;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;57171:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;38783:104::-:0;38839:13;38872:7;38865:14;;;;;:::i;59504:222::-;59595:7;59615:9;59626;59637:7;59648:26;59663:10;59648:14;:26::i;:::-;59689:32;;;;;;;;;;;;12634:25:1;;;12707:4;12695:17;;12675:18;;;12668:45;;;;12729:18;;;12722:34;;;12772:18;;;12765:34;;;59614:60:0;;-1:-1:-1;59614:60:0;;-1:-1:-1;59614:60:0;-1:-1:-1;59689:32:0;;12606:19:1;;59689:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59689:32:0;;-1:-1:-1;;59689:32:0;;;59504:222;-1:-1:-1;;;;;;;59504:222:0:o;40393:279::-;-1:-1:-1;;;;;40484:24:0;;12142:10;40484:24;40480:54;;;40517:17;;-1:-1:-1;;;40517:17:0;;;;;;;;;;;40480:54;12142:10;40547:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;40547:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;40547:53:0;;;;;;;;;;40616:48;;11842:41:1;;;40547:42:0;;12142:10;40616:48;;11815:18:1;40616:48:0;;;;;;;40393:279;;:::o;59732:313::-;59796:9;59807;59818:7;59845:4;:11;59860:2;59845:17;59837:54;;;;-1:-1:-1;;;59837:54:0;;17752:2:1;59837:54:0;;;17734:21:1;17791:2;17771:18;;;17764:30;17830:26;17810:18;;;17803:54;17874:18;;59837:54:0;17724:174:1;59837:54:0;-1:-1:-1;;;59948:2:0;59938:13;;59932:20;59984:2;59974:13;;59968:20;60028:2;60018:13;;;60012:20;59932;;60009:1;60004:29;;;;;59915:126::o;56715:130::-;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;56799:18:::1;:40:::0;56715:130::o;41471:369::-;41638:28;41648:4;41654:2;41658:7;41638:9;:28::i;:::-;-1:-1:-1;;;;;41681:13:0;;15949:20;15997:8;;41681:76;;;;;41701:56;41732:4;41738:2;41742:7;41751:5;41701:30;:56::i;:::-;41700:57;41681:76;41677:156;;;41781:40;;-1:-1:-1;;;41781:40:0;;;;;;;;;;;41677:156;41471:369;;;;:::o;56621:88::-;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;56684:11:::1;:19:::0;56621:88::o;55980:372::-;56054:13;56084:17;56092:8;56084:7;:17::i;:::-;56076:77;;;;-1:-1:-1;;;56076:77:0;;15421:2:1;56076:77:0;;;15403:21:1;15460:2;15440:18;;;15433:30;15499:34;15479:18;;;15472:62;-1:-1:-1;;;15550:18:1;;;15543:45;15605:19;;56076:77:0;15393:237:1;56076:77:0;56162:28;56193:10;:8;:10::i;:::-;56162:41;;56248:1;56223:14;56217:28;:32;:129;;;;;;;;;;;;;;;;;56285:14;56300:19;:8;:17;:19::i;:::-;56321:9;56268:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56217:129;56210:136;55980:372;-1:-1:-1;;;55980:372:0:o;58343:445::-;58641:28;;-1:-1:-1;;;58641:28:0;;-1:-1:-1;;;;;10246:32:1;;;58641:28:0;;;10228:51:1;58468:4:0;;53225:42;;58633:49;;;53225:42;;58641:21;;10201:18:1;;58641:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58633:49:0;;58629:93;;;58706:4;58699:11;;;;;58629:93;-1:-1:-1;;;;;40864:25:0;;;40840:4;40864:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;58741:39;58734:46;58343:445;-1:-1:-1;;;;58343:445:0:o;55076:155::-;55162:11;53936:9;53949:10;53936:23;53928:66;;;;-1:-1:-1;;;53928:66:0;;;;;;;:::i;:::-;54023:1;54009:11;:15;:52;;;;;54043:18;;54028:11;:33;;54009:52;54001:85;;;;-1:-1:-1;;;54001:85:0;;;;;;;:::i;:::-;54132:9;;54117:11;54101:13;55965:1;34732:12;34522:7;34716:13;:28;-1:-1:-1;;34716:46:0;;34478:303;54101:13;:27;;;;:::i;:::-;:40;;54093:73;;;;-1:-1:-1;;;54093:73:0;;;;;;;:::i;:::-;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23:::1;13550:68;;;;-1:-1:-1::0;;;13550:68:0::1;;;;;;;:::i;:::-;55192:33:::2;55202:9;55213:11;55192:9;:33::i;57758:90::-:0;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;57822:10:::1;:20:::0;57758:90::o;14247:201::-;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14336:22:0;::::1;14328:73;;;::::0;-1:-1:-1;;;14328:73:0;;13236:2:1;14328:73:0::1;::::0;::::1;13218:21:1::0;13275:2;13255:18;;;13248:30;13314:34;13294:18;;;13287:62;-1:-1:-1;;;13365:18:1;;;13358:36;13411:19;;14328:73:0::1;13208:228:1::0;14328:73:0::1;14412:28;14431:8;14412:18;:28::i;:::-;14247:201:::0;:::o;56979:114::-;13411:6;;-1:-1:-1;;;;;13411:6:0;12142:10;13558:23;13550:68;;;;-1:-1:-1;;;13550:68:0;;;;;;;:::i;:::-;57055:9:::1;:32:::0;56979:114::o;3792:215::-;3894:4;-1:-1:-1;;;;;;3918:41:0;;-1:-1:-1;;;3918:41:0;;:81;;;3963:36;3987:11;3963:23;:36::i;5154:332::-;4870:5;-1:-1:-1;;;;;5257:33:0;;;;5249:88;;;;-1:-1:-1;;;5249:88:0;;17341:2:1;5249:88:0;;;17323:21:1;17380:2;17360:18;;;17353:30;17419:34;17399:18;;;17392:62;-1:-1:-1;;;17470:18:1;;;17463:40;17520:19;;5249:88:0;17313:232:1;5249:88:0;-1:-1:-1;;;;;5356:22:0;;5348:60;;;;-1:-1:-1;;;5348:60:0;;18465:2:1;5348:60:0;;;18447:21:1;18504:2;18484:18;;;18477:30;18543:27;18523:18;;;18516:55;18588:18;;5348:60:0;18437:175:1;5348:60:0;5443:35;;;;;;;;;-1:-1:-1;;;;;5443:35:0;;;;;;-1:-1:-1;;;;;5443:35:0;;;;;;;;;;-1:-1:-1;;;5421:57:0;;;;:19;:57;5154:332::o;42095:187::-;42152:4;42195:7;55965:1;42176:26;;:53;;;;;42216:13;;42206:7;:23;42176:53;:98;;;;-1:-1:-1;;42247:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;42247:27:0;;;;42246:28;;42095:187::o;49706:196::-;49821:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;49821:29:0;-1:-1:-1;;;;;49821:29:0;;;;;;;;;49866:28;;49821:24;;49866:28;;;;;;;49706:196;;;:::o;45208:2112::-;45323:35;45361:20;45373:7;45361:11;:20::i;:::-;45436:18;;45323:58;;-1:-1:-1;45394:22:0;;-1:-1:-1;;;;;45420:34:0;12142:10;-1:-1:-1;;;;;45420:34:0;;:101;;;-1:-1:-1;45488:18:0;;45471:50;;12142:10;58343:445;:::i;45471:50::-;45420:154;;;-1:-1:-1;12142:10:0;45538:20;45550:7;45538:11;:20::i;:::-;-1:-1:-1;;;;;45538:36:0;;45420:154;45394:181;;45593:17;45588:66;;45619:35;;-1:-1:-1;;;45619:35:0;;;;;;;;;;;45588:66;45691:4;-1:-1:-1;;;;;45669:26:0;:13;:18;;;-1:-1:-1;;;;;45669:26:0;;45665:67;;45704:28;;-1:-1:-1;;;45704:28:0;;;;;;;;;;;45665:67;-1:-1:-1;;;;;45747:16:0;;45743:52;;45772:23;;-1:-1:-1;;;45772:23:0;;;;;;;;;;;45743:52;45916:49;45933:1;45937:7;45946:13;:18;;;45916:8;:49::i;:::-;-1:-1:-1;;;;;46261:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;46261:31:0;;;-1:-1:-1;;;;;46261:31:0;;;-1:-1:-1;;46261:31:0;;;;;;;46307:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;46307:29:0;;;;;;;;;;;46353:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;46398:61:0;;;;-1:-1:-1;;;46443:15:0;46398:61;;;;;;;;;;;46733:11;;;46763:24;;;;;:29;46733:11;;46763:29;46759:445;;46988:13;;46974:11;:27;46970:219;;;47058:18;;;47026:24;;;:11;:24;;;;;;;;:50;;47141:28;;;;-1:-1:-1;;;;;47099:70:0;-1:-1:-1;;;47099:70:0;-1:-1:-1;;;;;;47099:70:0;;;-1:-1:-1;;;;;47026:50:0;;;47099:70;;;;;;;46970:219;45208:2112;47251:7;47247:2;-1:-1:-1;;;;;47232:27:0;47241:4;-1:-1:-1;;;;;47232:27:0;;;;;;;;;;;47270:42;45208:2112;;;;;:::o;42290:104::-;42359:27;42369:2;42373:8;42359:27;;;;;;;;;;;;:9;:27::i;37253:1108::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;37363:7:0;;55965:1;37412:23;;:47;;;;;37446:13;;37439:4;:20;37412:47;37408:886;;;37480:31;37514:17;;;:11;:17;;;;;;;;;37480:51;;;;;;;;;-1:-1:-1;;;;;37480:51:0;;;;-1:-1:-1;;;37480:51:0;;-1:-1:-1;;;;;37480:51:0;;;;;;;;-1:-1:-1;;;37480:51:0;;;;;;;;;;;;;;37550:729;;37600:14;;-1:-1:-1;;;;;37600:28:0;;37596:101;;37664:9;37253:1108;-1:-1:-1;;;37253:1108:0:o;37596:101::-;-1:-1:-1;;;38039:6:0;38084:17;;;;:11;:17;;;;;;;;;38072:29;;;;;;;;;-1:-1:-1;;;;;38072:29:0;;;;;-1:-1:-1;;;38072:29:0;;-1:-1:-1;;;;;38072:29:0;;;;;;;;-1:-1:-1;;;38072:29:0;;;;;;;;;;;;;38132:28;38128:109;;38200:9;37253:1108;-1:-1:-1;;;37253:1108:0:o;38128:109::-;37999:261;;;37408:886;;38322:31;;-1:-1:-1;;;38322:31:0;;;;;;;;;;;14608:191;14701:6;;;-1:-1:-1;;;;;14718:17:0;;;-1:-1:-1;;;;;;14718:17:0;;;;;;;14751:40;;14701:6;;;14718:17;14701:6;;14751:40;;14682:16;;14751:40;14608:191;;:::o;50394:667::-;50578:72;;-1:-1:-1;;;50578:72:0;;50557:4;;-1:-1:-1;;;;;50578:36:0;;;;;:72;;12142:10;;50629:4;;50635:7;;50644:5;;50578:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50578:72:0;;;;;;;;-1:-1:-1;;50578:72:0;;;;;;;;;;;;:::i;:::-;;;50574:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50812:13:0;;50808:235;;50858:40;;-1:-1:-1;;;50858:40:0;;;;;;;;;;;50808:235;51001:6;50995:13;50986:6;50982:2;50978:15;50971:38;50574:480;-1:-1:-1;;;;;;50697:55:0;-1:-1:-1;;;50697:55:0;;-1:-1:-1;50394:667:0;;;;;;:::o;58152:104::-;58212:13;58241:9;58234:16;;;;;:::i;9624:723::-;9680:13;9901:10;9897:53;;-1:-1:-1;;9928:10:0;;;;;;;;;;;;-1:-1:-1;;;9928:10:0;;;;;9624:723::o;9897:53::-;9975:5;9960:12;10016:78;10023:9;;10016:78;;10049:8;;;;:::i;:::-;;-1:-1:-1;10072:10:0;;-1:-1:-1;10080:2:0;10072:10;;:::i;:::-;;;10016:78;;;10104:19;10136:6;-1:-1:-1;;;;;10126:17:0;;;;;-1:-1:-1;;;10126:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10126:17:0;;10104:39;;10154:154;10161:10;;10154:154;;10188:11;10198:1;10188:11;;:::i;:::-;;-1:-1:-1;10257:10:0;10265:2;10257:5;:10;:::i;:::-;10244:24;;:2;:24;:::i;:::-;10231:39;;10214:6;10221;10214:14;;;;;;-1:-1:-1;;;10214:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;10214:56:0;;;;;;;;-1:-1:-1;10285:11:0;10294:2;10285:11;;:::i;:::-;;;10154:154;;35229:305;35331:4;-1:-1:-1;;;;;;35368:40:0;;-1:-1:-1;;;35368:40:0;;:105;;-1:-1:-1;;;;;;;35425:48:0;;-1:-1:-1;;;35425:48:0;35368:105;:158;;;-1:-1:-1;;;;;;;;;;2485:40:0;;;35490:36;2376:157;42757:163;42880:32;42886:2;42890:8;42900:5;42907:4;43318:20;43341:13;-1:-1:-1;;;;;43369:16:0;;43365:48;;43394:19;;-1:-1:-1;;;43394:19:0;;;;;;;;;;;43365:48;43428:13;43424:44;;43450:18;;-1:-1:-1;;;43450:18:0;;;;;;;;;;;43424:44;-1:-1:-1;;;;;43819:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;43878:49:0;;-1:-1:-1;;;;;43819:44:0;;;;;;;43878:49;;;;-1:-1:-1;;43819:44:0;;;;;;43878:49;;;;;;;;;;;;;;;;43944:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;43994:66:0;;;;-1:-1:-1;;;44044:15:0;43994:66;;;;;;;;;;43944:25;44141:23;;;44185:4;:23;;;;-1:-1:-1;;;;;;44193:13:0;;15949:20;15997:8;;44193:15;44181:641;;;44229:314;44260:38;;44285:12;;-1:-1:-1;;;;;44260:38:0;;;44277:1;;44260:38;;44277:1;;44260:38;44326:69;44365:1;44369:2;44373:14;;;;;;44389:5;44326:30;:69::i;:::-;44321:174;;44431:40;;-1:-1:-1;;;44431:40:0;;;;;;;;;;;44321:174;44538:3;44522:12;:19;;44229:314;;44624:12;44607:13;;:29;44603:43;;44638:8;;;44603:43;44181:641;;;44687:120;44718:40;;44743:14;;;;;-1:-1:-1;;;;;44718:40:0;;;44735:1;;44718:40;;44735:1;;44718:40;44802:3;44786:12;:19;;44687:120;;44181:641;-1:-1:-1;44836:13:0;:28;44886:60;41471:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:228::-;692:5;745:3;738:4;730:6;726:17;722:27;712:2;;767:5;760;753:20;712:2;793:79;868:3;859:6;846:20;839:4;831:6;827:17;793:79;:::i;883:257::-;942:6;995:2;983:9;974:7;970:23;966:32;963:2;;;1016:6;1008;1001:22;963:2;1060:9;1047:23;1079:31;1104:5;1079:31;:::i;1145:398::-;1213:6;1221;1274:2;1262:9;1253:7;1249:23;1245:32;1242:2;;;1295:6;1287;1280:22;1242:2;1339:9;1326:23;1358:31;1383:5;1358:31;:::i;:::-;1408:5;-1:-1:-1;1465:2:1;1450:18;;1437:32;1478:33;1437:32;1478:33;:::i;:::-;1530:7;1520:17;;;1232:311;;;;;:::o;1548:466::-;1625:6;1633;1641;1694:2;1682:9;1673:7;1669:23;1665:32;1662:2;;;1715:6;1707;1700:22;1662:2;1759:9;1746:23;1778:31;1803:5;1778:31;:::i;:::-;1828:5;-1:-1:-1;1885:2:1;1870:18;;1857:32;1898:33;1857:32;1898:33;:::i;:::-;1652:362;;1950:7;;-1:-1:-1;;;2004:2:1;1989:18;;;;1976:32;;1652:362::o;2019:685::-;2114:6;2122;2130;2138;2191:3;2179:9;2170:7;2166:23;2162:33;2159:2;;;2213:6;2205;2198:22;2159:2;2257:9;2244:23;2276:31;2301:5;2276:31;:::i;:::-;2326:5;-1:-1:-1;2383:2:1;2368:18;;2355:32;2396:33;2355:32;2396:33;:::i;:::-;2448:7;-1:-1:-1;2502:2:1;2487:18;;2474:32;;-1:-1:-1;2557:2:1;2542:18;;2529:32;-1:-1:-1;;;;;2573:30:1;;2570:2;;;2621:6;2613;2606:22;2570:2;2649:49;2690:7;2681:6;2670:9;2666:22;2649:49;:::i;:::-;2639:59;;;2149:555;;;;;;;:::o;2709:436::-;2774:6;2782;2835:2;2823:9;2814:7;2810:23;2806:32;2803:2;;;2856:6;2848;2841:22;2803:2;2900:9;2887:23;2919:31;2944:5;2919:31;:::i;:::-;2969:5;-1:-1:-1;3026:2:1;3011:18;;2998:32;3068:15;;3061:23;3049:36;;3039:2;;3104:6;3096;3089:22;3150:325;3218:6;3226;3279:2;3267:9;3258:7;3254:23;3250:32;3247:2;;;3300:6;3292;3285:22;3247:2;3344:9;3331:23;3363:31;3388:5;3363:31;:::i;:::-;3413:5;3465:2;3450:18;;;;3437:32;;-1:-1:-1;;;3237:238:1:o;3480:455::-;3547:6;3555;3608:2;3596:9;3587:7;3583:23;3579:32;3576:2;;;3629:6;3621;3614:22;3576:2;3673:9;3660:23;3692:31;3717:5;3692:31;:::i;:::-;3742:5;-1:-1:-1;3799:2:1;3784:18;;3771:32;-1:-1:-1;;;;;3834:40:1;;3822:53;;3812:2;;3894:6;3886;3879:22;3940:190;3999:6;4052:2;4040:9;4031:7;4027:23;4023:32;4020:2;;;4073:6;4065;4058:22;4020:2;-1:-1:-1;4101:23:1;;4010:120;-1:-1:-1;4010:120:1:o;4135:408::-;4212:6;4220;4273:2;4261:9;4252:7;4248:23;4244:32;4241:2;;;4294:6;4286;4279:22;4241:2;4335:9;4322:23;4312:33;;4396:2;4385:9;4381:18;4368:32;-1:-1:-1;;;;;4415:6:1;4412:30;4409:2;;;4460:6;4452;4445:22;4409:2;4488:49;4529:7;4520:6;4509:9;4505:22;4488:49;:::i;:::-;4478:59;;;4231:312;;;;;:::o;4548:255::-;4606:6;4659:2;4647:9;4638:7;4634:23;4630:32;4627:2;;;4680:6;4672;4665:22;4627:2;4724:9;4711:23;4743:30;4767:5;4743:30;:::i;4808:259::-;4877:6;4930:2;4918:9;4909:7;4905:23;4901:32;4898:2;;;4951:6;4943;4936:22;4898:2;4988:9;4982:16;5007:30;5031:5;5007:30;:::i;5072:340::-;5140:6;5193:2;5181:9;5172:7;5168:23;5164:32;5161:2;;;5214:6;5206;5199:22;5161:2;5259:9;5246:23;-1:-1:-1;;;;;5284:6:1;5281:30;5278:2;;;5329:6;5321;5314:22;5278:2;5357:49;5398:7;5389:6;5378:9;5374:22;5357:49;:::i;5417:475::-;5494:6;5502;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5576:6;5568;5561:22;5523:2;5621:9;5608:23;-1:-1:-1;;;;;5646:6:1;5643:30;5640:2;;;5691:6;5683;5676:22;5640:2;5719:49;5760:7;5751:6;5740:9;5736:22;5719:49;:::i;:::-;5709:59;;;5818:2;5807:9;5803:18;5790:32;5831:31;5856:5;5831:31;:::i;5897:290::-;5996:6;6049:2;6037:9;6028:7;6024:23;6020:32;6017:2;;;6070:6;6062;6055:22;6017:2;6107:9;6101:16;6126:31;6151:5;6126:31;:::i;6192:480::-;6261:6;6314:2;6302:9;6293:7;6289:23;6285:32;6282:2;;;6335:6;6327;6320:22;6282:2;6380:9;6367:23;-1:-1:-1;;;;;6405:6:1;6402:30;6399:2;;;6450:6;6442;6435:22;6399:2;6478:22;;6531:4;6523:13;;6519:27;-1:-1:-1;6509:2:1;;6565:6;6557;6550:22;6509:2;6593:73;6658:7;6653:2;6640:16;6635:2;6631;6627:11;6593:73;:::i;6872:325::-;6940:6;6948;7001:2;6989:9;6980:7;6976:23;6972:32;6969:2;;;7022:6;7014;7007:22;6969:2;7063:9;7050:23;7040:33;;7123:2;7112:9;7108:18;7095:32;7136:31;7161:5;7136:31;:::i;7202:258::-;7270:6;7278;7331:2;7319:9;7310:7;7306:23;7302:32;7299:2;;;7352:6;7344;7337:22;7299:2;-1:-1:-1;;7380:23:1;;;7450:2;7435:18;;;7422:32;;-1:-1:-1;7289:171:1:o;7465:257::-;7506:3;7544:5;7538:12;7571:6;7566:3;7559:19;7587:63;7643:6;7636:4;7631:3;7627:14;7620:4;7613:5;7609:16;7587:63;:::i;:::-;7704:2;7683:15;-1:-1:-1;;7679:29:1;7670:39;;;;7711:4;7666:50;;7514:208;-1:-1:-1;;7514:208:1:o;7961:370::-;8118:3;8156:6;8150:13;8172:53;8218:6;8213:3;8206:4;8198:6;8194:17;8172:53;:::i;:::-;8247:16;;;;8272:21;;;-1:-1:-1;8320:4:1;8309:16;;8126:205;-1:-1:-1;8126:205:1:o;8336:1531::-;8560:3;8598:6;8592:13;8624:4;8637:51;8681:6;8676:3;8671:2;8663:6;8659:15;8637:51;:::i;:::-;8751:13;;8710:16;;;;8773:55;8751:13;8710:16;8795:15;;;8773:55;:::i;:::-;8919:13;;8850:20;;;8890:3;;8979:1;9001:18;;;;9054;;;;9081:2;;9159:4;9149:8;9145:19;9133:31;;9081:2;9222;9212:8;9209:16;9189:18;9186:40;9183:2;;;-1:-1:-1;;;9249:33:1;;9305:4;9302:1;9295:15;9335:4;9256:3;9323:17;9183:2;9366:18;9393:110;;;;9517:1;9512:330;;;;9359:483;;9393:110;-1:-1:-1;;9428:24:1;;9414:39;;9473:20;;;;-1:-1:-1;9393:110:1;;9512:330;19194:4;19213:17;;;19263:4;19247:21;;9607:3;9623:169;9637:8;9634:1;9631:15;9623:169;;;9719:14;;9704:13;;;9697:37;9762:16;;;;9654:10;;9623:169;;;9627:3;;9823:8;9816:5;9812:20;9805:27;;9359:483;-1:-1:-1;9858:3:1;;8568:1299;-1:-1:-1;;;;;;;;;;;8568:1299:1:o;10290:488::-;-1:-1:-1;;;;;10559:15:1;;;10541:34;;10611:15;;10606:2;10591:18;;10584:43;10658:2;10643:18;;10636:34;;;10706:3;10701:2;10686:18;;10679:31;;;10484:4;;10727:45;;10752:19;;10744:6;10727:45;:::i;:::-;10719:53;10493:285;-1:-1:-1;;;;;;10493:285:1:o;11062:635::-;11233:2;11285:21;;;11355:13;;11258:18;;;11377:22;;;11204:4;;11233:2;11456:15;;;;11430:2;11415:18;;;11204:4;11502:169;11516:6;11513:1;11510:13;11502:169;;;11577:13;;11565:26;;11646:15;;;;11611:12;;;;11538:1;11531:9;11502:169;;;-1:-1:-1;11688:3:1;;11213:484;-1:-1:-1;;;;;;11213:484:1:o;12810:219::-;12959:2;12948:9;12941:21;12922:4;12979:44;13019:2;13008:9;13004:18;12996:6;12979:44;:::i;13441:344::-;13643:2;13625:21;;;13682:2;13662:18;;;13655:30;-1:-1:-1;;;13716:2:1;13701:18;;13694:50;13776:2;13761:18;;13615:170::o;14142:354::-;14344:2;14326:21;;;14383:2;14363:18;;;14356:30;14422:32;14417:2;14402:18;;14395:60;14487:2;14472:18;;14316:180::o;14858:356::-;15060:2;15042:21;;;15079:18;;;15072:30;15138:34;15133:2;15118:18;;15111:62;15205:2;15190:18;;15032:182::o;16387:344::-;16589:2;16571:21;;;16628:2;16608:18;;;16601:30;-1:-1:-1;;;16662:2:1;16647:18;;16640:50;16722:2;16707:18;;16561:170::o;19279:128::-;19319:3;19350:1;19346:6;19343:1;19340:13;19337:2;;;19356:18;;:::i;:::-;-1:-1:-1;19392:9:1;;19327:80::o;19412:120::-;19452:1;19478;19468:2;;19483:18;;:::i;:::-;-1:-1:-1;19517:9:1;;19458:74::o;19537:168::-;19577:7;19643:1;19639;19635:6;19631:14;19628:1;19625:21;19620:1;19613:9;19606:17;19602:45;19599:2;;;19650:18;;:::i;:::-;-1:-1:-1;19690:9:1;;19589:116::o;19710:125::-;19750:4;19778:1;19775;19772:8;19769:2;;;19783:18;;:::i;:::-;-1:-1:-1;19820:9:1;;19759:76::o;19840:258::-;19912:1;19922:113;19936:6;19933:1;19930:13;19922:113;;;20012:11;;;20006:18;19993:11;;;19986:39;19958:2;19951:10;19922:113;;;20053:6;20050:1;20047:13;20044:2;;;-1:-1:-1;;20088:1:1;20070:16;;20063:27;19893:205::o;20103:380::-;20182:1;20178:12;;;;20225;;;20246:2;;20300:4;20292:6;20288:17;20278:27;;20246:2;20353;20345:6;20342:14;20322:18;20319:38;20316:2;;;20399:10;20394:3;20390:20;20387:1;20380:31;20434:4;20431:1;20424:15;20462:4;20459:1;20452:15;20316:2;;20158:325;;;:::o;20488:135::-;20527:3;-1:-1:-1;;20548:17:1;;20545:2;;;20568:18;;:::i;:::-;-1:-1:-1;20615:1:1;20604:13;;20535:88::o;20628:112::-;20660:1;20686;20676:2;;20691:18;;:::i;:::-;-1:-1:-1;20725:9:1;;20666:74::o;20745:127::-;20806:10;20801:3;20797:20;20794:1;20787:31;20837:4;20834:1;20827:15;20861:4;20858:1;20851:15;20877:127;20938:10;20933:3;20929:20;20926:1;20919:31;20969:4;20966:1;20959:15;20993:4;20990:1;20983:15;21009:127;21070:10;21065:3;21061:20;21058:1;21051:31;21101:4;21098:1;21091:15;21125:4;21122:1;21115:15;21141:131;-1:-1:-1;;;;;21216:31:1;;21206:42;;21196:2;;21262:1;21259;21252:12;21277:131;-1:-1:-1;;;;;;21351:32:1;;21341:43;;21331:2;;21398:1;21395;21388:12

Swarm Source

ipfs://24fb94025b58b55e87d3abae056200c339ee424a26aee6370646619d2f0e1733
Loading...
Loading
Loading...
Loading
[ 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.