ETH Price: $3,319.76 (-2.06%)
 

Overview

Max Total Supply

69 TTX

Holders

37

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
everyting.eth
Balance
5 TTX
0x94197eca14c62dccacd8ac3488cf73c81cede8ba
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:
TISMTroops

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-29
*/

// https://EZFCM10iX.com

// SPDX-License-Identifier: MIT

pragma solidity 0.8.20;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event. C U ON THE MOON
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/// @notice Optimized and flexible operator filterer to abide to OpenSea's
/// mandatory on-chain royalty enforcement in order for new collections to
/// receive royalties.
/// For more information, see:
/// See: https://github.com/ProjectOpenSea/operator-filter-registry
abstract contract OperatorFilterer {
    /// @dev The default OpenSea operator blocklist subscription.
    address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

    /// @dev The OpenSea operator filter registry.
    address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E;

    /// @dev Registers the current contract to OpenSea's operator filter,
    /// and subscribe to the default OpenSea operator blocklist.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering() internal virtual {
        _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true);
    }

    /// @dev Registers the current contract to OpenSea's operator filter.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe)
        internal
        virtual
    {
        /// @solidity memory-safe-assembly
        assembly {
            let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`.

            // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty.
            subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy))

            for {} iszero(subscribe) {} {
                if iszero(subscriptionOrRegistrantToCopy) {
                    functionSelector := 0x4420e486 // `register(address)`.
                    break
                }
                functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`.
                break
            }
            // Store the function selector.
            mstore(0x00, shl(224, functionSelector))
            // Store the `address(this)`.
            mstore(0x04, address())
            // Store the `subscriptionOrRegistrantToCopy`.
            mstore(0x24, subscriptionOrRegistrantToCopy)
            // Register into the registry.
            if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) {
                // If the function selector has not been overwritten,
                // it is an out-of-gas error.
                if eq(shr(224, mload(0x00)), functionSelector) {
                    // To prevent gas under-estimation.
                    revert(0, 0)
                }
            }
            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, because of Solidity's memory size limits.
            mstore(0x24, 0)
        }
    }

    /// @dev Modifier to guard a function and revert if the caller is a blocked operator.
    modifier onlyAllowedOperator(address from) virtual {
        if (from != msg.sender) {
            if (!_isPriorityOperator(msg.sender)) {
                if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender);
            }
        }
        _;
    }

    /// @dev Modifier to guard a function from approving a blocked operator..
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        if (!_isPriorityOperator(operator)) {
            if (_operatorFilteringEnabled()) _revertIfBlocked(operator);
        }
        _;
    }

    /// @dev Helper function that reverts if the `operator` is blocked by the registry.
    function _revertIfBlocked(address operator) private view {
        /// @solidity memory-safe-assembly
        assembly {
            // Store the function selector of `isOperatorAllowed(address,address)`,
            // shifted left by 6 bytes, which is enough for 8tb of memory.
            // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL).
            mstore(0x00, 0xc6171134001122334455)
            // Store the `address(this)`.
            mstore(0x1a, address())
            // Store the `operator`.
            mstore(0x3a, operator)

            // `isOperatorAllowed` always returns true if it does not revert.
            if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) {
                // Bubble up the revert if the staticcall reverts.
                returndatacopy(0x00, 0x00, returndatasize())
                revert(0x00, returndatasize())
            }

            // We'll skip checking if `from` is inside the blacklist.
            // Even though that can block transferring out of wrapper contracts,
            // we don't want tokens to be stuck.

            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, if less than 8tb of memory is used.
            mstore(0x3a, 0)
        }
    }

    /// @dev For deriving contracts to override, so that operator filtering
    /// can be turned on / off.
    /// Returns true by default.
    function _operatorFilteringEnabled() internal view virtual returns (bool) {
        return true;
    }

    /// @dev For deriving contracts to override, so that preferred marketplaces can
    /// skip operator filtering, helping users save gas.
    /// Returns false for all inputs by default.
    function _isPriorityOperator(address) internal view virtual returns (bool) {
        return false;
    }
}

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


/**
 * @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 Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

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

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    using Strings for uint256;
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _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 {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector);
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector);

        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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Returns whether the ownership slot at `index` is initialized.
     * An uninitialized slot does not necessarily mean that the slot has no owner.
     */
    function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) {
        return _packedOwnerships[index] != 0;
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) {
        if (_startTokenId() <= tokenId) {
            packed = _packedOwnerships[tokenId];
            // If the data at the starting slot does not exist, start the scan.
            if (packed == 0) {
                if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector);
                // Invariant:
                // There will always be an initialized ownership slot
                // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                // before an unintialized ownership slot
                // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                // Hence, `tokenId` will not underflow.
                //
                // We can directly compare the packed value.
                // If the address is zero, packed will be zero.
                for (;;) {
                    unchecked {
                        packed = _packedOwnerships[--tokenId];
                    }
                    if (packed == 0) continue;
                    if (packed & _BITMASK_BURNED == 0) return packed;
                    // Otherwise, the token is burned, and we must revert.
                    // This handles the case of batch burned tokens, where only the burned bit
                    // of the starting slot is set, and remaining slots are left uninitialized.
                    _revert(OwnerQueryForNonexistentToken.selector);
                }
            }
            // Otherwise, the data exists and we can skip the scan.
            // This is possible because we have already achieved the target condition.
            // This saves 2143 gas on transfers of initialized tokens.
            // If the token is not burned, return `packed`. Otherwise, revert.
            if (packed & _BITMASK_BURNED == 0) return packed;
        }
        _revert(OwnerQueryForNonexistentToken.selector);
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(address to, uint256 tokenId) public payable virtual override {
        _approve(to, tokenId, true);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector);

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool result) {
        if (_startTokenId() <= tokenId) {
            if (tokenId < _currentIndex) {
                uint256 packed;
                while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId;
                result = packed & _BITMASK_BURNED == 0;
            }
        }
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
        from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS));

        if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector);

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector);

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
        uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
        assembly {
            // Emit the `Transfer` event.
            log4(
                0, // Start of data (0, since no data).
                0, // End of data (0, since no data).
                _TRANSFER_EVENT_SIGNATURE, // Signature.
                from, // `from`.
                toMasked, // `to`.
                tokenId // `tokenId`.
            )
        }
        if (toMasked == 0) _revert(TransferToZeroAddress.selector);

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                _revert(TransferToNonERC721ReceiverImplementer.selector);
            }
    }

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

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                _revert(TransferToNonERC721ReceiverImplementer.selector);
            }
            assembly {
                revert(add(32, reason), mload(reason))
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) _revert(MintZeroQuantity.selector);

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
            uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;

            if (toMasked == 0) _revert(MintToZeroAddress.selector);

            uint256 end = startTokenId + quantity;
            uint256 tokenId = startTokenId;

            do {
                assembly {
                    // Emit the `Transfer` event.
                    log4(
                        0, // Start of data (0, since no data).
                        0, // End of data (0, since no data).
                        _TRANSFER_EVENT_SIGNATURE, // Signature.
                        0, // `address(0)`.
                        toMasked, // `to`.
                        tokenId // `tokenId`.
                    )
                }
                // The `!=` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
            } while (++tokenId != end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) _revert(MintToZeroAddress.selector);
        if (quantity == 0) _revert(MintZeroQuantity.selector);
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector);

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        _revert(TransferToNonERC721ReceiverImplementer.selector);
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) _revert(bytes4(0));
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                       APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_approve(to, tokenId, false)`.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _approve(to, tokenId, false);
    }

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        bool approvalCheck
    ) internal virtual {
        address owner = ownerOf(tokenId);

        if (approvalCheck && _msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                _revert(ApprovalCallerNotOwnerNorApproved.selector);
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev 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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector);
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector);
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev For more efficient reverts.
     */
    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in paused state.
     */
    constructor() {
        _paused = true;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

/**
 * @dev Interface of ERC721ABurnable.
 */
interface IERC721ABurnable is IERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}

/**
 * @title ERC721ABurnable.
 *
 * @dev ERC721A token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (TokenOwnership memory ownership)
    {
        unchecked {
            if (tokenId >= _startTokenId()) {
                if (tokenId < _nextTokenId()) {
                    // If the `tokenId` is within bounds,
                    // scan backwards for the initialized ownership slot.
                    while (!_ownershipIsInitialized(tokenId)) --tokenId;
                    return _ownershipAt(tokenId);
                }
            }
        }
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        TokenOwnership[] memory ownerships;
        uint256 i = tokenIds.length;
        assembly {
            // Grab the free memory pointer.
            ownerships := mload(0x40)
            // Store the length.
            mstore(ownerships, i)
            // Allocate one word for the length,
            // `tokenIds.length` words for the pointers.
            i := shl(5, i) // Multiply `i` by 32.
            mstore(0x40, add(add(ownerships, 0x20), i))
        }
        while (i != 0) {
            uint256 tokenId;
            assembly {
                i := sub(i, 0x20)
                tokenId := calldataload(add(tokenIds.offset, i))
            }
            TokenOwnership memory ownership = explicitOwnershipOf(tokenId);
            assembly {
                // Store the pointer of `ownership` in the `ownerships` array.
                mstore(add(add(ownerships, 0x20), i), ownership)
            }
        }
        return ownerships;
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        return _tokensOfOwnerIn(owner, start, stop);
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        uint256 start = _startTokenId();
        uint256 stop = _nextTokenId();
        uint256[] memory tokenIds;
        if (start != stop) tokenIds = _tokensOfOwnerIn(owner, start, stop);
        return tokenIds;
    }

    /**
     * @dev Helper function for returning an array of token IDs owned by `owner`.
     *
     * Note that this function is optimized for smaller bytecode size over runtime gas,
     * since it is meant to be called off-chain.
     */
    function _tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) private view returns (uint256[] memory) {
        unchecked {
            if (start >= stop) _revert(InvalidQueryRange.selector);
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            uint256 stopLimit = _nextTokenId();
            // Set `stop = min(stop, stopLimit)`.
            if (stop >= stopLimit) {
                stop = stopLimit;
            }
            uint256[] memory tokenIds;
            uint256 tokenIdsMaxLength = balanceOf(owner);
            bool startLtStop = start < stop;
            assembly {
                // Set `tokenIdsMaxLength` to zero if `start` is less than `stop`.
                tokenIdsMaxLength := mul(tokenIdsMaxLength, startLtStop)
            }
            if (tokenIdsMaxLength != 0) {
                // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
                // to cater for cases where `balanceOf(owner)` is too big.
                if (stop - start <= tokenIdsMaxLength) {
                    tokenIdsMaxLength = stop - start;
                }
                assembly {
                    // Grab the free memory pointer.
                    tokenIds := mload(0x40)
                    // Allocate one word for the length, and `tokenIdsMaxLength` words
                    // for the data. `shl(5, x)` is equivalent to `mul(32, x)`.
                    mstore(0x40, add(tokenIds, shl(5, add(tokenIdsMaxLength, 1))))
                }
                // We need to call `explicitOwnershipOf(start)`,
                // because the slot at `start` may not be initialized.
                TokenOwnership memory ownership = explicitOwnershipOf(start);
                address currOwnershipAddr;
                // If the starting slot exists (i.e. not burned),
                // initialize `currOwnershipAddr`.
                // `ownership.address` will not be zero,
                // as `start` is clamped to the valid token ID range.
                if (!ownership.burned) {
                    currOwnershipAddr = ownership.addr;
                }
                uint256 tokenIdsIdx;
                // Use a do-while, which is slightly more efficient for this case,
                // as the array will at least contain one element.
                do {
                    ownership = _ownershipAt(start);
                    assembly {
                        switch mload(add(ownership, 0x40))
                        // if `ownership.burned == false`.
                        case 0 {
                            // if `ownership.addr != address(0)`.
                            // The `addr` already has it's upper 96 bits clearned,
                            // since it is written to memory with regular Solidity.
                            if mload(ownership) {
                                currOwnershipAddr := mload(ownership)
                            }
                            // if `currOwnershipAddr == owner`.
                            // The `shl(96, x)` is to make the comparison agnostic to any
                            // dirty upper 96 bits in `owner`.
                            if iszero(shl(96, xor(currOwnershipAddr, owner))) {
                                tokenIdsIdx := add(tokenIdsIdx, 1)
                                mstore(add(tokenIds, shl(5, tokenIdsIdx)), start)
                            }
                        }
                        // Otherwise, reset `currOwnershipAddr`.
                        // This handles the case of batch burned tokens
                        // (burned bit of first slot set, remaining slots left uninitialized).
                        default {
                            currOwnershipAddr := 0
                        }
                        start := add(start, 1)
                    }
                } while (!(start == stop || tokenIdsIdx == tokenIdsMaxLength));
                // Store the length of the array.
                assembly {
                    mstore(tokenIds, tokenIdsIdx)
                }
            }
            return tokenIds;
        }
    }
}

contract TISMTroops is ERC721A, ERC721ABurnable, ERC721AQueryable, Pausable, Ownable, OperatorFilterer {
    bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;
    using Strings for uint256;

    string baseURI;
    string placeholderURI;
    string constant baseExtension = "";

    uint256 price = 20_000_000_000_000_000;
    uint256 _max = 50;
    mapping(address => uint256) public mintPass;

    constructor() ERC721A("TISM Troops", "TTX") {

    }
    
    function setBaseURI(string calldata _base) external onlyOwner {
        baseURI = _base;
    }

    function setMax(uint256 limit) external onlyOwner {
        _max = limit;
    }

    function setMintPass(address _holder, uint256 _amount) external onlyOwner {
        mintPass[_holder] = _amount;
    }

    function setPlaceholderURI(string calldata _placeholder) external onlyOwner {
        placeholderURI = _placeholder;
    }

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

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function mint(uint256 amount) external payable {
        require(amount > 0, "No NFTs minted");

        require(totalSupply() + amount <= _max, "Total mint exceeded"); // 5000 total
        require(msg.value >= amount * price, "Insufficient funds"); //0.02Eth per NFT

        super._mint(msg.sender, amount);
    }

    function mintWithPass(uint256 amount) external payable whenNotPaused {
        require(amount > 0, "No NFTs minted");

        require(totalSupply() + amount <= _max, "Total mint exceeded"); // 5000 total
        uint256 passes = mintPass[msg.sender];
        require(amount <= passes, "Not enough passes");
        mintPass[msg.sender] -= amount;

        super._mint(msg.sender, amount);
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function tokenURI(uint256 tokenId) public view override(ERC721A, IERC721A) returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
        string memory base = _baseURI();

        if (bytes(base).length > 0) {
            return concatenate(base, concatenate(tokenId.toString(), baseExtension));
        }

        if (bytes(placeholderURI).length > 0) {
            return placeholderURI;
        }

        return super.tokenURI(tokenId);
    }

    function concatenate(string memory a, string memory b) internal pure returns (string memory) {
        return string(abi.encodePacked(a, b));
    }

    function extractTokens(address _token) external onlyOwner {
        IERC20(_token).transfer(msg.sender, IERC20(_token).balanceOf(address(this)));
    }    
    
    function extractETH() external onlyOwner {
       bool success;
       (success, ) = msg.sender.call{value: address(this).balance}("");
    }

    receive() external payable {
    }

    function setApprovalForAll(address operator, bool approved)
        public
        override(ERC721A, IERC721A)
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId)
        public
        payable
        override(ERC721A, IERC721A)
        onlyAllowedOperatorApproval(operator)
    {
        super.approve(operator, tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

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

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function totalMinted() public view returns (uint256) {
        return _totalMinted();
    }

    function totalBurned() public view returns (uint256) {
        return _totalBurned();
    }

    function nextTokenId() public view returns (uint256) {
        return _nextTokenId();
    }

    function getAux(address owner) public view returns (uint64) {
        return _getAux(owner);
    }

    function setAux(address owner, uint64 aux) external onlyOwner {
        _setAux(owner, aux);
    }

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function getOwnershipAt(uint256 index) public view returns (TokenOwnership memory) {
        return _ownershipAt(index);
    }

    function getOwnershipOf(uint256 index) public view returns (TokenOwnership memory) {
        return _ownershipOf(index);
    }

    function initializeOwnershipAt(uint256 index) public {
        _initializeOwnershipAt(index);
    }

    /**
     * ROYALTY FUNCTIONS
     */
    uint256 private _royaltyBps;
    address payable private _royaltyRecipient;
    bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a;

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A, IERC721A)
        returns (bool)
    {
        return super.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981;
    }

    function updateRoyalties(address payable recipient, uint256 bps) external onlyOwner {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
    }

    function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) {
        return (_royaltyRecipient, value*_royaltyBps/10000);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"ownership","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"extractTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getAux","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getOwnershipAt","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"initializeOwnershipAt","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPass","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintWithPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint64","name":"aux","type":"uint64"}],"name":"setAux","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_base","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMintPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_placeholder","type":"string"}],"name":"setPlaceholderURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405266470de4df820000600b556032600c5534801562000020575f80fd5b506040518060400160405280600b81526020016a5449534d2054726f6f707360a81b815250604051806040016040528060038152602001620a8a8b60eb1b81525081600290816200007291906200019c565b5060036200008182826200019c565b5060015f9081556008805460ff191660011790559150620000a190503390565b60088054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000264565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200012557607f821691505b6020821081036200014457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000197575f81815260208120601f850160051c81016020861015620001725750805b601f850160051c820191505b8181101562000193578281556001016200017e565b5050505b505050565b81516001600160401b03811115620001b857620001b8620000fc565b620001d081620001c9845462000110565b846200014a565b602080601f83116001811462000206575f8415620001ee5750858301515b5f19600386901b1c1916600185901b17855562000193565b5f85815260208120601f198616915b82811015620002365788860151825594840194600190910190840162000215565b50858210156200025457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6128ea80620002725f395ff3fe608060405260043610610283575f3560e01c806370a0823111610155578063b88d4fde116100be578063dc33e68111610078578063dc33e68114610781578063e7396382146107a0578063e985e9c5146107cb578063f252363314610812578063f2fde38b14610831578063fabb71d214610850575f80fd5b8063b88d4fde146106d1578063bf0b175e146106e4578063c041de1f1461071c578063c23dc68f1461072f578063c87b56dd1461074e578063d89135cd1461076d575f80fd5b806391b7f5ed1161010f57806391b7f5ed1461063757806395d89b411461065657806399a2557a1461066a578063a0712d6814610689578063a22cb4651461069c578063a2309ff8146106bb575f80fd5b806370a082311461058f578063715018a6146105ae57806375794a3c146105c25780638456cb59146105d55780638462151c146105e95780638da5cb5b14610615575f80fd5b806342842e0e116101f757806353b1233d116101b157806353b1233d146104d057806355f804b3146104ef5780635bbb21771461050e5780635c975abb1461053a5780636352211e146105515780636c2f5acd14610570575f80fd5b806342842e0e1461041557806342966c6814610428578063453ab1411461044757806348466402146104665780634f558e791461048557806352d8a4d1146104a4575f80fd5b806318160ddd1161024857806318160ddd1461034e5780631fe9eabc1461037257806323b872dd146103915780632a55205a146103a45780633574a2dd146103e25780633f4ba83a14610401575f80fd5b806301ffc9a71461028e57806306fdde03146102c257806307ebd12f146102e3578063081812fc14610304578063095ea7b31461033b575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102ad6102a8366004612121565b610864565b60405190151581526020015b60405180910390f35b3480156102cd575f80fd5b506102d661088f565b6040516102b99190612189565b3480156102ee575f80fd5b506103026102fd3660046121af565b61091f565b005b34801561030f575f80fd5b5061032361031e3660046121ca565b610a38565b6040516001600160a01b0390911681526020016102b9565b6103026103493660046121e1565b610a71565b348015610359575f80fd5b506001545f54035f19015b6040519081526020016102b9565b34801561037d575f80fd5b5061030261038c3660046121ca565b610a8a565b61030261039f36600461220b565b610abf565b3480156103af575f80fd5b506103c36103be366004612249565b610aea565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156103ed575f80fd5b506103026103fc366004612269565b610b23565b34801561040c575f80fd5b50610302610b60565b61030261042336600461220b565b610b9a565b348015610433575f80fd5b506103026104423660046121ca565b610bbf565b348015610452575f80fd5b506103026104613660046122d5565b610bcd565b348015610471575f80fd5b506103026104803660046121e1565b610c2d565b348015610490575f80fd5b506102ad61049f3660046121ca565b610c78565b3480156104af575f80fd5b506104c36104be3660046121ca565b610c82565b6040516102b99190612355565b3480156104db575f80fd5b506103026104ea3660046121ca565b610cae565b3480156104fa575f80fd5b50610302610509366004612269565b610cb7565b348015610519575f80fd5b5061052d610528366004612363565b610cf4565b6040516102b991906123c0565b348015610545575f80fd5b5060085460ff166102ad565b34801561055c575f80fd5b5061032361056b3660046121ca565b610d3f565b34801561057b575f80fd5b5061030261058a3660046121e1565b610d49565b34801561059a575f80fd5b506103646105a93660046121af565b610d9f565b3480156105b9575f80fd5b50610302610de3565b3480156105cd575f80fd5b505f54610364565b3480156105e0575f80fd5b50610302610e67565b3480156105f4575f80fd5b506106086106033660046121af565b610e9f565b6040516102b99190612401565b348015610620575f80fd5b5060085461010090046001600160a01b0316610323565b348015610642575f80fd5b506103026106513660046121ca565b610ec5565b348015610661575f80fd5b506102d6610efa565b348015610675575f80fd5b50610608610684366004612438565b610f09565b6103026106973660046121ca565b610f16565b3480156106a7575f80fd5b506103026106b6366004612477565b61100e565b3480156106c6575f80fd5b505f545f1901610364565b6103026106df3660046124b7565b611022565b3480156106ef575f80fd5b506107036106fe3660046121af565b61104f565b60405167ffffffffffffffff90911681526020016102b9565b61030261072a3660046121ca565b61106f565b34801561073a575f80fd5b506104c36107493660046121ca565b6111d3565b348015610759575f80fd5b506102d66107683660046121ca565b611233565b348015610778575f80fd5b50610364611397565b34801561078c575f80fd5b5061036461079b3660046121af565b6113a1565b3480156107ab575f80fd5b506103646107ba3660046121af565b600d6020525f908152604090205481565b3480156107d6575f80fd5b506102ad6107e5366004612590565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b34801561081d575f80fd5b506104c361082c3660046121ca565b6113cb565b34801561083c575f80fd5b5061030261084b3660046121af565b6113f3565b34801561085b575f80fd5b506103026114ee565b5f61086e8261155d565b8061088957506001600160e01b0319821663152a902d60e11b145b92915050565b60606002805461089e906125bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108ca906125bc565b80156109155780601f106108ec57610100808354040283529160200191610915565b820191905f5260205f20905b8154815290600101906020018083116108f857829003601f168201915b5050505050905090565b6008546001600160a01b036101009091041633146109585760405162461bcd60e51b815260040161094f906125f4565b60405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156109a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c89190612629565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610a10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a349190612640565b5050565b5f610a42826115aa565b610a5657610a566333d1c03960e21b6115f2565b505f908152600660205260409020546001600160a01b031690565b81610a7b816115fa565b610a858383611639565b505050565b6008546001600160a01b03610100909104163314610aba5760405162461bcd60e51b815260040161094f906125f4565b600c55565b826001600160a01b0381163314610ad957610ad9336115fa565b610ae4848484611645565b50505050565b600f54600e545f9182916001600160a01b039091169061271090610b0e908661266f565b610b18919061269a565b915091509250929050565b6008546001600160a01b03610100909104163314610b535760405162461bcd60e51b815260040161094f906125f4565b600a610a858284836126fa565b6008546001600160a01b03610100909104163314610b905760405162461bcd60e51b815260040161094f906125f4565b610b986117a9565b565b826001600160a01b0381163314610bb457610bb4336115fa565b610ae484848461183c565b610bca816001611856565b50565b6008546001600160a01b03610100909104163314610bfd5760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b0382165f908152600560205260409020805460c083901b6001600160c01b039091161790555050565b6008546001600160a01b03610100909104163314610c5d5760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b039091165f908152600d6020526040902055565b5f610889826115aa565b604080516080810182525f8082526020820181905291810182905260608101919091526108898261198d565b610bca816119c1565b6008546001600160a01b03610100909104163314610ce75760405162461bcd60e51b815260040161094f906125f4565b6009610a858284836126fa565b60408051828152600583901b8082016020019092526060915b8015610d3757601f1980820191860101355f610d28826111d3565b8484016020015250610d0d9050565b509392505050565b5f610889826119ef565b6008546001600160a01b03610100909104163314610d795760405162461bcd60e51b815260040161094f906125f4565b600f80546001600160a01b0319166001600160a01b039390931692909217909155600e55565b5f6001600160a01b038216610dbe57610dbe6323d3ad8160e21b6115f2565b506001600160a01b03165f9081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03610100909104163314610e135760405162461bcd60e51b815260040161094f906125f4565b6008546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360088054610100600160a81b0319169055565b905090565b6008546001600160a01b03610100909104163314610e975760405162461bcd60e51b815260040161094f906125f4565b610b98611a89565b5f5460609060019082828214610ebd57610eba858484611b04565b90505b949350505050565b6008546001600160a01b03610100909104163314610ef55760405162461bcd60e51b815260040161094f906125f4565b600b55565b60606003805461089e906125bc565b6060610ebd848484611b04565b5f8111610f565760405162461bcd60e51b815260206004820152600e60248201526d139bc81391951cc81b5a5b9d195960921b604482015260640161094f565b600c546001545f54839190035f1901610f6f91906127b5565b1115610fb35760405162461bcd60e51b8152602060048201526013602482015272151bdd185b081b5a5b9d08195e18d959591959606a1b604482015260640161094f565b600b54610fc0908261266f565b3410156110045760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b604482015260640161094f565b610bca3382611bfc565b81611018816115fa565b610a858383611cb6565b836001600160a01b038116331461103c5761103c336115fa565b61104885858585611d21565b5050505050565b6001600160a01b0381165f9081526005602052604081205460c01c610889565b60085460ff16156110b55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161094f565b5f81116110f55760405162461bcd60e51b815260206004820152600e60248201526d139bc81391951cc81b5a5b9d195960921b604482015260640161094f565b600c546001545f54839190035f190161110e91906127b5565b11156111525760405162461bcd60e51b8152602060048201526013602482015272151bdd185b081b5a5b9d08195e18d959591959606a1b604482015260640161094f565b335f908152600d6020526040902054808211156111a55760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682070617373657360781b604482015260640161094f565b335f908152600d6020526040812080548492906111c39084906127c8565b90915550610a3490503383611bfc565b604080516080810182525f8082526020820181905291810182905260608101919091526001821061122e575f5482101561122e575b5f82815260046020526040902054611225575f1990910190611208565b61088982611d5c565b919050565b606061123e826115aa565b6112a45760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b606482015260840161094f565b5f6112ad611d96565b8051909150156112e7576112e0816112db6112c786611da5565b60405180602001604052805f815250611ea2565b611ea2565b9392505050565b5f600a80546112f5906125bc565b9050111561138e57600a805461130a906125bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611336906125bc565b80156113815780601f1061135857610100808354040283529160200191611381565b820191905f5260205f20905b81548152906001019060200180831161136457829003601f168201915b5050505050915050919050565b6112e083611ece565b5f610e6260015490565b6001600160a01b0381165f908152600560205260408082205467ffffffffffffffff911c16610889565b604080516080810182525f808252602082018190529181018290526060810191909152611225565b6008546001600160a01b036101009091041633146114235760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b0381166114885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094f565b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6008546001600160a01b0361010090910416331461151e5760405162461bcd60e51b815260040161094f906125f4565b6040515f90339047908381818185875af1925050503d805f8114610ae4576040519150601f19603f3d011682016040523d82523d5f602084013e610ae4565b5f6301ffc9a760e01b6001600160e01b03198316148061158d57506380ac58cd60e01b6001600160e01b03198316145b806108895750506001600160e01b031916635b5e139f60e01b1490565b5f8160011161122e575f5482101561122e575f5b505f82815260046020526040812054908190036115e5576115de836127db565b92506115be565b600160e01b161592915050565b805f5260045ffd5b69c61711340011223344555f5230601a5280603a525f80604460166daaeb6d7670e522a718067333cd4e5afa611632573d5f803e3d5ffd5b5f603a5250565b610a3482826001611f45565b5f61164f826119ef565b6001600160a01b0394851694909150811684146116755761167562a1148160e81b6115f2565b5f82815260066020526040902080546116a08187335b6001600160a01b039081169116811491141790565b6116c2576116ae86336107e5565b6116c2576116c2632ce44b5f60e11b6115f2565b80156116cc575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b8416900361175857600184015f818152600460205260408120549003611756575f548114611756575f8181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4805f036117a0576117a0633a954ecd60e21b6115f2565b50505050505050565b60085460ff166117f25760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161094f565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610a8583838360405180602001604052805f815250611022565b5f611860836119ef565b9050805f8061187c865f90815260066020526040902080549091565b9150915084156118b35761189181843361168b565b6118b35761189f83336107e5565b6118b3576118b3632ce44b5f60e11b6115f2565b80156118bd575f82555b6001600160a01b0383165f81815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b175f87815260046020526040812091909155600160e11b8516900361194657600186015f818152600460205260408120549003611944575f548114611944575f8181526004602052604090208590555b505b60405186905f906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b604080516080810182525f8082526020820181905291810182905260608101919091526108896119bc836119ef565b611fe6565b5f818152600460205260408120549003610bca576119de816119ef565b5f8281526004602052604090205550565b5f81600111611a7957505f8181526004602052604081205490819003611a67575f548210611a2757611a27636f96cda160e11b6115f2565b5b505f19015f818152600460205260409020548015611a2857600160e01b81165f03611a5257919050565b611a62636f96cda160e11b6115f2565b611a28565b600160e01b81165f03611a7957919050565b61122e636f96cda160e11b6115f2565b60085460ff1615611acf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161094f565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861181f3390565b6060818310611b1d57611b1d631960ccad60e11b6115f2565b6001831015611b2b57600192505b5f54808310611b38578092505b60605f611b4487610d9f565b85871090810291508115611bf0578187870311611b615786860391505b60405192506001820160051b83016040525f611b7c886111d3565b90505f8160400151611b8c575080515b5f5b611b978a611d5c565b925060408301515f8114611bad575f9250611bd2565b835115611bb957835192505b8b831860601b611bd2576001820191508a8260051b8801525b5060018a019950888a1480611be657508481145b15611b8e57855250505b50909695505050505050565b5f805490829003611c1757611c1763b562e8dd60e01b6115f2565b5f8181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b17811790915580845260059092528220805468010000000000000001860201905590819003611c7457611c74622e076360e81b6115f2565b818301825b80835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4818160010191508103611c7957505f5550505050565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d2c848484610abf565b6001600160a01b0383163b15610ae457611d488484848461202e565b610ae457610ae46368d2bf6b60e11b6115f2565b604080516080810182525f8082526020820181905291810182905260608101919091525f8281526004602052604090205461088990611fe6565b60606009805461089e906125bc565b6060815f03611dcb5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611df45780611dde816127f0565b9150611ded9050600a8361269a565b9150611dce565b5f8167ffffffffffffffff811115611e0e57611e0e6124a3565b6040519080825280601f01601f191660200182016040528015611e38576020820181803683370190505b5090505b8415610ebd57611e4d6001836127c8565b9150611e5a600a86612808565b611e659060306127b5565b60f81b818381518110611e7a57611e7a61281b565b60200101906001600160f81b03191690815f1a905350611e9b600a8661269a565b9450611e3c565b60608282604051602001611eb792919061282f565b604051602081830303815290604052905092915050565b6060611ed9826115aa565b611eed57611eed630a14c4b560e41b6115f2565b5f611ef6611d96565b905080515f03611f145760405180602001604052805f8152506112e0565b80611f1e84611da5565b604051602001611f2f92919061282f565b6040516020818303038152906040529392505050565b5f611f4f83610d3f565b9050818015611f675750336001600160a01b03821614155b15611f8a57611f7681336107e5565b611f8a57611f8a6367d9dca160e11b6115f2565b5f8381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a029061206290339089908890889060040161285d565b6020604051808303815f875af192505050801561209c575060408051601f3d908101601f1916820190925261209991810190612899565b60015b6120ef573d8080156120c9576040519150601f19603f3d011682016040523d82523d5f602084013e6120ce565b606091505b5080515f036120e7576120e76368d2bf6b60e11b6115f2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001600160e01b031981168114610bca575f80fd5b5f60208284031215612131575f80fd5b81356112e08161210c565b5f5b8381101561215657818101518382015260200161213e565b50505f910152565b5f815180845261217581602086016020860161213c565b601f01601f19169290920160200192915050565b602081525f6112e0602083018461215e565b6001600160a01b0381168114610bca575f80fd5b5f602082840312156121bf575f80fd5b81356112e08161219b565b5f602082840312156121da575f80fd5b5035919050565b5f80604083850312156121f2575f80fd5b82356121fd8161219b565b946020939093013593505050565b5f805f6060848603121561221d575f80fd5b83356122288161219b565b925060208401356122388161219b565b929592945050506040919091013590565b5f806040838503121561225a575f80fd5b50508035926020909101359150565b5f806020838503121561227a575f80fd5b823567ffffffffffffffff80821115612291575f80fd5b818501915085601f8301126122a4575f80fd5b8135818111156122b2575f80fd5b8660208285010111156122c3575f80fd5b60209290920196919550909350505050565b5f80604083850312156122e6575f80fd5b82356122f18161219b565b9150602083013567ffffffffffffffff8116811461230d575f80fd5b809150509250929050565b80516001600160a01b0316825260208082015167ffffffffffffffff169083015260408082015115159083015260609081015162ffffff16910152565b608081016108898284612318565b5f8060208385031215612374575f80fd5b823567ffffffffffffffff8082111561238b575f80fd5b818501915085601f83011261239e575f80fd5b8135818111156123ac575f80fd5b8660208260051b85010111156122c3575f80fd5b602080825282518282018190525f9190848201906040850190845b81811015611bf0576123ee838551612318565b92840192608092909201916001016123db565b602080825282518282018190525f9190848201906040850190845b81811015611bf05783518352928401929184019160010161241c565b5f805f6060848603121561244a575f80fd5b83356124558161219b565b95602085013595506040909401359392505050565b8015158114610bca575f80fd5b5f8060408385031215612488575f80fd5b82356124938161219b565b9150602083013561230d8161246a565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156124ca575f80fd5b84356124d58161219b565b935060208501356124e58161219b565b925060408501359150606085013567ffffffffffffffff80821115612508575f80fd5b818701915087601f83011261251b575f80fd5b81358181111561252d5761252d6124a3565b604051601f8201601f19908116603f01168101908382118183101715612555576125556124a3565b816040528281528a602084870101111561256d575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156125a1575f80fd5b82356125ac8161219b565b9150602083013561230d8161219b565b600181811c908216806125d057607f821691505b6020821081036125ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f60208284031215612639575f80fd5b5051919050565b5f60208284031215612650575f80fd5b81516112e08161246a565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176108895761088961265b565b634e487b7160e01b5f52601260045260245ffd5b5f826126a8576126a8612686565b500490565b601f821115610a85575f81815260208120601f850160051c810160208610156126d35750805b601f850160051c820191505b818110156126f2578281556001016126df565b505050505050565b67ffffffffffffffff831115612712576127126124a3565b6127268361272083546125bc565b836126ad565b5f601f841160018114612757575f85156127405750838201355b5f19600387901b1c1916600186901b178355611048565b5f83815260209020601f19861690835b828110156127875786850135825560209485019460019092019101612767565b50868210156127a3575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b808201808211156108895761088961265b565b818103818111156108895761088961265b565b5f816127e9576127e961265b565b505f190190565b5f600182016128015761280161265b565b5060010190565b5f8261281657612816612686565b500690565b634e487b7160e01b5f52603260045260245ffd5b5f835161284081846020880161213c565b83519083019061285481836020880161213c565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061288f9083018461215e565b9695505050505050565b5f602082840312156128a9575f80fd5b81516112e08161210c56fea2646970667358221220cb63a01a2c71cacd76ec0444bc81a627194a767887badb3165fc052138c29f1a64736f6c63430008140033

Deployed Bytecode

0x608060405260043610610283575f3560e01c806370a0823111610155578063b88d4fde116100be578063dc33e68111610078578063dc33e68114610781578063e7396382146107a0578063e985e9c5146107cb578063f252363314610812578063f2fde38b14610831578063fabb71d214610850575f80fd5b8063b88d4fde146106d1578063bf0b175e146106e4578063c041de1f1461071c578063c23dc68f1461072f578063c87b56dd1461074e578063d89135cd1461076d575f80fd5b806391b7f5ed1161010f57806391b7f5ed1461063757806395d89b411461065657806399a2557a1461066a578063a0712d6814610689578063a22cb4651461069c578063a2309ff8146106bb575f80fd5b806370a082311461058f578063715018a6146105ae57806375794a3c146105c25780638456cb59146105d55780638462151c146105e95780638da5cb5b14610615575f80fd5b806342842e0e116101f757806353b1233d116101b157806353b1233d146104d057806355f804b3146104ef5780635bbb21771461050e5780635c975abb1461053a5780636352211e146105515780636c2f5acd14610570575f80fd5b806342842e0e1461041557806342966c6814610428578063453ab1411461044757806348466402146104665780634f558e791461048557806352d8a4d1146104a4575f80fd5b806318160ddd1161024857806318160ddd1461034e5780631fe9eabc1461037257806323b872dd146103915780632a55205a146103a45780633574a2dd146103e25780633f4ba83a14610401575f80fd5b806301ffc9a71461028e57806306fdde03146102c257806307ebd12f146102e3578063081812fc14610304578063095ea7b31461033b575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102ad6102a8366004612121565b610864565b60405190151581526020015b60405180910390f35b3480156102cd575f80fd5b506102d661088f565b6040516102b99190612189565b3480156102ee575f80fd5b506103026102fd3660046121af565b61091f565b005b34801561030f575f80fd5b5061032361031e3660046121ca565b610a38565b6040516001600160a01b0390911681526020016102b9565b6103026103493660046121e1565b610a71565b348015610359575f80fd5b506001545f54035f19015b6040519081526020016102b9565b34801561037d575f80fd5b5061030261038c3660046121ca565b610a8a565b61030261039f36600461220b565b610abf565b3480156103af575f80fd5b506103c36103be366004612249565b610aea565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156103ed575f80fd5b506103026103fc366004612269565b610b23565b34801561040c575f80fd5b50610302610b60565b61030261042336600461220b565b610b9a565b348015610433575f80fd5b506103026104423660046121ca565b610bbf565b348015610452575f80fd5b506103026104613660046122d5565b610bcd565b348015610471575f80fd5b506103026104803660046121e1565b610c2d565b348015610490575f80fd5b506102ad61049f3660046121ca565b610c78565b3480156104af575f80fd5b506104c36104be3660046121ca565b610c82565b6040516102b99190612355565b3480156104db575f80fd5b506103026104ea3660046121ca565b610cae565b3480156104fa575f80fd5b50610302610509366004612269565b610cb7565b348015610519575f80fd5b5061052d610528366004612363565b610cf4565b6040516102b991906123c0565b348015610545575f80fd5b5060085460ff166102ad565b34801561055c575f80fd5b5061032361056b3660046121ca565b610d3f565b34801561057b575f80fd5b5061030261058a3660046121e1565b610d49565b34801561059a575f80fd5b506103646105a93660046121af565b610d9f565b3480156105b9575f80fd5b50610302610de3565b3480156105cd575f80fd5b505f54610364565b3480156105e0575f80fd5b50610302610e67565b3480156105f4575f80fd5b506106086106033660046121af565b610e9f565b6040516102b99190612401565b348015610620575f80fd5b5060085461010090046001600160a01b0316610323565b348015610642575f80fd5b506103026106513660046121ca565b610ec5565b348015610661575f80fd5b506102d6610efa565b348015610675575f80fd5b50610608610684366004612438565b610f09565b6103026106973660046121ca565b610f16565b3480156106a7575f80fd5b506103026106b6366004612477565b61100e565b3480156106c6575f80fd5b505f545f1901610364565b6103026106df3660046124b7565b611022565b3480156106ef575f80fd5b506107036106fe3660046121af565b61104f565b60405167ffffffffffffffff90911681526020016102b9565b61030261072a3660046121ca565b61106f565b34801561073a575f80fd5b506104c36107493660046121ca565b6111d3565b348015610759575f80fd5b506102d66107683660046121ca565b611233565b348015610778575f80fd5b50610364611397565b34801561078c575f80fd5b5061036461079b3660046121af565b6113a1565b3480156107ab575f80fd5b506103646107ba3660046121af565b600d6020525f908152604090205481565b3480156107d6575f80fd5b506102ad6107e5366004612590565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b34801561081d575f80fd5b506104c361082c3660046121ca565b6113cb565b34801561083c575f80fd5b5061030261084b3660046121af565b6113f3565b34801561085b575f80fd5b506103026114ee565b5f61086e8261155d565b8061088957506001600160e01b0319821663152a902d60e11b145b92915050565b60606002805461089e906125bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108ca906125bc565b80156109155780601f106108ec57610100808354040283529160200191610915565b820191905f5260205f20905b8154815290600101906020018083116108f857829003601f168201915b5050505050905090565b6008546001600160a01b036101009091041633146109585760405162461bcd60e51b815260040161094f906125f4565b60405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156109a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c89190612629565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610a10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a349190612640565b5050565b5f610a42826115aa565b610a5657610a566333d1c03960e21b6115f2565b505f908152600660205260409020546001600160a01b031690565b81610a7b816115fa565b610a858383611639565b505050565b6008546001600160a01b03610100909104163314610aba5760405162461bcd60e51b815260040161094f906125f4565b600c55565b826001600160a01b0381163314610ad957610ad9336115fa565b610ae4848484611645565b50505050565b600f54600e545f9182916001600160a01b039091169061271090610b0e908661266f565b610b18919061269a565b915091509250929050565b6008546001600160a01b03610100909104163314610b535760405162461bcd60e51b815260040161094f906125f4565b600a610a858284836126fa565b6008546001600160a01b03610100909104163314610b905760405162461bcd60e51b815260040161094f906125f4565b610b986117a9565b565b826001600160a01b0381163314610bb457610bb4336115fa565b610ae484848461183c565b610bca816001611856565b50565b6008546001600160a01b03610100909104163314610bfd5760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b0382165f908152600560205260409020805460c083901b6001600160c01b039091161790555050565b6008546001600160a01b03610100909104163314610c5d5760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b039091165f908152600d6020526040902055565b5f610889826115aa565b604080516080810182525f8082526020820181905291810182905260608101919091526108898261198d565b610bca816119c1565b6008546001600160a01b03610100909104163314610ce75760405162461bcd60e51b815260040161094f906125f4565b6009610a858284836126fa565b60408051828152600583901b8082016020019092526060915b8015610d3757601f1980820191860101355f610d28826111d3565b8484016020015250610d0d9050565b509392505050565b5f610889826119ef565b6008546001600160a01b03610100909104163314610d795760405162461bcd60e51b815260040161094f906125f4565b600f80546001600160a01b0319166001600160a01b039390931692909217909155600e55565b5f6001600160a01b038216610dbe57610dbe6323d3ad8160e21b6115f2565b506001600160a01b03165f9081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03610100909104163314610e135760405162461bcd60e51b815260040161094f906125f4565b6008546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360088054610100600160a81b0319169055565b905090565b6008546001600160a01b03610100909104163314610e975760405162461bcd60e51b815260040161094f906125f4565b610b98611a89565b5f5460609060019082828214610ebd57610eba858484611b04565b90505b949350505050565b6008546001600160a01b03610100909104163314610ef55760405162461bcd60e51b815260040161094f906125f4565b600b55565b60606003805461089e906125bc565b6060610ebd848484611b04565b5f8111610f565760405162461bcd60e51b815260206004820152600e60248201526d139bc81391951cc81b5a5b9d195960921b604482015260640161094f565b600c546001545f54839190035f1901610f6f91906127b5565b1115610fb35760405162461bcd60e51b8152602060048201526013602482015272151bdd185b081b5a5b9d08195e18d959591959606a1b604482015260640161094f565b600b54610fc0908261266f565b3410156110045760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b604482015260640161094f565b610bca3382611bfc565b81611018816115fa565b610a858383611cb6565b836001600160a01b038116331461103c5761103c336115fa565b61104885858585611d21565b5050505050565b6001600160a01b0381165f9081526005602052604081205460c01c610889565b60085460ff16156110b55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161094f565b5f81116110f55760405162461bcd60e51b815260206004820152600e60248201526d139bc81391951cc81b5a5b9d195960921b604482015260640161094f565b600c546001545f54839190035f190161110e91906127b5565b11156111525760405162461bcd60e51b8152602060048201526013602482015272151bdd185b081b5a5b9d08195e18d959591959606a1b604482015260640161094f565b335f908152600d6020526040902054808211156111a55760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682070617373657360781b604482015260640161094f565b335f908152600d6020526040812080548492906111c39084906127c8565b90915550610a3490503383611bfc565b604080516080810182525f8082526020820181905291810182905260608101919091526001821061122e575f5482101561122e575b5f82815260046020526040902054611225575f1990910190611208565b61088982611d5c565b919050565b606061123e826115aa565b6112a45760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b606482015260840161094f565b5f6112ad611d96565b8051909150156112e7576112e0816112db6112c786611da5565b60405180602001604052805f815250611ea2565b611ea2565b9392505050565b5f600a80546112f5906125bc565b9050111561138e57600a805461130a906125bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611336906125bc565b80156113815780601f1061135857610100808354040283529160200191611381565b820191905f5260205f20905b81548152906001019060200180831161136457829003601f168201915b5050505050915050919050565b6112e083611ece565b5f610e6260015490565b6001600160a01b0381165f908152600560205260408082205467ffffffffffffffff911c16610889565b604080516080810182525f808252602082018190529181018290526060810191909152611225565b6008546001600160a01b036101009091041633146114235760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b0381166114885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094f565b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6008546001600160a01b0361010090910416331461151e5760405162461bcd60e51b815260040161094f906125f4565b6040515f90339047908381818185875af1925050503d805f8114610ae4576040519150601f19603f3d011682016040523d82523d5f602084013e610ae4565b5f6301ffc9a760e01b6001600160e01b03198316148061158d57506380ac58cd60e01b6001600160e01b03198316145b806108895750506001600160e01b031916635b5e139f60e01b1490565b5f8160011161122e575f5482101561122e575f5b505f82815260046020526040812054908190036115e5576115de836127db565b92506115be565b600160e01b161592915050565b805f5260045ffd5b69c61711340011223344555f5230601a5280603a525f80604460166daaeb6d7670e522a718067333cd4e5afa611632573d5f803e3d5ffd5b5f603a5250565b610a3482826001611f45565b5f61164f826119ef565b6001600160a01b0394851694909150811684146116755761167562a1148160e81b6115f2565b5f82815260066020526040902080546116a08187335b6001600160a01b039081169116811491141790565b6116c2576116ae86336107e5565b6116c2576116c2632ce44b5f60e11b6115f2565b80156116cc575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b8416900361175857600184015f818152600460205260408120549003611756575f548114611756575f8181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4805f036117a0576117a0633a954ecd60e21b6115f2565b50505050505050565b60085460ff166117f25760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161094f565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610a8583838360405180602001604052805f815250611022565b5f611860836119ef565b9050805f8061187c865f90815260066020526040902080549091565b9150915084156118b35761189181843361168b565b6118b35761189f83336107e5565b6118b3576118b3632ce44b5f60e11b6115f2565b80156118bd575f82555b6001600160a01b0383165f81815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b175f87815260046020526040812091909155600160e11b8516900361194657600186015f818152600460205260408120549003611944575f548114611944575f8181526004602052604090208590555b505b60405186905f906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b604080516080810182525f8082526020820181905291810182905260608101919091526108896119bc836119ef565b611fe6565b5f818152600460205260408120549003610bca576119de816119ef565b5f8281526004602052604090205550565b5f81600111611a7957505f8181526004602052604081205490819003611a67575f548210611a2757611a27636f96cda160e11b6115f2565b5b505f19015f818152600460205260409020548015611a2857600160e01b81165f03611a5257919050565b611a62636f96cda160e11b6115f2565b611a28565b600160e01b81165f03611a7957919050565b61122e636f96cda160e11b6115f2565b60085460ff1615611acf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161094f565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861181f3390565b6060818310611b1d57611b1d631960ccad60e11b6115f2565b6001831015611b2b57600192505b5f54808310611b38578092505b60605f611b4487610d9f565b85871090810291508115611bf0578187870311611b615786860391505b60405192506001820160051b83016040525f611b7c886111d3565b90505f8160400151611b8c575080515b5f5b611b978a611d5c565b925060408301515f8114611bad575f9250611bd2565b835115611bb957835192505b8b831860601b611bd2576001820191508a8260051b8801525b5060018a019950888a1480611be657508481145b15611b8e57855250505b50909695505050505050565b5f805490829003611c1757611c1763b562e8dd60e01b6115f2565b5f8181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b17811790915580845260059092528220805468010000000000000001860201905590819003611c7457611c74622e076360e81b6115f2565b818301825b80835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4818160010191508103611c7957505f5550505050565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d2c848484610abf565b6001600160a01b0383163b15610ae457611d488484848461202e565b610ae457610ae46368d2bf6b60e11b6115f2565b604080516080810182525f8082526020820181905291810182905260608101919091525f8281526004602052604090205461088990611fe6565b60606009805461089e906125bc565b6060815f03611dcb5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611df45780611dde816127f0565b9150611ded9050600a8361269a565b9150611dce565b5f8167ffffffffffffffff811115611e0e57611e0e6124a3565b6040519080825280601f01601f191660200182016040528015611e38576020820181803683370190505b5090505b8415610ebd57611e4d6001836127c8565b9150611e5a600a86612808565b611e659060306127b5565b60f81b818381518110611e7a57611e7a61281b565b60200101906001600160f81b03191690815f1a905350611e9b600a8661269a565b9450611e3c565b60608282604051602001611eb792919061282f565b604051602081830303815290604052905092915050565b6060611ed9826115aa565b611eed57611eed630a14c4b560e41b6115f2565b5f611ef6611d96565b905080515f03611f145760405180602001604052805f8152506112e0565b80611f1e84611da5565b604051602001611f2f92919061282f565b6040516020818303038152906040529392505050565b5f611f4f83610d3f565b9050818015611f675750336001600160a01b03821614155b15611f8a57611f7681336107e5565b611f8a57611f8a6367d9dca160e11b6115f2565b5f8381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a029061206290339089908890889060040161285d565b6020604051808303815f875af192505050801561209c575060408051601f3d908101601f1916820190925261209991810190612899565b60015b6120ef573d8080156120c9576040519150601f19603f3d011682016040523d82523d5f602084013e6120ce565b606091505b5080515f036120e7576120e76368d2bf6b60e11b6115f2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001600160e01b031981168114610bca575f80fd5b5f60208284031215612131575f80fd5b81356112e08161210c565b5f5b8381101561215657818101518382015260200161213e565b50505f910152565b5f815180845261217581602086016020860161213c565b601f01601f19169290920160200192915050565b602081525f6112e0602083018461215e565b6001600160a01b0381168114610bca575f80fd5b5f602082840312156121bf575f80fd5b81356112e08161219b565b5f602082840312156121da575f80fd5b5035919050565b5f80604083850312156121f2575f80fd5b82356121fd8161219b565b946020939093013593505050565b5f805f6060848603121561221d575f80fd5b83356122288161219b565b925060208401356122388161219b565b929592945050506040919091013590565b5f806040838503121561225a575f80fd5b50508035926020909101359150565b5f806020838503121561227a575f80fd5b823567ffffffffffffffff80821115612291575f80fd5b818501915085601f8301126122a4575f80fd5b8135818111156122b2575f80fd5b8660208285010111156122c3575f80fd5b60209290920196919550909350505050565b5f80604083850312156122e6575f80fd5b82356122f18161219b565b9150602083013567ffffffffffffffff8116811461230d575f80fd5b809150509250929050565b80516001600160a01b0316825260208082015167ffffffffffffffff169083015260408082015115159083015260609081015162ffffff16910152565b608081016108898284612318565b5f8060208385031215612374575f80fd5b823567ffffffffffffffff8082111561238b575f80fd5b818501915085601f83011261239e575f80fd5b8135818111156123ac575f80fd5b8660208260051b85010111156122c3575f80fd5b602080825282518282018190525f9190848201906040850190845b81811015611bf0576123ee838551612318565b92840192608092909201916001016123db565b602080825282518282018190525f9190848201906040850190845b81811015611bf05783518352928401929184019160010161241c565b5f805f6060848603121561244a575f80fd5b83356124558161219b565b95602085013595506040909401359392505050565b8015158114610bca575f80fd5b5f8060408385031215612488575f80fd5b82356124938161219b565b9150602083013561230d8161246a565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156124ca575f80fd5b84356124d58161219b565b935060208501356124e58161219b565b925060408501359150606085013567ffffffffffffffff80821115612508575f80fd5b818701915087601f83011261251b575f80fd5b81358181111561252d5761252d6124a3565b604051601f8201601f19908116603f01168101908382118183101715612555576125556124a3565b816040528281528a602084870101111561256d575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156125a1575f80fd5b82356125ac8161219b565b9150602083013561230d8161219b565b600181811c908216806125d057607f821691505b6020821081036125ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f60208284031215612639575f80fd5b5051919050565b5f60208284031215612650575f80fd5b81516112e08161246a565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176108895761088961265b565b634e487b7160e01b5f52601260045260245ffd5b5f826126a8576126a8612686565b500490565b601f821115610a85575f81815260208120601f850160051c810160208610156126d35750805b601f850160051c820191505b818110156126f2578281556001016126df565b505050505050565b67ffffffffffffffff831115612712576127126124a3565b6127268361272083546125bc565b836126ad565b5f601f841160018114612757575f85156127405750838201355b5f19600387901b1c1916600186901b178355611048565b5f83815260209020601f19861690835b828110156127875786850135825560209485019460019092019101612767565b50868210156127a3575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b808201808211156108895761088961265b565b818103818111156108895761088961265b565b5f816127e9576127e961265b565b505f190190565b5f600182016128015761280161265b565b5060010190565b5f8261281657612816612686565b500690565b634e487b7160e01b5f52603260045260245ffd5b5f835161284081846020880161213c565b83519083019061285481836020880161213c565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061288f9083018461215e565b9695505050505050565b5f602082840312156128a9575f80fd5b81516112e08161210c56fea2646970667358221220cb63a01a2c71cacd76ec0444bc81a627194a767887badb3165fc052138c29f1a64736f6c63430008140033

Deployed Bytecode Sourcemap

90977:6217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96604:255;;;;;;;;;;-1:-1:-1;96604:255:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;96604:255:0;;;;;;;;44302:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;93692:153::-;;;;;;;;;;-1:-1:-1;93692:153:0;;;;;:::i;:::-;;:::i;:::-;;51336:227;;;;;;;;;;-1:-1:-1;51336:227:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2085:32:1;;;2067:51;;2055:2;2040:18;51336:227:0;1921:203:1;94291:225:0;;;;;;:::i;:::-;;:::i;40044:323::-;;;;;;;;;;-1:-1:-1;9595:4:0;40318:12;40105:7;40302:13;:28;-1:-1:-1;;40302:46:0;40044:323;;;2595:25:1;;;2583:2;2568:18;40044:323:0;2449:177:1;91573:81:0;;;;;;;;;;-1:-1:-1;91573:81:0;;;;;:::i;:::-;;:::i;94524:224::-;;;;;;:::i;:::-;;:::i;97035:156::-;;;;;;;;;;-1:-1:-1;97035:156:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3537:32:1;;;3519:51;;3601:2;3586:18;;3579:34;;;;3492:18;97035:156:0;3345:274:1;91790:124:0;;;;;;;;;;-1:-1:-1;91790:124:0;;;;;:::i;:::-;;:::i;92099:65::-;;;;;;;;;;;;;:::i;94756:232::-;;;;;;:::i;:::-;;:::i;79657:94::-;;;;;;;;;;-1:-1:-1;79657:94:0;;;;;:::i;:::-;;:::i;95802:100::-;;;;;;;;;;-1:-1:-1;95802:100:0;;;;;:::i;:::-;;:::i;91662:120::-;;;;;;;;;;-1:-1:-1;91662:120:0;;;;;:::i;:::-;;:::i;95910:102::-;;;;;;;;;;-1:-1:-1;95910:102:0;;;;;:::i;:::-;;:::i;96156:128::-;;;;;;;;;;-1:-1:-1;96156:128:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;96292:101::-;;;;;;;;;;-1:-1:-1;96292:101:0;;;;;:::i;:::-;;:::i;91469:96::-;;;;;;;;;;-1:-1:-1;91469:96:0;;;;;:::i;:::-;;:::i;83819:1163::-;;;;;;;;;;-1:-1:-1;83819:1163:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77799:86::-;;;;;;;;;;-1:-1:-1;77870:7:0;;;;77799:86;;45704:152;;;;;;;;;;-1:-1:-1;45704:152:0;;;;;:::i;:::-;;:::i;96867:160::-;;;;;;;;;;-1:-1:-1;96867:160:0;;;;;:::i;:::-;;:::i;41228:242::-;;;;;;;;;;-1:-1:-1;41228:242:0;;;;;:::i;:::-;;:::i;3797:148::-;;;;;;;;;;;;;:::i;95593:93::-;;;;;;;;;;-1:-1:-1;95637:7:0;39813:13;95593:93;;92030:61;;;;;;;;;;;;;:::i;86040:325::-;;;;;;;;;;-1:-1:-1;86040:325:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3583:79::-;;;;;;;;;;-1:-1:-1;3648:6:0;;;;;-1:-1:-1;;;;;3648:6:0;3583:79;;92915:86;;;;;;;;;;-1:-1:-1;92915:86:0;;;;;:::i;:::-;;:::i;44478:104::-;;;;;;;;;;;;;:::i;85370:223::-;;;;;;;;;;-1:-1:-1;85370:223:0;;;;;:::i;:::-;;:::i;92172:323::-;;;;;;:::i;:::-;;:::i;94056:227::-;;;;;;;;;;-1:-1:-1;94056:227:0;;;;;:::i;:::-;;:::i;95391:93::-;;;;;;;;;;-1:-1:-1;95435:7:0;40711:13;-1:-1:-1;;40711:31:0;95391:93;95593;94996:266;;;;;;:::i;:::-;;:::i;95694:100::-;;;;;;;;;;-1:-1:-1;95694:100:0;;;;;:::i;:::-;;:::i;:::-;;;10065:18:1;10053:31;;;10035:50;;10023:2;10008:18;95694:100:0;9891:200:1;92503:404:0;;;;;;:::i;:::-;;:::i;83064:596::-;;;;;;;;;;-1:-1:-1;83064:596:0;;;;;:::i;:::-;;:::i;93009:518::-;;;;;;;;;;-1:-1:-1;93009:518:0;;;;;:::i;:::-;;:::i;95492:93::-;;;;;;;;;;;;;:::i;95270:113::-;;;;;;;;;;-1:-1:-1;95270:113:0;;;;;:::i;:::-;;:::i;91351:43::-;;;;;;;;;;-1:-1:-1;91351:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;52294:164;;;;;;;;;;-1:-1:-1;52294:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;52415:25:0;;;52391:4;52415:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;52294:164;96020:128;;;;;;;;;;-1:-1:-1;96020:128:0;;;;;:::i;:::-;;:::i;3953:281::-;;;;;;;;;;-1:-1:-1;3953:281:0;;;;;:::i;:::-;;:::i;93861:144::-;;;;;;;;;;;;;:::i;96604:255::-;96736:4;96765:36;96789:11;96765:23;:36::i;:::-;:86;;;-1:-1:-1;;;;;;;96805:46:0;;-1:-1:-1;;;96805:46:0;96765:86;96758:93;96604:255;-1:-1:-1;;96604:255:0:o;44302:100::-;44356:13;44389:5;44382:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44302:100;:::o;93692:153::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;;;;;;;;;93797:39:::1;::::0;-1:-1:-1;;;93797:39:0;;93830:4:::1;93797:39;::::0;::::1;2067:51:1::0;-1:-1:-1;;;;;93761:23:0;::::1;::::0;::::1;::::0;93785:10:::1;::::0;93761:23;;93797:24:::1;::::0;2040:18:1;;93797:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;93761:76;::::0;-1:-1:-1;;;;;;93761:76:0::1;::::0;;;;;;-1:-1:-1;;;;;3537:32:1;;;93761:76:0::1;::::0;::::1;3519:51:1::0;3586:18;;;3579:34;3492:18;;93761:76:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;93692:153:::0;:::o;51336:227::-;51412:7;51437:16;51445:7;51437;:16::i;:::-;51432:73;;51455:50;-1:-1:-1;;;51455:7:0;:50::i;:::-;-1:-1:-1;51525:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;51525:30:0;;51336:227::o;94291:225::-;94450:8;7838:26;7855:8;7838:16;:26::i;:::-;94476:32:::1;94490:8;94500:7;94476:13;:32::i;:::-;94291:225:::0;;;:::o;91573:81::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;91634:4:::1;:12:::0;91573:81::o;94524:224::-;94686:4;-1:-1:-1;;;;;7394:18:0;;7402:10;7394:18;7390:184;;7519:28;7536:10;7519:16;:28::i;:::-;94703:37:::1;94722:4;94728:2;94732:7;94703:18;:37::i;:::-;94524:224:::0;;;;:::o;97035:156::-;97140:17;;97165:11;;97103:7;;;;-1:-1:-1;;;;;97140:17:0;;;;97177:5;;97159:17;;:5;:17;:::i;:::-;:23;;;;:::i;:::-;97132:51;;;;97035:156;;;;;:::o;91790:124::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;91877:14:::1;:29;91894:12:::0;;91877:14;:29:::1;:::i;92099:65::-:0;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;92146:10:::1;:8;:10::i;:::-;92099:65::o:0;94756:232::-;94922:4;-1:-1:-1;;;;;7394:18:0;;7402:10;7394:18;7390:184;;7519:28;7536:10;7519:16;:28::i;:::-;94939:41:::1;94962:4;94968:2;94972:7;94939:22;:41::i;79657:94::-:0;79723:20;79729:7;79738:4;79723:5;:20::i;:::-;79657:94;:::o;95802:100::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42538:25:0;;42521:14;42538:25;;;:18;:25;;;;;;;35761:3;42775:24;;;-1:-1:-1;;;;;42738:32:0;;;42737:63;42811:34;;93761:76:::1;93692:153:::0;:::o;91662:120::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;91747:17:0;;::::1;;::::0;;;:8:::1;:17;::::0;;;;:27;91662:120::o;95910:102::-;95964:4;95988:16;95996:7;95988;:16::i;96156:128::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96257:19:0;96270:5;96257:12;:19::i;96292:101::-;96356:29;96379:5;96356:22;:29::i;91469:96::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;91542:7:::1;:15;91552:5:::0;;91542:7;:15:::1;:::i;83819:1163::-:0;84177:4;84171:11;;84230:21;;;84382:1;84378:9;;;84437:29;;;84457:4;84437:29;84424:43;;;83963:23;;84488:459;84495:6;;84488:459;;-1:-1:-1;;84581:12:0;;;;84635:23;;;84622:37;84518:15;84722:28;84622:37;84722:19;:28::i;:::-;84880:29;;;84900:4;84880:29;84873:48;-1:-1:-1;84488:459:0;;-1:-1:-1;84488:459:0;;-1:-1:-1;84964:10:0;83819:1163;-1:-1:-1;;;83819:1163:0:o;45704:152::-;45776:7;45819:27;45838:7;45819:18;:27::i;96867:160::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;96962:17:::1;:29:::0;;-1:-1:-1;;;;;;96962:29:0::1;-1:-1:-1::0;;;;;96962:29:0;;;::::1;::::0;;;::::1;::::0;;;97002:11:::1;:17:::0;96867:160::o;41228:242::-;41300:7;-1:-1:-1;;;;;41324:19:0;;41320:69;;41345:44;-1:-1:-1;;;41345:7:0;:44::i;:::-;-1:-1:-1;;;;;;41407:25:0;;;;;:18;:25;;;;;;35387:13;41407:55;;41228:242::o;3797:148::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;3888:6:::1;::::0;3867:40:::1;::::0;3904:1:::1;::::0;3888:6:::1;::::0;::::1;-1:-1:-1::0;;;;;3888:6:0::1;::::0;3867:40:::1;::::0;3904:1;;3867:40:::1;3918:6;:19:::0;;-1:-1:-1;;;;;;3918:19:0::1;::::0;;3797:148::o;95664:14::-;95657:21;;95593:93;:::o;92030:61::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;92075:8:::1;:6;:8::i;86040:325::-:0;86147:13;39813;86118:16;;9595:4;;86118:16;86269:13;;;86265:66;;86295:36;86312:5;86319;86326:4;86295:16;:36::i;:::-;86284:47;;86265:66;86349:8;86040:325;-1:-1:-1;;;;86040:325:0:o;92915:86::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;92979:5:::1;:14:::0;92915:86::o;44478:104::-;44534:13;44567:7;44560:14;;;;;:::i;85370:223::-;85513:16;85549:36;85566:5;85573;85580:4;85549:16;:36::i;92172:323::-;92247:1;92238:6;:10;92230:37;;;;-1:-1:-1;;;92230:37:0;;14496:2:1;92230:37:0;;;14478:21:1;14535:2;14515:18;;;14508:30;-1:-1:-1;;;14554:18:1;;;14547:44;14608:18;;92230:37:0;14294:338:1;92230:37:0;92314:4;;9595;40318:12;40105:7;40302:13;92304:6;;40302:28;;-1:-1:-1;;40302:46:0;92288:22;;;;:::i;:::-;:30;;92280:62;;;;-1:-1:-1;;;92280:62:0;;14969:2:1;92280:62:0;;;14951:21:1;15008:2;14988:18;;;14981:30;-1:-1:-1;;;15027:18:1;;;15020:49;15086:18;;92280:62:0;14767:343:1;92280:62:0;92397:5;;92388:14;;:6;:14;:::i;:::-;92375:9;:27;;92367:58;;;;-1:-1:-1;;;92367:58:0;;15317:2:1;92367:58:0;;;15299:21:1;15356:2;15336:18;;;15329:30;-1:-1:-1;;;15375:18:1;;;15368:48;15433:18;;92367:58:0;15115:342:1;92367:58:0;92456:31;92468:10;92480:6;92456:11;:31::i;94056:227::-;94206:8;7838:26;7855:8;7838:16;:26::i;:::-;94232:43:::1;94256:8;94266;94232:23;:43::i;94996:266::-:0;95190:4;-1:-1:-1;;;;;7394:18:0;;7402:10;7394:18;7390:184;;7519:28;7536:10;7519:16;:28::i;:::-;95207:47:::1;95230:4;95236:2;95240:7;95249:4;95207:22;:47::i;:::-;94996:266:::0;;;;;:::o;95694:100::-;-1:-1:-1;;;;;42212:25:0;;95746:6;42212:25;;;:18;:25;;;;;;35761:3;42212:40;95772:14;42124:137;92503:404;77870:7;;;;78124:9;78116:38;;;;-1:-1:-1;;;78116:38:0;;15664:2:1;78116:38:0;;;15646:21:1;15703:2;15683:18;;;15676:30;-1:-1:-1;;;15722:18:1;;;15715:46;15778:18;;78116:38:0;15462:340:1;78116:38:0;92600:1:::1;92591:6;:10;92583:37;;;::::0;-1:-1:-1;;;92583:37:0;;14496:2:1;92583:37:0::1;::::0;::::1;14478:21:1::0;14535:2;14515:18;;;14508:30;-1:-1:-1;;;14554:18:1;;;14547:44;14608:18;;92583:37:0::1;14294:338:1::0;92583:37:0::1;92667:4;::::0;9595;40318:12;40105:7;40302:13;92657:6;;40302:28;;-1:-1:-1;;40302:46:0;92641:22:::1;;;;:::i;:::-;:30;;92633:62;;;::::0;-1:-1:-1;;;92633:62:0;;14969:2:1;92633:62:0::1;::::0;::::1;14951:21:1::0;15008:2;14988:18;;;14981:30;-1:-1:-1;;;15027:18:1;;;15020:49;15086:18;;92633:62:0::1;14767:343:1::0;92633:62:0::1;92746:10;92720:14;92737:20:::0;;;:8:::1;:20;::::0;;;;;92776:16;;::::1;;92768:46;;;::::0;-1:-1:-1;;;92768:46:0;;16009:2:1;92768:46:0::1;::::0;::::1;15991:21:1::0;16048:2;16028:18;;;16021:30;-1:-1:-1;;;16067:18:1;;;16060:47;16124:18;;92768:46:0::1;15807:341:1::0;92768:46:0::1;92834:10;92825:20;::::0;;;:8:::1;:20;::::0;;;;:30;;92849:6;;92825:20;:30:::1;::::0;92849:6;;92825:30:::1;:::i;:::-;::::0;;;-1:-1:-1;92868:31:0::1;::::0;-1:-1:-1;92880:10:0::1;92892:6:::0;92868:11:::1;:31::i;83064:596::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9595:4:0;83271:7;:26;83267:375;;39786:7;39813:13;83322:7;:24;83318:309;;;83505:51;46732:4;46756:24;;;:17;:24;;;;;;83505:51;;-1:-1:-1;;83547:9:0;;;;83505:51;;;83586:21;83599:7;83586:12;:21::i;83318:309::-;83064:596;;;:::o;93009:518::-;93093:13;93127:16;93135:7;93127;:16::i;:::-;93119:78;;;;-1:-1:-1;;;93119:78:0;;16488:2:1;93119:78:0;;;16470:21:1;16527:2;16507:18;;;16500:30;16566:34;16546:18;;;16539:62;-1:-1:-1;;;16617:18:1;;;16610:47;16674:19;;93119:78:0;16286:413:1;93119:78:0;93208:18;93229:10;:8;:10::i;:::-;93256:18;;93208:31;;-1:-1:-1;93256:22:0;93252:127;;93302:65;93314:4;93320:46;93332:18;:7;:16;:18::i;:::-;93352:13;;;;;;;;;;;;93320:11;:46::i;:::-;93302:11;:65::i;:::-;93295:72;93009:518;-1:-1:-1;;;93009:518:0:o;93252:127::-;93426:1;93401:14;93395:28;;;;;:::i;:::-;;;:32;93391:86;;;93451:14;93444:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93009:518;;;:::o;93391:86::-;93496:23;93511:7;93496:14;:23::i;95492:93::-;95536:7;95563:14;40925:12;;;40843:102;95270:113;-1:-1:-1;;;;;41641:25:0;;95328:7;41641:25;;;:18;:25;;35525:2;41641:25;;;;35387:13;41641:50;;41640:82;95355:20;41552:178;96020:128;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96080:21:0;-1:-1:-1;3953:281:0;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4056:22:0;::::1;4034:110;;;::::0;-1:-1:-1;;;4034:110:0;;16906:2:1;4034:110:0::1;::::0;::::1;16888:21:1::0;16945:2;16925:18;;;16918:30;16984:34;16964:18;;;16957:62;-1:-1:-1;;;17035:18:1;;;17028:36;17081:19;;4034:110:0::1;16704:402:1::0;4034:110:0::1;4181:6;::::0;4160:38:::1;::::0;-1:-1:-1;;;;;4160:38:0;;::::1;::::0;4181:6:::1;::::0;::::1;;::::0;4160:38:::1;::::0;;;::::1;4209:6;:17:::0;;-1:-1:-1;;;;;4209:17:0;;::::1;;;-1:-1:-1::0;;;;;;4209:17:0;;::::1;::::0;;;::::1;::::0;;3953:281::o;93861:144::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;93948:49:::1;::::0;93912:12:::1;::::0;93948:10:::1;::::0;93971:21:::1;::::0;93912:12;93948:49;93912:12;93948:49;93971:21;93948:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43400:639:::0;43485:4;-1:-1:-1;;;;;;;;;43809:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;43886:25:0;;;43809:102;:179;;;-1:-1:-1;;;;;;;;43963:25:0;-1:-1:-1;;;43963:25:0;;43400:639::o;52716:368::-;52781:11;52828:7;9595:4;52809:26;52805:272;;52866:13;;52856:7;:23;52852:214;;;52900:14;52933:60;-1:-1:-1;52950:26:0;;;;:17;:26;;;;;;;52940:42;;;52933:60;;52984:9;;;:::i;:::-;;;52933:60;;;-1:-1:-1;;;53021:24:0;:29;;52716:368;-1:-1:-1;;52716:368:0:o;76647:165::-;76748:13;76742:4;76735:27;76789:4;76783;76776:18;7992:1359;8385:22;8379:4;8372:36;8478:9;8472:4;8465:23;8553:8;8547:4;8540:22;8730:4;8724;8718;8712;8685:25;8678:5;8667:68;8657:274;;8851:16;8845:4;8839;8824:44;8899:16;8893:4;8886:30;8657:274;9331:1;9325:4;9318:15;7992:1359;:::o;51053:124::-;51142:27;51151:2;51155:7;51164:4;51142:8;:27::i;55070:3523::-;55212:27;55242;55261:7;55242:18;:27::i;:::-;-1:-1:-1;;;;;55397:22:0;;;;55212:57;;-1:-1:-1;55457:45:0;;;;55453:95;;55504:44;-1:-1:-1;;;55504:7:0;:44::i;:::-;55562:27;54178:24;;;:15;:24;;;;;54406:26;;55753:68;54406:26;55795:4;203:10;55801:19;-1:-1:-1;;;;;53652:32:0;;;53496:28;;53781:20;;53803:30;;53778:56;;53193:659;55753:68;55748:189;;55841:43;55858:4;203:10;52294:164;:::i;55841:43::-;55836:101;;55886:51;-1:-1:-1;;;55886:7:0;:51::i;:::-;56086:15;56083:160;;;56226:1;56205:19;56198:30;56083:160;-1:-1:-1;;;;;56623:24:0;;;;;;;:18;:24;;;;;;56621:26;;-1:-1:-1;;56621:26:0;;;56692:22;;;;;;;;;56690:24;;-1:-1:-1;56690:24:0;;;50155:11;50130:23;50126:41;50113:63;-1:-1:-1;;;50113:63:0;56985:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;57280:47:0;;:52;;57276:627;;57385:1;57375:11;;57353:19;57508:30;;;:17;:30;;;;;;:35;;57504:384;;57646:13;;57631:11;:28;57627:242;;57793:30;;;;:17;:30;;;;;:52;;;57627:242;57334:569;57276:627;-1:-1:-1;;;;;58035:20:0;;58415:7;58035:20;58345:4;58287:25;58016:16;;58152:299;58476:8;58488:1;58476:13;58472:58;;58491:39;-1:-1:-1;;;58491:7:0;:39::i;:::-;55201:3392;;;;55070:3523;;;:::o;78858:120::-;77870:7;;;;78394:41;;;;-1:-1:-1;;;78394:41:0;;17664:2:1;78394:41:0;;;17646:21:1;17703:2;17683:18;;;17676:30;-1:-1:-1;;;17722:18:1;;;17715:50;17782:18;;78394:41:0;17462:344:1;78394:41:0;78917:7:::1;:15:::0;;-1:-1:-1;;78917:15:0::1;::::0;;78948:22:::1;203:10:::0;78957:12:::1;78948:22;::::0;-1:-1:-1;;;;;2085:32:1;;;2067:51;;2055:2;2040:18;78948:22:0::1;;;;;;;78858:120::o:0;58689:193::-;58835:39;58852:4;58858:2;58862:7;58835:39;;;;;;;;;;;;:16;:39::i;70986:3090::-;71066:27;71096;71115:7;71096:18;:27::i;:::-;71066:57;-1:-1:-1;71066:57:0;71136:12;;71258:35;71285:7;54067:27;54178:24;;;:15;:24;;;;;54406:26;;54178:24;;53965:485;71258:35;71201:92;;;;71310:13;71306:325;;;71431:68;71456:15;71473:4;203:10;71479:19;123:98;71431:68;71426:193;;71523:43;71540:4;203:10;52294:164;:::i;71523:43::-;71518:101;;71568:51;-1:-1:-1;;;71568:7:0;:51::i;:::-;71787:15;71784:160;;;71927:1;71906:19;71899:30;71784:160;-1:-1:-1;;;;;72546:24:0;;;;;;:18;:24;;;;;:60;;72574:32;72546:60;;;50155:11;50130:23;50126:41;50113:63;-1:-1:-1;;;50113:63:0;72844:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;73169:47:0;;:52;;73165:627;;73274:1;73264:11;;73242:19;73397:30;;;:17;:30;;;;;;:35;;73393:384;;73535:13;;73520:11;:28;73516:242;;73682:30;;;;:17;:30;;;;;:52;;;73516:242;73223:569;73165:627;73820:35;;73847:7;;73843:1;;-1:-1:-1;;;;;73820:35:0;;;;;73843:1;;73820:35;-1:-1:-1;;74043:12:0;:14;;;;;;-1:-1:-1;;;;70986:3090:0:o;46045:166::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46156:47:0;46175:27;46194:7;46175:18;:27::i;:::-;46156:18;:47::i;46906:196::-;46985:24;;;;:17;:24;;;;;;:29;;46981:114;;47058:25;47077:5;47058:18;:25::i;:::-;47031:24;;;;:17;:24;;;;;:52;46906:196;:::o;47184:2012::-;47251:14;47301:7;9595:4;47282:26;47278:1853;;-1:-1:-1;47334:26:0;;;;:17;:26;;;;;;;47460:11;;;47456:1292;;47507:13;;47496:7;:24;47492:77;;47522:47;-1:-1:-1;;;47522:7:0;:47::i;:::-;48126:607;-1:-1:-1;;;48222:9:0;48204:28;;;;:17;:28;;;;;;48278:25;;48126:607;48278:25;-1:-1:-1;;;48330:6:0;:24;48358:1;48330:29;48326:48;;47184:2012;;;:::o;48326:48::-;48666:47;-1:-1:-1;;;48666:7:0;:47::i;:::-;48126:607;;47456:1292;-1:-1:-1;;;49075:6:0;:24;49103:1;49075:29;49071:48;;47184:2012;;;:::o;49071:48::-;49141:47;-1:-1:-1;;;49141:7:0;:47::i;78599:118::-;77870:7;;;;78124:9;78116:38;;;;-1:-1:-1;;;78116:38:0;;15664:2:1;78116:38:0;;;15646:21:1;15703:2;15683:18;;;15676:30;-1:-1:-1;;;15722:18:1;;;15715:46;15778:18;;78116:38:0;15462:340:1;78116:38:0;78659:7:::1;:14:::0;;-1:-1:-1;;78659:14:0::1;78669:4;78659:14;::::0;;78689:20:::1;78696:12;203:10:::0;;123:98;86621:4349;86747:16;86814:4;86805:5;:13;86801:54;;86820:35;-1:-1:-1;;;86820:7:0;:35::i;:::-;9595:4;86933:5;:23;86929:87;;;9595:4;86977:23;;86929:87;87030:17;39813:13;87134:17;;;87130:74;;87179:9;87172:16;;87130:74;87218:25;87258;87286:16;87296:5;87286:9;:16::i;:::-;87336:12;;;87496:35;;;;-1:-1:-1;87564:22:0;;87560:3362;;87786:17;87777:5;87770:4;:12;:33;87766:114;;87855:5;87848:4;:12;87828:32;;87766:114;88002:4;87996:11;87984:23;;88255:1;88236:17;88232:25;88229:1;88225:33;88215:8;88211:48;88205:4;88198:62;88435:31;88469:26;88489:5;88469:19;:26::i;:::-;88435:60;;88514:25;88811:9;:16;;;88806:100;;-1:-1:-1;88872:14:0;;88806:100;88924:19;89114:1644;89152:19;89165:5;89152:12;:19::i;:::-;89140:31;;89258:4;89247:9;89243:20;89237:27;89355:1;89350:907;;;;90578:1;90557:22;;89230:1376;;89350:907;89633:9;89627:16;89624:123;;;89706:9;89700:16;89679:37;;89624:123;90038:5;90019:17;90015:29;90011:2;90007:38;89997:233;;90114:1;90101:11;90097:19;90082:34;;90193:5;90178:11;90175:1;90171:19;90161:8;90157:34;90150:49;89997:233;89230:1376;90652:1;90645:5;90641:13;90632:22;;90715:4;90706:5;:13;:49;;;;90738:17;90723:11;:32;90706:49;90704:52;89114:1644;;90859:29;;-1:-1:-1;;87560:3362:0;-1:-1:-1;90943:8:0;;86621:4349;-1:-1:-1;;;;;;86621:4349:0:o;63133:2305::-;63206:20;63229:13;;;63257;;;63253:53;;63272:34;-1:-1:-1;;;63272:7:0;:34::i;:::-;63819:31;;;;:17;:31;;;;;;;;-1:-1:-1;;;;;49981:28:0;;50155:11;50130:23;50126:41;50599:1;50586:15;;50560:24;50556:46;50123:52;50113:63;;63819:173;;;64210:22;;;:18;:22;;;;;:71;;64248:32;64236:45;;64210:71;;;49981:28;64471:13;;;64467:54;;64486:35;-1:-1:-1;;;64486:7:0;:35::i;:::-;64552:23;;;:12;64637:676;65056:7;65012:8;64967:1;64901:25;64838:1;64773;64742:358;65308:3;65295:9;;;;;;:16;64637:676;;-1:-1:-1;65329:13:0;:19;-1:-1:-1;94291:225:0;;;:::o;51903:234::-;203:10;51998:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;51998:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;51998:60:0;;;;;;;;;;52074:55;;540:41:1;;;51998:49:0;;203:10;52074:55;;513:18:1;52074:55:0;;;;;;;51903:234;;:::o;59480:416::-;59655:31;59668:4;59674:2;59678:7;59655:12;:31::i;:::-;-1:-1:-1;;;;;59701:14:0;;;:19;59697:192;;59740:56;59771:4;59777:2;59781:7;59790:5;59740:30;:56::i;:::-;59735:154;;59817:56;-1:-1:-1;;;59817:7:0;:56::i;46307:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46435:24:0;;;;:17;:24;;;;;;46416:44;;:18;:44::i;91922:100::-;91974:13;92007:7;92000:14;;;;;:::i;24480:723::-;24536:13;24757:5;24766:1;24757:10;24753:53;;-1:-1:-1;;24784:10:0;;;;;;;;;;;;-1:-1:-1;;;24784:10:0;;;;;24480:723::o;24753:53::-;24831:5;24816:12;24872:78;24879:9;;24872:78;;24905:8;;;;:::i;:::-;;-1:-1:-1;24928:10:0;;-1:-1:-1;24936:2:0;24928:10;;:::i;:::-;;;24872:78;;;24960:19;24992:6;24982:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24982:17:0;;24960:39;;25010:154;25017:10;;25010:154;;25044:11;25054:1;25044:11;;:::i;:::-;;-1:-1:-1;25113:10:0;25121:2;25113:5;:10;:::i;:::-;25100:24;;:2;:24;:::i;:::-;25087:39;;25070:6;25077;25070:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;25070:56:0;;;;;;;;-1:-1:-1;25141:11:0;25150:2;25141:11;;:::i;:::-;;;25010:154;;93535:149;93613:13;93670:1;93673;93653:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;93639:37;;93535:149;;;;:::o;44688:327::-;44761:13;44792:16;44800:7;44792;:16::i;:::-;44787:68;;44810:45;-1:-1:-1;;;44810:7:0;:45::i;:::-;44868:21;44892:10;:8;:10::i;:::-;44868:34;;44926:7;44920:21;44945:1;44920:26;:87;;;;;;;;;;;;;;;;;44973:7;44982:18;:7;:16;:18::i;:::-;44956:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44913:94;44688:327;-1:-1:-1;;;44688:327:0:o;69927:474::-;70056:13;70072:16;70080:7;70072;:16::i;:::-;70056:32;;70105:13;:45;;;;-1:-1:-1;203:10:0;-1:-1:-1;;;;;70122:28:0;;;;70105:45;70101:201;;;70170:44;70187:5;203:10;52294:164;:::i;70170:44::-;70165:137;;70235:51;-1:-1:-1;;;70235:7:0;:51::i;:::-;70314:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;70314:35:0;-1:-1:-1;;;;;70314:35:0;;;;;;;;;70365:28;;70314:24;;70365:28;;;;;;;70045:356;69927:474;;;:::o;49295:366::-;-1:-1:-1;;;;;;;;;;;;;49405:41:0;;;;36046:3;49491:33;;;49457:68;;-1:-1:-1;;;49457:68:0;-1:-1:-1;;;49555:24:0;;:29;;-1:-1:-1;;;49536:48:0;;;;36567:3;49624:28;;;;-1:-1:-1;;;49595:58:0;-1:-1:-1;49295:366:0:o;61980:691::-;62164:88;;-1:-1:-1;;;62164:88:0;;62143:4;;-1:-1:-1;;;;;62164:45:0;;;;;:88;;203:10;;62231:4;;62237:7;;62246:5;;62164:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62164:88:0;;;;;;;;-1:-1:-1;;62164:88:0;;;;;;;;;;;;:::i;:::-;;;62160:504;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62447:6;:13;62464:1;62447:18;62443:115;;62486:56;-1:-1:-1;;;62486:7:0;:56::i;:::-;62630:6;62624:13;62615:6;62611:2;62607:15;62600:38;62160:504;-1:-1:-1;;;;;;62323:64:0;-1:-1:-1;;;62323:64:0;;-1:-1:-1;61980:691:0;;;;;;:::o;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:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:131::-;-1:-1:-1;;;;;1423:31:1;;1413:42;;1403:70;;1469:1;1466;1459:12;1484:247;1543:6;1596:2;1584:9;1575:7;1571:23;1567:32;1564:52;;;1612:1;1609;1602:12;1564:52;1651:9;1638:23;1670:31;1695:5;1670:31;:::i;1736:180::-;1795:6;1848:2;1836:9;1827:7;1823:23;1819:32;1816:52;;;1864:1;1861;1854:12;1816:52;-1:-1:-1;1887:23:1;;1736:180;-1:-1:-1;1736:180:1:o;2129:315::-;2197:6;2205;2258:2;2246:9;2237:7;2233:23;2229:32;2226:52;;;2274:1;2271;2264:12;2226:52;2313:9;2300:23;2332:31;2357:5;2332:31;:::i;:::-;2382:5;2434:2;2419:18;;;;2406:32;;-1:-1:-1;;;2129:315:1:o;2631:456::-;2708:6;2716;2724;2777:2;2765:9;2756:7;2752:23;2748:32;2745:52;;;2793:1;2790;2783:12;2745:52;2832:9;2819:23;2851:31;2876:5;2851:31;:::i;:::-;2901:5;-1:-1:-1;2958:2:1;2943:18;;2930:32;2971:33;2930:32;2971:33;:::i;:::-;2631:456;;3023:7;;-1:-1:-1;;;3077:2:1;3062:18;;;;3049:32;;2631:456::o;3092:248::-;3160:6;3168;3221:2;3209:9;3200:7;3196:23;3192:32;3189:52;;;3237:1;3234;3227:12;3189:52;-1:-1:-1;;3260:23:1;;;3330:2;3315:18;;;3302:32;;-1:-1:-1;3092:248:1:o;3624:592::-;3695:6;3703;3756:2;3744:9;3735:7;3731:23;3727:32;3724:52;;;3772:1;3769;3762:12;3724:52;3812:9;3799:23;3841:18;3882:2;3874:6;3871:14;3868:34;;;3898:1;3895;3888:12;3868:34;3936:6;3925:9;3921:22;3911:32;;3981:7;3974:4;3970:2;3966:13;3962:27;3952:55;;4003:1;4000;3993:12;3952:55;4043:2;4030:16;4069:2;4061:6;4058:14;4055:34;;;4085:1;4082;4075:12;4055:34;4130:7;4125:2;4116:6;4112:2;4108:15;4104:24;4101:37;4098:57;;;4151:1;4148;4141:12;4098:57;4182:2;4174:11;;;;;4204:6;;-1:-1:-1;3624:592:1;;-1:-1:-1;;;;3624:592:1:o;4221:427::-;4288:6;4296;4349:2;4337:9;4328:7;4324:23;4320:32;4317:52;;;4365:1;4362;4355:12;4317:52;4404:9;4391:23;4423:31;4448:5;4423:31;:::i;:::-;4473:5;-1:-1:-1;4530:2:1;4515:18;;4502:32;4578:18;4565:32;;4553:45;;4543:73;;4612:1;4609;4602:12;4543:73;4635:7;4625:17;;;4221:427;;;;;:::o;4653:349::-;4737:12;;-1:-1:-1;;;;;4733:38:1;4721:51;;4825:4;4814:16;;;4808:23;4833:18;4804:48;4788:14;;;4781:72;4916:4;4905:16;;;4899:23;4892:31;4885:39;4869:14;;;4862:63;4978:4;4967:16;;;4961:23;4986:8;4957:38;4941:14;;4934:62;4653:349::o;5007:266::-;5203:3;5188:19;;5216:51;5192:9;5249:6;5216:51;:::i;5278:615::-;5364:6;5372;5425:2;5413:9;5404:7;5400:23;5396:32;5393:52;;;5441:1;5438;5431:12;5393:52;5481:9;5468:23;5510:18;5551:2;5543:6;5540:14;5537:34;;;5567:1;5564;5557:12;5537:34;5605:6;5594:9;5590:22;5580:32;;5650:7;5643:4;5639:2;5635:13;5631:27;5621:55;;5672:1;5669;5662:12;5621:55;5712:2;5699:16;5738:2;5730:6;5727:14;5724:34;;;5754:1;5751;5744:12;5724:34;5807:7;5802:2;5792:6;5789:1;5785:14;5781:2;5777:23;5773:32;5770:45;5767:65;;;5828:1;5825;5818:12;5898:722;6131:2;6183:21;;;6253:13;;6156:18;;;6275:22;;;6102:4;;6131:2;6354:15;;;;6328:2;6313:18;;;6102:4;6397:197;6411:6;6408:1;6405:13;6397:197;;;6460:52;6508:3;6499:6;6493:13;6460:52;:::i;:::-;6569:15;;;;6541:4;6532:14;;;;;6433:1;6426:9;6397:197;;6953:632;7124:2;7176:21;;;7246:13;;7149:18;;;7268:22;;;7095:4;;7124:2;7347:15;;;;7321:2;7306:18;;;7095:4;7390:169;7404:6;7401:1;7398:13;7390:169;;;7465:13;;7453:26;;7534:15;;;;7499:12;;;;7426:1;7419:9;7390:169;;7590:383;7667:6;7675;7683;7736:2;7724:9;7715:7;7711:23;7707:32;7704:52;;;7752:1;7749;7742:12;7704:52;7791:9;7778:23;7810:31;7835:5;7810:31;:::i;:::-;7860:5;7912:2;7897:18;;7884:32;;-1:-1:-1;7963:2:1;7948:18;;;7935:32;;7590:383;-1:-1:-1;;;7590:383:1:o;7978:118::-;8064:5;8057:13;8050:21;8043:5;8040:32;8030:60;;8086:1;8083;8076:12;8101:382;8166:6;8174;8227:2;8215:9;8206:7;8202:23;8198:32;8195:52;;;8243:1;8240;8233:12;8195:52;8282:9;8269:23;8301:31;8326:5;8301:31;:::i;:::-;8351:5;-1:-1:-1;8408:2:1;8393:18;;8380:32;8421:30;8380:32;8421:30;:::i;8488:127::-;8549:10;8544:3;8540:20;8537:1;8530:31;8580:4;8577:1;8570:15;8604:4;8601:1;8594:15;8620:1266;8715:6;8723;8731;8739;8792:3;8780:9;8771:7;8767:23;8763:33;8760:53;;;8809:1;8806;8799:12;8760:53;8848:9;8835:23;8867:31;8892:5;8867:31;:::i;:::-;8917:5;-1:-1:-1;8974:2:1;8959:18;;8946:32;8987:33;8946:32;8987:33;:::i;:::-;9039:7;-1:-1:-1;9093:2:1;9078:18;;9065:32;;-1:-1:-1;9148:2:1;9133:18;;9120:32;9171:18;9201:14;;;9198:34;;;9228:1;9225;9218:12;9198:34;9266:6;9255:9;9251:22;9241:32;;9311:7;9304:4;9300:2;9296:13;9292:27;9282:55;;9333:1;9330;9323:12;9282:55;9369:2;9356:16;9391:2;9387;9384:10;9381:36;;;9397:18;;:::i;:::-;9472:2;9466:9;9440:2;9526:13;;-1:-1:-1;;9522:22:1;;;9546:2;9518:31;9514:40;9502:53;;;9570:18;;;9590:22;;;9567:46;9564:72;;;9616:18;;:::i;:::-;9656:10;9652:2;9645:22;9691:2;9683:6;9676:18;9731:7;9726:2;9721;9717;9713:11;9709:20;9706:33;9703:53;;;9752:1;9749;9742:12;9703:53;9808:2;9803;9799;9795:11;9790:2;9782:6;9778:15;9765:46;9853:1;9848:2;9843;9835:6;9831:15;9827:24;9820:35;9874:6;9864:16;;;;;;;8620:1266;;;;;;;:::o;10096:388::-;10164:6;10172;10225:2;10213:9;10204:7;10200:23;10196:32;10193:52;;;10241:1;10238;10231:12;10193:52;10280:9;10267:23;10299:31;10324:5;10299:31;:::i;:::-;10349:5;-1:-1:-1;10406:2:1;10391:18;;10378:32;10419:33;10378:32;10419:33;:::i;10489:380::-;10568:1;10564:12;;;;10611;;;10632:61;;10686:4;10678:6;10674:17;10664:27;;10632:61;10739:2;10731:6;10728:14;10708:18;10705:38;10702:161;;10785:10;10780:3;10776:20;10773:1;10766:31;10820:4;10817:1;10810:15;10848:4;10845:1;10838:15;10702:161;;10489:380;;;:::o;10874:356::-;11076:2;11058:21;;;11095:18;;;11088:30;11154:34;11149:2;11134:18;;11127:62;11221:2;11206:18;;10874:356::o;11235:184::-;11305:6;11358:2;11346:9;11337:7;11333:23;11329:32;11326:52;;;11374:1;11371;11364:12;11326:52;-1:-1:-1;11397:16:1;;11235:184;-1:-1:-1;11235:184:1:o;11424:245::-;11491:6;11544:2;11532:9;11523:7;11519:23;11515:32;11512:52;;;11560:1;11557;11550:12;11512:52;11592:9;11586:16;11611:28;11633:5;11611:28;:::i;11674:127::-;11735:10;11730:3;11726:20;11723:1;11716:31;11766:4;11763:1;11756:15;11790:4;11787:1;11780:15;11806:168;11879:9;;;11910;;11927:15;;;11921:22;;11907:37;11897:71;;11948:18;;:::i;11979:127::-;12040:10;12035:3;12031:20;12028:1;12021:31;12071:4;12068:1;12061:15;12095:4;12092:1;12085:15;12111:120;12151:1;12177;12167:35;;12182:18;;:::i;:::-;-1:-1:-1;12216:9:1;;12111:120::o;12362:545::-;12464:2;12459:3;12456:11;12453:448;;;12500:1;12525:5;12521:2;12514:17;12570:4;12566:2;12556:19;12640:2;12628:10;12624:19;12621:1;12617:27;12611:4;12607:38;12676:4;12664:10;12661:20;12658:47;;;-1:-1:-1;12699:4:1;12658:47;12754:2;12749:3;12745:12;12742:1;12738:20;12732:4;12728:31;12718:41;;12809:82;12827:2;12820:5;12817:13;12809:82;;;12872:17;;;12853:1;12842:13;12809:82;;;12813:3;;;12362:545;;;:::o;13083:1206::-;13207:18;13202:3;13199:27;13196:53;;;13229:18;;:::i;:::-;13258:94;13348:3;13308:38;13340:4;13334:11;13308:38;:::i;:::-;13302:4;13258:94;:::i;:::-;13378:1;13403:2;13398:3;13395:11;13420:1;13415:616;;;;14075:1;14092:3;14089:93;;;-1:-1:-1;14148:19:1;;;14135:33;14089:93;-1:-1:-1;;13040:1:1;13036:11;;;13032:24;13028:29;13018:40;13064:1;13060:11;;;13015:57;14195:78;;13388:895;;13415:616;12309:1;12302:14;;;12346:4;12333:18;;-1:-1:-1;;13451:17:1;;;13552:9;13574:229;13588:7;13585:1;13582:14;13574:229;;;13677:19;;;13664:33;13649:49;;13784:4;13769:20;;;;13737:1;13725:14;;;;13604:12;13574:229;;;13578:3;13831;13822:7;13819:16;13816:159;;;13955:1;13951:6;13945:3;13939;13936:1;13932:11;13928:21;13924:34;13920:39;13907:9;13902:3;13898:19;13885:33;13881:79;13873:6;13866:95;13816:159;;;14018:1;14012:3;14009:1;14005:11;14001:19;13995:4;13988:33;13388:895;;13083:1206;;;:::o;14637:125::-;14702:9;;;14723:10;;;14720:36;;;14736:18;;:::i;16153:128::-;16220:9;;;16241:11;;;16238:37;;;16255:18;;:::i;17321:136::-;17360:3;17388:5;17378:39;;17397:18;;:::i;:::-;-1:-1:-1;;;17433:18:1;;17321:136::o;17811:135::-;17850:3;17871:17;;;17868:43;;17891:18;;:::i;:::-;-1:-1:-1;17938:1:1;17927:13;;17811:135::o;17951:112::-;17983:1;18009;17999:35;;18014:18;;:::i;:::-;-1:-1:-1;18048:9:1;;17951:112::o;18068:127::-;18129:10;18124:3;18120:20;18117:1;18110:31;18160:4;18157:1;18150:15;18184:4;18181:1;18174:15;18200:496;18379:3;18417:6;18411:13;18433:66;18492:6;18487:3;18480:4;18472:6;18468:17;18433:66;:::i;:::-;18562:13;;18521:16;;;;18584:70;18562:13;18521:16;18631:4;18619:17;;18584:70;:::i;:::-;18670:20;;18200:496;-1:-1:-1;;;;18200:496:1:o;18701:489::-;-1:-1:-1;;;;;18970:15:1;;;18952:34;;19022:15;;19017:2;19002:18;;18995:43;19069:2;19054:18;;19047:34;;;19117:3;19112:2;19097:18;;19090:31;;;18895:4;;19138:46;;19164:19;;19156:6;19138:46;:::i;:::-;19130:54;18701:489;-1:-1:-1;;;;;;18701:489:1:o;19195:249::-;19264:6;19317:2;19305:9;19296:7;19292:23;19288:32;19285:52;;;19333:1;19330;19323:12;19285:52;19365:9;19359:16;19384:30;19408:5;19384:30;:::i

Swarm Source

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