ETH Price: $2,395.99 (-1.08%)

Token

Tiger Toonz (TIGERTOONZ)
 

Overview

Max Total Supply

67 TIGERTOONZ

Holders

22

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 TIGERTOONZ
0xe2611F19A8A2228Aa003121eB5c27EcAc746082F
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:
TigerToonz

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 400 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-28
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// 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 (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                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/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts 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/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: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
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 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) {
        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) {
        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) {
        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 {
        _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 virtual 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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, 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: nft.sol

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




// File contracts/test.sol

contract TigerToonz is ERC721A, Ownable, ReentrancyGuard {
    string private baseURI = "";
    string public constant baseExtension = ".json";
    string private notRevealedUri;
    uint256 public MAX_PER_TX = 1;
    uint256 public maxPerWallet = 5;
    uint256 public MAX_SUPPLY = 3333;
    bool public paused = false;
    bool public revealed = false;
    address[] public WL_OG;
    address[] public WL_WLR;
    uint256[] public prices = [0.03 ether, 0.04 ether, 0.05 ether];
    uint256[] public maxMints = [5, 3];
    uint256 public presaleEndTime;
    uint256 public presaleStartTime;
    address public marketingWallet = 0xE2A48cCBA6678011bEDfaA365514352Ab8c63f51;
    address public gameDevAddress = 0x7B9a595f74c360111e8fed196F101b1Db7F64392;
    address public metaverseAddress = 0x6581DE24627fa0B0e3E8F8eDf238CfBA396d730a;
    address public charityAddress = 0x92AFfeeFC212C2d7CFe9d425deFfd77D9743EF58;
    uint256 public marketingPercent = 30;
    uint256 public gameDevPercent = 35;
    uint256 public metaPercent = 20;
    uint256 public charityPercent = 5;

    event addedToWhitelist(address indexed _by, address _address, uint256 role);
    event whitelistUpdated(address indexed _by, address[] newWhitelist,uint256 typeOfWL);
    event Mint(address indexed _to, uint256 _amount);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        string memory _initNotRevealedUri,
        uint256 _duration,
        uint256 _presaleStartTime
    ) ERC721A(_name, _symbol) {
        setBaseURI(_initBaseURI);
        setNotRevealedURI(_initNotRevealedUri);
        presaleEndTime = _presaleStartTime + _duration;
        presaleStartTime = _presaleStartTime;
    }


    function mint(uint256 _amount) external payable {
        address _caller = msg.sender;
        require(!paused, "Paused");
        require(MAX_SUPPLY >= totalSupply() + _amount, "Exceeds max supply");
        require(_amount > 0, "No 0 mints");
        require(tx.origin == _caller, "No contracts");
        uint256 callerBalance = balanceOf(msg.sender);
        uint256 totalMintCost = getTotalMintPrice(_caller, _amount);
        require(block.timestamp > presaleStartTime,"Sale Has Not Started Yet");
        if (_caller != owner()) {
            if (block.timestamp < presaleEndTime) {
                require(isWhitelisted(_caller), "user is not whitelisted");
                uint256 maxAllowed = getUserMaxMints(_caller);
                require (callerBalance + _amount <= maxAllowed,'exceeds maximum allowed during whitelist');
                
            }
            require(totalMintCost == msg.value, "Invalid funds provided");
        }

        _safeMint(_caller, _amount);
        emit Mint(_caller, _amount);
    }

    function getUserRole(address _user) public view returns (uint256) {
        for (uint256 i = 0; i < WL_OG.length; i++) {
            address currWallet = WL_OG[i];
            if (currWallet == _user) {
                return 1;
            }
        }
        for (uint256 i = 0; i < WL_WLR.length; i++) {
            address currWallet = WL_WLR[i];
            if (currWallet == _user) {
                return 2;
            }
        }
        return 3;
    }

    function isPresaleActive() public view returns (bool) {
        if (block.timestamp < presaleEndTime) {
            return true;
        }
        return false;
    }

    function getMintPrice(address _user) public view returns (uint256) {
        if (block.timestamp < presaleEndTime) {
            uint256 userRole = getUserRole(_user);
            if (userRole == 1) {
                return prices[0];
            } else if (userRole == 2) {
                return prices[1];
            } else {
                return prices[2];
            }
        } else {
            return prices[2];
        }
    }

    function getTotalMintPrice(address _user, uint256 _amount)
        public
        view
        returns (uint256)
    {
        uint256 mintPrice = getMintPrice(_user);
        uint256 totalCost = mintPrice * _amount;
        return totalCost;
    }

    function getUserMaxMints(address _user) public view returns(uint256) {
        if (block.timestamp < presaleEndTime) {
            uint256 userRole = getUserRole(_user);
        if (userRole == 1) {
            return maxMints[0];
        } else if (userRole == 2) {
            return maxMints[1];
        } else {
            return 0;
        }
        } else {
            return maxMints[1];
        }
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        return super.isApprovedForAll(owner, operator);
    }

    function maxMintAmount() public view returns (uint256) {
        return MAX_PER_TX;
    }

    function isWhitelisted(address _user) public view returns (bool) {
        for (uint256 i = 0; i < WL_OG.length; i++) {
            address currWallet = WL_OG[i];
            if (currWallet == _user) {
                return true;
            }
        }
        for (uint256 i = 0; i < WL_WLR.length; i++) {
            address currWallet = WL_WLR[i];
            if (currWallet == _user) {
                return true;
            }
        }
        return false;
    }

    function reveal() public onlyOwner {
        revealed = true;
    }

    function withdraw() external onlyOwner nonReentrant {
        _withdraw(msg.sender);
    }

    function changePrice(uint256 _newPrice,uint256 priceindex) public onlyOwner {
        prices[priceindex] = _newPrice;
    }

    function changeWithdrawPercentages(uint256 _newmkt,uint256 _newGameDev,uint256 _newMeta,uint256 _newCharity) public onlyOwner {
        marketingPercent = _newmkt;
        gameDevPercent = _newGameDev;
        metaPercent = _newMeta;
        charityPercent = _newCharity;
    }

    function setMarketingAddress(address _newAddress) public onlyOwner {
        marketingWallet = _newAddress;
    }

    function setGameDevAddress(address _newAddress) public onlyOwner {
        gameDevAddress = _newAddress;
    }

    function setMetaverseAddress(address _newAddress) public onlyOwner {
        metaverseAddress = _newAddress;
    }

    function setCharityAddress(address _newAddress) public onlyOwner {
        charityAddress = _newAddress;
    }

    

    function _withdraw(address _caller) private {
        uint256 currBalance = address(this).balance;
        uint256 mktShare = (currBalance * marketingPercent) /100;
        uint256 gameDevShare = (currBalance * gameDevPercent) / 100;
        uint256 metaShare = (currBalance * metaPercent) / 100;
        uint256 charityShare = (currBalance * charityPercent)/100;

        payable(marketingWallet).transfer(mktShare);
        payable(gameDevAddress).transfer(gameDevShare);
        payable(metaverseAddress).transfer(metaShare);
        payable(charityAddress).transfer(charityShare);
        payable(_caller).transfer(address(this).balance);
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        MAX_PER_TX = _newmaxMintAmount;
    }

    function setupOS() external onlyOwner {
        _safeMint(_msgSender(), 1);
    }

    function pause(bool _state) external onlyOwner {
        paused = _state;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function extendPSTime(uint256 _newStart, uint256 _duration) public onlyOwner {
        presaleStartTime = _newStart;
        presaleEndTime = _newStart +_duration;
    }


    function updateMaxSupply(uint256 _newSupply) external onlyOwner {
        MAX_SUPPLY = _newSupply;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function updateWhitelist(address[] calldata _whitelist,uint256 _typeOfWL) public onlyOwner {
       if (_typeOfWL == 1) {
           delete WL_OG;
           WL_OG = _whitelist;
       } else {
           delete WL_WLR;
           WL_WLR = _whitelist;
       }

       emit whitelistUpdated(msg.sender, _whitelist,_typeOfWL);
    }

    function addToWhitelist(address _newAddress,uint256 _role) public onlyOwner {
        require(_role == 1 || _role ==2,'Invalid Role Provided. No Such Role');
       if (_role == 1) {
           WL_OG.push(_newAddress);
           
       } else {
           WL_WLR.push(_newAddress);
       }
       emit addedToWhitelist(msg.sender, _newAddress,_role);
    }



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

        if (revealed == false) {
            return notRevealedUri;
        }

        string memory currentBaseURI = baseURI;
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        Strings.toString(tokenId),
                        baseExtension
                    )
                )
                : "";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_presaleStartTime","type":"uint256"}],"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":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Mint","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"role","type":"uint256"}],"name":"addedToWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"address[]","name":"newWhitelist","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"typeOfWL","type":"uint256"}],"name":"whitelistUpdated","type":"event"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"WL_OG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"WL_WLR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"},{"internalType":"uint256","name":"_role","type":"uint256"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"},{"internalType":"uint256","name":"priceindex","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmkt","type":"uint256"},{"internalType":"uint256","name":"_newGameDev","type":"uint256"},{"internalType":"uint256","name":"_newMeta","type":"uint256"},{"internalType":"uint256","name":"_newCharity","type":"uint256"}],"name":"changeWithdrawPercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"charityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStart","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"extendPSTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gameDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameDevPercent","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":"_user","type":"address"}],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getTotalMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserMaxMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserRole","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaverseAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"prices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setCharityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setGameDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setMetaverseAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setupOS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelist","type":"address[]"},{"internalType":"uint256","name":"_typeOfWL","type":"uint256"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600a91620002f5565b506001600c556005600d55610d05600e55600f805461ffff1916905560408051606081018252666a94d74f4300008152668e1bc9bf040000602082015266b1a2bc2ec50000918101919091526200007790601290600362000384565b506040805180820190915260058152600360208201526200009d906013906002620003cd565b50601680546001600160a01b031990811673e2a48ccba6678011bedfaa365514352ab8c63f5117909155601780548216737b9a595f74c360111e8fed196f101b1db7f64392179055601880548216736581de24627fa0b0e3e8f8edf238cfba396d730a179055601980549091167392affeefc212c2d7cfe9d425deffd77d9743ef58179055601e601a556023601b556014601c556005601d553480156200014357600080fd5b5060405162003759380380620037598339810160408190526200016691620004f4565b8551869086906200017f906002906020850190620002f5565b50805162000195906003906020840190620002f5565b50506000805550620001a733620001e0565b6001600955620001b78462000232565b620001c2836200029a565b620001ce8282620005bf565b60145560155550620006229350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620002815760405162461bcd60e51b815260206004820181905260248201526000805160206200373983398151915260448201526064015b60405180910390fd5b80516200029690600a906020840190620002f5565b5050565b6008546001600160a01b03163314620002e55760405162461bcd60e51b8152602060048201819052602482015260008051602062003739833981519152604482015260640162000278565b80516200029690600b9060208401905b8280546200030390620005e6565b90600052602060002090601f01602090048101928262000327576000855562000372565b82601f106200034257805160ff191683800117855562000372565b8280016001018555821562000372579182015b828111156200037257825182559160200191906001019062000355565b506200038092915062000410565b5090565b82805482825590600052602060002090810192821562000372579160200282015b8281111562000372578251829066ffffffffffffff16905591602001919060010190620003a5565b82805482825590600052602060002090810192821562000372579160200282015b8281111562000372578251829060ff16905591602001919060010190620003ee565b5b8082111562000380576000815560010162000411565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200044f57600080fd5b81516001600160401b03808211156200046c576200046c62000427565b604051601f8301601f19908116603f0116810190828211818310171562000497576200049762000427565b81604052838152602092508683858801011115620004b457600080fd5b600091505b83821015620004d85785820183015181830184015290820190620004b9565b83821115620004ea5760008385830101525b9695505050505050565b60008060008060008060c087890312156200050e57600080fd5b86516001600160401b03808211156200052657600080fd5b620005348a838b016200043d565b975060208901519150808211156200054b57600080fd5b620005598a838b016200043d565b965060408901519150808211156200057057600080fd5b6200057e8a838b016200043d565b955060608901519150808211156200059557600080fd5b50620005a489828a016200043d565b9350506080870151915060a087015190509295509295509295565b60008219821115620005e157634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620005fb57607f821691505b6020821081036200061c57634e487b7160e01b600052602260045260246000fd5b50919050565b61310780620006326000396000f3fe6080604052600436106103ad5760003560e01c8063719d0f2b116101e7578063bc31c1c11161010d578063d8020a18116100a0578063f103b4331161006f578063f103b43314610a88578063f2c4ce1e14610aa8578063f2fde38b14610ac8578063f43a22dc14610ae857600080fd5b8063d8020a1814610a12578063da35d2f014610a28578063da968ff514610a48578063e985e9c514610a6857600080fd5b8063c2f3aa6b116100dc578063c2f3aa6b14610981578063c6682862146109a1578063c87b56dd146109d2578063cb4b202f146109f257600080fd5b8063bc31c1c11461090b578063bd451fbf1461092b578063bfcb00d014610941578063c03809261461096157600080fd5b80639784c68d11610185578063a82524b211610154578063a82524b214610895578063afcf2fc4146108ab578063b3de019c146108cb578063b88d4fde146108eb57600080fd5b80639784c68d1461082d578063a0712d681461084d578063a22cb46514610860578063a475b5dd1461088057600080fd5b80637f00c7a6116101c15780637f00c7a6146107ba5780638da5cb5b146107da578063906e9dd0146107f857806395d89b411461081857600080fd5b8063719d0f2b1461075a57806375f0a8741461077a5780637f0023be1461079a57600080fd5b806332cb6b0c116102d75780635c975abb1161026a5780636a85ad87116102395780636a85ad87146106e55780636d0d93a51461070557806370a0823114610725578063715018a61461074557600080fd5b80635c975abb1461068157806360d938dc1461069b5780636352211e146106b0578063698982ba146106d057600080fd5b8063453c2310116102a6578063453c2310146106165780634a8cbae11461062c578063518302271461064257806355f804b31461066157600080fd5b806332cb6b0c146105ab5780633af32abf146105c15780633ccfd60b146105e157806342842e0e146105f657600080fd5b80630c9be46d1161034f578063239c70ae1161031e578063239c70ae1461054057806323b872dd14610555578063249b7c1914610575578063278208511461058b57600080fd5b80630c9be46d146104c35780631618d95a146104e357806318160ddd14610507578063214405fc1461052057600080fd5b806306fdde031161038b57806306fdde03146104295780630804409e1461044b578063081812fc1461046b578063095ea7b3146104a357600080fd5b806301ffc9a7146103b257806302329a29146103e75780630264b40a14610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004612ad5565b610afe565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b50610407610402366004612b02565b610b50565b005b34801561041557600080fd5b50610407610424366004612b1d565b610bb0565b34801561043557600080fd5b5061043e610c0e565b6040516103de9190612b97565b34801561045757600080fd5b50610407610466366004612bc1565b610ca0565b34801561047757600080fd5b5061048b610486366004612bdc565b610d0a565b6040516001600160a01b0390911681526020016103de565b3480156104af57600080fd5b506104076104be366004612bf5565b610d4e565b3480156104cf57600080fd5b506104076104de366004612bc1565b610ddb565b3480156104ef57600080fd5b506104f9601b5481565b6040519081526020016103de565b34801561051357600080fd5b50600154600054036104f9565b34801561052c57600080fd5b5061040761053b366004612bf5565b610e45565b34801561054c57600080fd5b50600c546104f9565b34801561056157600080fd5b50610407610570366004612c1f565b610fe0565b34801561058157600080fd5b506104f960145481565b34801561059757600080fd5b506104f96105a6366004612bc1565b610feb565b3480156105b757600080fd5b506104f9600e5481565b3480156105cd57600080fd5b506103d26105dc366004612bc1565b6110b6565b3480156105ed57600080fd5b50610407611181565b34801561060257600080fd5b50610407610611366004612c1f565b611230565b34801561062257600080fd5b506104f9600d5481565b34801561063857600080fd5b506104f9601d5481565b34801561064e57600080fd5b50600f546103d290610100900460ff1681565b34801561066d57600080fd5b5061040761067c366004612ce7565b61124b565b34801561068d57600080fd5b50600f546103d29060ff1681565b3480156106a757600080fd5b506103d26112aa565b3480156106bc57600080fd5b5061048b6106cb366004612bdc565b6112c2565b3480156106dc57600080fd5b506104076112d4565b3480156106f157600080fd5b5060185461048b906001600160a01b031681565b34801561071157600080fd5b5060175461048b906001600160a01b031681565b34801561073157600080fd5b506104f9610740366004612bc1565b611329565b34801561075157600080fd5b50610407611378565b34801561076657600080fd5b506104f9610775366004612bc1565b6113ca565b34801561078657600080fd5b5060165461048b906001600160a01b031681565b3480156107a657600080fd5b506104076107b5366004612d30565b61146d565b3480156107c657600080fd5b506104076107d5366004612bdc565b6114c9565b3480156107e657600080fd5b506008546001600160a01b031661048b565b34801561080457600080fd5b50610407610813366004612bc1565b611516565b34801561082457600080fd5b5061043e611580565b34801561083957600080fd5b506104f9610848366004612bf5565b61158f565b61040761085b366004612bdc565b6115b2565b34801561086c57600080fd5b5061040761087b366004612d62565b6118d8565b34801561088c57600080fd5b5061040761196d565b3480156108a157600080fd5b506104f960155481565b3480156108b757600080fd5b5060195461048b906001600160a01b031681565b3480156108d757600080fd5b506104076108e6366004612b1d565b6119c6565b3480156108f757600080fd5b50610407610906366004612d95565b611a32565b34801561091757600080fd5b506104f9610926366004612bdc565b611a83565b34801561093757600080fd5b506104f9601c5481565b34801561094d57600080fd5b5061048b61095c366004612bdc565b611aa4565b34801561096d57600080fd5b5061040761097c366004612bc1565b611ace565b34801561098d57600080fd5b506104f961099c366004612bc1565b611b38565b3480156109ad57600080fd5b5061043e60405180604001604052806005815260200164173539b7b760d91b81525081565b3480156109de57600080fd5b5061043e6109ed366004612bdc565b611b9d565b3480156109fe57600080fd5b50610407610a0d366004612e11565b611db0565b348015610a1e57600080fd5b506104f9601a5481565b348015610a3457600080fd5b5061048b610a43366004612bdc565b611e82565b348015610a5457600080fd5b506104f9610a63366004612bdc565b611e92565b348015610a7457600080fd5b506103d2610a83366004612e8c565b611ea2565b348015610a9457600080fd5b50610407610aa3366004612bdc565b611ed2565b348015610ab457600080fd5b50610407610ac3366004612ce7565b611f1f565b348015610ad457600080fd5b50610407610ae3366004612bc1565b611f7a565b348015610af457600080fd5b506104f9600c5481565b60006001600160e01b031982166380ac58cd60e01b1480610b2f57506001600160e01b03198216635b5e139f60e01b145b80610b4a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b03163314610b9d5760405162461bcd60e51b815260206004820181905260248201526000805160206130b283398151915260448201526064015b60405180910390fd5b600f805460ff1916911515919091179055565b6008546001600160a01b03163314610bf85760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b6015829055610c078183612ecc565b6014555050565b606060028054610c1d90612ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4990612ee4565b8015610c965780601f10610c6b57610100808354040283529160200191610c96565b820191906000526020600020905b815481529060010190602001808311610c7957829003601f168201915b5050505050905090565b6008546001600160a01b03163314610ce85760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d1582612033565b610d32576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d59826112c2565b9050806001600160a01b0316836001600160a01b031603610d8d5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610dad5750610dab8133611ea2565b155b15610dcb576040516367d9dca160e11b815260040160405180910390fd5b610dd683838361205e565b505050565b6008546001600160a01b03163314610e235760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610e8d5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b8060011480610e9c5750806002145b610ef45760405162461bcd60e51b815260206004820152602360248201527f496e76616c696420526f6c652050726f76696465642e204e6f205375636820526044820152626f6c6560e81b6064820152608401610b94565b80600103610f4c57601080546001810182556000919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319166001600160a01b038416179055610f98565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0384161790555b604080516001600160a01b03841681526020810183905233917f168d43db522f6251e2e308aaef14cf92f9f7d29f21fb2bf18a138f48173340fb910160405180910390a25050565b610dd68383836120ba565b6000805b60105481101561104c5760006010828154811061100e5761100e612f1e565b6000918252602090912001546001600160a01b03908116915084168103611039575060019392505050565b508061104481612f34565b915050610fef565b5060005b6011548110156110ad5760006011828154811061106f5761106f612f1e565b6000918252602090912001546001600160a01b0390811691508416810361109a575060029392505050565b50806110a581612f34565b915050611050565b50600392915050565b6000805b601054811015611117576000601082815481106110d9576110d9612f1e565b6000918252602090912001546001600160a01b03908116915084168103611104575060019392505050565b508061110f81612f34565b9150506110ba565b5060005b6011548110156111785760006011828154811061113a5761113a612f1e565b6000918252602090912001546001600160a01b03908116915084168103611165575060019392505050565b508061117081612f34565b91505061111b565b50600092915050565b6008546001600160a01b031633146111c95760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b60026009540361121b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b94565b6002600955611229336122aa565b6001600955565b610dd683838360405180602001604052806000815250611a32565b6008546001600160a01b031633146112935760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b80516112a690600a9060208401906129b5565b5050565b60006014544210156112bc5750600190565b50600090565b60006112cd8261244e565b5192915050565b6008546001600160a01b0316331461131c5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b61132733600161256a565b565b60006001600160a01b038216611352576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146113c05760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b6113276000612584565b60006014544210156114425760006113e183610feb565b9050806001036114125760126000815481106113ff576113ff612f1e565b9060005260206000200154915050919050565b8060020361142e5760126001815481106113ff576113ff612f1e565b60126002815481106113ff576113ff612f1e565b601260028154811061145657611456612f1e565b90600052602060002001549050919050565b919050565b6008546001600160a01b031633146114b55760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601a93909355601b91909155601c55601d55565b6008546001600160a01b031633146115115760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b600c55565b6008546001600160a01b0316331461155e5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b606060038054610c1d90612ee4565b60008061159b846113ca565b905060006115a98483612f4d565b95945050505050565b600f54339060ff16156115f05760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610b94565b816115fe6001546000540390565b6116089190612ecc565b600e5410156116595760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617820737570706c7900000000000000000000000000006044820152606401610b94565b600082116116965760405162461bcd60e51b815260206004820152600a6024820152694e6f2030206d696e747360b01b6044820152606401610b94565b326001600160a01b038216146116dd5760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b6044820152606401610b94565b60006116e833611329565b905060006116f6838561158f565b905060155442116117495760405162461bcd60e51b815260206004820152601860248201527f53616c6520486173204e6f7420537461727465642059657400000000000000006044820152606401610b94565b6008546001600160a01b038481169116146118855760145442101561183657611771836110b6565b6117bd5760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610b94565b60006117c884611b38565b9050806117d58685612ecc565b11156118345760405162461bcd60e51b815260206004820152602860248201527f65786365656473206d6178696d756d20616c6c6f77656420647572696e6720776044820152671a1a5d195b1a5cdd60c21b6064820152608401610b94565b505b3481146118855760405162461bcd60e51b815260206004820152601660248201527f496e76616c69642066756e64732070726f7669646564000000000000000000006044820152606401610b94565b61188f838561256a565b826001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885856040516118ca91815260200190565b60405180910390a250505050565b336001600160a01b038316036119015760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146119b55760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b600f805461ff001916610100179055565b6008546001600160a01b03163314611a0e5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b8160128281548110611a2257611a22612f1e565b6000918252602090912001555050565b611a3d8484846120ba565b6001600160a01b0383163b15158015611a5f5750611a5d848484846125d6565b155b15611a7d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60128181548110611a9357600080fd5b600091825260209091200154905081565b60118181548110611ab457600080fd5b6000918252602090912001546001600160a01b0316905081565b6008546001600160a01b03163314611b165760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000601454421015611b89576000611b4f83610feb565b905080600103611b6d5760136000815481106113ff576113ff612f1e565b806002036111785760136001815481106113ff576113ff612f1e565b601360018154811061145657611456612f1e565b6060611ba882612033565b611c0c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b94565b600f54610100900460ff161515600003611cb257600b8054611c2d90612ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5990612ee4565b8015611ca65780601f10611c7b57610100808354040283529160200191611ca6565b820191906000526020600020905b815481529060010190602001808311611c8957829003601f168201915b50505050509050919050565b6000600a8054611cc190612ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ced90612ee4565b8015611d3a5780601f10611d0f57610100808354040283529160200191611d3a565b820191906000526020600020905b815481529060010190602001808311611d1d57829003601f168201915b505050505090506000815111611d5f5760405180602001604052806000815250611da9565b80611d69846126c2565b60405180604001604052806005815260200164173539b7b760d91b815250604051602001611d9993929190612f6c565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611df85760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b80600103611e1e57611e0c60106000612a39565b611e1860108484612a57565b50611e38565b611e2a60116000612a39565b611e3660118484612a57565b505b336001600160a01b03167fcabd662ad441e99a29b0825d2c9a8660e80e6d363314893ca046b58821cc3dcd848484604051611e7593929190612faf565b60405180910390a2505050565b60108181548110611ab457600080fd5b60138181548110611a9357600080fd5b6001600160a01b03808316600090815260076020908152604080832093851683529290529081205460ff16611da9565b6008546001600160a01b03163314611f1a5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b600e55565b6008546001600160a01b03163314611f675760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b80516112a690600b9060208401906129b5565b6008546001600160a01b03163314611fc25760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b6001600160a01b0381166120275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b94565b61203081612584565b50565b6000805482108015610b4a575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006120c58261244e565b9050836001600160a01b031681600001516001600160a01b0316146120fc5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061211a575061211a8533611ea2565b8061213557503361212a84610d0a565b6001600160a01b0316145b90508061215557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661217c57604051633a954ecd60e21b815260040160405180910390fd5b6121886000848761205e565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661225e57600054821461225e578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b601a5447906000906064906122bf9084612f4d565b6122c99190613019565b905060006064601b54846122dd9190612f4d565b6122e79190613019565b905060006064601c54856122fb9190612f4d565b6123059190613019565b905060006064601d54866123199190612f4d565b6123239190613019565b6016546040519192506001600160a01b03169085156108fc029086906000818181858888f1935050505015801561235e573d6000803e3d6000fd5b506017546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015612399573d6000803e3d6000fd5b506018546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156123d4573d6000803e3d6000fd5b506019546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561240f573d6000803e3d6000fd5b506040516001600160a01b038716904780156108fc02916000818181858888f19350505050158015612445573d6000803e3d6000fd5b50505050505050565b60408051606081018252600080825260208201819052918101919091528160005481101561255157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff1615159181018290529061254f5780516001600160a01b0316156124e5579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561254a579392505050565b6124e5565b505b604051636f96cda160e11b815260040160405180910390fd5b6112a68282604051806020016040528060008152506127db565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061260b90339089908890889060040161302d565b6020604051808303816000875af1925050508015612646575060408051601f3d908101601f1916820190925261264391810190613069565b60015b6126a4573d808015612674576040519150601f19603f3d011682016040523d82523d6000602084013e612679565b606091505b50805160000361269c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036126e95750506040805180820190915260018152600360fc1b602082015290565b8160005b811561271357806126fd81612f34565b915061270c9050600a83613019565b91506126ed565b60008167ffffffffffffffff81111561272e5761272e612c5b565b6040519080825280601f01601f191660200182016040528015612758576020820181803683370190505b5090505b84156126ba5761276d600183613086565b915061277a600a8661309d565b612785906030612ecc565b60f81b81838151811061279a5761279a612f1e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506127d4600a86613019565b945061275c565b610dd683838360016000546001600160a01b03851661280c57604051622e076360e81b815260040160405180910390fd5b8360000361282d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156128df57506001600160a01b0387163b15155b15612967575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461293060008884806001019550886125d6565b61294d576040516368d2bf6b60e11b815260040160405180910390fd5b8082036128e557826000541461296257600080fd5b6129ac565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203612968575b506000556122a3565b8280546129c190612ee4565b90600052602060002090601f0160209004810192826129e35760008555612a29565b82601f106129fc57805160ff1916838001178555612a29565b82800160010185558215612a29579182015b82811115612a29578251825591602001919060010190612a0e565b50612a35929150612aaa565b5090565b50805460008255906000526020600020908101906120309190612aaa565b828054828255906000526020600020908101928215612a29579160200282015b82811115612a295781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612a77565b5b80821115612a355760008155600101612aab565b6001600160e01b03198116811461203057600080fd5b600060208284031215612ae757600080fd5b8135611da981612abf565b8035801515811461146857600080fd5b600060208284031215612b1457600080fd5b611da982612af2565b60008060408385031215612b3057600080fd5b50508035926020909101359150565b60005b83811015612b5a578181015183820152602001612b42565b83811115611a7d5750506000910152565b60008151808452612b83816020860160208601612b3f565b601f01601f19169290920160200192915050565b602081526000611da96020830184612b6b565b80356001600160a01b038116811461146857600080fd5b600060208284031215612bd357600080fd5b611da982612baa565b600060208284031215612bee57600080fd5b5035919050565b60008060408385031215612c0857600080fd5b612c1183612baa565b946020939093013593505050565b600080600060608486031215612c3457600080fd5b612c3d84612baa565b9250612c4b60208501612baa565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612c8c57612c8c612c5b565b604051601f8501601f19908116603f01168101908282118183101715612cb457612cb4612c5b565b81604052809350858152868686011115612ccd57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612cf957600080fd5b813567ffffffffffffffff811115612d1057600080fd5b8201601f81018413612d2157600080fd5b6126ba84823560208401612c71565b60008060008060808587031215612d4657600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215612d7557600080fd5b612d7e83612baa565b9150612d8c60208401612af2565b90509250929050565b60008060008060808587031215612dab57600080fd5b612db485612baa565b9350612dc260208601612baa565b925060408501359150606085013567ffffffffffffffff811115612de557600080fd5b8501601f81018713612df657600080fd5b612e0587823560208401612c71565b91505092959194509250565b600080600060408486031215612e2657600080fd5b833567ffffffffffffffff80821115612e3e57600080fd5b818601915086601f830112612e5257600080fd5b813581811115612e6157600080fd5b8760208260051b8501011115612e7657600080fd5b6020928301989097509590910135949350505050565b60008060408385031215612e9f57600080fd5b612ea883612baa565b9150612d8c60208401612baa565b634e487b7160e01b600052601160045260246000fd5b60008219821115612edf57612edf612eb6565b500190565b600181811c90821680612ef857607f821691505b602082108103612f1857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201612f4657612f46612eb6565b5060010190565b6000816000190483118215151615612f6757612f67612eb6565b500290565b60008451612f7e818460208901612b3f565b845190830190612f92818360208901612b3f565b8451910190612fa5818360208801612b3f565b0195945050505050565b6040808252810183905260008460608301825b86811015612ff0576001600160a01b03612fdb84612baa565b16825260209283019290910190600101612fc2565b5060209390930193909352509392505050565b634e487b7160e01b600052601260045260246000fd5b60008261302857613028613003565b500490565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261305f6080830184612b6b565b9695505050505050565b60006020828403121561307b57600080fd5b8151611da981612abf565b60008282101561309857613098612eb6565b500390565b6000826130ac576130ac613003565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220416b4abcecd56d9b9d3531b24392a1283dc1f31ae135103a1ec4e03562108ea564736f6c634300080d00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000546000000000000000000000000000000000000000000000000000000000626e5a20000000000000000000000000000000000000000000000000000000000000000b546967657220546f6f6e7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5449474552544f4f4e5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5851757238444c6f6b464b544d554c4c7664786864716d6b723544674657674850417641645a6f67357973772f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103ad5760003560e01c8063719d0f2b116101e7578063bc31c1c11161010d578063d8020a18116100a0578063f103b4331161006f578063f103b43314610a88578063f2c4ce1e14610aa8578063f2fde38b14610ac8578063f43a22dc14610ae857600080fd5b8063d8020a1814610a12578063da35d2f014610a28578063da968ff514610a48578063e985e9c514610a6857600080fd5b8063c2f3aa6b116100dc578063c2f3aa6b14610981578063c6682862146109a1578063c87b56dd146109d2578063cb4b202f146109f257600080fd5b8063bc31c1c11461090b578063bd451fbf1461092b578063bfcb00d014610941578063c03809261461096157600080fd5b80639784c68d11610185578063a82524b211610154578063a82524b214610895578063afcf2fc4146108ab578063b3de019c146108cb578063b88d4fde146108eb57600080fd5b80639784c68d1461082d578063a0712d681461084d578063a22cb46514610860578063a475b5dd1461088057600080fd5b80637f00c7a6116101c15780637f00c7a6146107ba5780638da5cb5b146107da578063906e9dd0146107f857806395d89b411461081857600080fd5b8063719d0f2b1461075a57806375f0a8741461077a5780637f0023be1461079a57600080fd5b806332cb6b0c116102d75780635c975abb1161026a5780636a85ad87116102395780636a85ad87146106e55780636d0d93a51461070557806370a0823114610725578063715018a61461074557600080fd5b80635c975abb1461068157806360d938dc1461069b5780636352211e146106b0578063698982ba146106d057600080fd5b8063453c2310116102a6578063453c2310146106165780634a8cbae11461062c578063518302271461064257806355f804b31461066157600080fd5b806332cb6b0c146105ab5780633af32abf146105c15780633ccfd60b146105e157806342842e0e146105f657600080fd5b80630c9be46d1161034f578063239c70ae1161031e578063239c70ae1461054057806323b872dd14610555578063249b7c1914610575578063278208511461058b57600080fd5b80630c9be46d146104c35780631618d95a146104e357806318160ddd14610507578063214405fc1461052057600080fd5b806306fdde031161038b57806306fdde03146104295780630804409e1461044b578063081812fc1461046b578063095ea7b3146104a357600080fd5b806301ffc9a7146103b257806302329a29146103e75780630264b40a14610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004612ad5565b610afe565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b50610407610402366004612b02565b610b50565b005b34801561041557600080fd5b50610407610424366004612b1d565b610bb0565b34801561043557600080fd5b5061043e610c0e565b6040516103de9190612b97565b34801561045757600080fd5b50610407610466366004612bc1565b610ca0565b34801561047757600080fd5b5061048b610486366004612bdc565b610d0a565b6040516001600160a01b0390911681526020016103de565b3480156104af57600080fd5b506104076104be366004612bf5565b610d4e565b3480156104cf57600080fd5b506104076104de366004612bc1565b610ddb565b3480156104ef57600080fd5b506104f9601b5481565b6040519081526020016103de565b34801561051357600080fd5b50600154600054036104f9565b34801561052c57600080fd5b5061040761053b366004612bf5565b610e45565b34801561054c57600080fd5b50600c546104f9565b34801561056157600080fd5b50610407610570366004612c1f565b610fe0565b34801561058157600080fd5b506104f960145481565b34801561059757600080fd5b506104f96105a6366004612bc1565b610feb565b3480156105b757600080fd5b506104f9600e5481565b3480156105cd57600080fd5b506103d26105dc366004612bc1565b6110b6565b3480156105ed57600080fd5b50610407611181565b34801561060257600080fd5b50610407610611366004612c1f565b611230565b34801561062257600080fd5b506104f9600d5481565b34801561063857600080fd5b506104f9601d5481565b34801561064e57600080fd5b50600f546103d290610100900460ff1681565b34801561066d57600080fd5b5061040761067c366004612ce7565b61124b565b34801561068d57600080fd5b50600f546103d29060ff1681565b3480156106a757600080fd5b506103d26112aa565b3480156106bc57600080fd5b5061048b6106cb366004612bdc565b6112c2565b3480156106dc57600080fd5b506104076112d4565b3480156106f157600080fd5b5060185461048b906001600160a01b031681565b34801561071157600080fd5b5060175461048b906001600160a01b031681565b34801561073157600080fd5b506104f9610740366004612bc1565b611329565b34801561075157600080fd5b50610407611378565b34801561076657600080fd5b506104f9610775366004612bc1565b6113ca565b34801561078657600080fd5b5060165461048b906001600160a01b031681565b3480156107a657600080fd5b506104076107b5366004612d30565b61146d565b3480156107c657600080fd5b506104076107d5366004612bdc565b6114c9565b3480156107e657600080fd5b506008546001600160a01b031661048b565b34801561080457600080fd5b50610407610813366004612bc1565b611516565b34801561082457600080fd5b5061043e611580565b34801561083957600080fd5b506104f9610848366004612bf5565b61158f565b61040761085b366004612bdc565b6115b2565b34801561086c57600080fd5b5061040761087b366004612d62565b6118d8565b34801561088c57600080fd5b5061040761196d565b3480156108a157600080fd5b506104f960155481565b3480156108b757600080fd5b5060195461048b906001600160a01b031681565b3480156108d757600080fd5b506104076108e6366004612b1d565b6119c6565b3480156108f757600080fd5b50610407610906366004612d95565b611a32565b34801561091757600080fd5b506104f9610926366004612bdc565b611a83565b34801561093757600080fd5b506104f9601c5481565b34801561094d57600080fd5b5061048b61095c366004612bdc565b611aa4565b34801561096d57600080fd5b5061040761097c366004612bc1565b611ace565b34801561098d57600080fd5b506104f961099c366004612bc1565b611b38565b3480156109ad57600080fd5b5061043e60405180604001604052806005815260200164173539b7b760d91b81525081565b3480156109de57600080fd5b5061043e6109ed366004612bdc565b611b9d565b3480156109fe57600080fd5b50610407610a0d366004612e11565b611db0565b348015610a1e57600080fd5b506104f9601a5481565b348015610a3457600080fd5b5061048b610a43366004612bdc565b611e82565b348015610a5457600080fd5b506104f9610a63366004612bdc565b611e92565b348015610a7457600080fd5b506103d2610a83366004612e8c565b611ea2565b348015610a9457600080fd5b50610407610aa3366004612bdc565b611ed2565b348015610ab457600080fd5b50610407610ac3366004612ce7565b611f1f565b348015610ad457600080fd5b50610407610ae3366004612bc1565b611f7a565b348015610af457600080fd5b506104f9600c5481565b60006001600160e01b031982166380ac58cd60e01b1480610b2f57506001600160e01b03198216635b5e139f60e01b145b80610b4a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b03163314610b9d5760405162461bcd60e51b815260206004820181905260248201526000805160206130b283398151915260448201526064015b60405180910390fd5b600f805460ff1916911515919091179055565b6008546001600160a01b03163314610bf85760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b6015829055610c078183612ecc565b6014555050565b606060028054610c1d90612ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4990612ee4565b8015610c965780601f10610c6b57610100808354040283529160200191610c96565b820191906000526020600020905b815481529060010190602001808311610c7957829003601f168201915b5050505050905090565b6008546001600160a01b03163314610ce85760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d1582612033565b610d32576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d59826112c2565b9050806001600160a01b0316836001600160a01b031603610d8d5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610dad5750610dab8133611ea2565b155b15610dcb576040516367d9dca160e11b815260040160405180910390fd5b610dd683838361205e565b505050565b6008546001600160a01b03163314610e235760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610e8d5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b8060011480610e9c5750806002145b610ef45760405162461bcd60e51b815260206004820152602360248201527f496e76616c696420526f6c652050726f76696465642e204e6f205375636820526044820152626f6c6560e81b6064820152608401610b94565b80600103610f4c57601080546001810182556000919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319166001600160a01b038416179055610f98565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0384161790555b604080516001600160a01b03841681526020810183905233917f168d43db522f6251e2e308aaef14cf92f9f7d29f21fb2bf18a138f48173340fb910160405180910390a25050565b610dd68383836120ba565b6000805b60105481101561104c5760006010828154811061100e5761100e612f1e565b6000918252602090912001546001600160a01b03908116915084168103611039575060019392505050565b508061104481612f34565b915050610fef565b5060005b6011548110156110ad5760006011828154811061106f5761106f612f1e565b6000918252602090912001546001600160a01b0390811691508416810361109a575060029392505050565b50806110a581612f34565b915050611050565b50600392915050565b6000805b601054811015611117576000601082815481106110d9576110d9612f1e565b6000918252602090912001546001600160a01b03908116915084168103611104575060019392505050565b508061110f81612f34565b9150506110ba565b5060005b6011548110156111785760006011828154811061113a5761113a612f1e565b6000918252602090912001546001600160a01b03908116915084168103611165575060019392505050565b508061117081612f34565b91505061111b565b50600092915050565b6008546001600160a01b031633146111c95760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b60026009540361121b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b94565b6002600955611229336122aa565b6001600955565b610dd683838360405180602001604052806000815250611a32565b6008546001600160a01b031633146112935760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b80516112a690600a9060208401906129b5565b5050565b60006014544210156112bc5750600190565b50600090565b60006112cd8261244e565b5192915050565b6008546001600160a01b0316331461131c5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b61132733600161256a565b565b60006001600160a01b038216611352576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146113c05760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b6113276000612584565b60006014544210156114425760006113e183610feb565b9050806001036114125760126000815481106113ff576113ff612f1e565b9060005260206000200154915050919050565b8060020361142e5760126001815481106113ff576113ff612f1e565b60126002815481106113ff576113ff612f1e565b601260028154811061145657611456612f1e565b90600052602060002001549050919050565b919050565b6008546001600160a01b031633146114b55760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601a93909355601b91909155601c55601d55565b6008546001600160a01b031633146115115760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b600c55565b6008546001600160a01b0316331461155e5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b606060038054610c1d90612ee4565b60008061159b846113ca565b905060006115a98483612f4d565b95945050505050565b600f54339060ff16156115f05760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610b94565b816115fe6001546000540390565b6116089190612ecc565b600e5410156116595760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617820737570706c7900000000000000000000000000006044820152606401610b94565b600082116116965760405162461bcd60e51b815260206004820152600a6024820152694e6f2030206d696e747360b01b6044820152606401610b94565b326001600160a01b038216146116dd5760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b6044820152606401610b94565b60006116e833611329565b905060006116f6838561158f565b905060155442116117495760405162461bcd60e51b815260206004820152601860248201527f53616c6520486173204e6f7420537461727465642059657400000000000000006044820152606401610b94565b6008546001600160a01b038481169116146118855760145442101561183657611771836110b6565b6117bd5760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610b94565b60006117c884611b38565b9050806117d58685612ecc565b11156118345760405162461bcd60e51b815260206004820152602860248201527f65786365656473206d6178696d756d20616c6c6f77656420647572696e6720776044820152671a1a5d195b1a5cdd60c21b6064820152608401610b94565b505b3481146118855760405162461bcd60e51b815260206004820152601660248201527f496e76616c69642066756e64732070726f7669646564000000000000000000006044820152606401610b94565b61188f838561256a565b826001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885856040516118ca91815260200190565b60405180910390a250505050565b336001600160a01b038316036119015760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146119b55760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b600f805461ff001916610100179055565b6008546001600160a01b03163314611a0e5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b8160128281548110611a2257611a22612f1e565b6000918252602090912001555050565b611a3d8484846120ba565b6001600160a01b0383163b15158015611a5f5750611a5d848484846125d6565b155b15611a7d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60128181548110611a9357600080fd5b600091825260209091200154905081565b60118181548110611ab457600080fd5b6000918252602090912001546001600160a01b0316905081565b6008546001600160a01b03163314611b165760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000601454421015611b89576000611b4f83610feb565b905080600103611b6d5760136000815481106113ff576113ff612f1e565b806002036111785760136001815481106113ff576113ff612f1e565b601360018154811061145657611456612f1e565b6060611ba882612033565b611c0c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b94565b600f54610100900460ff161515600003611cb257600b8054611c2d90612ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5990612ee4565b8015611ca65780601f10611c7b57610100808354040283529160200191611ca6565b820191906000526020600020905b815481529060010190602001808311611c8957829003601f168201915b50505050509050919050565b6000600a8054611cc190612ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ced90612ee4565b8015611d3a5780601f10611d0f57610100808354040283529160200191611d3a565b820191906000526020600020905b815481529060010190602001808311611d1d57829003601f168201915b505050505090506000815111611d5f5760405180602001604052806000815250611da9565b80611d69846126c2565b60405180604001604052806005815260200164173539b7b760d91b815250604051602001611d9993929190612f6c565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611df85760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b80600103611e1e57611e0c60106000612a39565b611e1860108484612a57565b50611e38565b611e2a60116000612a39565b611e3660118484612a57565b505b336001600160a01b03167fcabd662ad441e99a29b0825d2c9a8660e80e6d363314893ca046b58821cc3dcd848484604051611e7593929190612faf565b60405180910390a2505050565b60108181548110611ab457600080fd5b60138181548110611a9357600080fd5b6001600160a01b03808316600090815260076020908152604080832093851683529290529081205460ff16611da9565b6008546001600160a01b03163314611f1a5760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b600e55565b6008546001600160a01b03163314611f675760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b80516112a690600b9060208401906129b5565b6008546001600160a01b03163314611fc25760405162461bcd60e51b815260206004820181905260248201526000805160206130b28339815191526044820152606401610b94565b6001600160a01b0381166120275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b94565b61203081612584565b50565b6000805482108015610b4a575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006120c58261244e565b9050836001600160a01b031681600001516001600160a01b0316146120fc5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061211a575061211a8533611ea2565b8061213557503361212a84610d0a565b6001600160a01b0316145b90508061215557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661217c57604051633a954ecd60e21b815260040160405180910390fd5b6121886000848761205e565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661225e57600054821461225e578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b601a5447906000906064906122bf9084612f4d565b6122c99190613019565b905060006064601b54846122dd9190612f4d565b6122e79190613019565b905060006064601c54856122fb9190612f4d565b6123059190613019565b905060006064601d54866123199190612f4d565b6123239190613019565b6016546040519192506001600160a01b03169085156108fc029086906000818181858888f1935050505015801561235e573d6000803e3d6000fd5b506017546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015612399573d6000803e3d6000fd5b506018546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156123d4573d6000803e3d6000fd5b506019546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561240f573d6000803e3d6000fd5b506040516001600160a01b038716904780156108fc02916000818181858888f19350505050158015612445573d6000803e3d6000fd5b50505050505050565b60408051606081018252600080825260208201819052918101919091528160005481101561255157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff1615159181018290529061254f5780516001600160a01b0316156124e5579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561254a579392505050565b6124e5565b505b604051636f96cda160e11b815260040160405180910390fd5b6112a68282604051806020016040528060008152506127db565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061260b90339089908890889060040161302d565b6020604051808303816000875af1925050508015612646575060408051601f3d908101601f1916820190925261264391810190613069565b60015b6126a4573d808015612674576040519150601f19603f3d011682016040523d82523d6000602084013e612679565b606091505b50805160000361269c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036126e95750506040805180820190915260018152600360fc1b602082015290565b8160005b811561271357806126fd81612f34565b915061270c9050600a83613019565b91506126ed565b60008167ffffffffffffffff81111561272e5761272e612c5b565b6040519080825280601f01601f191660200182016040528015612758576020820181803683370190505b5090505b84156126ba5761276d600183613086565b915061277a600a8661309d565b612785906030612ecc565b60f81b81838151811061279a5761279a612f1e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506127d4600a86613019565b945061275c565b610dd683838360016000546001600160a01b03851661280c57604051622e076360e81b815260040160405180910390fd5b8360000361282d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156128df57506001600160a01b0387163b15155b15612967575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461293060008884806001019550886125d6565b61294d576040516368d2bf6b60e11b815260040160405180910390fd5b8082036128e557826000541461296257600080fd5b6129ac565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203612968575b506000556122a3565b8280546129c190612ee4565b90600052602060002090601f0160209004810192826129e35760008555612a29565b82601f106129fc57805160ff1916838001178555612a29565b82800160010185558215612a29579182015b82811115612a29578251825591602001919060010190612a0e565b50612a35929150612aaa565b5090565b50805460008255906000526020600020908101906120309190612aaa565b828054828255906000526020600020908101928215612a29579160200282015b82811115612a295781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612a77565b5b80821115612a355760008155600101612aab565b6001600160e01b03198116811461203057600080fd5b600060208284031215612ae757600080fd5b8135611da981612abf565b8035801515811461146857600080fd5b600060208284031215612b1457600080fd5b611da982612af2565b60008060408385031215612b3057600080fd5b50508035926020909101359150565b60005b83811015612b5a578181015183820152602001612b42565b83811115611a7d5750506000910152565b60008151808452612b83816020860160208601612b3f565b601f01601f19169290920160200192915050565b602081526000611da96020830184612b6b565b80356001600160a01b038116811461146857600080fd5b600060208284031215612bd357600080fd5b611da982612baa565b600060208284031215612bee57600080fd5b5035919050565b60008060408385031215612c0857600080fd5b612c1183612baa565b946020939093013593505050565b600080600060608486031215612c3457600080fd5b612c3d84612baa565b9250612c4b60208501612baa565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612c8c57612c8c612c5b565b604051601f8501601f19908116603f01168101908282118183101715612cb457612cb4612c5b565b81604052809350858152868686011115612ccd57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612cf957600080fd5b813567ffffffffffffffff811115612d1057600080fd5b8201601f81018413612d2157600080fd5b6126ba84823560208401612c71565b60008060008060808587031215612d4657600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215612d7557600080fd5b612d7e83612baa565b9150612d8c60208401612af2565b90509250929050565b60008060008060808587031215612dab57600080fd5b612db485612baa565b9350612dc260208601612baa565b925060408501359150606085013567ffffffffffffffff811115612de557600080fd5b8501601f81018713612df657600080fd5b612e0587823560208401612c71565b91505092959194509250565b600080600060408486031215612e2657600080fd5b833567ffffffffffffffff80821115612e3e57600080fd5b818601915086601f830112612e5257600080fd5b813581811115612e6157600080fd5b8760208260051b8501011115612e7657600080fd5b6020928301989097509590910135949350505050565b60008060408385031215612e9f57600080fd5b612ea883612baa565b9150612d8c60208401612baa565b634e487b7160e01b600052601160045260246000fd5b60008219821115612edf57612edf612eb6565b500190565b600181811c90821680612ef857607f821691505b602082108103612f1857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201612f4657612f46612eb6565b5060010190565b6000816000190483118215151615612f6757612f67612eb6565b500290565b60008451612f7e818460208901612b3f565b845190830190612f92818360208901612b3f565b8451910190612fa5818360208801612b3f565b0195945050505050565b6040808252810183905260008460608301825b86811015612ff0576001600160a01b03612fdb84612baa565b16825260209283019290910190600101612fc2565b5060209390930193909352509392505050565b634e487b7160e01b600052601260045260246000fd5b60008261302857613028613003565b500490565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261305f6080830184612b6b565b9695505050505050565b60006020828403121561307b57600080fd5b8151611da981612abf565b60008282101561309857613098612eb6565b500390565b6000826130ac576130ac613003565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220416b4abcecd56d9b9d3531b24392a1283dc1f31ae135103a1ec4e03562108ea564736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000546000000000000000000000000000000000000000000000000000000000626e5a20000000000000000000000000000000000000000000000000000000000000000b546967657220546f6f6e7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5449474552544f4f4e5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5851757238444c6f6b464b544d554c4c7664786864716d6b723544674657674850417641645a6f67357973772f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Tiger Toonz
Arg [1] : _symbol (string): TIGERTOONZ
Arg [2] : _initBaseURI (string):
Arg [3] : _initNotRevealedUri (string): ipfs://QmXQur8DLokFKTMULLvdxhdqmkr5DgFWgHPAvAdZog5ysw/hidden.json
Arg [4] : _duration (uint256): 21600
Arg [5] : _presaleStartTime (uint256): 1651399200

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000005460
Arg [5] : 00000000000000000000000000000000000000000000000000000000626e5a20
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [7] : 546967657220546f6f6e7a000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [9] : 5449474552544f4f4e5a00000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [12] : 697066733a2f2f516d5851757238444c6f6b464b544d554c4c7664786864716d
Arg [13] : 6b723544674657674850417641645a6f67357973772f68696464656e2e6a736f
Arg [14] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

47598:9548:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29731:305;;;;;;;;;;-1:-1:-1;29731:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;29731:305:0;;;;;;;;55054:81;;;;;;;;;;-1:-1:-1;55054:81:0;;;;;:::i;:::-;;:::i;:::-;;55255:172;;;;;;;;;;-1:-1:-1;55255:172:0;;;;;:::i;:::-;;:::i;32844:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53916:116::-;;;;;;;;;;-1:-1:-1;53916:116:0;;;;;:::i;:::-;;:::i;34347:204::-;;;;;;;;;;-1:-1:-1;34347:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2687:55:1;;;2669:74;;2657:2;2642:18;34347:204:0;2523:226:1;33910:371:0;;;;;;;;;;-1:-1:-1;33910:371:0;;;;;:::i;:::-;;:::i;54040:112::-;;;;;;;;;;-1:-1:-1;54040:112:0;;;;;:::i;:::-;;:::i;48579:34::-;;;;;;;;;;;;;;;;;;;3159:25:1;;;3147:2;3132:18;48579:34:0;3013:177:1;28980:303:0;;;;;;;;;;-1:-1:-1;29234:12:0;;29024:7;29218:13;:28;28980:303;;56034:368;;;;;;;;;;-1:-1:-1;56034:368:0;;;;;:::i;:::-;;:::i;52480:91::-;;;;;;;;;;-1:-1:-1;52553:10:0;;52480:91;;35212:170;;;;;;;;;;-1:-1:-1;35212:170:0;;;;;:::i;:::-;;:::i;48135:29::-;;;;;;;;;;;;;;;;50449:477;;;;;;;;;;-1:-1:-1;50449:477:0;;;;;:::i;:::-;;:::i;47859:32::-;;;;;;;;;;;;;;;;52579:486;;;;;;;;;;-1:-1:-1;52579:486:0;;;;;:::i;:::-;;:::i;53150:92::-;;;;;;;;;;;;;:::i;35453:185::-;;;;;;;;;;-1:-1:-1;35453:185:0;;;;;:::i;:::-;;:::i;47821:31::-;;;;;;;;;;;;;;;;48658:33;;;;;;;;;;;;;;;;47931:28;;;;;;;;;;-1:-1:-1;47931:28:0;;;;;;;;;;;55143:104;;;;;;;;;;-1:-1:-1;55143:104:0;;;;;:::i;:::-;;:::i;47898:26::-;;;;;;;;;;-1:-1:-1;47898:26:0;;;;;;;;50934:171;;;;;;;;;;;;;:::i;32652:125::-;;;;;;;;;;-1:-1:-1;32652:125:0;;;;;:::i;:::-;;:::i;54963:83::-;;;;;;;;;;;;;:::i;48372:76::-;;;;;;;;;;-1:-1:-1;48372:76:0;;;;-1:-1:-1;;;;;48372:76:0;;;48291:74;;;;;;;;;;-1:-1:-1;48291:74:0;;;;-1:-1:-1;;;;;48291:74:0;;;30100:206;;;;;;;;;;-1:-1:-1;30100:206:0;;;;;:::i;:::-;;:::i;7489:103::-;;;;;;;;;;;;;:::i;51113:453::-;;;;;;;;;;-1:-1:-1;51113:453:0;;;;;:::i;:::-;;:::i;48209:75::-;;;;;;;;;;-1:-1:-1;48209:75:0;;;;-1:-1:-1;;;;;48209:75:0;;;53383:282;;;;;;;;;;-1:-1:-1;53383:282:0;;;;;:::i;:::-;;:::i;54836:119::-;;;;;;;;;;-1:-1:-1;54836:119:0;;;;;:::i;:::-;;:::i;6838:87::-;;;;;;;;;;-1:-1:-1;6911:6:0;;-1:-1:-1;;;;;6911:6:0;6838:87;;53673:115;;;;;;;;;;-1:-1:-1;53673:115:0;;;;;:::i;:::-;;:::i;33013:104::-;;;;;;;;;;;;;:::i;51574:256::-;;;;;;;;;;-1:-1:-1;51574:256:0;;;;;:::i;:::-;;:::i;49386:1055::-;;;;;;:::i;:::-;;:::i;34623:287::-;;;;;;;;;;-1:-1:-1;34623:287:0;;;;;:::i;:::-;;:::i;53073:69::-;;;;;;;;;;;;;:::i;48171:31::-;;;;;;;;;;;;;;;;48455:74;;;;;;;;;;-1:-1:-1;48455:74:0;;;;-1:-1:-1;;;;;48455:74:0;;;53250:125;;;;;;;;;;-1:-1:-1;53250:125:0;;;;;:::i;:::-;;:::i;35709:369::-;;;;;;;;;;-1:-1:-1;35709:369:0;;;;;:::i;:::-;;:::i;48025:62::-;;;;;;;;;;-1:-1:-1;48025:62:0;;;;;:::i;:::-;;:::i;48620:31::-;;;;;;;;;;;;;;;;47995:23;;;;;;;;;;-1:-1:-1;47995:23:0;;;;;:::i;:::-;;:::i;53796:112::-;;;;;;;;;;-1:-1:-1;53796:112:0;;;;;:::i;:::-;;:::i;51838:425::-;;;;;;;;;;-1:-1:-1;51838:425:0;;;;;:::i;:::-;;:::i;47696:46::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47696:46:0;;;;;56414:729;;;;;;;;;;-1:-1:-1;56414:729:0;;;;;:::i;:::-;;:::i;55685:341::-;;;;;;;;;;-1:-1:-1;55685:341:0;;;;;:::i;:::-;;:::i;48536:36::-;;;;;;;;;;;;;;;;47966:22;;;;;;;;;;-1:-1:-1;47966:22:0;;;;;:::i;:::-;;:::i;48094:34::-;;;;;;;;;;-1:-1:-1;48094:34:0;;;;;:::i;:::-;;:::i;52271:201::-;;;;;;;;;;-1:-1:-1;52271:201:0;;;;;:::i;:::-;;:::i;55437:106::-;;;;;;;;;;-1:-1:-1;55437:106:0;;;;;:::i;:::-;;:::i;55551:126::-;;;;;;;;;;-1:-1:-1;55551:126:0;;;;;:::i;:::-;;:::i;7747:201::-;;;;;;;;;;-1:-1:-1;7747:201:0;;;;;:::i;:::-;;:::i;47785:29::-;;;;;;;;;;;;;;;;29731:305;29833:4;-1:-1:-1;;;;;;29870:40:0;;-1:-1:-1;;;29870:40:0;;:105;;-1:-1:-1;;;;;;;29927:48:0;;-1:-1:-1;;;29927:48:0;29870:105;:158;;;-1:-1:-1;;;;;;;;;;19731:40:0;;;29992:36;29850:178;29731:305;-1:-1:-1;;29731:305:0:o;55054:81::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;;;;;;;;;55112:6:::1;:15:::0;;-1:-1:-1;;55112:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55054:81::o;55255:172::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;55343:16:::1;:28:::0;;;55399:20:::1;55410:9:::0;55362;55399:20:::1;:::i;:::-;55382:14;:37:::0;-1:-1:-1;;55255:172:0:o;32844:100::-;32898:13;32931:5;32924:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32844:100;:::o;53916:116::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;53994:16:::1;:30:::0;;-1:-1:-1;;;;;;53994:30:0::1;-1:-1:-1::0;;;;;53994:30:0;;;::::1;::::0;;;::::1;::::0;;53916:116::o;34347:204::-;34415:7;34440:16;34448:7;34440;:16::i;:::-;34435:64;;34465:34;;-1:-1:-1;;;34465:34:0;;;;;;;;;;;34435:64;-1:-1:-1;34519:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34519:24:0;;34347:204::o;33910:371::-;33983:13;33999:24;34015:7;33999:15;:24::i;:::-;33983:40;;34044:5;-1:-1:-1;;;;;34038:11:0;:2;-1:-1:-1;;;;;34038:11:0;;34034:48;;34058:24;;-1:-1:-1;;;34058:24:0;;;;;;;;;;;34034:48;5642:10;-1:-1:-1;;;;;34099:21:0;;;;;;:63;;-1:-1:-1;34125:37:0;34142:5;5642:10;52271:201;:::i;34125:37::-;34124:38;34099:63;34095:138;;;34186:35;;-1:-1:-1;;;34186:35:0;;;;;;;;;;;34095:138;34245:28;34254:2;34258:7;34267:5;34245:8;:28::i;:::-;33972:309;33910:371;;:::o;54040:112::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;54116:14:::1;:28:::0;;-1:-1:-1;;;;;;54116:28:0::1;-1:-1:-1::0;;;;;54116:28:0;;;::::1;::::0;;;::::1;::::0;;54040:112::o;56034:368::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;56129:5:::1;56138:1;56129:10;:23;;;;56143:5;56151:1;56143:9;56129:23;56121:70;;;::::0;-1:-1:-1;;;56121:70:0;;8246:2:1;56121:70:0::1;::::0;::::1;8228:21:1::0;8285:2;8265:18;;;8258:30;8324:34;8304:18;;;8297:62;-1:-1:-1;;;8375:18:1;;;8368:33;8418:19;;56121:70:0::1;8044:399:1::0;56121:70:0::1;56205:5;56214:1;56205:10:::0;56201:132:::1;;56231:5;:23:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;56231:23:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;56231:23:0::1;-1:-1:-1::0;;;;;56231:23:0;::::1;;::::0;;56201:132:::1;;;56298:6;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;56298:24:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;56298:24:0::1;-1:-1:-1::0;;;;;56298:24:0;::::1;;::::0;;56201:132:::1;56347:47;::::0;;-1:-1:-1;;;;;8640:55:1;;8622:74;;8727:2;8712:18;;8705:34;;;56364:10:0::1;::::0;56347:47:::1;::::0;8595:18:1;56347:47:0::1;;;;;;;56034:368:::0;;:::o;35212:170::-;35346:28;35356:4;35362:2;35366:7;35346:9;:28::i;50449:477::-;50506:7;;50526:181;50550:5;:12;50546:16;;50526:181;;;50584:18;50605:5;50611:1;50605:8;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;50605:8:0;;;;-1:-1:-1;50632:19:0;;;;50628:68;;-1:-1:-1;50679:1:0;;50449:477;-1:-1:-1;;;50449:477:0:o;50628:68::-;-1:-1:-1;50564:3:0;;;;:::i;:::-;;;;50526:181;;;;50722:9;50717:183;50741:6;:13;50737:17;;50717:183;;;50776:18;50797:6;50804:1;50797:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;50797:9:0;;;;-1:-1:-1;50825:19:0;;;;50821:68;;-1:-1:-1;50872:1:0;;50449:477;-1:-1:-1;;;50449:477:0:o;50821:68::-;-1:-1:-1;50756:3:0;;;;:::i;:::-;;;;50717:183;;;-1:-1:-1;50917:1:0;;50449:477;-1:-1:-1;;50449:477:0:o;52579:486::-;52638:4;;52655:184;52679:5;:12;52675:16;;52655:184;;;52713:18;52734:5;52740:1;52734:8;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;52734:8:0;;;;-1:-1:-1;52761:19:0;;;;52757:71;;-1:-1:-1;52808:4:0;;52579:486;-1:-1:-1;;;52579:486:0:o;52757:71::-;-1:-1:-1;52693:3:0;;;;:::i;:::-;;;;52655:184;;;;52854:9;52849:186;52873:6;:13;52869:17;;52849:186;;;52908:18;52929:6;52936:1;52929:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;52929:9:0;;;;-1:-1:-1;52957:19:0;;;;52953:71;;-1:-1:-1;53004:4:0;;52579:486;-1:-1:-1;;;52579:486:0:o;52953:71::-;-1:-1:-1;52888:3:0;;;;:::i;:::-;;;;52849:186;;;-1:-1:-1;53052:5:0;;52579:486;-1:-1:-1;;52579:486:0:o;53150:92::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;::::0;-1:-1:-1;;;2402:63:0;;9224:2:1;2402:63:0::1;::::0;::::1;9206:21:1::0;9263:2;9243:18;;;9236:30;9302:33;9282:18;;;9275:61;9353:18;;2402:63:0::1;9022:355:1::0;2402:63:0::1;1812:1;2543:7;:18:::0;53213:21:::2;53223:10;53213:9;:21::i;:::-;1768:1:::1;2722:7;:22:::0;53150:92::o;35453:185::-;35591:39;35608:4;35614:2;35618:7;35591:39;;;;;;;;;;;;:16;:39::i;55143:104::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;55218:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;55143:104:::0;:::o;50934:171::-;50982:4;51021:14;;51003:15;:32;50999:76;;;-1:-1:-1;51059:4:0;;50934:171::o;50999:76::-;-1:-1:-1;51092:5:0;;50934:171::o;32652:125::-;32716:7;32743:21;32756:7;32743:12;:21::i;:::-;:26;;32652:125;-1:-1:-1;;32652:125:0:o;54963:83::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;55012:26:::1;5642:10:::0;55036:1:::1;55012:9;:26::i;:::-;54963:83::o:0;30100:206::-;30164:7;-1:-1:-1;;;;;30188:19:0;;30184:60;;30216:28;;-1:-1:-1;;;30216:28:0;;;;;;;;;;;30184:60;-1:-1:-1;;;;;;30270:19:0;;;;;:12;:19;;;;;:27;;;;30100:206::o;7489:103::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;7554:30:::1;7581:1;7554:18;:30::i;51113:453::-:0;51171:7;51213:14;;51195:15;:32;51191:368;;;51244:16;51263:18;51275:5;51263:11;:18::i;:::-;51244:37;;51300:8;51312:1;51300:13;51296:203;;51341:6;51348:1;51341:9;;;;;;;;:::i;:::-;;;;;;;;;51334:16;;;51113:453;;;:::o;51296:203::-;51376:8;51388:1;51376:13;51372:127;;51417:6;51424:1;51417:9;;;;;;;;:::i;51372:127::-;51474:6;51481:1;51474:9;;;;;;;;:::i;51191:368::-;51538:6;51545:1;51538:9;;;;;;;;:::i;:::-;;;;;;;;;51531:16;;51113:453;;;:::o;51191:368::-;51113:453;;;:::o;53383:282::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;53520:16:::1;:26:::0;;;;53557:14:::1;:28:::0;;;;53596:11:::1;:22:::0;53629:14:::1;:28:::0;53383:282::o;54836:119::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;54917:10:::1;:30:::0;54836:119::o;53673:115::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;53751:15:::1;:29:::0;;-1:-1:-1;;;;;;53751:29:0::1;-1:-1:-1::0;;;;;53751:29:0;;;::::1;::::0;;;::::1;::::0;;53673:115::o;33013:104::-;33069:13;33102:7;33095:14;;;;;:::i;51574:256::-;51681:7;51706:17;51726:19;51739:5;51726:12;:19::i;:::-;51706:39;-1:-1:-1;51756:17:0;51776:19;51788:7;51706:39;51776:19;:::i;:::-;51756:39;51574:256;-1:-1:-1;;;;;51574:256:0:o;49386:1055::-;49493:6;;49463:10;;49493:6;;49492:7;49484:26;;;;-1:-1:-1;;;49484:26:0;;9757:2:1;49484:26:0;;;9739:21:1;9796:1;9776:18;;;9769:29;-1:-1:-1;;;9814:18:1;;;9807:36;9860:18;;49484:26:0;9555:329:1;49484:26:0;49559:7;49543:13;29234:12;;29024:7;29218:13;:28;;28980:303;49543:13;:23;;;;:::i;:::-;49529:10;;:37;;49521:68;;;;-1:-1:-1;;;49521:68:0;;10091:2:1;49521:68:0;;;10073:21:1;10130:2;10110:18;;;10103:30;10169:20;10149:18;;;10142:48;10207:18;;49521:68:0;9889:342:1;49521:68:0;49618:1;49608:7;:11;49600:34;;;;-1:-1:-1;;;49600:34:0;;10438:2:1;49600:34:0;;;10420:21:1;10477:2;10457:18;;;10450:30;-1:-1:-1;;;10496:18:1;;;10489:40;10546:18;;49600:34:0;10236:334:1;49600:34:0;49653:9;-1:-1:-1;;;;;49653:20:0;;;49645:45;;;;-1:-1:-1;;;49645:45:0;;10777:2:1;49645:45:0;;;10759:21:1;10816:2;10796:18;;;10789:30;-1:-1:-1;;;10835:18:1;;;10828:42;10887:18;;49645:45:0;10575:336:1;49645:45:0;49701:21;49725;49735:10;49725:9;:21::i;:::-;49701:45;;49757:21;49781:35;49799:7;49808;49781:17;:35::i;:::-;49757:59;;49853:16;;49835:15;:34;49827:70;;;;-1:-1:-1;;;49827:70:0;;11118:2:1;49827:70:0;;;11100:21:1;11157:2;11137:18;;;11130:30;11196:26;11176:18;;;11169:54;11240:18;;49827:70:0;10916:348:1;49827:70:0;6911:6;;-1:-1:-1;;;;;49912:18:0;;;6911:6;;49912:18;49908:448;;49969:14;;49951:15;:32;49947:322;;;50012:22;50026:7;50012:13;:22::i;:::-;50004:58;;;;-1:-1:-1;;;50004:58:0;;11471:2:1;50004:58:0;;;11453:21:1;11510:2;11490:18;;;11483:30;11549:25;11529:18;;;11522:53;11592:18;;50004:58:0;11269:347:1;50004:58:0;50081:18;50102:24;50118:7;50102:15;:24::i;:::-;50081:45;-1:-1:-1;50081:45:0;50154:23;50170:7;50154:13;:23;:::i;:::-;:37;;50145:90;;;;-1:-1:-1;;;50145:90:0;;11823:2:1;50145:90:0;;;11805:21:1;11862:2;11842:18;;;11835:30;11901:34;11881:18;;;11874:62;-1:-1:-1;;;11952:18:1;;;11945:38;12000:19;;50145:90:0;11621:404:1;50145:90:0;49985:284;49947:322;50308:9;50291:13;:26;50283:61;;;;-1:-1:-1;;;50283:61:0;;12232:2:1;50283:61:0;;;12214:21:1;12271:2;12251:18;;;12244:30;12310:24;12290:18;;;12283:52;12352:18;;50283:61:0;12030:346:1;50283:61:0;50368:27;50378:7;50387;50368:9;:27::i;:::-;50416:7;-1:-1:-1;;;;;50411:22:0;;50425:7;50411:22;;;;3159:25:1;;3147:2;3132:18;;3013:177;50411:22:0;;;;;;;;49434:1007;;;49386:1055;:::o;34623:287::-;5642:10;-1:-1:-1;;;;;34722:24:0;;;34718:54;;34755:17;;-1:-1:-1;;;34755:17:0;;;;;;;;;;;34718:54;5642:10;34785:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34785:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34785:53:0;;;;;;;;;;34854:48;;540:41:1;;;34785:42:0;;5642:10;34854:48;;513:18:1;34854:48:0;;;;;;;34623:287;;:::o;53073:69::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;53119:8:::1;:15:::0;;-1:-1:-1;;53119:15:0::1;;;::::0;;53073:69::o;53250:125::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;53358:9:::1;53337:6;53344:10;53337:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:30:::0;-1:-1:-1;;53250:125:0:o;35709:369::-;35876:28;35886:4;35892:2;35896:7;35876:9;:28::i;:::-;-1:-1:-1;;;;;35919:13:0;;9834:19;:23;;35919:76;;;;;35939:56;35970:4;35976:2;35980:7;35989:5;35939:30;:56::i;:::-;35938:57;35919:76;35915:156;;;36019:40;;-1:-1:-1;;;36019:40:0;;;;;;;;;;;35915:156;35709:369;;;;:::o;48025:62::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48025:62:0;:::o;47995:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47995:23:0;;-1:-1:-1;47995:23:0;:::o;53796:112::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;53872:14:::1;:28:::0;;-1:-1:-1;;;;;;53872:28:0::1;-1:-1:-1::0;;;;;53872:28:0;;;::::1;::::0;;;::::1;::::0;;53796:112::o;51838:425::-;51898:7;51940:14;;51922:15;:32;51918:338;;;51971:16;51990:18;52002:5;51990:11;:18::i;:::-;51971:37;;52023:8;52035:1;52023:13;52019:175;;52060:8;52069:1;52060:11;;;;;;;;:::i;52019:175::-;52093:8;52105:1;52093:13;52089:105;;52130:8;52139:1;52130:11;;;;;;;;:::i;51918:338::-;52233:8;52242:1;52233:11;;;;;;;;:::i;56414:729::-;56532:13;56585:16;56593:7;56585;:16::i;:::-;56563:113;;;;-1:-1:-1;;;56563:113:0;;12583:2:1;56563:113:0;;;12565:21:1;12622:2;12602:18;;;12595:30;12661:34;12641:18;;;12634:62;-1:-1:-1;;;12712:18:1;;;12705:45;12767:19;;56563:113:0;12381:411:1;56563:113:0;56693:8;;;;;;;:17;;56705:5;56693:17;56689:71;;56734:14;56727:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56414:729;;;:::o;56689:71::-;56772:28;56803:7;56772:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56872:1;56847:14;56841:28;:32;:294;;;;;;;;;;;;;;;;;56965:14;57006:25;57023:7;57006:16;:25::i;:::-;57058:13;;;;;;;;;;;;;-1:-1:-1;;;57058:13:0;;;56922:172;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56841:294;56821:314;56414:729;-1:-1:-1;;;56414:729:0:o;55685:341::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;55790:9:::1;55803:1;55790:14:::0;55786:166:::1;;55820:12;55827:5;;55820:12;:::i;:::-;55846:18;:5;55854:10:::0;;55846:18:::1;:::i;:::-;;55786:166;;;55895:13;55902:6;;55895:13;:::i;:::-;55922:19;:6;55931:10:::0;;55922:19:::1;:::i;:::-;;55786:166;55985:10;-1:-1:-1::0;;;;;55968:50:0::1;;55997:10;;56008:9;55968:50;;;;;;;;:::i;:::-;;;;;;;;55685:341:::0;;;:::o;47966:22::-;;;;;;;;;;;;48094:34;;;;;;;;;;;;52271:201;-1:-1:-1;;;;;35102:25:0;;;52396:4;35102:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;52425:39;34981:164;55437:106;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;55512:10:::1;:23:::0;55437:106::o;55551:126::-;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;55637:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;7747:201::-:0;6911:6;;-1:-1:-1;;;;;6911:6:0;5642:10;7058:23;7050:68;;;;-1:-1:-1;;;7050:68:0;;7235:2:1;7050:68:0;;;7217:21:1;;;7254:18;;;7247:30;-1:-1:-1;;;;;;;;;;;7293:18:1;;;7286:62;7365:18;;7050:68:0;7033:356:1;7050:68:0;-1:-1:-1;;;;;7836:22:0;::::1;7828:73;;;::::0;-1:-1:-1;;;7828:73:0;;14411:2:1;7828:73:0::1;::::0;::::1;14393:21:1::0;14450:2;14430:18;;;14423:30;14489:34;14469:18;;;14462:62;-1:-1:-1;;;14540:18:1;;;14533:36;14586:19;;7828:73:0::1;14209:402:1::0;7828:73:0::1;7912:28;7931:8;7912:18;:28::i;:::-;7747:201:::0;:::o;36333:174::-;36390:4;36454:13;;36444:7;:23;36414:85;;;;-1:-1:-1;;36472:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;36472:27:0;;;;36471:28;;36333:174::o;44490:196::-;44605:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;44605:29:0;-1:-1:-1;;;;;44605:29:0;;;;;;;;;44650:28;;44605:24;;44650:28;;;;;;;44490:196;;;:::o;39433:2130::-;39548:35;39586:21;39599:7;39586:12;:21::i;:::-;39548:59;;39646:4;-1:-1:-1;;;;;39624:26:0;:13;:18;;;-1:-1:-1;;;;;39624:26:0;;39620:67;;39659:28;;-1:-1:-1;;;39659:28:0;;;;;;;;;;;39620:67;39700:22;5642:10;-1:-1:-1;;;;;39726:20:0;;;;:73;;-1:-1:-1;39763:36:0;39780:4;5642:10;52271:201;:::i;39763:36::-;39726:126;;;-1:-1:-1;5642:10:0;39816:20;39828:7;39816:11;:20::i;:::-;-1:-1:-1;;;;;39816:36:0;;39726:126;39700:153;;39871:17;39866:66;;39897:35;;-1:-1:-1;;;39897:35:0;;;;;;;;;;;39866:66;-1:-1:-1;;;;;39947:16:0;;39943:52;;39972:23;;-1:-1:-1;;;39972:23:0;;;;;;;;;;;39943:52;40116:35;40133:1;40137:7;40146:4;40116:8;:35::i;:::-;-1:-1:-1;;;;;40447:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40447:31:0;;;;;;;-1:-1:-1;;40447:31:0;;;;;;;40493:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40493:29:0;;;;;;;;;;;40573:20;;;:11;:20;;;;;;40608:18;;-1:-1:-1;;;;;;40641:49:0;;;;-1:-1:-1;;;40674:15:0;40641:49;;;;;;;;;;40964:11;;41024:24;;;;;41067:13;;40573:20;;41024:24;;41067:13;41063:384;;41277:13;;41262:11;:28;41258:174;;41315:20;;41384:28;;;;41358:54;;-1:-1:-1;;;41358:54:0;-1:-1:-1;;;;;;41358:54:0;;;-1:-1:-1;;;;;41315:20:0;;41358:54;;;;41258:174;40422:1036;;;41494:7;41490:2;-1:-1:-1;;;;;41475:27:0;41484:4;-1:-1:-1;;;;;41475:27:0;;;;;;;;;;;41513:42;39537:2026;;39433:2130;;;:::o;54168:660::-;54311:16;;54245:21;;54223:19;;54330:3;;54297:30;;54245:21;54297:30;:::i;:::-;54296:37;;;;:::i;:::-;54277:56;;54344:20;54400:3;54382:14;;54368:11;:28;;;;:::i;:::-;54367:36;;;;:::i;:::-;54344:59;;54414:17;54464:3;54449:11;;54435;:25;;;;:::i;:::-;54434:33;;;;:::i;:::-;54414:53;;54478:20;54532:3;54516:14;;54502:11;:28;;;;:::i;:::-;54501:34;;;;:::i;:::-;54556:15;;54548:43;;54478:57;;-1:-1:-1;;;;;;54556:15:0;;54548:43;;;;;54582:8;;54556:15;54548:43;54556:15;54548:43;54582:8;54556:15;54548:43;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54610:14:0;;54602:46;;-1:-1:-1;;;;;54610:14:0;;;;54602:46;;;;;54635:12;;54610:14;54602:46;54610:14;54602:46;54635:12;54610:14;54602:46;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54667:16:0;;54659:45;;-1:-1:-1;;;;;54667:16:0;;;;54659:45;;;;;54694:9;;54667:16;54659:45;54667:16;54659:45;54694:9;54667:16;54659:45;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54723:14:0;;54715:46;;-1:-1:-1;;;;;54723:14:0;;;;54715:46;;;;;54748:12;;54723:14;54715:46;54723:14;54715:46;54748:12;54723:14;54715:46;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54772:48:0;;-1:-1:-1;;;;;54772:25:0;;;54798:21;54772:48;;;;;;;;;54798:21;54772:25;:48;;;;;;;;;;;;;;;;;;;;;54212:616;;;;;54168:660;:::o;31481:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31592:7:0;31675:13;;31668:4;:20;31637:886;;;31709:31;31743:17;;;:11;:17;;;;;;;;;31709:51;;;;;;;;;-1:-1:-1;;;;;31709:51:0;;;;-1:-1:-1;;;31709:51:0;;;;;;;;;;;-1:-1:-1;;;31709:51:0;;;;;;;;;;;;;;31779:729;;31829:14;;-1:-1:-1;;;;;31829:28:0;;31825:101;;31893:9;31481:1109;-1:-1:-1;;;31481:1109:0:o;31825:101::-;-1:-1:-1;;;32268:6:0;32313:17;;;;:11;:17;;;;;;;;;32301:29;;;;;;;;;-1:-1:-1;;;;;32301:29:0;;;;;-1:-1:-1;;;32301:29:0;;;;;;;;;;;-1:-1:-1;;;32301:29:0;;;;;;;;;;;;;32361:28;32357:109;;32429:9;31481:1109;-1:-1:-1;;;31481:1109:0:o;32357:109::-;32228:261;;;31690:833;31637:886;32551:31;;-1:-1:-1;;;32551:31:0;;;;;;;;;;;36515:104;36584:27;36594:2;36598:8;36584:27;;;;;;;;;;;;:9;:27::i;8108:191::-;8201:6;;;-1:-1:-1;;;;;8218:17:0;;;-1:-1:-1;;;;;;8218:17:0;;;;;;;8251:40;;8201:6;;;8218:17;8201:6;;8251:40;;8182:16;;8251:40;8171:128;8108:191;:::o;45178:667::-;45362:72;;-1:-1:-1;;;45362:72:0;;45341:4;;-1:-1:-1;;;;;45362:36:0;;;;;:72;;5642:10;;45413:4;;45419:7;;45428:5;;45362:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45362:72:0;;;;;;;;-1:-1:-1;;45362:72:0;;;;;;;;;;;;:::i;:::-;;;45358:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45596:6;:13;45613:1;45596:18;45592:235;;45642:40;;-1:-1:-1;;;45642:40:0;;;;;;;;;;;45592:235;45785:6;45779:13;45770:6;45766:2;45762:15;45755:38;45358:480;-1:-1:-1;;;;;;45481:55:0;-1:-1:-1;;;45481:55:0;;-1:-1:-1;45358:480:0;45178:667;;;;;;:::o;3124:723::-;3180:13;3401:5;3410:1;3401:10;3397:53;;-1:-1:-1;;3428:10:0;;;;;;;;;;;;-1:-1:-1;;;3428:10:0;;;;;3124:723::o;3397:53::-;3475:5;3460:12;3516:78;3523:9;;3516:78;;3549:8;;;;:::i;:::-;;-1:-1:-1;3572:10:0;;-1:-1:-1;3580:2:0;3572:10;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3626:17:0;;3604:39;;3654:154;3661:10;;3654:154;;3688:11;3698:1;3688:11;;:::i;:::-;;-1:-1:-1;3757:10:0;3765:2;3757:5;:10;:::i;:::-;3744:24;;:2;:24;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3785:11:0;3794:2;3785:11;;:::i;:::-;;;3654:154;;36982:163;37105:32;37111:2;37115:8;37125:5;37132:4;37543:20;37566:13;-1:-1:-1;;;;;37594:16:0;;37590:48;;37619:19;;-1:-1:-1;;;37619:19:0;;;;;;;;;;;37590:48;37653:8;37665:1;37653:13;37649:44;;37675:18;;-1:-1:-1;;;37675:18:0;;;;;;;;;;;37649:44;-1:-1:-1;;;;;38044:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;38103:49:0;;38044:44;;;;;;;;38103:49;;;;-1:-1:-1;;38044:44:0;;;;;;38103:49;;;;;;;;;;;;;;;;38169:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;38219:66:0;;;;-1:-1:-1;;;38269:15:0;38219:66;;;;;;;;;;38169:25;38366:23;;;38410:4;:23;;;;-1:-1:-1;;;;;;38418:13:0;;9834:19;:23;;38418:15;38406:641;;;38454:314;38485:38;;38510:12;;-1:-1:-1;;;;;38485:38:0;;;38502:1;;38485:38;;38502:1;;38485:38;38551:69;38590:1;38594:2;38598:14;;;;;;38614:5;38551:30;:69::i;:::-;38546:174;;38656:40;;-1:-1:-1;;;38656:40:0;;;;;;;;;;;38546:174;38763:3;38747:12;:19;38454:314;;38849:12;38832:13;;:29;38828:43;;38863:8;;;38828:43;38406:641;;;38912:120;38943:40;;38968:14;;;;;-1:-1:-1;;;;;38943:40:0;;;38960:1;;38943:40;;38960:1;;38943:40;39027:3;39011:12;:19;38912:120;;38406:641;-1:-1:-1;39061:13:0;:28;39111:60;35709:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:160::-;657:20;;713:13;;706:21;696:32;;686:60;;742:1;739;732:12;757:180;813:6;866:2;854:9;845:7;841:23;837:32;834:52;;;882:1;879;872:12;834:52;905:26;921:9;905:26;:::i;942:248::-;1010:6;1018;1071:2;1059:9;1050:7;1046:23;1042:32;1039:52;;;1087:1;1084;1077:12;1039:52;-1:-1:-1;;1110:23:1;;;1180:2;1165:18;;;1152:32;;-1:-1:-1;942:248:1:o;1195:258::-;1267:1;1277:113;1291:6;1288:1;1285:13;1277:113;;;1367:11;;;1361:18;1348:11;;;1341:39;1313:2;1306:10;1277:113;;;1408:6;1405:1;1402:13;1399:48;;;-1:-1:-1;;1443:1:1;1425:16;;1418:27;1195:258::o;1458:::-;1500:3;1538:5;1532:12;1565:6;1560:3;1553:19;1581:63;1637:6;1630:4;1625:3;1621:14;1614:4;1607:5;1603:16;1581:63;:::i;:::-;1698:2;1677:15;-1:-1:-1;;1673:29:1;1664:39;;;;1705:4;1660:50;;1458:258;-1:-1:-1;;1458:258:1:o;1721:220::-;1870:2;1859:9;1852:21;1833:4;1890:45;1931:2;1920:9;1916:18;1908:6;1890:45;:::i;1946:196::-;2014:20;;-1:-1:-1;;;;;2063:54:1;;2053:65;;2043:93;;2132:1;2129;2122:12;2147:186;2206:6;2259:2;2247:9;2238:7;2234:23;2230:32;2227:52;;;2275:1;2272;2265:12;2227:52;2298:29;2317:9;2298:29;:::i;2338:180::-;2397:6;2450:2;2438:9;2429:7;2425:23;2421:32;2418:52;;;2466:1;2463;2456:12;2418:52;-1:-1:-1;2489:23:1;;2338:180;-1:-1:-1;2338:180:1:o;2754:254::-;2822:6;2830;2883:2;2871:9;2862:7;2858:23;2854:32;2851:52;;;2899:1;2896;2889:12;2851:52;2922:29;2941:9;2922:29;:::i;:::-;2912:39;2998:2;2983:18;;;;2970:32;;-1:-1:-1;;;2754:254:1:o;3195:328::-;3272:6;3280;3288;3341:2;3329:9;3320:7;3316:23;3312:32;3309:52;;;3357:1;3354;3347:12;3309:52;3380:29;3399:9;3380:29;:::i;:::-;3370:39;;3428:38;3462:2;3451:9;3447:18;3428:38;:::i;:::-;3418:48;;3513:2;3502:9;3498:18;3485:32;3475:42;;3195:328;;;;;:::o;3528:127::-;3589:10;3584:3;3580:20;3577:1;3570:31;3620:4;3617:1;3610:15;3644:4;3641:1;3634:15;3660:632;3725:5;3755:18;3796:2;3788:6;3785:14;3782:40;;;3802:18;;:::i;:::-;3877:2;3871:9;3845:2;3931:15;;-1:-1:-1;;3927:24:1;;;3953:2;3923:33;3919:42;3907:55;;;3977:18;;;3997:22;;;3974:46;3971:72;;;4023:18;;:::i;:::-;4063:10;4059:2;4052:22;4092:6;4083:15;;4122:6;4114;4107:22;4162:3;4153:6;4148:3;4144:16;4141:25;4138:45;;;4179:1;4176;4169:12;4138:45;4229:6;4224:3;4217:4;4209:6;4205:17;4192:44;4284:1;4277:4;4268:6;4260;4256:19;4252:30;4245:41;;;;3660:632;;;;;:::o;4297:451::-;4366:6;4419:2;4407:9;4398:7;4394:23;4390:32;4387:52;;;4435:1;4432;4425:12;4387:52;4475:9;4462:23;4508:18;4500:6;4497:30;4494:50;;;4540:1;4537;4530:12;4494:50;4563:22;;4616:4;4608:13;;4604:27;-1:-1:-1;4594:55:1;;4645:1;4642;4635:12;4594:55;4668:74;4734:7;4729:2;4716:16;4711:2;4707;4703:11;4668:74;:::i;4753:385::-;4839:6;4847;4855;4863;4916:3;4904:9;4895:7;4891:23;4887:33;4884:53;;;4933:1;4930;4923:12;4884:53;-1:-1:-1;;4956:23:1;;;5026:2;5011:18;;4998:32;;-1:-1:-1;5077:2:1;5062:18;;5049:32;;5128:2;5113:18;5100:32;;-1:-1:-1;4753:385:1;-1:-1:-1;4753:385:1:o;5143:254::-;5208:6;5216;5269:2;5257:9;5248:7;5244:23;5240:32;5237:52;;;5285:1;5282;5275:12;5237:52;5308:29;5327:9;5308:29;:::i;:::-;5298:39;;5356:35;5387:2;5376:9;5372:18;5356:35;:::i;:::-;5346:45;;5143:254;;;;;:::o;5402:667::-;5497:6;5505;5513;5521;5574:3;5562:9;5553:7;5549:23;5545:33;5542:53;;;5591:1;5588;5581:12;5542:53;5614:29;5633:9;5614:29;:::i;:::-;5604:39;;5662:38;5696:2;5685:9;5681:18;5662:38;:::i;:::-;5652:48;;5747:2;5736:9;5732:18;5719:32;5709:42;;5802:2;5791:9;5787:18;5774:32;5829:18;5821:6;5818:30;5815:50;;;5861:1;5858;5851:12;5815:50;5884:22;;5937:4;5929:13;;5925:27;-1:-1:-1;5915:55:1;;5966:1;5963;5956:12;5915:55;5989:74;6055:7;6050:2;6037:16;6032:2;6028;6024:11;5989:74;:::i;:::-;5979:84;;;5402:667;;;;;;;:::o;6074:689::-;6169:6;6177;6185;6238:2;6226:9;6217:7;6213:23;6209:32;6206:52;;;6254:1;6251;6244:12;6206:52;6294:9;6281:23;6323:18;6364:2;6356:6;6353:14;6350:34;;;6380:1;6377;6370:12;6350:34;6418:6;6407:9;6403:22;6393:32;;6463:7;6456:4;6452:2;6448:13;6444:27;6434:55;;6485:1;6482;6475:12;6434:55;6525:2;6512:16;6551:2;6543:6;6540:14;6537:34;;;6567:1;6564;6557:12;6537:34;6622:7;6615:4;6605:6;6602:1;6598:14;6594:2;6590:23;6586:34;6583:47;6580:67;;;6643:1;6640;6633:12;6580:67;6674:4;6666:13;;;;6698:6;;-1:-1:-1;6736:20:1;;;;6723:34;;6074:689;-1:-1:-1;;;;6074:689:1:o;6768:260::-;6836:6;6844;6897:2;6885:9;6876:7;6872:23;6868:32;6865:52;;;6913:1;6910;6903:12;6865:52;6936:29;6955:9;6936:29;:::i;:::-;6926:39;;6984:38;7018:2;7007:9;7003:18;6984:38;:::i;7394:127::-;7455:10;7450:3;7446:20;7443:1;7436:31;7486:4;7483:1;7476:15;7510:4;7507:1;7500:15;7526:128;7566:3;7597:1;7593:6;7590:1;7587:13;7584:39;;;7603:18;;:::i;:::-;-1:-1:-1;7639:9:1;;7526:128::o;7659:380::-;7738:1;7734:12;;;;7781;;;7802:61;;7856:4;7848:6;7844:17;7834:27;;7802:61;7909:2;7901:6;7898:14;7878:18;7875:38;7872:161;;7955:10;7950:3;7946:20;7943:1;7936:31;7990:4;7987:1;7980:15;8018:4;8015:1;8008:15;7872:161;;7659:380;;;:::o;8750:127::-;8811:10;8806:3;8802:20;8799:1;8792:31;8842:4;8839:1;8832:15;8866:4;8863:1;8856:15;8882:135;8921:3;8942:17;;;8939:43;;8962:18;;:::i;:::-;-1:-1:-1;9009:1:1;8998:13;;8882:135::o;9382:168::-;9422:7;9488:1;9484;9480:6;9476:14;9473:1;9470:21;9465:1;9458:9;9451:17;9447:45;9444:71;;;9495:18;;:::i;:::-;-1:-1:-1;9535:9:1;;9382:168::o;12797:664::-;13024:3;13062:6;13056:13;13078:53;13124:6;13119:3;13112:4;13104:6;13100:17;13078:53;:::i;:::-;13194:13;;13153:16;;;;13216:57;13194:13;13153:16;13250:4;13238:17;;13216:57;:::i;:::-;13340:13;;13295:20;;;13362:57;13340:13;13295:20;13396:4;13384:17;;13362:57;:::i;:::-;13435:20;;12797:664;-1:-1:-1;;;;;12797:664:1:o;13466:738::-;13694:2;13706:21;;;13679:18;;13762:22;;;13646:4;13841:6;13815:2;13800:18;;13646:4;13875:258;13889:6;13886:1;13883:13;13875:258;;;-1:-1:-1;;;;;13954:26:1;13973:6;13954:26;:::i;:::-;13950:75;13938:88;;14049:4;14108:15;;;;14073:12;;;;13911:1;13904:9;13875:258;;;-1:-1:-1;14184:4:1;14169:20;;;;14162:36;;;;-1:-1:-1;14150:3:1;13466:738;-1:-1:-1;;;13466:738:1:o;14616:127::-;14677:10;14672:3;14668:20;14665:1;14658:31;14708:4;14705:1;14698:15;14732:4;14729:1;14722:15;14748:120;14788:1;14814;14804:35;;14819:18;;:::i;:::-;-1:-1:-1;14853:9:1;;14748:120::o;14873:512::-;15067:4;-1:-1:-1;;;;;15177:2:1;15169:6;15165:15;15154:9;15147:34;15229:2;15221:6;15217:15;15212:2;15201:9;15197:18;15190:43;;15269:6;15264:2;15253:9;15249:18;15242:34;15312:3;15307:2;15296:9;15292:18;15285:31;15333:46;15374:3;15363:9;15359:19;15351:6;15333:46;:::i;:::-;15325:54;14873:512;-1:-1:-1;;;;;;14873:512:1:o;15390:249::-;15459:6;15512:2;15500:9;15491:7;15487:23;15483:32;15480:52;;;15528:1;15525;15518:12;15480:52;15560:9;15554:16;15579:30;15603:5;15579:30;:::i;15644:125::-;15684:4;15712:1;15709;15706:8;15703:34;;;15717:18;;:::i;:::-;-1:-1:-1;15754:9:1;;15644:125::o;15774:112::-;15806:1;15832;15822:35;;15837:18;;:::i;:::-;-1:-1:-1;15871:9:1;;15774:112::o

Swarm Source

ipfs://416b4abcecd56d9b9d3531b24392a1283dc1f31ae135103a1ec4e03562108ea5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.