ETH Price: $3,110.35 (+1.39%)
Gas: 20 Gwei

Token

The Popes NFT (TPNFT)
 

Overview

Max Total Supply

200 TPNFT

Holders

63

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 TPNFT
0x5ac163a73831f1c6d6b2d3d1b34a24c2e7d15a85
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:
NFT

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-20
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.7.0 <0.9.0;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}


abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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


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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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


interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

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

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

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

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

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

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

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

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

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {
    // Reference type for token approval.
    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 0;
    }

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

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

    /**
     * @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 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // 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, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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.
     * 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) public virtual override {
        address owner = ownerOf(tokenId);

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

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

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

        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 {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _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) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @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]`.
        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 virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

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

        if (to == address(0)) revert TransferToZeroAddress();

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public 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 virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

        _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:
            // - `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)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // 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`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _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();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _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();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    // =============================================================
    //                        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();
        }

        _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();
        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 Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

contract NFT is ERC721A, Ownable, ReentrancyGuard, DefaultOperatorFilterer {
    using Strings for uint256;

    string public baseURI;
    string public baseExtension = ".json";
    string public notRevealedUri;
    uint256 public cost = 0;
    uint256 public maxSupply = 7777;
    uint256 public FreeSupply = 0;
    uint256 public MaxperWallet = 10;
    uint256 public MaxperWalletFree = 5;

    bool public paused = false;
    bool public revealed = false;
    bool public whitelistEnabled = false;
    bool public freeWhitelistEnabled = false;

    address public admin;
    address payable public collector;

    mapping(address => bool) public whitelist;
    mapping(address => bool) public freeMintWhitelist;

    constructor(string memory _initBaseURI, string memory _notRevealedUri)
        ERC721A("The Popes NFT", "TPNFT")
    {
        // change the name and symbol for your collection
        setBaseURI(_initBaseURI);
        setNotRevealedURI(_notRevealedUri);
        admin = msg.sender;
    }

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

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

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

    function updateAdmin(address admin_) external onlyOwner{
        admin = admin_;
    }


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

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

    function updateWhitelistStatus(bool status) external onlyOwner {
        whitelistEnabled = status;
    }

    function updateFreeWhitelistStatus(bool status) external onlyOwner {
        freeWhitelistEnabled = status;
    }

    // public
    /// @dev Public mint
    function mint(uint256 tokens) public payable nonReentrant {
        require(!paused, "oops contract is paused");
        require(totalSupply() + tokens <= maxSupply, "We Soldout");
        if (msg.sender != admin && msg.sender != owner()) {
            require(tokens <= MaxperWallet, "max mint amount per tx exceeded");
            if(whitelistEnabled){
                require(whitelist[msg.sender] == true, "Not whitelisted");
            }
            require(
                _numberMinted(_msgSenderERC721A()) + tokens <= MaxperWallet,
                "Max NFT Per Wallet exceeded"
            );
            require(msg.value >= cost * tokens, "insufficient funds");
        }

        _safeMint(_msgSenderERC721A(), tokens);
    }

       /// @dev free mint
    function freemint(uint256 tokens) public nonReentrant {
        require(!paused, "oops contract is paused");
        if (msg.sender != admin && msg.sender != owner()) {
            require(
                _numberMinted(_msgSenderERC721A()) + tokens <= MaxperWalletFree,
                "Max NFT Per Wallet exceeded"
            );
            require(tokens <= MaxperWalletFree, "max mint per Tx exceeded");
            require(freeMintWhitelist[msg.sender] == true, "Not whitelisted");
        }
        require(
            totalSupply() + tokens <= FreeSupply,
            "Whitelist MaxSupply exceeded"
        );

        _safeMint(_msgSenderERC721A(), tokens);
    }

    /// @dev use it for giveaway and team mint
    function airdrop(uint256 _mintAmount, address destination)
        public
        onlyOwner
        nonReentrant
    {
        require(
            totalSupply() + _mintAmount <= maxSupply,
            "max NFT limit exceeded"
        );

        _safeMint(destination, _mintAmount);
    }

    function addWalletToWhitelist(address[] memory wallets) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            whitelist[wallets[i]] = true;
        }
    }

    function removeWalletsFromWhitelist(address[] memory wallets) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            whitelist[wallets[i]] = false;
        }
    }

    function addWalletToFreeMintWhitelist(address[] memory wallets) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            freeMintWhitelist[wallets[i]] = true;
        }
    }

    function removeWalletsFromFreeMintWhitelist(address[] memory wallets) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            freeMintWhitelist[wallets[i]] = false;
        }
    }

    /// @notice returns metadata link of tokenid
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721AMetadata: URI query for nonexistent token"
        );

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

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

    /// @notice return the number minted by an address
    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    /// @notice return the tokens owned by an address
    function tokensOfOwner(address owner)
        public
        view
        returns (uint256[] memory)
    {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (
                uint256 i = _startTokenId();
                tokenIdsIdx != tokenIdsLength;
                ++i
            ) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }

    //only owner
    function reveal(bool _state) public onlyOwner {
        revealed = _state;
    }

    /// @dev change the public max per wallet
    function setMaxPerWallet(uint256 _limit) public onlyOwner {
        MaxperWallet = _limit;
    }

    /// @dev change the free max per wallet
    function setFreeMaxPerWallet(uint256 _limit) public onlyOwner {
        MaxperWalletFree = _limit;
    }

    /// @dev change the public price(amount need to be in wei)
    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    /// @dev cut the supply if we dont sold out
    function setMaxsupply(uint256 _newsupply) public onlyOwner {
        maxSupply = _newsupply;
    }

    /// @dev cut the free supply
    function setFreesupply(uint256 _newsupply) public onlyOwner {
        FreeSupply = _newsupply;
    }

    /// @dev set your baseuri
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    /// @dev set base extension(default is .json)
    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    /// @dev set hidden uri
    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    /// @dev to pause and unpause your contract(use booleans true or false)
    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    //@dev update the collector address

    function updateCollector(address payable new_address) external onlyOwner {
        collector = new_address;
    }

    /// @dev withdraw funds from contract
    function withdraw() public payable onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        payable(collector).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_notRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperWalletFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addWalletToFreeMintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addWalletToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeWhitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"freemint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"removeWalletsFromFreeMintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"removeWalletsFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newsupply","type":"uint256"}],"name":"setFreesupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newsupply","type":"uint256"}],"name":"setMaxsupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin_","type":"address"}],"name":"updateAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"new_address","type":"address"}],"name":"updateCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateFreeWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600b919062000390565b506000600d819055611e61600e55600f55600a60105560056011556012805463ffffffff191690553480156200005d57600080fd5b506040516200330338038062003303833981016040819052620000809162000503565b604080518082018252600d81526c151a1948141bdc195cc8139195609a1b602080830191825283518085019094526005845264151413919560da1b908401528151733cc6cdda760b79bafa08df41ecfa224f810dceb693600193929091620000eb9160029162000390565b5080516200010190600390602084019062000390565b505060016000555062000114336200029b565b60016009556daaeb6d7670e522a718067333cd4e3b156200025e578015620001ac57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200018d57600080fd5b505af1158015620001a2573d6000803e3d6000fd5b505050506200025e565b6001600160a01b03821615620001fd5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000172565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200024457600080fd5b505af115801562000259573d6000803e3d6000fd5b505050505b506200026c905082620002ed565b620002778162000310565b505060128054600160201b600160c01b0319163364010000000002179055620005a9565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002f76200032f565b80516200030c90600a90602084019062000390565b5050565b6200031a6200032f565b80516200030c90600c90602084019062000390565b6008546001600160a01b031633146200038e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b8280546200039e906200056d565b90600052602060002090601f016020900481019282620003c257600085556200040d565b82601f10620003dd57805160ff19168380011785556200040d565b828001600101855582156200040d579182015b828111156200040d578251825591602001919060010190620003f0565b506200041b9291506200041f565b5090565b5b808211156200041b576000815560010162000420565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200045e57600080fd5b81516001600160401b03808211156200047b576200047b62000436565b604051601f8301601f19908116603f01168101908282118183101715620004a657620004a662000436565b81604052838152602092508683858801011115620004c357600080fd5b600091505b83821015620004e75785820183015181830184015290820190620004c8565b83821115620004f95760008385830101525b9695505050505050565b600080604083850312156200051757600080fd5b82516001600160401b03808211156200052f57600080fd5b6200053d868387016200044c565b935060208501519150808211156200055457600080fd5b5062000563858286016200044c565b9150509250929050565b600181811c908216806200058257607f821691505b602082108103620005a357634e487b7160e01b600052602260045260246000fd5b50919050565b612d4a80620005b96000396000f3fe6080604052600436106103765760003560e01c8063715018a6116101d1578063c316c98b11610102578063e1cf8baa116100a0578063ebcd13db1161006f578063ebcd13db14610a18578063f2c4ce1e14610a38578063f2fde38b14610a58578063f851a44014610a7857600080fd5b8063e1cf8baa1461096f578063e268e4d31461098f578063e2f273bd146109af578063e985e9c5146109cf57600080fd5b8063d5abeb01116100dc578063d5abeb01146108f9578063d5ad3cda1461090f578063da3ef23f1461092f578063dc33e6811461094f57600080fd5b8063c316c98b146108a4578063c6682862146108c4578063c87b56dd146108d957600080fd5b80639b19251a1161016f578063a4da9b1b11610149578063a4da9b1b1461082d578063b88d4fde1461084e578063bc63f02e1461086e578063bd7a19981461088e57600080fd5b80639b19251a146107ca578063a0712d68146107fa578063a22cb4651461080d57600080fd5b80638da5cb5b116101ab5780638da5cb5b14610757578063913e77ad14610775578063940cd05b1461079557806395d89b41146107b557600080fd5b8063715018a6146106f55780638462151c1461070a578063864a47291461073757600080fd5b806337746bbe116102ab57806351fb012d11610249578063624208ae11610223578063624208ae1461068a5780636352211e146106a05780636c0360eb146106c057806370a08231146106d557600080fd5b806351fb012d1461063057806355f804b3146106505780635c975abb1461067057600080fd5b806342842e0e1161028557806342842e0e146105bb57806344a0d68a146105db57806350839bef146105fb578063518302271461061157600080fd5b806337746bbe146105735780633b75089a146105935780633ccfd60b146105b357600080fd5b80630fbe4fe21161031857806318160ddd116102f257806318160ddd146104f557806321820f6e1461051357806323b872dd14610533578063351de26e1461055357600080fd5b80630fbe4fe21461049157806313faede6146104b1578063149835a0146104d557600080fd5b8063081812fc11610354578063081812fc146103f4578063081c8c441461042c578063092ca2d014610441578063095ea7b31461047157600080fd5b806301ffc9a71461037b57806302329a29146103b057806306fdde03146103d2575b600080fd5b34801561038757600080fd5b5061039b61039636600461264f565b610aa0565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103d06103cb36600461267a565b610af2565b005b3480156103de57600080fd5b506103e7610b0d565b6040516103a791906126ef565b34801561040057600080fd5b5061041461040f366004612702565b610b9f565b6040516001600160a01b0390911681526020016103a7565b34801561043857600080fd5b506103e7610be3565b34801561044d57600080fd5b5061039b61045c366004612730565b60156020526000908152604090205460ff1681565b34801561047d57600080fd5b506103d061048c36600461274d565b610c71565b34801561049d57600080fd5b506103d06104ac366004612702565b610d11565b3480156104bd57600080fd5b506104c7600d5481565b6040519081526020016103a7565b3480156104e157600080fd5b506103d06104f0366004612702565b610f4d565b34801561050157600080fd5b506104c7600154600054036000190190565b34801561051f57600080fd5b506103d061052e36600461267a565b610f5a565b34801561053f57600080fd5b506103d061054e366004612779565b610f7e565b34801561055f57600080fd5b506103d061056e366004612702565b6110da565b34801561057f57600080fd5b506103d061058e366004612801565b6110e7565b34801561059f57600080fd5b506103d06105ae366004612801565b61115b565b6103d06111cb565b3480156105c757600080fd5b506103d06105d6366004612779565b61123d565b3480156105e757600080fd5b506103d06105f6366004612702565b61138e565b34801561060757600080fd5b506104c7600f5481565b34801561061d57600080fd5b5060125461039b90610100900460ff1681565b34801561063c57600080fd5b5060125461039b9062010000900460ff1681565b34801561065c57600080fd5b506103d061066b36600461290b565b61139b565b34801561067c57600080fd5b5060125461039b9060ff1681565b34801561069657600080fd5b506104c760115481565b3480156106ac57600080fd5b506104146106bb366004612702565b6113b6565b3480156106cc57600080fd5b506103e76113c1565b3480156106e157600080fd5b506104c76106f0366004612730565b6113ce565b34801561070157600080fd5b506103d061141d565b34801561071657600080fd5b5061072a610725366004612730565b611431565b6040516103a79190612954565b34801561074357600080fd5b506103d0610752366004612801565b61153a565b34801561076357600080fd5b506008546001600160a01b0316610414565b34801561078157600080fd5b50601354610414906001600160a01b031681565b3480156107a157600080fd5b506103d06107b036600461267a565b6115aa565b3480156107c157600080fd5b506103e76115cc565b3480156107d657600080fd5b5061039b6107e5366004612730565b60146020526000908152604090205460ff1681565b6103d0610808366004612702565b6115db565b34801561081957600080fd5b506103d061082836600461298c565b61184c565b34801561083957600080fd5b5060125461039b906301000000900460ff1681565b34801561085a57600080fd5b506103d06108693660046129c5565b6118e1565b34801561087a57600080fd5b506103d0610889366004612a45565b611a40565b34801561089a57600080fd5b506104c760105481565b3480156108b057600080fd5b506103d06108bf366004612730565b611adf565b3480156108d057600080fd5b506103e7611b09565b3480156108e557600080fd5b506103e76108f4366004612702565b611b16565b34801561090557600080fd5b506104c7600e5481565b34801561091b57600080fd5b506103d061092a366004612801565b611c8b565b34801561093b57600080fd5b506103d061094a36600461290b565b611cfb565b34801561095b57600080fd5b506104c761096a366004612730565b611d16565b34801561097b57600080fd5b506103d061098a366004612702565b611d21565b34801561099b57600080fd5b506103d06109aa366004612702565b611d2e565b3480156109bb57600080fd5b506103d06109ca366004612730565b611d3b565b3480156109db57600080fd5b5061039b6109ea366004612a6a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a2457600080fd5b506103d0610a3336600461267a565b611d71565b348015610a4457600080fd5b506103d0610a5336600461290b565b611d97565b348015610a6457600080fd5b506103d0610a73366004612730565b611db2565b348015610a8457600080fd5b506012546104149064010000000090046001600160a01b031681565b60006301ffc9a760e01b6001600160e01b031983161480610ad157506380ac58cd60e01b6001600160e01b03198316145b80610aec5750635b5e139f60e01b6001600160e01b03198316145b92915050565b610afa611e2b565b6012805460ff1916911515919091179055565b606060028054610b1c90612a98565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4890612a98565b8015610b955780601f10610b6a57610100808354040283529160200191610b95565b820191906000526020600020905b815481529060010190602001808311610b7857829003601f168201915b5050505050905090565b6000610baa82611e85565b610bc7576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600c8054610bf090612a98565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c90612a98565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b505050505081565b6000610c7c826113b6565b9050336001600160a01b03821614610cb557610c9881336109ea565b610cb5576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600260095403610d3c5760405162461bcd60e51b8152600401610d3390612ad2565b60405180910390fd5b600260095560125460ff1615610d8e5760405162461bcd60e51b81526020600482015260176024820152761bdbdc1cc818dbdb9d1c9858dd081a5cc81c185d5cd959604a1b6044820152606401610d33565b60125464010000000090046001600160a01b03163314801590610dbc57506008546001600160a01b03163314155b15610ece5760115481610dce33611eba565b610dd89190612b1f565b1115610e265760405162461bcd60e51b815260206004820152601b60248201527f4d6178204e4654205065722057616c6c657420657863656564656400000000006044820152606401610d33565b601154811115610e785760405162461bcd60e51b815260206004820152601860248201527f6d6178206d696e742070657220547820657863656564656400000000000000006044820152606401610d33565b3360009081526015602052604090205460ff161515600114610ece5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610d33565b600f5481610ee3600154600054036000190190565b610eed9190612b1f565b1115610f3b5760405162461bcd60e51b815260206004820152601c60248201527f57686974656c697374204d6178537570706c79206578636565646564000000006044820152606401610d33565b610f453382611ee3565b506001600955565b610f55611e2b565b600e55565b610f62611e2b565b60128054911515620100000262ff000019909216919091179055565b826daaeb6d7670e522a718067333cd4e3b156110c957336001600160a01b03821603610fb457610faf848484611efd565b6110d4565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110279190612b37565b80156110aa5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190612b37565b6110c957604051633b79c77360e21b8152336004820152602401610d33565b6110d4848484611efd565b50505050565b6110e2611e2b565b601155565b6110ef611e2b565b60005b81518110156111575760006015600084848151811061111357611113612b54565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061114f81612b6a565b9150506110f2565b5050565b611163611e2b565b60005b81518110156111575760016014600084848151811061118757611187612b54565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806111c381612b6a565b915050611166565b6111d3611e2b565b6002600954036111f55760405162461bcd60e51b8152600401610d3390612ad2565b600260095560135460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015611234573d6000803e3d6000fd5b50506001600955565b826daaeb6d7670e522a718067333cd4e3b1561138357336001600160a01b0382160361126e57610faf848484612095565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156112bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e19190612b37565b80156113645750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113649190612b37565b61138357604051633b79c77360e21b8152336004820152602401610d33565b6110d4848484612095565b611396611e2b565b600d55565b6113a3611e2b565b805161115790600a9060208401906125a0565b6000610aec826120b5565b600a8054610bf090612a98565b60006001600160a01b0382166113f7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611425611e2b565b61142f6000612124565b565b60606000806000611441856113ce565b905060008167ffffffffffffffff81111561145e5761145e6127ba565b604051908082528060200260200182016040528015611487578160200160208202803683370190505b5090506114b460408051608081018252600080825260208201819052918101829052606081019190915290565b60015b83861461152e576114c781612176565b915081604001516115265781516001600160a01b0316156114e757815194505b876001600160a01b0316856001600160a01b031603611526578083878060010198508151811061151957611519612b54565b6020026020010181815250505b6001016114b7565b50909695505050505050565b611542611e2b565b60005b81518110156111575760016015600084848151811061156657611566612b54565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806115a281612b6a565b915050611545565b6115b2611e2b565b601280549115156101000261ff0019909216919091179055565b606060038054610b1c90612a98565b6002600954036115fd5760405162461bcd60e51b8152600401610d3390612ad2565b600260095560125460ff161561164f5760405162461bcd60e51b81526020600482015260176024820152761bdbdc1cc818dbdb9d1c9858dd081a5cc81c185d5cd959604a1b6044820152606401610d33565b600e5481611664600154600054036000190190565b61166e9190612b1f565b11156116a95760405162461bcd60e51b815260206004820152600a60248201526915d94814dbdb191bdd5d60b21b6044820152606401610d33565b60125464010000000090046001600160a01b031633148015906116d757506008546001600160a01b03163314155b15610f3b5760105481111561172e5760405162461bcd60e51b815260206004820152601f60248201527f6d6178206d696e7420616d6f756e7420706572207478206578636565646564006044820152606401610d33565b60125462010000900460ff1615611795573360009081526014602052604090205460ff1615156001146117955760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610d33565b601054816117a233611eba565b6117ac9190612b1f565b11156117fa5760405162461bcd60e51b815260206004820152601b60248201527f4d6178204e4654205065722057616c6c657420657863656564656400000000006044820152606401610d33565b80600d546118089190612b83565b341015610f3b5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610d33565b336001600160a01b038316036118755760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b836daaeb6d7670e522a718067333cd4e3b15611a2d57336001600160a01b0382160361191857611913858585856121f5565b611a39565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190612b37565b8015611a0e5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156119ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0e9190612b37565b611a2d57604051633b79c77360e21b8152336004820152602401610d33565b611a39858585856121f5565b5050505050565b611a48611e2b565b600260095403611a6a5760405162461bcd60e51b8152600401610d3390612ad2565b6002600955600e5482611a84600154600054036000190190565b611a8e9190612b1f565b1115611ad55760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610d33565b6112348183611ee3565b611ae7611e2b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600b8054610bf090612a98565b6060611b2182611e85565b611b865760405162461bcd60e51b815260206004820152603060248201527f455243373231414d657461646174613a2055524920717565727920666f72206e60448201526f37b732bc34b9ba32b73a103a37b5b2b760811b6064820152608401610d33565b601254610100900460ff161515600003611c2c57600c8054611ba790612a98565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd390612a98565b8015611c205780601f10611bf557610100808354040283529160200191611c20565b820191906000526020600020905b815481529060010190602001808311611c0357829003601f168201915b50505050509050919050565b6000611c36612239565b90506000815111611c565760405180602001604052806000815250611c84565b80611c6084612248565b600b604051602001611c7493929190612ba2565b6040516020818303038152906040525b9392505050565b611c93611e2b565b60005b815181101561115757600060146000848481518110611cb757611cb7612b54565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611cf381612b6a565b915050611c96565b611d03611e2b565b805161115790600b9060208401906125a0565b6000610aec82611eba565b611d29611e2b565b600f55565b611d36611e2b565b601055565b611d43611e2b565b601280546001600160a01b0390921664010000000002640100000000600160c01b0319909216919091179055565b611d79611e2b565b6012805491151563010000000263ff00000019909216919091179055565b611d9f611e2b565b805161115790600c9060208401906125a0565b611dba611e2b565b6001600160a01b038116611e1f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d33565b611e2881612124565b50565b6008546001600160a01b0316331461142f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d33565b600081600111158015611e99575060005482105b8015610aec575050600090815260046020526040902054600160e01b161590565b6001600160a01b03166000908152600560205260409081902054901c67ffffffffffffffff1690565b611157828260405180602001604052806000815250612351565b6000611f08826120b5565b9050836001600160a01b0316816001600160a01b031614611f3b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611f8857611f6b86336109ea565b611f8857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611faf57604051633a954ecd60e21b815260040160405180910390fd5b8015611fba57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361204c5760018401600081815260046020526040812054900361204a57600054811461204a5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6120b0838383604051806020016040528060008152506118e1565b505050565b6000818060011161210b5760005481101561210b5760008181526004602052604081205490600160e01b82169003612109575b80600003611c845750600019016000818152600460205260409020546120e8565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610aec90604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b612200848484610f7e565b6001600160a01b0383163b156110d45761221c848484846123b7565b6110d4576040516368d2bf6b60e11b815260040160405180910390fd5b6060600a8054610b1c90612a98565b60608160000361226f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612299578061228381612b6a565b91506122929050600a83612c7b565b9150612273565b60008167ffffffffffffffff8111156122b4576122b46127ba565b6040519080825280601f01601f1916602001820160405280156122de576020820181803683370190505b5090505b8415612349576122f3600183612c8f565b9150612300600a86612ca6565b61230b906030612b1f565b60f81b81838151811061232057612320612b54565b60200101906001600160f81b031916908160001a905350612342600a86612c7b565b94506122e2565b949350505050565b61235b83836124a2565b6001600160a01b0383163b156120b0576000548281035b61238560008683806001019450866123b7565b6123a2576040516368d2bf6b60e11b815260040160405180910390fd5b818110612372578160005414611a3957600080fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906123ec903390899088908890600401612cba565b6020604051808303816000875af1925050508015612427575060408051601f3d908101601f1916820190925261242491810190612cf7565b60015b612485573d808015612455576040519150601f19603f3d011682016040523d82523d6000602084013e61245a565b606091505b50805160000361247d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60008054908290036124c75760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461257657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161253e565b508160000361259757604051622e076360e81b815260040160405180910390fd5b60005550505050565b8280546125ac90612a98565b90600052602060002090601f0160209004810192826125ce5760008555612614565b82601f106125e757805160ff1916838001178555612614565b82800160010185558215612614579182015b828111156126145782518255916020019190600101906125f9565b50612620929150612624565b5090565b5b808211156126205760008155600101612625565b6001600160e01b031981168114611e2857600080fd5b60006020828403121561266157600080fd5b8135611c8481612639565b8015158114611e2857600080fd5b60006020828403121561268c57600080fd5b8135611c848161266c565b60005b838110156126b257818101518382015260200161269a565b838111156110d45750506000910152565b600081518084526126db816020860160208601612697565b601f01601f19169290920160200192915050565b602081526000611c8460208301846126c3565b60006020828403121561271457600080fd5b5035919050565b6001600160a01b0381168114611e2857600080fd5b60006020828403121561274257600080fd5b8135611c848161271b565b6000806040838503121561276057600080fd5b823561276b8161271b565b946020939093013593505050565b60008060006060848603121561278e57600080fd5b83356127998161271b565b925060208401356127a98161271b565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127f9576127f96127ba565b604052919050565b6000602080838503121561281457600080fd5b823567ffffffffffffffff8082111561282c57600080fd5b818501915085601f83011261284057600080fd5b813581811115612852576128526127ba565b8060051b91506128638483016127d0565b818152918301840191848101908884111561287d57600080fd5b938501935b838510156128a757843592506128978361271b565b8282529385019390850190612882565b98975050505050505050565b600067ffffffffffffffff8311156128cd576128cd6127ba565b6128e0601f8401601f19166020016127d0565b90508281528383830111156128f457600080fd5b828260208301376000602084830101529392505050565b60006020828403121561291d57600080fd5b813567ffffffffffffffff81111561293457600080fd5b8201601f8101841361294557600080fd5b612349848235602084016128b3565b6020808252825182820181905260009190848201906040850190845b8181101561152e57835183529284019291840191600101612970565b6000806040838503121561299f57600080fd5b82356129aa8161271b565b915060208301356129ba8161266c565b809150509250929050565b600080600080608085870312156129db57600080fd5b84356129e68161271b565b935060208501356129f68161271b565b925060408501359150606085013567ffffffffffffffff811115612a1957600080fd5b8501601f81018713612a2a57600080fd5b612a39878235602084016128b3565b91505092959194509250565b60008060408385031215612a5857600080fd5b8235915060208301356129ba8161271b565b60008060408385031215612a7d57600080fd5b8235612a888161271b565b915060208301356129ba8161271b565b600181811c90821680612aac57607f821691505b602082108103612acc57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612b3257612b32612b09565b500190565b600060208284031215612b4957600080fd5b8151611c848161266c565b634e487b7160e01b600052603260045260246000fd5b600060018201612b7c57612b7c612b09565b5060010190565b6000816000190483118215151615612b9d57612b9d612b09565b500290565b600084516020612bb58285838a01612697565b855191840191612bc88184848a01612697565b8554920191600090600181811c9080831680612be557607f831692505b8583108103612c0257634e487b7160e01b85526022600452602485fd5b808015612c165760018114612c2757612c54565b60ff19851688528388019550612c54565b60008b81526020902060005b85811015612c4c5781548a820152908401908801612c33565b505083880195505b50939b9a5050505050505050505050565b634e487b7160e01b600052601260045260246000fd5b600082612c8a57612c8a612c65565b500490565b600082821015612ca157612ca1612b09565b500390565b600082612cb557612cb5612c65565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ced908301846126c3565b9695505050505050565b600060208284031215612d0957600080fd5b8151611c848161263956fea2646970667358221220096f5d6d99c5ed737c8eb658b83ab9a192f30767e03699874f99e8edc6861f9e64736f6c634300080e00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000046e6f6e650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046e6f6e6500000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103765760003560e01c8063715018a6116101d1578063c316c98b11610102578063e1cf8baa116100a0578063ebcd13db1161006f578063ebcd13db14610a18578063f2c4ce1e14610a38578063f2fde38b14610a58578063f851a44014610a7857600080fd5b8063e1cf8baa1461096f578063e268e4d31461098f578063e2f273bd146109af578063e985e9c5146109cf57600080fd5b8063d5abeb01116100dc578063d5abeb01146108f9578063d5ad3cda1461090f578063da3ef23f1461092f578063dc33e6811461094f57600080fd5b8063c316c98b146108a4578063c6682862146108c4578063c87b56dd146108d957600080fd5b80639b19251a1161016f578063a4da9b1b11610149578063a4da9b1b1461082d578063b88d4fde1461084e578063bc63f02e1461086e578063bd7a19981461088e57600080fd5b80639b19251a146107ca578063a0712d68146107fa578063a22cb4651461080d57600080fd5b80638da5cb5b116101ab5780638da5cb5b14610757578063913e77ad14610775578063940cd05b1461079557806395d89b41146107b557600080fd5b8063715018a6146106f55780638462151c1461070a578063864a47291461073757600080fd5b806337746bbe116102ab57806351fb012d11610249578063624208ae11610223578063624208ae1461068a5780636352211e146106a05780636c0360eb146106c057806370a08231146106d557600080fd5b806351fb012d1461063057806355f804b3146106505780635c975abb1461067057600080fd5b806342842e0e1161028557806342842e0e146105bb57806344a0d68a146105db57806350839bef146105fb578063518302271461061157600080fd5b806337746bbe146105735780633b75089a146105935780633ccfd60b146105b357600080fd5b80630fbe4fe21161031857806318160ddd116102f257806318160ddd146104f557806321820f6e1461051357806323b872dd14610533578063351de26e1461055357600080fd5b80630fbe4fe21461049157806313faede6146104b1578063149835a0146104d557600080fd5b8063081812fc11610354578063081812fc146103f4578063081c8c441461042c578063092ca2d014610441578063095ea7b31461047157600080fd5b806301ffc9a71461037b57806302329a29146103b057806306fdde03146103d2575b600080fd5b34801561038757600080fd5b5061039b61039636600461264f565b610aa0565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103d06103cb36600461267a565b610af2565b005b3480156103de57600080fd5b506103e7610b0d565b6040516103a791906126ef565b34801561040057600080fd5b5061041461040f366004612702565b610b9f565b6040516001600160a01b0390911681526020016103a7565b34801561043857600080fd5b506103e7610be3565b34801561044d57600080fd5b5061039b61045c366004612730565b60156020526000908152604090205460ff1681565b34801561047d57600080fd5b506103d061048c36600461274d565b610c71565b34801561049d57600080fd5b506103d06104ac366004612702565b610d11565b3480156104bd57600080fd5b506104c7600d5481565b6040519081526020016103a7565b3480156104e157600080fd5b506103d06104f0366004612702565b610f4d565b34801561050157600080fd5b506104c7600154600054036000190190565b34801561051f57600080fd5b506103d061052e36600461267a565b610f5a565b34801561053f57600080fd5b506103d061054e366004612779565b610f7e565b34801561055f57600080fd5b506103d061056e366004612702565b6110da565b34801561057f57600080fd5b506103d061058e366004612801565b6110e7565b34801561059f57600080fd5b506103d06105ae366004612801565b61115b565b6103d06111cb565b3480156105c757600080fd5b506103d06105d6366004612779565b61123d565b3480156105e757600080fd5b506103d06105f6366004612702565b61138e565b34801561060757600080fd5b506104c7600f5481565b34801561061d57600080fd5b5060125461039b90610100900460ff1681565b34801561063c57600080fd5b5060125461039b9062010000900460ff1681565b34801561065c57600080fd5b506103d061066b36600461290b565b61139b565b34801561067c57600080fd5b5060125461039b9060ff1681565b34801561069657600080fd5b506104c760115481565b3480156106ac57600080fd5b506104146106bb366004612702565b6113b6565b3480156106cc57600080fd5b506103e76113c1565b3480156106e157600080fd5b506104c76106f0366004612730565b6113ce565b34801561070157600080fd5b506103d061141d565b34801561071657600080fd5b5061072a610725366004612730565b611431565b6040516103a79190612954565b34801561074357600080fd5b506103d0610752366004612801565b61153a565b34801561076357600080fd5b506008546001600160a01b0316610414565b34801561078157600080fd5b50601354610414906001600160a01b031681565b3480156107a157600080fd5b506103d06107b036600461267a565b6115aa565b3480156107c157600080fd5b506103e76115cc565b3480156107d657600080fd5b5061039b6107e5366004612730565b60146020526000908152604090205460ff1681565b6103d0610808366004612702565b6115db565b34801561081957600080fd5b506103d061082836600461298c565b61184c565b34801561083957600080fd5b5060125461039b906301000000900460ff1681565b34801561085a57600080fd5b506103d06108693660046129c5565b6118e1565b34801561087a57600080fd5b506103d0610889366004612a45565b611a40565b34801561089a57600080fd5b506104c760105481565b3480156108b057600080fd5b506103d06108bf366004612730565b611adf565b3480156108d057600080fd5b506103e7611b09565b3480156108e557600080fd5b506103e76108f4366004612702565b611b16565b34801561090557600080fd5b506104c7600e5481565b34801561091b57600080fd5b506103d061092a366004612801565b611c8b565b34801561093b57600080fd5b506103d061094a36600461290b565b611cfb565b34801561095b57600080fd5b506104c761096a366004612730565b611d16565b34801561097b57600080fd5b506103d061098a366004612702565b611d21565b34801561099b57600080fd5b506103d06109aa366004612702565b611d2e565b3480156109bb57600080fd5b506103d06109ca366004612730565b611d3b565b3480156109db57600080fd5b5061039b6109ea366004612a6a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a2457600080fd5b506103d0610a3336600461267a565b611d71565b348015610a4457600080fd5b506103d0610a5336600461290b565b611d97565b348015610a6457600080fd5b506103d0610a73366004612730565b611db2565b348015610a8457600080fd5b506012546104149064010000000090046001600160a01b031681565b60006301ffc9a760e01b6001600160e01b031983161480610ad157506380ac58cd60e01b6001600160e01b03198316145b80610aec5750635b5e139f60e01b6001600160e01b03198316145b92915050565b610afa611e2b565b6012805460ff1916911515919091179055565b606060028054610b1c90612a98565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4890612a98565b8015610b955780601f10610b6a57610100808354040283529160200191610b95565b820191906000526020600020905b815481529060010190602001808311610b7857829003601f168201915b5050505050905090565b6000610baa82611e85565b610bc7576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600c8054610bf090612a98565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c90612a98565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b505050505081565b6000610c7c826113b6565b9050336001600160a01b03821614610cb557610c9881336109ea565b610cb5576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600260095403610d3c5760405162461bcd60e51b8152600401610d3390612ad2565b60405180910390fd5b600260095560125460ff1615610d8e5760405162461bcd60e51b81526020600482015260176024820152761bdbdc1cc818dbdb9d1c9858dd081a5cc81c185d5cd959604a1b6044820152606401610d33565b60125464010000000090046001600160a01b03163314801590610dbc57506008546001600160a01b03163314155b15610ece5760115481610dce33611eba565b610dd89190612b1f565b1115610e265760405162461bcd60e51b815260206004820152601b60248201527f4d6178204e4654205065722057616c6c657420657863656564656400000000006044820152606401610d33565b601154811115610e785760405162461bcd60e51b815260206004820152601860248201527f6d6178206d696e742070657220547820657863656564656400000000000000006044820152606401610d33565b3360009081526015602052604090205460ff161515600114610ece5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610d33565b600f5481610ee3600154600054036000190190565b610eed9190612b1f565b1115610f3b5760405162461bcd60e51b815260206004820152601c60248201527f57686974656c697374204d6178537570706c79206578636565646564000000006044820152606401610d33565b610f453382611ee3565b506001600955565b610f55611e2b565b600e55565b610f62611e2b565b60128054911515620100000262ff000019909216919091179055565b826daaeb6d7670e522a718067333cd4e3b156110c957336001600160a01b03821603610fb457610faf848484611efd565b6110d4565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110279190612b37565b80156110aa5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190612b37565b6110c957604051633b79c77360e21b8152336004820152602401610d33565b6110d4848484611efd565b50505050565b6110e2611e2b565b601155565b6110ef611e2b565b60005b81518110156111575760006015600084848151811061111357611113612b54565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061114f81612b6a565b9150506110f2565b5050565b611163611e2b565b60005b81518110156111575760016014600084848151811061118757611187612b54565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806111c381612b6a565b915050611166565b6111d3611e2b565b6002600954036111f55760405162461bcd60e51b8152600401610d3390612ad2565b600260095560135460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015611234573d6000803e3d6000fd5b50506001600955565b826daaeb6d7670e522a718067333cd4e3b1561138357336001600160a01b0382160361126e57610faf848484612095565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156112bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e19190612b37565b80156113645750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113649190612b37565b61138357604051633b79c77360e21b8152336004820152602401610d33565b6110d4848484612095565b611396611e2b565b600d55565b6113a3611e2b565b805161115790600a9060208401906125a0565b6000610aec826120b5565b600a8054610bf090612a98565b60006001600160a01b0382166113f7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611425611e2b565b61142f6000612124565b565b60606000806000611441856113ce565b905060008167ffffffffffffffff81111561145e5761145e6127ba565b604051908082528060200260200182016040528015611487578160200160208202803683370190505b5090506114b460408051608081018252600080825260208201819052918101829052606081019190915290565b60015b83861461152e576114c781612176565b915081604001516115265781516001600160a01b0316156114e757815194505b876001600160a01b0316856001600160a01b031603611526578083878060010198508151811061151957611519612b54565b6020026020010181815250505b6001016114b7565b50909695505050505050565b611542611e2b565b60005b81518110156111575760016015600084848151811061156657611566612b54565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806115a281612b6a565b915050611545565b6115b2611e2b565b601280549115156101000261ff0019909216919091179055565b606060038054610b1c90612a98565b6002600954036115fd5760405162461bcd60e51b8152600401610d3390612ad2565b600260095560125460ff161561164f5760405162461bcd60e51b81526020600482015260176024820152761bdbdc1cc818dbdb9d1c9858dd081a5cc81c185d5cd959604a1b6044820152606401610d33565b600e5481611664600154600054036000190190565b61166e9190612b1f565b11156116a95760405162461bcd60e51b815260206004820152600a60248201526915d94814dbdb191bdd5d60b21b6044820152606401610d33565b60125464010000000090046001600160a01b031633148015906116d757506008546001600160a01b03163314155b15610f3b5760105481111561172e5760405162461bcd60e51b815260206004820152601f60248201527f6d6178206d696e7420616d6f756e7420706572207478206578636565646564006044820152606401610d33565b60125462010000900460ff1615611795573360009081526014602052604090205460ff1615156001146117955760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610d33565b601054816117a233611eba565b6117ac9190612b1f565b11156117fa5760405162461bcd60e51b815260206004820152601b60248201527f4d6178204e4654205065722057616c6c657420657863656564656400000000006044820152606401610d33565b80600d546118089190612b83565b341015610f3b5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610d33565b336001600160a01b038316036118755760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b836daaeb6d7670e522a718067333cd4e3b15611a2d57336001600160a01b0382160361191857611913858585856121f5565b611a39565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190612b37565b8015611a0e5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156119ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0e9190612b37565b611a2d57604051633b79c77360e21b8152336004820152602401610d33565b611a39858585856121f5565b5050505050565b611a48611e2b565b600260095403611a6a5760405162461bcd60e51b8152600401610d3390612ad2565b6002600955600e5482611a84600154600054036000190190565b611a8e9190612b1f565b1115611ad55760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610d33565b6112348183611ee3565b611ae7611e2b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600b8054610bf090612a98565b6060611b2182611e85565b611b865760405162461bcd60e51b815260206004820152603060248201527f455243373231414d657461646174613a2055524920717565727920666f72206e60448201526f37b732bc34b9ba32b73a103a37b5b2b760811b6064820152608401610d33565b601254610100900460ff161515600003611c2c57600c8054611ba790612a98565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd390612a98565b8015611c205780601f10611bf557610100808354040283529160200191611c20565b820191906000526020600020905b815481529060010190602001808311611c0357829003601f168201915b50505050509050919050565b6000611c36612239565b90506000815111611c565760405180602001604052806000815250611c84565b80611c6084612248565b600b604051602001611c7493929190612ba2565b6040516020818303038152906040525b9392505050565b611c93611e2b565b60005b815181101561115757600060146000848481518110611cb757611cb7612b54565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611cf381612b6a565b915050611c96565b611d03611e2b565b805161115790600b9060208401906125a0565b6000610aec82611eba565b611d29611e2b565b600f55565b611d36611e2b565b601055565b611d43611e2b565b601280546001600160a01b0390921664010000000002640100000000600160c01b0319909216919091179055565b611d79611e2b565b6012805491151563010000000263ff00000019909216919091179055565b611d9f611e2b565b805161115790600c9060208401906125a0565b611dba611e2b565b6001600160a01b038116611e1f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d33565b611e2881612124565b50565b6008546001600160a01b0316331461142f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d33565b600081600111158015611e99575060005482105b8015610aec575050600090815260046020526040902054600160e01b161590565b6001600160a01b03166000908152600560205260409081902054901c67ffffffffffffffff1690565b611157828260405180602001604052806000815250612351565b6000611f08826120b5565b9050836001600160a01b0316816001600160a01b031614611f3b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611f8857611f6b86336109ea565b611f8857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611faf57604051633a954ecd60e21b815260040160405180910390fd5b8015611fba57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361204c5760018401600081815260046020526040812054900361204a57600054811461204a5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6120b0838383604051806020016040528060008152506118e1565b505050565b6000818060011161210b5760005481101561210b5760008181526004602052604081205490600160e01b82169003612109575b80600003611c845750600019016000818152600460205260409020546120e8565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610aec90604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b612200848484610f7e565b6001600160a01b0383163b156110d45761221c848484846123b7565b6110d4576040516368d2bf6b60e11b815260040160405180910390fd5b6060600a8054610b1c90612a98565b60608160000361226f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612299578061228381612b6a565b91506122929050600a83612c7b565b9150612273565b60008167ffffffffffffffff8111156122b4576122b46127ba565b6040519080825280601f01601f1916602001820160405280156122de576020820181803683370190505b5090505b8415612349576122f3600183612c8f565b9150612300600a86612ca6565b61230b906030612b1f565b60f81b81838151811061232057612320612b54565b60200101906001600160f81b031916908160001a905350612342600a86612c7b565b94506122e2565b949350505050565b61235b83836124a2565b6001600160a01b0383163b156120b0576000548281035b61238560008683806001019450866123b7565b6123a2576040516368d2bf6b60e11b815260040160405180910390fd5b818110612372578160005414611a3957600080fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906123ec903390899088908890600401612cba565b6020604051808303816000875af1925050508015612427575060408051601f3d908101601f1916820190925261242491810190612cf7565b60015b612485573d808015612455576040519150601f19603f3d011682016040523d82523d6000602084013e61245a565b606091505b50805160000361247d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60008054908290036124c75760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461257657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161253e565b508160000361259757604051622e076360e81b815260040160405180910390fd5b60005550505050565b8280546125ac90612a98565b90600052602060002090601f0160209004810192826125ce5760008555612614565b82601f106125e757805160ff1916838001178555612614565b82800160010185558215612614579182015b828111156126145782518255916020019190600101906125f9565b50612620929150612624565b5090565b5b808211156126205760008155600101612625565b6001600160e01b031981168114611e2857600080fd5b60006020828403121561266157600080fd5b8135611c8481612639565b8015158114611e2857600080fd5b60006020828403121561268c57600080fd5b8135611c848161266c565b60005b838110156126b257818101518382015260200161269a565b838111156110d45750506000910152565b600081518084526126db816020860160208601612697565b601f01601f19169290920160200192915050565b602081526000611c8460208301846126c3565b60006020828403121561271457600080fd5b5035919050565b6001600160a01b0381168114611e2857600080fd5b60006020828403121561274257600080fd5b8135611c848161271b565b6000806040838503121561276057600080fd5b823561276b8161271b565b946020939093013593505050565b60008060006060848603121561278e57600080fd5b83356127998161271b565b925060208401356127a98161271b565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127f9576127f96127ba565b604052919050565b6000602080838503121561281457600080fd5b823567ffffffffffffffff8082111561282c57600080fd5b818501915085601f83011261284057600080fd5b813581811115612852576128526127ba565b8060051b91506128638483016127d0565b818152918301840191848101908884111561287d57600080fd5b938501935b838510156128a757843592506128978361271b565b8282529385019390850190612882565b98975050505050505050565b600067ffffffffffffffff8311156128cd576128cd6127ba565b6128e0601f8401601f19166020016127d0565b90508281528383830111156128f457600080fd5b828260208301376000602084830101529392505050565b60006020828403121561291d57600080fd5b813567ffffffffffffffff81111561293457600080fd5b8201601f8101841361294557600080fd5b612349848235602084016128b3565b6020808252825182820181905260009190848201906040850190845b8181101561152e57835183529284019291840191600101612970565b6000806040838503121561299f57600080fd5b82356129aa8161271b565b915060208301356129ba8161266c565b809150509250929050565b600080600080608085870312156129db57600080fd5b84356129e68161271b565b935060208501356129f68161271b565b925060408501359150606085013567ffffffffffffffff811115612a1957600080fd5b8501601f81018713612a2a57600080fd5b612a39878235602084016128b3565b91505092959194509250565b60008060408385031215612a5857600080fd5b8235915060208301356129ba8161271b565b60008060408385031215612a7d57600080fd5b8235612a888161271b565b915060208301356129ba8161271b565b600181811c90821680612aac57607f821691505b602082108103612acc57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612b3257612b32612b09565b500190565b600060208284031215612b4957600080fd5b8151611c848161266c565b634e487b7160e01b600052603260045260246000fd5b600060018201612b7c57612b7c612b09565b5060010190565b6000816000190483118215151615612b9d57612b9d612b09565b500290565b600084516020612bb58285838a01612697565b855191840191612bc88184848a01612697565b8554920191600090600181811c9080831680612be557607f831692505b8583108103612c0257634e487b7160e01b85526022600452602485fd5b808015612c165760018114612c2757612c54565b60ff19851688528388019550612c54565b60008b81526020902060005b85811015612c4c5781548a820152908401908801612c33565b505083880195505b50939b9a5050505050505050505050565b634e487b7160e01b600052601260045260246000fd5b600082612c8a57612c8a612c65565b500490565b600082821015612ca157612ca1612b09565b500390565b600082612cb557612cb5612c65565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ced908301846126c3565b9695505050505050565b600060208284031215612d0957600080fd5b8151611c848161263956fea2646970667358221220096f5d6d99c5ed737c8eb658b83ab9a192f30767e03699874f99e8edc6861f9e64736f6c634300080e0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000046e6f6e650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046e6f6e6500000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): none
Arg [1] : _notRevealedUri (string): none

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 6e6f6e6500000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 6e6f6e6500000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

60442:8883:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28051:639;;;;;;;;;;-1:-1:-1;28051:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;28051:639:0;;;;;;;;68863:79;;;;;;;;;;-1:-1:-1;68863:79:0;;;;;:::i;:::-;;:::i;:::-;;28953:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35436:218::-;;;;;;;;;;-1:-1:-1;35436:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;35436:218:0;1897:203:1;60630:28:0;;;;;;;;;;;;;:::i;61128:49::-;;;;;;;;;;-1:-1:-1;61128:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34877:400;;;;;;;;;;-1:-1:-1;34877:400:0;;;;;:::i;:::-;;:::i;63485:689::-;;;;;;;;;;-1:-1:-1;63485:689:0;;;;;:::i;:::-;;:::i;60665:23::-;;;;;;;;;;;;;;;;;;;2959:25:1;;;2947:2;2932:18;60665:23:0;2813:177:1;68018:100:0;;;;;;;;;;-1:-1:-1;68018:100:0;;;;;:::i;:::-;;:::i;24704:323::-;;;;;;;;;;;;62400:1;24978:12;24765:7;24962:13;:28;-1:-1:-1;;24962:46:0;;24704:323;62417:107;;;;;;;;;;-1:-1:-1;62417:107:0;;;;;:::i;:::-;;:::i;61491:163::-;;;;;;;;;;-1:-1:-1;61491:163:0;;;;;:::i;:::-;;:::i;67697:106::-;;;;;;;;;;-1:-1:-1;67697:106:0;;;;;:::i;:::-;;:::i;65164:216::-;;;;;;;;;;-1:-1:-1;65164:216:0;;;;;:::i;:::-;;:::i;64538:193::-;;;;;;;;;;-1:-1:-1;64538:193:0;;;;;:::i;:::-;;:::i;69159:163::-;;;:::i;61662:171::-;;;;;;;;;;-1:-1:-1;61662:171:0;;;;;:::i;:::-;;:::i;67875:86::-;;;;;;;;;;-1:-1:-1;67875:86:0;;;;;:::i;:::-;;:::i;60733:29::-;;;;;;;;;;;;;;;;60885:28;;;;;;;;;;-1:-1:-1;60885:28:0;;;;;;;;;;;60920:36;;;;;;;;;;-1:-1:-1;60920:36:0;;;;;;;;;;;68301:104;;;;;;;;;;-1:-1:-1;68301:104:0;;;;;:::i;:::-;;:::i;60852:26::-;;;;;;;;;;-1:-1:-1;60852:26:0;;;;;;;;60808:35;;;;;;;;;;;;;;;;30346:152;;;;;;;;;;-1:-1:-1;30346:152:0;;;;;:::i;:::-;;:::i;60558:21::-;;;;;;;;;;;;;:::i;25888:233::-;;;;;;;;;;-1:-1:-1;25888:233:0;;;;;:::i;:::-;;:::i;9666:103::-;;;;;;;;;;;;;:::i;66404:979::-;;;;;;;;;;-1:-1:-1;66404:979:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64947:209::-;;;;;;;;;;-1:-1:-1;64947:209:0;;;;;:::i;:::-;;:::i;9018:87::-;;;;;;;;;;-1:-1:-1;9091:6:0;;-1:-1:-1;;;;;9091:6:0;9018:87;;61039:32;;;;;;;;;;-1:-1:-1;61039:32:0;;;;-1:-1:-1;;;;;61039:32:0;;;67409:82;;;;;;;;;;-1:-1:-1;67409:82:0;;;;;:::i;:::-;;:::i;29129:104::-;;;;;;;;;;;;;:::i;61080:41::-;;;;;;;;;;-1:-1:-1;61080:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;62696:754;;;;;;:::i;:::-;;:::i;35994:308::-;;;;;;;;;;-1:-1:-1;35994:308:0;;;;;:::i;:::-;;:::i;60963:40::-;;;;;;;;;;-1:-1:-1;60963:40:0;;;;;;;;;;;61841:228;;;;;;;;;;-1:-1:-1;61841:228:0;;;;;:::i;:::-;;:::i;64230:300::-;;;;;;;;;;-1:-1:-1;64230:300:0;;;;;:::i;:::-;;:::i;60769:32::-;;;;;;;;;;;;;;;;68993:115;;;;;;;;;;-1:-1:-1;68993:115:0;;;;;:::i;:::-;;:::i;60586:37::-;;;;;;;;;;;;;:::i;65438:726::-;;;;;;;;;;-1:-1:-1;65438:726:0;;;;;:::i;:::-;;:::i;60695:31::-;;;;;;;;;;;;;;;;64739:200;;;;;;;;;;-1:-1:-1;64739:200:0;;;;;:::i;:::-;;:::i;68464:151::-;;;;;;;;;;-1:-1:-1;68464:151:0;;;;;:::i;:::-;;:::i;66228:113::-;;;;;;;;;;-1:-1:-1;66228:113:0;;;;;:::i;:::-;;:::i;68160:102::-;;;;;;;;;;-1:-1:-1;68160:102:0;;;;;:::i;:::-;;:::i;67546:98::-;;;;;;;;;;-1:-1:-1;67546:98:0;;;;;:::i;:::-;;:::i;62077:88::-;;;;;;;;;;-1:-1:-1;62077:88:0;;;;;:::i;:::-;;:::i;36459:164::-;;;;;;;;;;-1:-1:-1;36459:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;36580:25:0;;;36556:4;36580:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36459:164;62532:115;;;;;;;;;;-1:-1:-1;62532:115:0;;;;;:::i;:::-;;:::i;68652:126::-;;;;;;;;;;-1:-1:-1;68652:126:0;;;;;:::i;:::-;;:::i;9924:201::-;;;;;;;;;;-1:-1:-1;9924:201:0;;;;;:::i;:::-;;:::i;61012:20::-;;;;;;;;;;-1:-1:-1;61012:20:0;;;;;;;-1:-1:-1;;;;;61012:20:0;;;28051:639;28136:4;-1:-1:-1;;;;;;;;;28460:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;28537:25:0;;;28460:102;:179;;;-1:-1:-1;;;;;;;;;;28614:25:0;;;28460:179;28440:199;28051:639;-1:-1:-1;;28051:639:0:o;68863:79::-;8904:13;:11;:13::i;:::-;68919:6:::1;:15:::0;;-1:-1:-1;;68919:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;68863:79::o;28953:100::-;29007:13;29040:5;29033:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28953:100;:::o;35436:218::-;35512:7;35537:16;35545:7;35537;:16::i;:::-;35532:64;;35562:34;;-1:-1:-1;;;35562:34:0;;;;;;;;;;;35532:64;-1:-1:-1;35616:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;35616:30:0;;35436:218::o;60630:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34877:400::-;34958:13;34974:16;34982:7;34974;:16::i;:::-;34958:32;-1:-1:-1;58734:10:0;-1:-1:-1;;;;;35007:28:0;;;35003:175;;35055:44;35072:5;58734:10;36459:164;:::i;35055:44::-;35050:128;;35127:35;;-1:-1:-1;;;35127:35:0;;;;;;;;;;;35050:128;35190:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;35190:35:0;-1:-1:-1;;;;;35190:35:0;;;;;;;;;35241:28;;35190:24;;35241:28;;;;;;;34947:330;34877:400;;:::o;63485:689::-;5305:1;5903:7;;:19;5895:63;;;;-1:-1:-1;;;5895:63:0;;;;;;;:::i;:::-;;;;;;;;;5305:1;6036:7;:18;63559:6:::1;::::0;::::1;;63558:7;63550:43;;;::::0;-1:-1:-1;;;63550:43:0;;9730:2:1;63550:43:0::1;::::0;::::1;9712:21:1::0;9769:2;9749:18;;;9742:30;-1:-1:-1;;;9788:18:1;;;9781:53;9851:18;;63550:43:0::1;9528:347:1::0;63550:43:0::1;63622:5;::::0;;;::::1;-1:-1:-1::0;;;;;63622:5:0::1;63608:10;:19;::::0;::::1;::::0;:44:::1;;-1:-1:-1::0;9091:6:0;;-1:-1:-1;;;;;9091:6:0;63631:10:::1;:21;;63608:44;63604:387;;;63742:16;::::0;63732:6;63695:34:::1;58734:10:::0;63695:13:::1;:34::i;:::-;:43;;;;:::i;:::-;:63;;63669:152;;;::::0;-1:-1:-1;;;63669:152:0;;10347:2:1;63669:152:0::1;::::0;::::1;10329:21:1::0;10386:2;10366:18;;;10359:30;10425:29;10405:18;;;10398:57;10472:18;;63669:152:0::1;10145:351:1::0;63669:152:0::1;63854:16;;63844:6;:26;;63836:63;;;::::0;-1:-1:-1;;;63836:63:0;;10703:2:1;63836:63:0::1;::::0;::::1;10685:21:1::0;10742:2;10722:18;;;10715:30;10781:26;10761:18;;;10754:54;10825:18;;63836:63:0::1;10501:348:1::0;63836:63:0::1;63940:10;63922:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;:37;;:29:::0;:37:::1;63914:65;;;::::0;-1:-1:-1;;;63914:65:0;;11056:2:1;63914:65:0::1;::::0;::::1;11038:21:1::0;11095:2;11075:18;;;11068:30;-1:-1:-1;;;11114:18:1;;;11107:45;11169:18;;63914:65:0::1;10854:339:1::0;63914:65:0::1;64049:10;;64039:6;64023:13;62400:1:::0;24978:12;24765:7;24962:13;:28;-1:-1:-1;;24962:46:0;;24704:323;64023:13:::1;:22;;;;:::i;:::-;:36;;64001:114;;;::::0;-1:-1:-1;;;64001:114:0;;11400:2:1;64001:114:0::1;::::0;::::1;11382:21:1::0;11439:2;11419:18;;;11412:30;11478;11458:18;;;11451:58;11526:18;;64001:114:0::1;11198:352:1::0;64001:114:0::1;64128:38;58734:10:::0;64159:6:::1;64128:9;:38::i;:::-;-1:-1:-1::0;5261:1:0;6215:7;:22;63485:689::o;68018:100::-;8904:13;:11;:13::i;:::-;68088:9:::1;:22:::0;68018:100::o;62417:107::-;8904:13;:11;:13::i;:::-;62491:16:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;62491:25:0;;::::1;::::0;;;::::1;::::0;;62417:107::o;61491:163::-;61592:4;2321:42;3461:43;:47;3457:699;;3748:10;-1:-1:-1;;;;;3740:18:0;;;3736:85;;61609:37:::1;61628:4;61634:2;61638:7;61609:18;:37::i;:::-;3799:7:::0;;3736:85;3881:67;;-1:-1:-1;;;3881:67:0;;3930:4;3881:67;;;11767:34:1;3937:10:0;11817:18:1;;;11810:43;2321:42:0;;3881:40;;11702:18:1;;3881:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;3977:61:0;;-1:-1:-1;;;3977:61:0;;4026:4;3977:61;;;11767:34:1;-1:-1:-1;;;;;11837:15:1;;11817:18;;;11810:43;2321:42:0;;3977:40;;11702:18:1;;3977:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3835:310;;4099:30;;-1:-1:-1;;;4099:30:0;;4118:10;4099:30;;;2043:51:1;2016:18;;4099:30:0;1897:203:1;3835:310:0;61609:37:::1;61628:4;61634:2;61638:7;61609:18;:37::i;:::-;61491:163:::0;;;;:::o;67697:106::-;8904:13;:11;:13::i;:::-;67770:16:::1;:25:::0;67697:106::o;65164:216::-;8904:13;:11;:13::i;:::-;65269:9:::1;65264:109;65288:7;:14;65284:1;:18;65264:109;;;65356:5;65324:17;:29;65342:7;65350:1;65342:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;65324:29:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;65324:29:0;:37;;-1:-1:-1;;65324:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65304:3;::::1;::::0;::::1;:::i;:::-;;;;65264:109;;;;65164:216:::0;:::o;64538:193::-;8904:13;:11;:13::i;:::-;64629:9:::1;64624:100;64648:7;:14;64644:1;:18;64624:100;;;64708:4;64684:9;:21;64694:7;64702:1;64694:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;64684:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;64684:21:0;:28;;-1:-1:-1;;64684:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64664:3;::::1;::::0;::::1;:::i;:::-;;;;64624:100;;69159:163:::0;8904:13;:11;:13::i;:::-;5305:1:::1;5903:7;;:19:::0;5895:63:::1;;;;-1:-1:-1::0;;;5895:63:0::1;;;;;;;:::i;:::-;5305:1;6036:7;:18:::0;69286:9:::2;::::0;69278:36:::2;::::0;69246:21:::2;::::0;-1:-1:-1;;;;;69286:9:0::2;::::0;69278:36;::::2;;;::::0;69246:21;;69228:15:::2;69278:36:::0;69228:15;69278:36;69246:21;69286:9;69278:36;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;5261:1:0::1;6215:7;:22:::0;69159:163::o;61662:171::-;61767:4;2321:42;3461:43;:47;3457:699;;3748:10;-1:-1:-1;;;;;3740:18:0;;;3736:85;;61784:41:::1;61807:4;61813:2;61817:7;61784:22;:41::i;3736:85::-:0;3881:67;;-1:-1:-1;;;3881:67:0;;3930:4;3881:67;;;11767:34:1;3937:10:0;11817:18:1;;;11810:43;2321:42:0;;3881:40;;11702:18:1;;3881:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;3977:61:0;;-1:-1:-1;;;3977:61:0;;4026:4;3977:61;;;11767:34:1;-1:-1:-1;;;;;11837:15:1;;11817:18;;;11810:43;2321:42:0;;3977:40;;11702:18:1;;3977:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3835:310;;4099:30;;-1:-1:-1;;;4099:30:0;;4118:10;4099:30;;;2043:51:1;2016:18;;4099:30:0;1897:203:1;3835:310:0;61784:41:::1;61807:4;61813:2;61817:7;61784:22;:41::i;67875:86::-:0;8904:13;:11;:13::i;:::-;67938:4:::1;:15:::0;67875:86::o;68301:104::-;8904:13;:11;:13::i;:::-;68376:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;30346:152::-:0;30418:7;30461:27;30480:7;30461:18;:27::i;60558:21::-;;;;;;;:::i;25888:233::-;25960:7;-1:-1:-1;;;;;25984:19:0;;25980:60;;26012:28;;-1:-1:-1;;;26012:28:0;;;;;;;;;;;25980:60;-1:-1:-1;;;;;;26058:25:0;;;;;:18;:25;;;;;;20047:13;26058:55;;25888:233::o;9666:103::-;8904:13;:11;:13::i;:::-;9731:30:::1;9758:1;9731:18;:30::i;:::-;9666:103::o:0;66404:979::-;66490:16;66549:19;66583:25;66623:22;66648:16;66658:5;66648:9;:16::i;:::-;66623:41;;66679:25;66721:14;66707:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66707:29:0;;66679:57;;66751:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66751:31:0;62400:1;66797:538;66881:14;66866:11;:29;66797:538;;66964:15;66977:1;66964:12;:15::i;:::-;66952:27;;67002:9;:16;;;67043:8;66998:73;67093:14;;-1:-1:-1;;;;;67093:28:0;;67089:111;;67166:14;;;-1:-1:-1;67089:111:0;67243:5;-1:-1:-1;;;;;67222:26:0;:17;-1:-1:-1;;;;;67222:26:0;;67218:102;;67299:1;67273:8;67282:13;;;;;;67273:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;67218:102;66914:3;;66797:538;;;-1:-1:-1;67356:8:0;;66404:979;-1:-1:-1;;;;;;66404:979:0:o;64947:209::-;8904:13;:11;:13::i;:::-;65046:9:::1;65041:108;65065:7;:14;65061:1;:18;65041:108;;;65133:4;65101:17;:29;65119:7;65127:1;65119:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;65101:29:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;65101:29:0;:36;;-1:-1:-1;;65101:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65081:3;::::1;::::0;::::1;:::i;:::-;;;;65041:108;;67409:82:::0;8904:13;:11;:13::i;:::-;67466:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;67466:17:0;;::::1;::::0;;;::::1;::::0;;67409:82::o;29129:104::-;29185:13;29218:7;29211:14;;;;;:::i;62696:754::-;5305:1;5903:7;;:19;5895:63;;;;-1:-1:-1;;;5895:63:0;;;;;;;:::i;:::-;5305:1;6036:7;:18;62774:6:::1;::::0;::::1;;62773:7;62765:43;;;::::0;-1:-1:-1;;;62765:43:0;;9730:2:1;62765:43:0::1;::::0;::::1;9712:21:1::0;9769:2;9749:18;;;9742:30;-1:-1:-1;;;9788:18:1;;;9781:53;9851:18;;62765:43:0::1;9528:347:1::0;62765:43:0::1;62853:9;;62843:6;62827:13;62400:1:::0;24978:12;24765:7;24962:13;:28;-1:-1:-1;;24962:46:0;;24704:323;62827:13:::1;:22;;;;:::i;:::-;:35;;62819:58;;;::::0;-1:-1:-1;;;62819:58:0;;12588:2:1;62819:58:0::1;::::0;::::1;12570:21:1::0;12627:2;12607:18;;;12600:30;-1:-1:-1;;;12646:18:1;;;12639:40;12696:18;;62819:58:0::1;12386:334:1::0;62819:58:0::1;62906:5;::::0;;;::::1;-1:-1:-1::0;;;;;62906:5:0::1;62892:10;:19;::::0;::::1;::::0;:44:::1;;-1:-1:-1::0;9091:6:0;;-1:-1:-1;;;;;9091:6:0;62915:10:::1;:21;;62892:44;62888:504;;;62971:12;;62961:6;:22;;62953:66;;;::::0;-1:-1:-1;;;62953:66:0;;12927:2:1;62953:66:0::1;::::0;::::1;12909:21:1::0;12966:2;12946:18;;;12939:30;13005:33;12985:18;;;12978:61;13056:18;;62953:66:0::1;12725:355:1::0;62953:66:0::1;63037:16;::::0;;;::::1;;;63034:112;;;63091:10;63081:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;:29;;:21:::0;:29:::1;63073:57;;;::::0;-1:-1:-1;;;63073:57:0;;11056:2:1;63073:57:0::1;::::0;::::1;11038:21:1::0;11095:2;11075:18;;;11068:30;-1:-1:-1;;;11114:18:1;;;11107:45;11169:18;;63073:57:0::1;10854:339:1::0;63073:57:0::1;63233:12;::::0;63223:6;63186:34:::1;58734:10:::0;63695:13:::1;:34::i;63186:::-;:43;;;;:::i;:::-;:59;;63160:148;;;::::0;-1:-1:-1;;;63160:148:0;;10347:2:1;63160:148:0::1;::::0;::::1;10329:21:1::0;10386:2;10366:18;;;10359:30;10425:29;10405:18;;;10398:57;10472:18;;63160:148:0::1;10145:351:1::0;63160:148:0::1;63351:6;63344:4;;:13;;;;:::i;:::-;63331:9;:26;;63323:57;;;::::0;-1:-1:-1;;;63323:57:0;;13460:2:1;63323:57:0::1;::::0;::::1;13442:21:1::0;13499:2;13479:18;;;13472:30;-1:-1:-1;;;13518:18:1;;;13511:48;13576:18;;63323:57:0::1;13258:342:1::0;35994:308:0;58734:10;-1:-1:-1;;;;;36093:31:0;;;36089:61;;36133:17;;-1:-1:-1;;;36133:17:0;;;;;;;;;;;36089:61;58734:10;36163:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;36163:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;36163:60:0;;;;;;;;;;36239:55;;540:41:1;;;36163:49:0;;58734:10;36239:55;;513:18:1;36239:55:0;;;;;;;35994:308;;:::o;61841:228::-;61992:4;2321:42;3461:43;:47;3457:699;;3748:10;-1:-1:-1;;;;;3740:18:0;;;3736:85;;62014:47:::1;62037:4;62043:2;62047:7;62056:4;62014:22;:47::i;:::-;3799:7:::0;;3736:85;3881:67;;-1:-1:-1;;;3881:67:0;;3930:4;3881:67;;;11767:34:1;3937:10:0;11817:18:1;;;11810:43;2321:42:0;;3881:40;;11702:18:1;;3881:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;3977:61:0;;-1:-1:-1;;;3977:61:0;;4026:4;3977:61;;;11767:34:1;-1:-1:-1;;;;;11837:15:1;;11817:18;;;11810:43;2321:42:0;;3977:40;;11702:18:1;;3977:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3835:310;;4099:30;;-1:-1:-1;;;4099:30:0;;4118:10;4099:30;;;2043:51:1;2016:18;;4099:30:0;1897:203:1;3835:310:0;62014:47:::1;62037:4;62043:2;62047:7;62056:4;62014:22;:47::i;:::-;61841:228:::0;;;;;:::o;64230:300::-;8904:13;:11;:13::i;:::-;5305:1:::1;5903:7;;:19:::0;5895:63:::1;;;;-1:-1:-1::0;;;5895:63:0::1;;;;;;;:::i;:::-;5305:1;6036:7;:18:::0;64415:9:::2;::::0;64400:11;64384:13:::2;62400:1:::0;24978:12;24765:7;24962:13;:28;-1:-1:-1;;24962:46:0;;24704:323;64384:13:::2;:27;;;;:::i;:::-;:40;;64362:112;;;::::0;-1:-1:-1;;;64362:112:0;;13807:2:1;64362:112:0::2;::::0;::::2;13789:21:1::0;13846:2;13826:18;;;13819:30;-1:-1:-1;;;13865:18:1;;;13858:52;13927:18;;64362:112:0::2;13605:346:1::0;64362:112:0::2;64487:35;64497:11;64510;64487:9;:35::i;68993:115::-:0;8904:13;:11;:13::i;:::-;69077:9:::1;:23:::0;;-1:-1:-1;;;;;;69077:23:0::1;-1:-1:-1::0;;;;;69077:23:0;;;::::1;::::0;;;::::1;::::0;;68993:115::o;60586:37::-;;;;;;;:::i;65438:726::-;65556:13;65609:16;65617:7;65609;:16::i;:::-;65587:114;;;;-1:-1:-1;;;65587:114:0;;14158:2:1;65587:114:0;;;14140:21:1;14197:2;14177:18;;;14170:30;14236:34;14216:18;;;14209:62;-1:-1:-1;;;14287:18:1;;;14280:46;14343:19;;65587:114:0;13956:412:1;65587:114:0;65718:8;;;;;;;:17;;65730:5;65718:17;65714:71;;65759:14;65752:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65438:726;;;:::o;65714:71::-;65797:28;65828:10;:8;:10::i;:::-;65797:41;;65900:1;65875:14;65869:28;:32;:287;;;;;;;;;;;;;;;;;65993:14;66034:18;:7;:16;:18::i;:::-;66079:13;65950:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65869:287;65849:307;65438:726;-1:-1:-1;;;65438:726:0:o;64739:200::-;8904:13;:11;:13::i;:::-;64836:9:::1;64831:101;64855:7;:14;64851:1;:18;64831:101;;;64915:5;64891:9;:21;64901:7;64909:1;64901:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;64891:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;64891:21:0;:29;;-1:-1:-1;;64891:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64871:3;::::1;::::0;::::1;:::i;:::-;;;;64831:101;;68464:151:::0;8904:13;:11;:13::i;:::-;68574:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;66228:113::-:0;66286:7;66313:20;66327:5;66313:13;:20::i;68160:102::-;8904:13;:11;:13::i;:::-;68231:10:::1;:23:::0;68160:102::o;67546:98::-;8904:13;:11;:13::i;:::-;67615:12:::1;:21:::0;67546:98::o;62077:88::-;8904:13;:11;:13::i;:::-;62143:5:::1;:14:::0;;-1:-1:-1;;;;;62143:14:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;62143:14:0;;::::1;::::0;;;::::1;::::0;;62077:88::o;62532:115::-;8904:13;:11;:13::i;:::-;62610:20:::1;:29:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;62610:29:0;;::::1;::::0;;;::::1;::::0;;62532:115::o;68652:126::-;8904:13;:11;:13::i;:::-;68738:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;9924:201::-:0;8904:13;:11;:13::i;:::-;-1:-1:-1;;;;;10013:22:0;::::1;10005:73;;;::::0;-1:-1:-1;;;10005:73:0;;16233:2:1;10005:73:0::1;::::0;::::1;16215:21:1::0;16272:2;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;-1:-1:-1;;;16362:18:1;;;16355:36;16408:19;;10005:73:0::1;16031:402:1::0;10005:73:0::1;10089:28;10108:8;10089:18;:28::i;:::-;9924:201:::0;:::o;9183:132::-;9091:6;;-1:-1:-1;;;;;9091:6:0;58734:10;9247:23;9239:68;;;;-1:-1:-1;;;9239:68:0;;16640:2:1;9239:68:0;;;16622:21:1;;;16659:18;;;16652:30;16718:34;16698:18;;;16691:62;16770:18;;9239:68:0;16438:356:1;36881:282:0;36946:4;37002:7;62400:1;36983:26;;:66;;;;;37036:13;;37026:7;:23;36983:66;:153;;;;-1:-1:-1;;37087:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;37087:44:0;:49;;36881:282::o;26203:178::-;-1:-1:-1;;;;;26292:25:0;26264:7;26292:25;;;:18;:25;;20185:2;26292:25;;;;;:50;;20047:13;26291:82;;26203:178::o;52479:112::-;52556:27;52566:2;52570:8;52556:27;;;;;;;;;;;;:9;:27::i;39143:2817::-;39277:27;39307;39326:7;39307:18;:27::i;:::-;39277:57;;39392:4;-1:-1:-1;;;;;39351:45:0;39367:19;-1:-1:-1;;;;;39351:45:0;;39347:86;;39405:28;;-1:-1:-1;;;39405:28:0;;;;;;;;;;;39347:86;39447:27;38257:24;;;:15;:24;;;;;38479:26;;58734:10;37882:30;;;-1:-1:-1;;;;;37575:28:0;;37860:20;;;37857:56;39633:180;;39726:43;39743:4;58734:10;36459:164;:::i;39726:43::-;39721:92;;39778:35;;-1:-1:-1;;;39778:35:0;;;;;;;;;;;39721:92;-1:-1:-1;;;;;39830:16:0;;39826:52;;39855:23;;-1:-1:-1;;;39855:23:0;;;;;;;;;;;39826:52;40027:15;40024:160;;;40167:1;40146:19;40139:30;40024:160;-1:-1:-1;;;;;40564:24:0;;;;;;;:18;:24;;;;;;40562:26;;-1:-1:-1;;40562:26:0;;;40633:22;;;;;;;;;40631:24;;-1:-1:-1;40631:24:0;;;33735:11;33710:23;33706:41;33693:63;-1:-1:-1;;;33693:63:0;40926:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;41221:47:0;;:52;;41217:627;;41326:1;41316:11;;41294:19;41449:30;;;:17;:30;;;;;;:35;;41445:384;;41587:13;;41572:11;:28;41568:242;;41734:30;;;;:17;:30;;;;;:52;;;41568:242;41275:569;41217:627;41891:7;41887:2;-1:-1:-1;;;;;41872:27:0;41881:4;-1:-1:-1;;;;;41872:27:0;;;;;;;;;;;39266:2694;;;39143:2817;;;:::o;42056:185::-;42194:39;42211:4;42217:2;42221:7;42194:39;;;;;;;;;;;;:16;:39::i;:::-;42056:185;;;:::o;31501:1275::-;31568:7;31603;;62400:1;31652:23;31648:1061;;31705:13;;31698:4;:20;31694:1015;;;31743:14;31760:23;;;:17;:23;;;;;;;-1:-1:-1;;;31849:24:0;;:29;;31845:845;;32514:113;32521:6;32531:1;32521:11;32514:113;;-1:-1:-1;;;32592:6:0;32574:25;;;;:17;:25;;;;;;32514:113;;31845:845;31720:989;31694:1015;32737:31;;-1:-1:-1;;;32737:31:0;;;;;;;;;;;10285:191;10378:6;;;-1:-1:-1;;;;;10395:17:0;;;-1:-1:-1;;;;;;10395:17:0;;;;;;;10428:40;;10378:6;;;10395:17;10378:6;;10428:40;;10359:16;;10428:40;10348:128;10285:191;:::o;30949:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31077:24:0;;;;:17;:24;;;;;;31058:44;;-1:-1:-1;;;;;;;;;;;;;32985:41:0;;;;20706:3;33071:33;;;33037:68;;-1:-1:-1;;;33037:68:0;-1:-1:-1;;;33135:24:0;;:29;;-1:-1:-1;;;33116:48:0;;;;21227:3;33204:28;;;;-1:-1:-1;;;33175:58:0;-1:-1:-1;32875:366:0;42839:399;43006:31;43019:4;43025:2;43029:7;43006:12;:31::i;:::-;-1:-1:-1;;;;;43052:14:0;;;:19;43048:183;;43091:56;43122:4;43128:2;43132:7;43141:5;43091:30;:56::i;:::-;43086:145;;43175:40;;-1:-1:-1;;;43175:40:0;;;;;;;;;;;62192:108;62252:13;62285:7;62278:14;;;;;:::i;6440:723::-;6496:13;6717:5;6726:1;6717:10;6713:53;;-1:-1:-1;;6744:10:0;;;;;;;;;;;;-1:-1:-1;;;6744:10:0;;;;;6440:723::o;6713:53::-;6791:5;6776:12;6832:78;6839:9;;6832:78;;6865:8;;;;:::i;:::-;;-1:-1:-1;6888:10:0;;-1:-1:-1;6896:2:0;6888:10;;:::i;:::-;;;6832:78;;;6920:19;6952:6;6942:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6942:17:0;;6920:39;;6970:154;6977:10;;6970:154;;7004:11;7014:1;7004:11;;:::i;:::-;;-1:-1:-1;7073:10:0;7081:2;7073:5;:10;:::i;:::-;7060:24;;:2;:24;:::i;:::-;7047:39;;7030:6;7037;7030:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7030:56:0;;;;;;;;-1:-1:-1;7101:11:0;7110:2;7101:11;;:::i;:::-;;;6970:154;;;7148:6;6440:723;-1:-1:-1;;;;6440:723:0:o;51706:689::-;51837:19;51843:2;51847:8;51837:5;:19::i;:::-;-1:-1:-1;;;;;51898:14:0;;;:19;51894:483;;51938:11;51952:13;52000:14;;;52033:233;52064:62;52103:1;52107:2;52111:7;;;;;;52120:5;52064:30;:62::i;:::-;52059:167;;52162:40;;-1:-1:-1;;;52162:40:0;;;;;;;;;;;52059:167;52261:3;52253:5;:11;52033:233;;52348:3;52331:13;;:20;52327:34;;52353:8;;;45322:716;45506:88;;-1:-1:-1;;;45506:88:0;;45485:4;;-1:-1:-1;;;;;45506:45:0;;;;;:88;;58734:10;;45573:4;;45579:7;;45588:5;;45506:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45506:88:0;;;;;;;;-1:-1:-1;;45506:88:0;;;;;;;;;;;;:::i;:::-;;;45502:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45789:6;:13;45806:1;45789:18;45785:235;;45835:40;;-1:-1:-1;;;45835:40:0;;;;;;;;;;;45785:235;45978:6;45972:13;45963:6;45959:2;45955:15;45948:38;45502:529;-1:-1:-1;;;;;;45665:64:0;-1:-1:-1;;;45665:64:0;;-1:-1:-1;45322:716:0;;;;;;:::o;46500:2454::-;46573:20;46596:13;;;46624;;;46620:44;;46646:18;;-1:-1:-1;;;46646:18:0;;;;;;;;;;;46620:44;-1:-1:-1;;;;;47152:22:0;;;;;;:18;:22;;;;20185:2;47152:22;;;:71;;47190:32;47178:45;;47152:71;;;47466:31;;;:17;:31;;;;;-1:-1:-1;34166:15:0;;34140:24;34136:46;33735:11;33710:23;33706:41;33703:52;33693:63;;47466:173;;47701:23;;;;47466:31;;47152:22;;48200:25;47152:22;;48053:335;48468:1;48454:12;48450:20;48408:346;48509:3;48500:7;48497:16;48408:346;;48727:7;48717:8;48714:1;48687:25;48684:1;48681;48676:59;48562:1;48549:15;48408:346;;;48412:77;48787:8;48799:1;48787:13;48783:45;;48809:19;;-1:-1:-1;;;48809:19:0;;;;;;;;;;;48783:45;48845:13;:19;-1:-1:-1;42056:185:0;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:118::-;678:5;671:13;664:21;657:5;654:32;644:60;;700:1;697;690:12;715:241;771:6;824:2;812:9;803:7;799:23;795:32;792:52;;;840:1;837;830:12;792:52;879:9;866:23;898:28;920:5;898:28;:::i;961:258::-;1033:1;1043:113;1057:6;1054:1;1051:13;1043:113;;;1133:11;;;1127:18;1114:11;;;1107:39;1079:2;1072:10;1043:113;;;1174:6;1171:1;1168:13;1165:48;;;-1:-1:-1;;1209:1:1;1191:16;;1184:27;961:258::o;1224:::-;1266:3;1304:5;1298:12;1331:6;1326:3;1319:19;1347:63;1403:6;1396:4;1391:3;1387:14;1380:4;1373:5;1369:16;1347:63;:::i;:::-;1464:2;1443:15;-1:-1:-1;;1439:29:1;1430:39;;;;1471:4;1426:50;;1224:258;-1:-1:-1;;1224:258:1:o;1487:220::-;1636:2;1625:9;1618:21;1599:4;1656:45;1697:2;1686:9;1682:18;1674:6;1656:45;:::i;1712:180::-;1771:6;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;-1:-1:-1;1863:23:1;;1712:180;-1:-1:-1;1712:180:1:o;2105:131::-;-1:-1:-1;;;;;2180:31:1;;2170:42;;2160:70;;2226:1;2223;2216:12;2241:247;2300:6;2353:2;2341:9;2332:7;2328:23;2324:32;2321:52;;;2369:1;2366;2359:12;2321:52;2408:9;2395:23;2427:31;2452:5;2427:31;:::i;2493:315::-;2561:6;2569;2622:2;2610:9;2601:7;2597:23;2593:32;2590:52;;;2638:1;2635;2628:12;2590:52;2677:9;2664:23;2696:31;2721:5;2696:31;:::i;:::-;2746:5;2798:2;2783:18;;;;2770:32;;-1:-1:-1;;;2493:315:1:o;2995:456::-;3072:6;3080;3088;3141:2;3129:9;3120:7;3116:23;3112:32;3109:52;;;3157:1;3154;3147:12;3109:52;3196:9;3183:23;3215:31;3240:5;3215:31;:::i;:::-;3265:5;-1:-1:-1;3322:2:1;3307:18;;3294:32;3335:33;3294:32;3335:33;:::i;:::-;2995:456;;3387:7;;-1:-1:-1;;;3441:2:1;3426:18;;;;3413:32;;2995:456::o;3456:127::-;3517:10;3512:3;3508:20;3505:1;3498:31;3548:4;3545:1;3538:15;3572:4;3569:1;3562:15;3588:275;3659:2;3653:9;3724:2;3705:13;;-1:-1:-1;;3701:27:1;3689:40;;3759:18;3744:34;;3780:22;;;3741:62;3738:88;;;3806:18;;:::i;:::-;3842:2;3835:22;3588:275;;-1:-1:-1;3588:275:1:o;3868:1021::-;3952:6;3983:2;4026;4014:9;4005:7;4001:23;3997:32;3994:52;;;4042:1;4039;4032:12;3994:52;4082:9;4069:23;4111:18;4152:2;4144:6;4141:14;4138:34;;;4168:1;4165;4158:12;4138:34;4206:6;4195:9;4191:22;4181:32;;4251:7;4244:4;4240:2;4236:13;4232:27;4222:55;;4273:1;4270;4263:12;4222:55;4309:2;4296:16;4331:2;4327;4324:10;4321:36;;;4337:18;;:::i;:::-;4383:2;4380:1;4376:10;4366:20;;4406:28;4430:2;4426;4422:11;4406:28;:::i;:::-;4468:15;;;4538:11;;;4534:20;;;4499:12;;;;4566:19;;;4563:39;;;4598:1;4595;4588:12;4563:39;4622:11;;;;4642:217;4658:6;4653:3;4650:15;4642:217;;;4738:3;4725:17;4712:30;;4755:31;4780:5;4755:31;:::i;:::-;4799:18;;;4675:12;;;;4837;;;;4642:217;;;4878:5;3868:1021;-1:-1:-1;;;;;;;;3868:1021:1:o;4894:407::-;4959:5;4993:18;4985:6;4982:30;4979:56;;;5015:18;;:::i;:::-;5053:57;5098:2;5077:15;;-1:-1:-1;;5073:29:1;5104:4;5069:40;5053:57;:::i;:::-;5044:66;;5133:6;5126:5;5119:21;5173:3;5164:6;5159:3;5155:16;5152:25;5149:45;;;5190:1;5187;5180:12;5149:45;5239:6;5234:3;5227:4;5220:5;5216:16;5203:43;5293:1;5286:4;5277:6;5270:5;5266:18;5262:29;5255:40;4894:407;;;;;:::o;5306:451::-;5375:6;5428:2;5416:9;5407:7;5403:23;5399:32;5396:52;;;5444:1;5441;5434:12;5396:52;5484:9;5471:23;5517:18;5509:6;5506:30;5503:50;;;5549:1;5546;5539:12;5503:50;5572:22;;5625:4;5617:13;;5613:27;-1:-1:-1;5603:55:1;;5654:1;5651;5644:12;5603:55;5677:74;5743:7;5738:2;5725:16;5720:2;5716;5712:11;5677:74;:::i;5762:632::-;5933:2;5985:21;;;6055:13;;5958:18;;;6077:22;;;5904:4;;5933:2;6156:15;;;;6130:2;6115:18;;;5904:4;6199:169;6213:6;6210:1;6207:13;6199:169;;;6274:13;;6262:26;;6343:15;;;;6308:12;;;;6235:1;6228:9;6199:169;;6623:382;6688:6;6696;6749:2;6737:9;6728:7;6724:23;6720:32;6717:52;;;6765:1;6762;6755:12;6717:52;6804:9;6791:23;6823:31;6848:5;6823:31;:::i;:::-;6873:5;-1:-1:-1;6930:2:1;6915:18;;6902:32;6943:30;6902:32;6943:30;:::i;:::-;6992:7;6982:17;;;6623:382;;;;;:::o;7010:795::-;7105:6;7113;7121;7129;7182:3;7170:9;7161:7;7157:23;7153:33;7150:53;;;7199:1;7196;7189:12;7150:53;7238:9;7225:23;7257:31;7282:5;7257:31;:::i;:::-;7307:5;-1:-1:-1;7364:2:1;7349:18;;7336:32;7377:33;7336:32;7377:33;:::i;:::-;7429:7;-1:-1:-1;7483:2:1;7468:18;;7455:32;;-1:-1:-1;7538:2:1;7523:18;;7510:32;7565:18;7554:30;;7551:50;;;7597:1;7594;7587:12;7551:50;7620:22;;7673:4;7665:13;;7661:27;-1:-1:-1;7651:55:1;;7702:1;7699;7692:12;7651:55;7725:74;7791:7;7786:2;7773:16;7768:2;7764;7760:11;7725:74;:::i;:::-;7715:84;;;7010:795;;;;;;;:::o;7810:315::-;7878:6;7886;7939:2;7927:9;7918:7;7914:23;7910:32;7907:52;;;7955:1;7952;7945:12;7907:52;7991:9;7978:23;7968:33;;8051:2;8040:9;8036:18;8023:32;8064:31;8089:5;8064:31;:::i;8390:388::-;8458:6;8466;8519:2;8507:9;8498:7;8494:23;8490:32;8487:52;;;8535:1;8532;8525:12;8487:52;8574:9;8561:23;8593:31;8618:5;8593:31;:::i;:::-;8643:5;-1:-1:-1;8700:2:1;8685:18;;8672:32;8713:33;8672:32;8713:33;:::i;8783:380::-;8862:1;8858:12;;;;8905;;;8926:61;;8980:4;8972:6;8968:17;8958:27;;8926:61;9033:2;9025:6;9022:14;9002:18;8999:38;8996:161;;9079:10;9074:3;9070:20;9067:1;9060:31;9114:4;9111:1;9104:15;9142:4;9139:1;9132:15;8996:161;;8783:380;;;:::o;9168:355::-;9370:2;9352:21;;;9409:2;9389:18;;;9382:30;9448:33;9443:2;9428:18;;9421:61;9514:2;9499:18;;9168:355::o;9880:127::-;9941:10;9936:3;9932:20;9929:1;9922:31;9972:4;9969:1;9962:15;9996:4;9993:1;9986:15;10012:128;10052:3;10083:1;10079:6;10076:1;10073:13;10070:39;;;10089:18;;:::i;:::-;-1:-1:-1;10125:9:1;;10012:128::o;11864:245::-;11931:6;11984:2;11972:9;11963:7;11959:23;11955:32;11952:52;;;12000:1;11997;11990:12;11952:52;12032:9;12026:16;12051:28;12073:5;12051:28;:::i;12114:127::-;12175:10;12170:3;12166:20;12163:1;12156:31;12206:4;12203:1;12196:15;12230:4;12227:1;12220:15;12246:135;12285:3;12306:17;;;12303:43;;12326:18;;:::i;:::-;-1:-1:-1;12373:1:1;12362:13;;12246:135::o;13085:168::-;13125:7;13191:1;13187;13183:6;13179:14;13176:1;13173:21;13168:1;13161:9;13154:17;13150:45;13147:71;;;13198:18;;:::i;:::-;-1:-1:-1;13238:9:1;;13085:168::o;14499:1527::-;14723:3;14761:6;14755:13;14787:4;14800:51;14844:6;14839:3;14834:2;14826:6;14822:15;14800:51;:::i;:::-;14914:13;;14873:16;;;;14936:55;14914:13;14873:16;14958:15;;;14936:55;:::i;:::-;15080:13;;15013:20;;;15053:1;;15140;15162:18;;;;15215;;;;15242:93;;15320:4;15310:8;15306:19;15294:31;;15242:93;15383:2;15373:8;15370:16;15350:18;15347:40;15344:167;;-1:-1:-1;;;15410:33:1;;15466:4;15463:1;15456:15;15496:4;15417:3;15484:17;15344:167;15527:18;15554:110;;;;15678:1;15673:328;;;;15520:481;;15554:110;-1:-1:-1;;15589:24:1;;15575:39;;15634:20;;;;-1:-1:-1;15554:110:1;;15673:328;14446:1;14439:14;;;14483:4;14470:18;;15768:1;15782:169;15796:8;15793:1;15790:15;15782:169;;;15878:14;;15863:13;;;15856:37;15921:16;;;;15813:10;;15782:169;;;15786:3;;15982:8;15975:5;15971:20;15964:27;;15520:481;-1:-1:-1;16017:3:1;;14499:1527;-1:-1:-1;;;;;;;;;;;14499:1527:1:o;16799:127::-;16860:10;16855:3;16851:20;16848:1;16841:31;16891:4;16888:1;16881:15;16915:4;16912:1;16905:15;16931:120;16971:1;16997;16987:35;;17002:18;;:::i;:::-;-1:-1:-1;17036:9:1;;16931:120::o;17056:125::-;17096:4;17124:1;17121;17118:8;17115:34;;;17129:18;;:::i;:::-;-1:-1:-1;17166:9:1;;17056:125::o;17186:112::-;17218:1;17244;17234:35;;17249:18;;:::i;:::-;-1:-1:-1;17283:9:1;;17186:112::o;17303:489::-;-1:-1:-1;;;;;17572:15:1;;;17554:34;;17624:15;;17619:2;17604:18;;17597:43;17671:2;17656:18;;17649:34;;;17719:3;17714:2;17699:18;;17692:31;;;17497:4;;17740:46;;17766:19;;17758:6;17740:46;:::i;:::-;17732:54;17303:489;-1:-1:-1;;;;;;17303:489:1:o;17797:249::-;17866:6;17919:2;17907:9;17898:7;17894:23;17890:32;17887:52;;;17935:1;17932;17925:12;17887:52;17967:9;17961:16;17986:30;18010:5;17986:30;:::i

Swarm Source

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