ETH Price: $3,094.28 (-1.27%)
Gas: 9.64 Gwei

Token

Futuristic Farm Frens (FFF)
 

Overview

Max Total Supply

6,041 FFF

Holders

484

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
15 FFF
0xc3d6c9fa865fa778e517e90b801d6635ab085a68
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:
FuturisticFarmFrens

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-17
*/

// SPDX-License-Identifier: MIT

// File erc721a/contracts/[email protected]

// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

// File erc721a/contracts/extensions/[email protected]

// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

// File erc721a/contracts/[email protected]

// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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)
        }
    }
}

// File erc721a/contracts/extensions/[email protected]

// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](
                tokenIdsLength
            );
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (
                uint256 i = start;
                i != stop && tokenIdsIdx != tokenIdsMaxLength;
                ++i
            ) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

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

// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/cryptography/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }
        return computedHash;
    }
}

// File @openzeppelin/contracts/security/[email protected]

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File contracts/FFF.sol

pragma solidity >=0.8.9 <0.9.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = 1;

            // compute log10(value), and add it to length
            uint256 valueCopy = value;
            if (valueCopy >= 10**64) {
                valueCopy /= 10**64;
                length += 64;
            }
            if (valueCopy >= 10**32) {
                valueCopy /= 10**32;
                length += 32;
            }
            if (valueCopy >= 10**16) {
                valueCopy /= 10**16;
                length += 16;
            }
            if (valueCopy >= 10**8) {
                valueCopy /= 10**8;
                length += 8;
            }
            if (valueCopy >= 10**4) {
                valueCopy /= 10**4;
                length += 4;
            }
            if (valueCopy >= 10**2) {
                valueCopy /= 10**2;
                length += 2;
            }
            if (valueCopy >= 10**1) {
                length += 1;
            }
            // now, length is log10(value) + 1

            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = 1;

            // compute log256(value), and add it to length
            uint256 valueCopy = value;
            if (valueCopy >= 1 << 128) {
                valueCopy >>= 128;
                length += 16;
            }
            if (valueCopy >= 1 << 64) {
                valueCopy >>= 64;
                length += 8;
            }
            if (valueCopy >= 1 << 32) {
                valueCopy >>= 32;
                length += 4;
            }
            if (valueCopy >= 1 << 16) {
                valueCopy >>= 16;
                length += 2;
            }
            if (valueCopy >= 1 << 8) {
                valueCopy >>= 8;
                length += 1;
            }
            // now, length is log256(value) + 1

            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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

contract FuturisticFarmFrens is ERC721AQueryable, Ownable, ReentrancyGuard {
    using Strings for uint256;

    bytes32 public merkleRoot;
    mapping(address => bool) public whitelistClaimed;

    string public uriPrefix = "";
    string public uriSuffix = ".json";
    string public hiddenMetadataUri;

    uint256 public cost;
    uint256 public maxSupply;
    uint256 public maxMintAmountPerTx;
    uint256 private maxHonoraries;

    bool public paused = true;
    bool public whitelistMintEnabled = false;
    bool public revealed = false;

    constructor() ERC721A("Futuristic Farm Frens", "FFF") {
        setCost(0.035 ether); // .035eth || 35000000000000000000
        maxSupply = 6111;
        setMaxMintAmountPerTx(15);
        setHiddenMetadataUri("");
        setMaxHonoraries(70);
    }

    modifier mintCompliance(uint256 _mintAmount) {
        require(
            _mintAmount > 0 && _mintAmount <= maxMintAmountPerTx,
            "Invalid mint amount!"
        );
        require(
            totalSupply() + _mintAmount <= maxSupply - maxHonoraries,
            "Max supply exceeded!"
        );
        _;
    }

    modifier mintPriceCompliance(uint256 _mintAmount) {
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        _;
    }

    function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof)
        public
        payable
        mintCompliance(_mintAmount)
        mintPriceCompliance(_mintAmount)
    {
        // Verify whitelist requirements
        require(whitelistMintEnabled, "The whitelist sale is not enabled!");
        require(!whitelistClaimed[_msgSender()], "Address already claimed!");
        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        require(
            MerkleProof.verify(_merkleProof, merkleRoot, leaf),
            "Invalid proof!"
        );

        whitelistClaimed[_msgSender()] = true;
        _safeMint(_msgSender(), _mintAmount);
    }

    function mint(uint256 _mintAmount)
        public
        payable
        mintCompliance(_mintAmount)
        mintPriceCompliance(_mintAmount)
    {
        require(!paused, "The contract is paused!");

        _safeMint(_msgSender(), _mintAmount);
    }

    function mintHonorary(address _receiver) public onlyOwner {
        require(totalSupply() + 1 <= maxSupply, "Max supply exceeded!");
        _safeMint(_receiver, 1);
    }

    function mintForAddress(uint256 _mintAmount, address _receiver)
        public
        mintCompliance(_mintAmount)
        onlyOwner
    {
        _safeMint(_receiver, _mintAmount);
    }

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

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

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

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

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function setCost(uint256 _cost) public onlyOwner {
        cost = _cost;
    }

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

    function setMaxHonoraries(uint256 _maxHonoraries)
        public
        onlyOwner
    {
        maxHonoraries = _maxHonoraries;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri)
        public
        onlyOwner
    {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

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

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

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function setWhitelistMintEnabled(bool _state) public onlyOwner {
        whitelistMintEnabled = _state;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool a, ) = payable(0x5870F14442fADe3f06cd277D22057476Db38dfdf).call{
            value: (address(this).balance * 30) / 100
        }("");
        require(a);

        (bool b, ) = payable(0xd3d8C8B39E5cbc2b48bBA4ffe06b6feab2BC3314).call{
            value: (address(this).balance * 30) / 100
        }("");
        require(b);

        (bool c, ) = payable(0xa9e848a557bad7c4f78daA0C2dbc479852E62a2E).call{
            value: (address(this).balance * 25) / 100
        }("");
        require(c);

        (bool d, ) = payable(0x6aD637e2B23fB8296A437Bb539f7eCA2c0A4C6D2).call{
            value: (address(this).balance * 15) / 100
        }("");
        require(d);

        (bool e, ) = payable(owner()).call{value: address(this).balance}("");
        require(e);
        // =============================================================================
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintHonorary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxHonoraries","type":"uint256"}],"name":"setMaxHonoraries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600c91620002f0565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a91600d91620002f0565b506013805462ffffff191660011790553480156200006757600080fd5b50604080518082018252601581527f46757475726973746963204661726d204672656e73000000000000000000000060208083019182528351808501909452600384526223232360e91b908401528151919291620000c891600291620002f0565b508051620000de906003906020840190620002f0565b5050600160005550620000f13362000146565b600160095562000108667c58508723800062000198565b6117df6010556200011a600f620001ec565b60408051602081019091526000815262000134906200023c565b620001406046620002a0565b620003d3565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620001e75760405162461bcd60e51b81526020600482018190526024820152600080516020620030a583398151915260448201526064015b60405180910390fd5b600f55565b6008546001600160a01b03163314620002375760405162461bcd60e51b81526020600482018190526024820152600080516020620030a58339815191526044820152606401620001de565b601155565b6008546001600160a01b03163314620002875760405162461bcd60e51b81526020600482018190526024820152600080516020620030a58339815191526044820152606401620001de565b80516200029c90600e906020840190620002f0565b5050565b6008546001600160a01b03163314620002eb5760405162461bcd60e51b81526020600482018190526024820152600080516020620030a58339815191526044820152606401620001de565b601255565b828054620002fe9062000396565b90600052602060002090601f0160209004810192826200032257600085556200036d565b82601f106200033d57805160ff19168380011785556200036d565b828001600101855582156200036d579182015b828111156200036d57825182559160200191906001019062000350565b506200037b9291506200037f565b5090565b5b808211156200037b576000815560010162000380565b600181811c90821680620003ab57607f821691505b60208210811415620003cd57634e487b7160e01b600052602260045260246000fd5b50919050565b612cc280620003e36000396000f3fe6080604052600436106102885760003560e01c80637cb647591161015a578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb0114610785578063db4bec441461079b578063e0a80853146107cb578063e985e9c5146107eb578063efbd73f414610834578063f2fde38b1461085457600080fd5b8063b88d4fde146106c5578063bcc4efba146106e5578063c23dc68f14610705578063c87b56dd14610732578063cbd939ef14610752578063d2cab0561461077257600080fd5b806399a2557a1161011357806399a2557a1461061d578063a0712d681461063d578063a22cb46514610650578063a45ba8e714610670578063b071401b14610685578063b767a098146106a557600080fd5b80637cb64759146105675780637ec4a659146105875780638462151c146105a75780638da5cb5b146105d457806394354fd0146105f257806395d89b411461060857600080fd5b806342842e0e116101fe5780635c975abb116101b75780635c975abb146104c457806362b99ad4146104de5780636352211e146104f35780636caede3d1461051357806370a0823114610532578063715018a61461055257600080fd5b806342842e0e1461040257806344a0d68a146104225780634fdd43cb1461044257806351830227146104625780635503a0e8146104825780635bbb21771461049757600080fd5b806316ba10e01161025057806316ba10e01461036257806316c38b3c1461038257806318160ddd146103a257806323b872dd146103b75780632eb4a7ab146103d75780633ccfd60b146103ed57600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806313faede61461033e575b600080fd5b34801561029957600080fd5b506102ad6102a83660046124e6565b610874565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108c6565b6040516102b9919061255b565b3480156102f057600080fd5b506103046102ff36600461256e565b610958565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c6103373660046125a3565b61099c565b005b34801561034a57600080fd5b50610354600f5481565b6040519081526020016102b9565b34801561036e57600080fd5b5061033c61037d366004612658565b610a3c565b34801561038e57600080fd5b5061033c61039d3660046126b0565b610a86565b3480156103ae57600080fd5b50610354610ac3565b3480156103c357600080fd5b5061033c6103d23660046126cb565b610ad1565b3480156103e357600080fd5b50610354600a5481565b3480156103f957600080fd5b5061033c610c63565b34801561040e57600080fd5b5061033c61041d3660046126cb565b610f56565b34801561042e57600080fd5b5061033c61043d36600461256e565b610f76565b34801561044e57600080fd5b5061033c61045d366004612658565b610fa5565b34801561046e57600080fd5b506013546102ad9062010000900460ff1681565b34801561048e57600080fd5b506102d7610fe2565b3480156104a357600080fd5b506104b76104b2366004612752565b611070565b6040516102b991906127cf565b3480156104d057600080fd5b506013546102ad9060ff1681565b3480156104ea57600080fd5b506102d761113b565b3480156104ff57600080fd5b5061030461050e36600461256e565b611148565b34801561051f57600080fd5b506013546102ad90610100900460ff1681565b34801561053e57600080fd5b5061035461054d366004612811565b611153565b34801561055e57600080fd5b5061033c6111a1565b34801561057357600080fd5b5061033c61058236600461256e565b6111d7565b34801561059357600080fd5b5061033c6105a2366004612658565b611206565b3480156105b357600080fd5b506105c76105c2366004612811565b611243565b6040516102b9919061282c565b3480156105e057600080fd5b506008546001600160a01b0316610304565b3480156105fe57600080fd5b5061035460115481565b34801561061457600080fd5b506102d7611352565b34801561062957600080fd5b506105c7610638366004612864565b611361565b61033c61064b36600461256e565b6114ec565b34801561065c57600080fd5b5061033c61066b366004612897565b61160d565b34801561067c57600080fd5b506102d76116a3565b34801561069157600080fd5b5061033c6106a036600461256e565b6116b0565b3480156106b157600080fd5b5061033c6106c03660046126b0565b6116df565b3480156106d157600080fd5b5061033c6106e03660046128ca565b611723565b3480156106f157600080fd5b5061033c610700366004612811565b61176d565b34801561071157600080fd5b5061072561072036600461256e565b6117d9565b6040516102b99190612945565b34801561073e57600080fd5b506102d761074d36600461256e565b611861565b34801561075e57600080fd5b5061033c61076d36600461256e565b6119d0565b61033c610780366004612953565b6119ff565b34801561079157600080fd5b5061035460105481565b3480156107a757600080fd5b506102ad6107b6366004612811565b600b6020526000908152604090205460ff1681565b3480156107d757600080fd5b5061033c6107e63660046126b0565b611c60565b3480156107f757600080fd5b506102ad61080636600461299e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561084057600080fd5b5061033c61084f3660046129c8565b611ca6565b34801561086057600080fd5b5061033c61086f366004612811565b611d4a565b60006301ffc9a760e01b6001600160e01b0319831614806108a557506380ac58cd60e01b6001600160e01b03198316145b806108c05750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546108d5906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610901906129eb565b801561094e5780601f106109235761010080835404028352916020019161094e565b820191906000526020600020905b81548152906001019060200180831161093157829003601f168201915b5050505050905090565b600061096382611de2565b610980576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109a782611148565b9050336001600160a01b038216146109e0576109c38133610806565b6109e0576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a6f5760405162461bcd60e51b8152600401610a6690612a26565b60405180910390fd5b8051610a8290600d906020840190612437565b5050565b6008546001600160a01b03163314610ab05760405162461bcd60e51b8152600401610a6690612a26565b6013805460ff1916911515919091179055565b600154600054036000190190565b6000610adc82611e17565b9050836001600160a01b0316816001600160a01b031614610b0f5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610b5c57610b3f8633610806565b610b5c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b8357604051633a954ecd60e21b815260040160405180910390fd5b8015610b8e57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610c195760018401600081815260046020526040902054610c17576000548114610c175760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b03163314610c8d5760405162461bcd60e51b8152600401610a6690612a26565b60026009541415610ce05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a66565b60026009556000735870f14442fade3f06cd277d22057476db38dfdf6064610d0947601e612a71565b610d139190612a90565b604051600081818185875af1925050503d8060008114610d4f576040519150601f19603f3d011682016040523d82523d6000602084013e610d54565b606091505b5050905080610d6257600080fd5b600073d3d8c8b39e5cbc2b48bba4ffe06b6feab2bc33146064610d8647601e612a71565b610d909190612a90565b604051600081818185875af1925050503d8060008114610dcc576040519150601f19603f3d011682016040523d82523d6000602084013e610dd1565b606091505b5050905080610ddf57600080fd5b600073a9e848a557bad7c4f78daa0c2dbc479852e62a2e6064610e03476019612a71565b610e0d9190612a90565b604051600081818185875af1925050503d8060008114610e49576040519150601f19603f3d011682016040523d82523d6000602084013e610e4e565b606091505b5050905080610e5c57600080fd5b6000736ad637e2b23fb8296a437bb539f7eca2c0a4c6d26064610e8047600f612a71565b610e8a9190612a90565b604051600081818185875af1925050503d8060008114610ec6576040519150601f19603f3d011682016040523d82523d6000602084013e610ecb565b606091505b5050905080610ed957600080fd5b6000610eed6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5050905080610f4a57600080fd5b50506001600955505050565b610f7183838360405180602001604052806000815250611723565b505050565b6008546001600160a01b03163314610fa05760405162461bcd60e51b8152600401610a6690612a26565b600f55565b6008546001600160a01b03163314610fcf5760405162461bcd60e51b8152600401610a6690612a26565b8051610a8290600e906020840190612437565b600d8054610fef906129eb565b80601f016020809104026020016040519081016040528092919081815260200182805461101b906129eb565b80156110685780601f1061103d57610100808354040283529160200191611068565b820191906000526020600020905b81548152906001019060200180831161104b57829003601f168201915b505050505081565b6060816000816001600160401b0381111561108d5761108d6125cd565b6040519080825280602002602001820160405280156110df57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816110ab5790505b50905060005b8281146111325761110d86868381811061110157611101612ab2565b905060200201356117d9565b82828151811061111f5761111f612ab2565b60209081029190910101526001016110e5565b50949350505050565b600c8054610fef906129eb565b60006108c082611e17565b60006001600160a01b03821661117c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111cb5760405162461bcd60e51b8152600401610a6690612a26565b6111d56000611e80565b565b6008546001600160a01b031633146112015760405162461bcd60e51b8152600401610a6690612a26565b600a55565b6008546001600160a01b031633146112305760405162461bcd60e51b8152600401610a6690612a26565b8051610a8290600c906020840190612437565b6060600080600061125385611153565b90506000816001600160401b0381111561126f5761126f6125cd565b604051908082528060200260200182016040528015611298578160200160208202803683370190505b5090506112c560408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614611346576112d881611ed2565b91508160400151156112e95761133e565b81516001600160a01b0316156112fe57815194505b876001600160a01b0316856001600160a01b0316141561133e578083878060010198508151811061133157611331612ab2565b6020026020010181815250505b6001016112c8565b50909695505050505050565b6060600380546108d5906129eb565b606081831061138357604051631960ccad60e11b815260040160405180910390fd5b60008061138f60005490565b9050600185101561139f57600194505b808411156113ab578093505b60006113b687611153565b9050848610156113d557858503818110156113cf578091505b506113d9565b5060005b6000816001600160401b038111156113f3576113f36125cd565b60405190808252806020026020018201604052801561141c578160200160208202803683370190505b5090508161142f5793506114e592505050565b600061143a886117d9565b90506000816040015161144b575080515b885b88811415801561145d5750848714155b156114d95761146b81611ed2565b925082604001511561147c576114d1565b82516001600160a01b03161561149157825191505b8a6001600160a01b0316826001600160a01b031614156114d157808488806001019950815181106114c4576114c4612ab2565b6020026020010181815250505b60010161144d565b50505092835250909150505b9392505050565b806000811180156114ff57506011548111155b61151b5760405162461bcd60e51b8152600401610a6690612ac8565b60125460105461152b9190612af6565b81611534610ac3565b61153e9190612b0d565b111561155c5760405162461bcd60e51b8152600401610a6690612b25565b8180600f5461156b9190612a71565b3410156115b05760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610a66565b60135460ff16156116035760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610a66565b610f713384611f0e565b6001600160a01b0382163314156116375760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e8054610fef906129eb565b6008546001600160a01b031633146116da5760405162461bcd60e51b8152600401610a6690612a26565b601155565b6008546001600160a01b031633146117095760405162461bcd60e51b8152600401610a6690612a26565b601380549115156101000261ff0019909216919091179055565b61172e848484610ad1565b6001600160a01b0383163b156117675761174a84848484611f28565b611767576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117975760405162461bcd60e51b8152600401610a6690612a26565b6010546117a2610ac3565b6117ad906001612b0d565b11156117cb5760405162461bcd60e51b8152600401610a6690612b25565b6117d6816001611f0e565b50565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152600183108061183257506000548310155b1561183d5792915050565b61184683611ed2565b90508060400151156118585792915050565b6114e583612020565b606061186c82611de2565b6118d05760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a66565b60135462010000900460ff1661197257600e80546118ed906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611919906129eb565b80156119665780601f1061193b57610100808354040283529160200191611966565b820191906000526020600020905b81548152906001019060200180831161194957829003601f168201915b50505050509050919050565b600061197c612055565b9050600081511161199c57604051806020016040528060008152506114e5565b806119a684612064565b600d6040516020016119ba93929190612b53565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146119fa5760405162461bcd60e51b8152600401610a6690612a26565b601255565b82600081118015611a1257506011548111155b611a2e5760405162461bcd60e51b8152600401610a6690612ac8565b601254601054611a3e9190612af6565b81611a47610ac3565b611a519190612b0d565b1115611a6f5760405162461bcd60e51b8152600401610a6690612b25565b8380600f54611a7e9190612a71565b341015611ac35760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610a66565b601354610100900460ff16611b255760405162461bcd60e51b815260206004820152602260248201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604482015261642160f01b6064820152608401610a66565b336000908152600b602052604090205460ff1615611b855760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610a66565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bff85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506121ca565b611c3c5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610a66565b336000818152600b60205260409020805460ff19166001179055610c5b9087611f0e565b6008546001600160a01b03163314611c8a5760405162461bcd60e51b8152600401610a6690612a26565b60138054911515620100000262ff000019909216919091179055565b81600081118015611cb957506011548111155b611cd55760405162461bcd60e51b8152600401610a6690612ac8565b601254601054611ce59190612af6565b81611cee610ac3565b611cf89190612b0d565b1115611d165760405162461bcd60e51b8152600401610a6690612b25565b6008546001600160a01b03163314611d405760405162461bcd60e51b8152600401610a6690612a26565b610f718284611f0e565b6008546001600160a01b03163314611d745760405162461bcd60e51b8152600401610a6690612a26565b6001600160a01b038116611dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a66565b6117d681611e80565b600081600111158015611df6575060005482105b80156108c0575050600090815260046020526040902054600160e01b161590565b60008180600111611e6757600054811015611e6757600081815260046020526040902054600160e01b8116611e65575b806114e5575060001901600081815260046020526040902054611e47565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546108c0906121e0565b610a82828260405180602001604052806000815250612227565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f5d903390899088908890600401612c17565b602060405180830381600087803b158015611f7757600080fd5b505af1925050508015611fa7575060408051601f3d908101601f19168201909252611fa491810190612c54565b60015b612002573d808015611fd5576040519150601f19603f3d011682016040523d82523d6000602084013e611fda565b606091505b508051611ffa576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526108c061205083611e17565b6121e0565b6060600c80546108d5906129eb565b606060018272184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b81106120a7576040919091019072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90045b6d04ee2d6d415b85acef810000000081106120d557602091909101906d04ee2d6d415b85acef810000000090045b662386f26fc1000081106120f55760109190910190662386f26fc1000090045b6305f5e100811061210f57600891909101906305f5e10090045b6127108110612125576004919091019061271090045b606481106121395760029190910190606490045b600a8110612148576001820191505b6000826001600160401b03811115612162576121626125cd565b6040519080825280601f01601f19166020018201604052801561218c576020820181803683370190505b5090508281016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a87061a8153600a86049550856121c557611132565b612196565b6000826121d78584612294565b14949350505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6122318383612340565b6001600160a01b0383163b15610f71576000548281035b61225b6000868380600101945086611f28565b612278576040516368d2bf6b60e11b815260040160405180910390fd5b81811061224857816000541461228d57600080fd5b5050505050565b600081815b84518110156123385760008582815181106122b6576122b6612ab2565b602002602001015190508083116122f8576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612325565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061233081612c71565b915050612299565b509392505050565b600054816123615760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461241057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016123d8565b508161242e57604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054612443906129eb565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e57805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612490565b506124b79291506124bb565b5090565b5b808211156124b757600081556001016124bc565b6001600160e01b0319811681146117d657600080fd5b6000602082840312156124f857600080fd5b81356114e5816124d0565b60005b8381101561251e578181015183820152602001612506565b838111156117675750506000910152565b60008151808452612547816020860160208601612503565b601f01601f19169290920160200192915050565b6020815260006114e5602083018461252f565b60006020828403121561258057600080fd5b5035919050565b80356001600160a01b038116811461259e57600080fd5b919050565b600080604083850312156125b657600080fd5b6125bf83612587565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156125fd576125fd6125cd565b604051601f8501601f19908116603f01168101908282118183101715612625576126256125cd565b8160405280935085815286868601111561263e57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561266a57600080fd5b81356001600160401b0381111561268057600080fd5b8201601f8101841361269157600080fd5b612018848235602084016125e3565b8035801515811461259e57600080fd5b6000602082840312156126c257600080fd5b6114e5826126a0565b6000806000606084860312156126e057600080fd5b6126e984612587565b92506126f760208501612587565b9150604084013590509250925092565b60008083601f84011261271957600080fd5b5081356001600160401b0381111561273057600080fd5b6020830191508360208260051b850101111561274b57600080fd5b9250929050565b6000806020838503121561276557600080fd5b82356001600160401b0381111561277b57600080fd5b61278785828601612707565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015611346576127fe838551612793565b92840192608092909201916001016127eb565b60006020828403121561282357600080fd5b6114e582612587565b6020808252825182820181905260009190848201906040850190845b8181101561134657835183529284019291840191600101612848565b60008060006060848603121561287957600080fd5b61288284612587565b95602085013595506040909401359392505050565b600080604083850312156128aa57600080fd5b6128b383612587565b91506128c1602084016126a0565b90509250929050565b600080600080608085870312156128e057600080fd5b6128e985612587565b93506128f760208601612587565b92506040850135915060608501356001600160401b0381111561291957600080fd5b8501601f8101871361292a57600080fd5b612939878235602084016125e3565b91505092959194509250565b608081016108c08284612793565b60008060006040848603121561296857600080fd5b8335925060208401356001600160401b0381111561298557600080fd5b61299186828701612707565b9497909650939450505050565b600080604083850312156129b157600080fd5b6129ba83612587565b91506128c160208401612587565b600080604083850312156129db57600080fd5b823591506128c160208401612587565b600181811c908216806129ff57607f821691505b60208210811415612a2057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612a8b57612a8b612a5b565b500290565b600082612aad57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b600082821015612b0857612b08612a5b565b500390565b60008219821115612b2057612b20612a5b565b500190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b600084516020612b668285838a01612503565b855191840191612b798184848a01612503565b8554920191600090600181811c9080831680612b9657607f831692505b858310811415612bb457634e487b7160e01b85526022600452602485fd5b808015612bc85760018114612bd957612c06565b60ff19851688528388019550612c06565b60008b81526020902060005b85811015612bfe5781548a820152908401908801612be5565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c4a9083018461252f565b9695505050505050565b600060208284031215612c6657600080fd5b81516114e5816124d0565b6000600019821415612c8557612c85612a5b565b506001019056fea2646970667358221220facd34ba18c84ee6a929bfca3bf327d003516ade0607aa736ed59bfd57971b1d64736f6c634300080900334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106102885760003560e01c80637cb647591161015a578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb0114610785578063db4bec441461079b578063e0a80853146107cb578063e985e9c5146107eb578063efbd73f414610834578063f2fde38b1461085457600080fd5b8063b88d4fde146106c5578063bcc4efba146106e5578063c23dc68f14610705578063c87b56dd14610732578063cbd939ef14610752578063d2cab0561461077257600080fd5b806399a2557a1161011357806399a2557a1461061d578063a0712d681461063d578063a22cb46514610650578063a45ba8e714610670578063b071401b14610685578063b767a098146106a557600080fd5b80637cb64759146105675780637ec4a659146105875780638462151c146105a75780638da5cb5b146105d457806394354fd0146105f257806395d89b411461060857600080fd5b806342842e0e116101fe5780635c975abb116101b75780635c975abb146104c457806362b99ad4146104de5780636352211e146104f35780636caede3d1461051357806370a0823114610532578063715018a61461055257600080fd5b806342842e0e1461040257806344a0d68a146104225780634fdd43cb1461044257806351830227146104625780635503a0e8146104825780635bbb21771461049757600080fd5b806316ba10e01161025057806316ba10e01461036257806316c38b3c1461038257806318160ddd146103a257806323b872dd146103b75780632eb4a7ab146103d75780633ccfd60b146103ed57600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806313faede61461033e575b600080fd5b34801561029957600080fd5b506102ad6102a83660046124e6565b610874565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108c6565b6040516102b9919061255b565b3480156102f057600080fd5b506103046102ff36600461256e565b610958565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c6103373660046125a3565b61099c565b005b34801561034a57600080fd5b50610354600f5481565b6040519081526020016102b9565b34801561036e57600080fd5b5061033c61037d366004612658565b610a3c565b34801561038e57600080fd5b5061033c61039d3660046126b0565b610a86565b3480156103ae57600080fd5b50610354610ac3565b3480156103c357600080fd5b5061033c6103d23660046126cb565b610ad1565b3480156103e357600080fd5b50610354600a5481565b3480156103f957600080fd5b5061033c610c63565b34801561040e57600080fd5b5061033c61041d3660046126cb565b610f56565b34801561042e57600080fd5b5061033c61043d36600461256e565b610f76565b34801561044e57600080fd5b5061033c61045d366004612658565b610fa5565b34801561046e57600080fd5b506013546102ad9062010000900460ff1681565b34801561048e57600080fd5b506102d7610fe2565b3480156104a357600080fd5b506104b76104b2366004612752565b611070565b6040516102b991906127cf565b3480156104d057600080fd5b506013546102ad9060ff1681565b3480156104ea57600080fd5b506102d761113b565b3480156104ff57600080fd5b5061030461050e36600461256e565b611148565b34801561051f57600080fd5b506013546102ad90610100900460ff1681565b34801561053e57600080fd5b5061035461054d366004612811565b611153565b34801561055e57600080fd5b5061033c6111a1565b34801561057357600080fd5b5061033c61058236600461256e565b6111d7565b34801561059357600080fd5b5061033c6105a2366004612658565b611206565b3480156105b357600080fd5b506105c76105c2366004612811565b611243565b6040516102b9919061282c565b3480156105e057600080fd5b506008546001600160a01b0316610304565b3480156105fe57600080fd5b5061035460115481565b34801561061457600080fd5b506102d7611352565b34801561062957600080fd5b506105c7610638366004612864565b611361565b61033c61064b36600461256e565b6114ec565b34801561065c57600080fd5b5061033c61066b366004612897565b61160d565b34801561067c57600080fd5b506102d76116a3565b34801561069157600080fd5b5061033c6106a036600461256e565b6116b0565b3480156106b157600080fd5b5061033c6106c03660046126b0565b6116df565b3480156106d157600080fd5b5061033c6106e03660046128ca565b611723565b3480156106f157600080fd5b5061033c610700366004612811565b61176d565b34801561071157600080fd5b5061072561072036600461256e565b6117d9565b6040516102b99190612945565b34801561073e57600080fd5b506102d761074d36600461256e565b611861565b34801561075e57600080fd5b5061033c61076d36600461256e565b6119d0565b61033c610780366004612953565b6119ff565b34801561079157600080fd5b5061035460105481565b3480156107a757600080fd5b506102ad6107b6366004612811565b600b6020526000908152604090205460ff1681565b3480156107d757600080fd5b5061033c6107e63660046126b0565b611c60565b3480156107f757600080fd5b506102ad61080636600461299e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561084057600080fd5b5061033c61084f3660046129c8565b611ca6565b34801561086057600080fd5b5061033c61086f366004612811565b611d4a565b60006301ffc9a760e01b6001600160e01b0319831614806108a557506380ac58cd60e01b6001600160e01b03198316145b806108c05750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546108d5906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610901906129eb565b801561094e5780601f106109235761010080835404028352916020019161094e565b820191906000526020600020905b81548152906001019060200180831161093157829003601f168201915b5050505050905090565b600061096382611de2565b610980576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109a782611148565b9050336001600160a01b038216146109e0576109c38133610806565b6109e0576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a6f5760405162461bcd60e51b8152600401610a6690612a26565b60405180910390fd5b8051610a8290600d906020840190612437565b5050565b6008546001600160a01b03163314610ab05760405162461bcd60e51b8152600401610a6690612a26565b6013805460ff1916911515919091179055565b600154600054036000190190565b6000610adc82611e17565b9050836001600160a01b0316816001600160a01b031614610b0f5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610b5c57610b3f8633610806565b610b5c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b8357604051633a954ecd60e21b815260040160405180910390fd5b8015610b8e57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610c195760018401600081815260046020526040902054610c17576000548114610c175760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b03163314610c8d5760405162461bcd60e51b8152600401610a6690612a26565b60026009541415610ce05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a66565b60026009556000735870f14442fade3f06cd277d22057476db38dfdf6064610d0947601e612a71565b610d139190612a90565b604051600081818185875af1925050503d8060008114610d4f576040519150601f19603f3d011682016040523d82523d6000602084013e610d54565b606091505b5050905080610d6257600080fd5b600073d3d8c8b39e5cbc2b48bba4ffe06b6feab2bc33146064610d8647601e612a71565b610d909190612a90565b604051600081818185875af1925050503d8060008114610dcc576040519150601f19603f3d011682016040523d82523d6000602084013e610dd1565b606091505b5050905080610ddf57600080fd5b600073a9e848a557bad7c4f78daa0c2dbc479852e62a2e6064610e03476019612a71565b610e0d9190612a90565b604051600081818185875af1925050503d8060008114610e49576040519150601f19603f3d011682016040523d82523d6000602084013e610e4e565b606091505b5050905080610e5c57600080fd5b6000736ad637e2b23fb8296a437bb539f7eca2c0a4c6d26064610e8047600f612a71565b610e8a9190612a90565b604051600081818185875af1925050503d8060008114610ec6576040519150601f19603f3d011682016040523d82523d6000602084013e610ecb565b606091505b5050905080610ed957600080fd5b6000610eed6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5050905080610f4a57600080fd5b50506001600955505050565b610f7183838360405180602001604052806000815250611723565b505050565b6008546001600160a01b03163314610fa05760405162461bcd60e51b8152600401610a6690612a26565b600f55565b6008546001600160a01b03163314610fcf5760405162461bcd60e51b8152600401610a6690612a26565b8051610a8290600e906020840190612437565b600d8054610fef906129eb565b80601f016020809104026020016040519081016040528092919081815260200182805461101b906129eb565b80156110685780601f1061103d57610100808354040283529160200191611068565b820191906000526020600020905b81548152906001019060200180831161104b57829003601f168201915b505050505081565b6060816000816001600160401b0381111561108d5761108d6125cd565b6040519080825280602002602001820160405280156110df57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816110ab5790505b50905060005b8281146111325761110d86868381811061110157611101612ab2565b905060200201356117d9565b82828151811061111f5761111f612ab2565b60209081029190910101526001016110e5565b50949350505050565b600c8054610fef906129eb565b60006108c082611e17565b60006001600160a01b03821661117c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111cb5760405162461bcd60e51b8152600401610a6690612a26565b6111d56000611e80565b565b6008546001600160a01b031633146112015760405162461bcd60e51b8152600401610a6690612a26565b600a55565b6008546001600160a01b031633146112305760405162461bcd60e51b8152600401610a6690612a26565b8051610a8290600c906020840190612437565b6060600080600061125385611153565b90506000816001600160401b0381111561126f5761126f6125cd565b604051908082528060200260200182016040528015611298578160200160208202803683370190505b5090506112c560408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614611346576112d881611ed2565b91508160400151156112e95761133e565b81516001600160a01b0316156112fe57815194505b876001600160a01b0316856001600160a01b0316141561133e578083878060010198508151811061133157611331612ab2565b6020026020010181815250505b6001016112c8565b50909695505050505050565b6060600380546108d5906129eb565b606081831061138357604051631960ccad60e11b815260040160405180910390fd5b60008061138f60005490565b9050600185101561139f57600194505b808411156113ab578093505b60006113b687611153565b9050848610156113d557858503818110156113cf578091505b506113d9565b5060005b6000816001600160401b038111156113f3576113f36125cd565b60405190808252806020026020018201604052801561141c578160200160208202803683370190505b5090508161142f5793506114e592505050565b600061143a886117d9565b90506000816040015161144b575080515b885b88811415801561145d5750848714155b156114d95761146b81611ed2565b925082604001511561147c576114d1565b82516001600160a01b03161561149157825191505b8a6001600160a01b0316826001600160a01b031614156114d157808488806001019950815181106114c4576114c4612ab2565b6020026020010181815250505b60010161144d565b50505092835250909150505b9392505050565b806000811180156114ff57506011548111155b61151b5760405162461bcd60e51b8152600401610a6690612ac8565b60125460105461152b9190612af6565b81611534610ac3565b61153e9190612b0d565b111561155c5760405162461bcd60e51b8152600401610a6690612b25565b8180600f5461156b9190612a71565b3410156115b05760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610a66565b60135460ff16156116035760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610a66565b610f713384611f0e565b6001600160a01b0382163314156116375760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e8054610fef906129eb565b6008546001600160a01b031633146116da5760405162461bcd60e51b8152600401610a6690612a26565b601155565b6008546001600160a01b031633146117095760405162461bcd60e51b8152600401610a6690612a26565b601380549115156101000261ff0019909216919091179055565b61172e848484610ad1565b6001600160a01b0383163b156117675761174a84848484611f28565b611767576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117975760405162461bcd60e51b8152600401610a6690612a26565b6010546117a2610ac3565b6117ad906001612b0d565b11156117cb5760405162461bcd60e51b8152600401610a6690612b25565b6117d6816001611f0e565b50565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152600183108061183257506000548310155b1561183d5792915050565b61184683611ed2565b90508060400151156118585792915050565b6114e583612020565b606061186c82611de2565b6118d05760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a66565b60135462010000900460ff1661197257600e80546118ed906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611919906129eb565b80156119665780601f1061193b57610100808354040283529160200191611966565b820191906000526020600020905b81548152906001019060200180831161194957829003601f168201915b50505050509050919050565b600061197c612055565b9050600081511161199c57604051806020016040528060008152506114e5565b806119a684612064565b600d6040516020016119ba93929190612b53565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146119fa5760405162461bcd60e51b8152600401610a6690612a26565b601255565b82600081118015611a1257506011548111155b611a2e5760405162461bcd60e51b8152600401610a6690612ac8565b601254601054611a3e9190612af6565b81611a47610ac3565b611a519190612b0d565b1115611a6f5760405162461bcd60e51b8152600401610a6690612b25565b8380600f54611a7e9190612a71565b341015611ac35760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610a66565b601354610100900460ff16611b255760405162461bcd60e51b815260206004820152602260248201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604482015261642160f01b6064820152608401610a66565b336000908152600b602052604090205460ff1615611b855760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610a66565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bff85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506121ca565b611c3c5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610a66565b336000818152600b60205260409020805460ff19166001179055610c5b9087611f0e565b6008546001600160a01b03163314611c8a5760405162461bcd60e51b8152600401610a6690612a26565b60138054911515620100000262ff000019909216919091179055565b81600081118015611cb957506011548111155b611cd55760405162461bcd60e51b8152600401610a6690612ac8565b601254601054611ce59190612af6565b81611cee610ac3565b611cf89190612b0d565b1115611d165760405162461bcd60e51b8152600401610a6690612b25565b6008546001600160a01b03163314611d405760405162461bcd60e51b8152600401610a6690612a26565b610f718284611f0e565b6008546001600160a01b03163314611d745760405162461bcd60e51b8152600401610a6690612a26565b6001600160a01b038116611dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a66565b6117d681611e80565b600081600111158015611df6575060005482105b80156108c0575050600090815260046020526040902054600160e01b161590565b60008180600111611e6757600054811015611e6757600081815260046020526040902054600160e01b8116611e65575b806114e5575060001901600081815260046020526040902054611e47565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546108c0906121e0565b610a82828260405180602001604052806000815250612227565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f5d903390899088908890600401612c17565b602060405180830381600087803b158015611f7757600080fd5b505af1925050508015611fa7575060408051601f3d908101601f19168201909252611fa491810190612c54565b60015b612002573d808015611fd5576040519150601f19603f3d011682016040523d82523d6000602084013e611fda565b606091505b508051611ffa576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526108c061205083611e17565b6121e0565b6060600c80546108d5906129eb565b606060018272184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b81106120a7576040919091019072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90045b6d04ee2d6d415b85acef810000000081106120d557602091909101906d04ee2d6d415b85acef810000000090045b662386f26fc1000081106120f55760109190910190662386f26fc1000090045b6305f5e100811061210f57600891909101906305f5e10090045b6127108110612125576004919091019061271090045b606481106121395760029190910190606490045b600a8110612148576001820191505b6000826001600160401b03811115612162576121626125cd565b6040519080825280601f01601f19166020018201604052801561218c576020820181803683370190505b5090508281016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a87061a8153600a86049550856121c557611132565b612196565b6000826121d78584612294565b14949350505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6122318383612340565b6001600160a01b0383163b15610f71576000548281035b61225b6000868380600101945086611f28565b612278576040516368d2bf6b60e11b815260040160405180910390fd5b81811061224857816000541461228d57600080fd5b5050505050565b600081815b84518110156123385760008582815181106122b6576122b6612ab2565b602002602001015190508083116122f8576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612325565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061233081612c71565b915050612299565b509392505050565b600054816123615760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461241057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016123d8565b508161242e57604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054612443906129eb565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e57805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612490565b506124b79291506124bb565b5090565b5b808211156124b757600081556001016124bc565b6001600160e01b0319811681146117d657600080fd5b6000602082840312156124f857600080fd5b81356114e5816124d0565b60005b8381101561251e578181015183820152602001612506565b838111156117675750506000910152565b60008151808452612547816020860160208601612503565b601f01601f19169290920160200192915050565b6020815260006114e5602083018461252f565b60006020828403121561258057600080fd5b5035919050565b80356001600160a01b038116811461259e57600080fd5b919050565b600080604083850312156125b657600080fd5b6125bf83612587565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156125fd576125fd6125cd565b604051601f8501601f19908116603f01168101908282118183101715612625576126256125cd565b8160405280935085815286868601111561263e57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561266a57600080fd5b81356001600160401b0381111561268057600080fd5b8201601f8101841361269157600080fd5b612018848235602084016125e3565b8035801515811461259e57600080fd5b6000602082840312156126c257600080fd5b6114e5826126a0565b6000806000606084860312156126e057600080fd5b6126e984612587565b92506126f760208501612587565b9150604084013590509250925092565b60008083601f84011261271957600080fd5b5081356001600160401b0381111561273057600080fd5b6020830191508360208260051b850101111561274b57600080fd5b9250929050565b6000806020838503121561276557600080fd5b82356001600160401b0381111561277b57600080fd5b61278785828601612707565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015611346576127fe838551612793565b92840192608092909201916001016127eb565b60006020828403121561282357600080fd5b6114e582612587565b6020808252825182820181905260009190848201906040850190845b8181101561134657835183529284019291840191600101612848565b60008060006060848603121561287957600080fd5b61288284612587565b95602085013595506040909401359392505050565b600080604083850312156128aa57600080fd5b6128b383612587565b91506128c1602084016126a0565b90509250929050565b600080600080608085870312156128e057600080fd5b6128e985612587565b93506128f760208601612587565b92506040850135915060608501356001600160401b0381111561291957600080fd5b8501601f8101871361292a57600080fd5b612939878235602084016125e3565b91505092959194509250565b608081016108c08284612793565b60008060006040848603121561296857600080fd5b8335925060208401356001600160401b0381111561298557600080fd5b61299186828701612707565b9497909650939450505050565b600080604083850312156129b157600080fd5b6129ba83612587565b91506128c160208401612587565b600080604083850312156129db57600080fd5b823591506128c160208401612587565b600181811c908216806129ff57607f821691505b60208210811415612a2057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612a8b57612a8b612a5b565b500290565b600082612aad57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b600082821015612b0857612b08612a5b565b500390565b60008219821115612b2057612b20612a5b565b500190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b600084516020612b668285838a01612503565b855191840191612b798184848a01612503565b8554920191600090600181811c9080831680612b9657607f831692505b858310811415612bb457634e487b7160e01b85526022600452602485fd5b808015612bc85760018114612bd957612c06565b60ff19851688528388019550612c06565b60008b81526020902060005b85811015612bfe5781548a820152908401908801612be5565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c4a9083018461252f565b9695505050505050565b600060208284031215612c6657600080fd5b81516114e5816124d0565b6000600019821415612c8557612c85612a5b565b506001019056fea2646970667358221220facd34ba18c84ee6a929bfca3bf327d003516ade0607aa736ed59bfd57971b1d64736f6c63430008090033

Deployed Bytecode Sourcemap

74580:5808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21410:689;;;;;;;;;;-1:-1:-1;21410:689:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;21410:689:0;;;;;;;;22362:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29251:268::-;;;;;;;;;;-1:-1:-1;29251:268:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;29251:268:0;1528:203:1;28692:400:0;;;;;;;;;;-1:-1:-1;28692:400:0;;;;;:::i;:::-;;:::i;:::-;;74900:19;;;;;;;;;;;;;;;;;;;2319:25:1;;;2307:2;2292:18;74900:19:0;2173:177:1;78887:106:0;;;;;;;;;;-1:-1:-1;78887:106:0;;;;;:::i;:::-;;:::i;79001:83::-;;;;;;;;;;-1:-1:-1;79001:83:0;;;;;:::i;:::-;;:::i;17935:323::-;;;;;;;;;;;;;:::i;33090:2995::-;;;;;;;;;;-1:-1:-1;33090:2995:0;;;;;:::i;:::-;;:::i;74696:25::-;;;;;;;;;;;;;;;;79323:944;;;;;;;;;;;;;:::i;36181:185::-;;;;;;;;;;-1:-1:-1;36181:185:0;;;;;:::i;:::-;;:::i;78202:80::-;;;;;;;;;;-1:-1:-1;78202:80:0;;;;;:::i;:::-;;:::i;78604:161::-;;;;;;;;;;-1:-1:-1;78604:161:0;;;;;:::i;:::-;;:::i;75114:28::-;;;;;;;;;;-1:-1:-1;75114:28:0;;;;;;;;;;;74820:33;;;;;;;;;;;;;:::i;57057:560::-;;;;;;;;;;-1:-1:-1;57057:560:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;75035:25::-;;;;;;;;;;-1:-1:-1;75035:25:0;;;;;;;;74785:28;;;;;;;;;;;;;:::i;23852:202::-;;;;;;;;;;-1:-1:-1;23852:202:0;;;;;:::i;:::-;;:::i;75067:40::-;;;;;;;;;;-1:-1:-1;75067:40:0;;;;;;;;;;;19119:283;;;;;;;;;;-1:-1:-1;19119:283:0;;;;;:::i;:::-;;:::i;64691:103::-;;;;;;;;;;;;;:::i;79092:104::-;;;;;;;;;;-1:-1:-1;79092:104:0;;;;;:::i;:::-;;:::i;78773:106::-;;;;;;;;;;-1:-1:-1;78773:106:0;;;;;:::i;:::-;;:::i;61031:1016::-;;;;;;;;;;-1:-1:-1;61031:1016:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64040:87::-;;;;;;;;;;-1:-1:-1;64113:6:0;;-1:-1:-1;;;;;64113:6:0;64040:87;;74957:33;;;;;;;;;;;;;;;;22538:104;;;;;;;;;;;;;:::i;58005:2579::-;;;;;;;;;;-1:-1:-1;58005:2579:0;;;;;:::i;:::-;;:::i;76609:263::-;;;;;;:::i;:::-;;:::i;29859:340::-;;;;;;;;;;-1:-1:-1;29859:340:0;;;;;:::i;:::-;;:::i;74860:31::-;;;;;;;;;;;;;:::i;78290:159::-;;;;;;;;;;-1:-1:-1;78290:159:0;;;;;:::i;:::-;;:::i;79204:111::-;;;;;;;;;;-1:-1:-1;79204:111:0;;;;;:::i;:::-;;:::i;36964:399::-;;;;;;;;;;-1:-1:-1;36964:399:0;;;;;:::i;:::-;;:::i;76880:174::-;;;;;;;;;;-1:-1:-1;76880:174:0;;;;;:::i;:::-;;:::i;56420:478::-;;;;;;;;;;-1:-1:-1;56420:478:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77372:727::-;;;;;;;;;;-1:-1:-1;77372:727:0;;;;;:::i;:::-;;:::i;78457:139::-;;;;;;;;;;-1:-1:-1;78457:139:0;;;;;:::i;:::-;;:::i;75911:690::-;;;;;;:::i;:::-;;:::i;74926:24::-;;;;;;;;;;;;;;;;74728:48;;;;;;;;;;-1:-1:-1;74728:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;78107:87;;;;;;;;;;-1:-1:-1;78107:87:0;;;;;:::i;:::-;;:::i;30356:214::-;;;;;;;;;;-1:-1:-1;30356:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;30527:25:0;;;30498:4;30527:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30356:214;77062:193;;;;;;;;;;-1:-1:-1;77062:193:0;;;;;:::i;:::-;;:::i;64949:238::-;;;;;;;;;;-1:-1:-1;64949:238:0;;;;;:::i;:::-;;:::i;21410:689::-;21540:4;-1:-1:-1;;;;;;;;;21869:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;21946:25:0;;;21869:102;:179;;;-1:-1:-1;;;;;;;;;;22023:25:0;;;21869:179;21849:199;21410:689;-1:-1:-1;;21410:689:0:o;22362:100::-;22416:13;22449:5;22442:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22362:100;:::o;29251:268::-;29372:7;29402:16;29410:7;29402;:16::i;:::-;29397:64;;29427:34;;-1:-1:-1;;;29427:34:0;;;;;;;;;;;29397:64;-1:-1:-1;29481:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;29481:30:0;;29251:268::o;28692:400::-;28773:13;28789:16;28797:7;28789;:16::i;:::-;28773:32;-1:-1:-1;53590:10:0;-1:-1:-1;;;;;28822:28:0;;;28818:175;;28870:44;28887:5;53590:10;30356:214;:::i;28870:44::-;28865:128;;28942:35;;-1:-1:-1;;;28942:35:0;;;;;;;;;;;28865:128;29005:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;29005:35:0;-1:-1:-1;;;;;29005:35:0;;;;;;;;;29056:28;;29005:24;;29056:28;;;;;;;28762:330;28692:400;;:::o;78887:106::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;;;;;;;;;78963:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;78887:106:::0;:::o;79001:83::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;79061:6:::1;:15:::0;;-1:-1:-1;;79061:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;79001:83::o;17935:323::-;77355:1;18209:12;17996:7;18193:13;:28;-1:-1:-1;;18193:46:0;;17935:323::o;33090:2995::-;33224:27;33254;33273:7;33254:18;:27::i;:::-;33224:57;;33339:4;-1:-1:-1;;;;;33298:45:0;33314:19;-1:-1:-1;;;;;33298:45:0;;33294:99;;33365:28;;-1:-1:-1;;;33365:28:0;;;;;;;;;;;33294:99;33421:27;32204:24;;;:15;:24;;;;;32426:26;;53590:10;31829:30;;;-1:-1:-1;;;;;31522:28:0;;31807:20;;;31804:56;33630:287;;33813:43;33830:4;53590:10;30356:214;:::i;33813:43::-;33808:109;;33882:35;;-1:-1:-1;;;33882:35:0;;;;;;;;;;;33808:109;-1:-1:-1;;;;;33934:16:0;;33930:52;;33959:23;;-1:-1:-1;;;33959:23:0;;;;;;;;;;;33930:52;34131:15;34128:160;;;34271:1;34250:19;34243:30;34128:160;-1:-1:-1;;;;;34668:24:0;;;;;;;:18;:24;;;;;;34666:26;;-1:-1:-1;;34666:26:0;;;34737:22;;;;;;;;;34735:24;;-1:-1:-1;34735:24:0;;;27504:11;27479:23;27475:41;27427:112;-1:-1:-1;;;27427:112:0;35030:26;;;;:17;:26;;;;;:196;-1:-1:-1;;;35346:47:0;;35342:627;;35451:1;35441:11;;35419:19;35574:30;;;:17;:30;;;;;;35570:384;;35712:13;;35697:11;:28;35693:242;;35859:30;;;;:17;:30;;;;;:52;;;35693:242;35400:569;35342:627;36016:7;36012:2;-1:-1:-1;;;;;35997:27:0;36006:4;-1:-1:-1;;;;;35997:27:0;;;;;;;;;;;36035:42;33213:2872;;;33090:2995;;;:::o;79323:944::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;69645:1:::1;70243:7;;:19;;70235:63;;;::::0;-1:-1:-1;;;70235:63:0;;10860:2:1;70235:63:0::1;::::0;::::1;10842:21:1::0;10899:2;10879:18;;;10872:30;10938:33;10918:18;;;10911:61;10989:18;;70235:63:0::1;10658:355:1::0;70235:63:0::1;69645:1;70376:7;:18:::0;79385:6:::2;79405:42;79506:3;79476:26;:21;79500:2;79476:26;:::i;:::-;79475:34;;;;:::i;:::-;79397:127;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79384:140;;;79543:1;79535:10;;;::::0;::::2;;79559:6;79579:42;79680:3;79650:26;:21;79674:2;79650:26;:::i;:::-;79649:34;;;;:::i;:::-;79571:127;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79558:140;;;79717:1;79709:10;;;::::0;::::2;;79733:6;79753:42;79854:3;79824:26;:21;79848:2;79824:26;:::i;:::-;79823:34;;;;:::i;:::-;79745:127;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79732:140;;;79891:1;79883:10;;;::::0;::::2;;79907:6;79927:42;80028:3;79998:26;:21;80022:2;79998:26;:::i;:::-;79997:34;;;;:::i;:::-;79919:127;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79906:140;;;80065:1;80057:10;;;::::0;::::2;;80081:6;80101:7;64113:6:::0;;-1:-1:-1;;;;;64113:6:0;;64040:87;80101:7:::2;-1:-1:-1::0;;;;;80093:21:0::2;80122;80093:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80080:68;;;80167:1;80159:10;;;::::0;::::2;;-1:-1:-1::0;;69601:1:0::1;70555:7;:22:::0;-1:-1:-1;;;79323:944:0:o;36181:185::-;36319:39;36336:4;36342:2;36346:7;36319:39;;;;;;;;;;;;:16;:39::i;:::-;36181:185;;;:::o;78202:80::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78262:4:::1;:12:::0;78202:80::o;78604:161::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78719:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;74820:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57057:560::-;57201:23;57292:8;57267:22;57292:8;-1:-1:-1;;;;;57359:68:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57359:68:0;;-1:-1:-1;;57359:68:0;;;;;;;;;;;;57322:105;;57447:9;57442:125;57463:14;57458:1;:19;57442:125;;57519:32;57539:8;;57548:1;57539:11;;;;;;;:::i;:::-;;;;;;;57519:19;:32::i;:::-;57503:10;57514:1;57503:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;57479:3;;57442:125;;;-1:-1:-1;57588:10:0;57057:560;-1:-1:-1;;;;57057:560:0:o;74785:28::-;;;;;;;:::i;23852:202::-;23969:7;24017:27;24036:7;24017:18;:27::i;19119:283::-;19236:7;-1:-1:-1;;;;;19265:19:0;;19261:60;;19293:28;;-1:-1:-1;;;19293:28:0;;;;;;;;;;;19261:60;-1:-1:-1;;;;;;19339:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;19339:55:0;;19119:283::o;64691:103::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;64756:30:::1;64783:1;64756:18;:30::i;:::-;64691:103::o:0;79092:104::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;79164:10:::1;:24:::0;79092:104::o;78773:106::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78849:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;61031:1016::-:0;61154:16;61213:19;61247:25;61287:22;61312:16;61322:5;61312:9;:16::i;:::-;61287:41;;61343:25;61385:14;-1:-1:-1;;;;;61371:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61371:29:0;;61343:57;;61415:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61415:31:0;77355:1;61461:538;61545:14;61530:11;:29;61461:538;;61628:15;61641:1;61628:12;:15::i;:::-;61616:27;;61666:9;:16;;;61662:73;;;61707:8;;61662:73;61757:14;;-1:-1:-1;;;;;61757:28:0;;61753:111;;61830:14;;;-1:-1:-1;61753:111:0;61907:5;-1:-1:-1;;;;;61886:26:0;:17;-1:-1:-1;;;;;61886:26:0;;61882:102;;;61963:1;61937:8;61946:13;;;;;;61937:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;61882:102;61578:3;;61461:538;;;-1:-1:-1;62020:8:0;;61031:1016;-1:-1:-1;;;;;;61031:1016:0:o;22538:104::-;22594:13;22627:7;22620:14;;;;;:::i;58005:2579::-;58148:16;58215:4;58206:5;:13;58202:45;;58228:19;;-1:-1:-1;;;58228:19:0;;;;;;;;;;;58202:45;58262:19;58296:17;58316:14;17677:7;17704:13;;17622:103;58316:14;58296:34;-1:-1:-1;77355:1:0;58408:5;:23;58404:87;;;77355:1;58452:23;;58404:87;58567:9;58560:4;:16;58556:73;;;58604:9;58597:16;;58556:73;58643:25;58671:16;58681:5;58671:9;:16::i;:::-;58643:44;;58865:4;58857:5;:12;58853:278;;;58912:12;;;58947:31;;;58943:111;;;59023:11;59003:31;;58943:111;58871:198;58853:278;;;-1:-1:-1;59114:1:0;58853:278;59145:25;59187:17;-1:-1:-1;;;;;59173:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59173:32:0;-1:-1:-1;59145:60:0;-1:-1:-1;59224:22:0;59220:78;;59274:8;-1:-1:-1;59267:15:0;;-1:-1:-1;;;59267:15:0;59220:78;59442:31;59476:26;59496:5;59476:19;:26::i;:::-;59442:60;;59517:25;59762:9;:16;;;59757:92;;-1:-1:-1;59819:14:0;;59757:92;59898:5;59863:544;59927:4;59922:1;:9;;:45;;;;;59950:17;59935:11;:32;;59922:45;59863:544;;;60036:15;60049:1;60036:12;:15::i;:::-;60024:27;;60074:9;:16;;;60070:73;;;60115:8;;60070:73;60165:14;;-1:-1:-1;;;;;60165:28:0;;60161:111;;60238:14;;;-1:-1:-1;60161:111:0;60315:5;-1:-1:-1;;;;;60294:26:0;:17;-1:-1:-1;;;;;60294:26:0;;60290:102;;;60371:1;60345:8;60354:13;;;;;;60345:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;60290:102;59986:3;;59863:544;;;-1:-1:-1;;;60492:29:0;;;-1:-1:-1;60499:8:0;;-1:-1:-1;;58005:2579:0;;;;;;:::o;76609:263::-;76701:11;75508:1;75494:11;:15;:52;;;;;75528:18;;75513:11;:33;;75494:52;75472:122;;;;-1:-1:-1;;;75472:122:0;;;;;;;:::i;:::-;75670:13;;75658:9;;:25;;;;:::i;:::-;75643:11;75627:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:56;;75605:126;;;;-1:-1:-1;;;75605:126:0;;;;;;;:::i;:::-;76743:11:::1;75848;75841:4;;:18;;;;:::i;:::-;75828:9;:31;;75820:63;;;::::0;-1:-1:-1;;;75820:63:0;;13182:2:1;75820:63:0::1;::::0;::::1;13164:21:1::0;13221:2;13201:18;;;13194:30;-1:-1:-1;;;13240:18:1;;;13233:49;13299:18;;75820:63:0::1;12980:343:1::0;75820:63:0::1;76781:6:::2;::::0;::::2;;76780:7;76772:43;;;::::0;-1:-1:-1;;;76772:43:0;;13530:2:1;76772:43:0::2;::::0;::::2;13512:21:1::0;13569:2;13549:18;;;13542:30;13608:25;13588:18;;;13581:53;13651:18;;76772:43:0::2;13328:347:1::0;76772:43:0::2;76828:36;53590:10:::0;76852:11:::2;76828:9;:36::i;29859:340::-:0;-1:-1:-1;;;;;29990:31:0;;53590:10;29990:31;29986:61;;;30030:17;;-1:-1:-1;;;30030:17:0;;;;;;;;;;;29986:61;53590:10;30060:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;30060:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;30060:60:0;;;;;;;;;;30136:55;;540:41:1;;;30060:49:0;;53590:10;30136:55;;513:18:1;30136:55:0;;;;;;;29859:340;;:::o;74860:31::-;;;;;;;:::i;78290:159::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78401:18:::1;:40:::0;78290:159::o;79204:111::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;79278:20:::1;:29:::0;;;::::1;;;;-1:-1:-1::0;;79278:29:0;;::::1;::::0;;;::::1;::::0;;79204:111::o;36964:399::-;37131:31;37144:4;37150:2;37154:7;37131:12;:31::i;:::-;-1:-1:-1;;;;;37177:14:0;;;:19;37173:183;;37216:56;37247:4;37253:2;37257:7;37266:5;37216:30;:56::i;:::-;37211:145;;37300:40;;-1:-1:-1;;;37300:40:0;;;;;;;;;;;37211:145;36964:399;;;;:::o;76880:174::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;76978:9:::1;;76957:13;:11;:13::i;:::-;:17;::::0;76973:1:::1;76957:17;:::i;:::-;:30;;76949:63;;;;-1:-1:-1::0;;;76949:63:0::1;;;;;;;:::i;:::-;77023:23;77033:9;77044:1;77023:9;:23::i;:::-;76880:174:::0;:::o;56420:478::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77355:1:0;56634:7;:25;:54;;;-1:-1:-1;17677:7:0;17704:13;56663:7;:25;;56634:54;56630:103;;;56712:9;56420:478;-1:-1:-1;;56420:478:0:o;56630:103::-;56755:21;56768:7;56755:12;:21::i;:::-;56743:33;;56791:9;:16;;;56787:65;;;56831:9;56420:478;-1:-1:-1;;56420:478:0:o;56787:65::-;56869:21;56882:7;56869:12;:21::i;77372:727::-;77491:13;77544:17;77552:8;77544:7;:17::i;:::-;77522:114;;;;-1:-1:-1;;;77522:114:0;;13882:2:1;77522:114:0;;;13864:21:1;13921:2;13901:18;;;13894:30;13960:34;13940:18;;;13933:62;-1:-1:-1;;;14011:18:1;;;14004:45;14066:19;;77522:114:0;13680:411:1;77522:114:0;77653:8;;;;;;;77649:74;;77694:17;77687:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77372:727;;;:::o;77649:74::-;77735:28;77766:10;:8;:10::i;:::-;77735:41;;77838:1;77813:14;77807:28;:32;:284;;;;;;;;;;;;;;;;;77931:14;77972:19;:8;:17;:19::i;:::-;78018:9;77888:162;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77787:304;77372:727;-1:-1:-1;;;77372:727:0:o;78457:139::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78558:13:::1;:30:::0;78457:139::o;75911:690::-;76045:11;75508:1;75494:11;:15;:52;;;;;75528:18;;75513:11;:33;;75494:52;75472:122;;;;-1:-1:-1;;;75472:122:0;;;;;;;:::i;:::-;75670:13;;75658:9;;:25;;;;:::i;:::-;75643:11;75627:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:56;;75605:126;;;;-1:-1:-1;;;75605:126:0;;;;;;;:::i;:::-;76087:11:::1;75848;75841:4;;:18;;;;:::i;:::-;75828:9;:31;;75820:63;;;::::0;-1:-1:-1;;;75820:63:0;;13182:2:1;75820:63:0::1;::::0;::::1;13164:21:1::0;13221:2;13201:18;;;13194:30;-1:-1:-1;;;13240:18:1;;;13233:49;13299:18;;75820:63:0::1;12980:343:1::0;75820:63:0::1;76166:20:::2;::::0;::::2;::::0;::::2;;;76158:67;;;::::0;-1:-1:-1;;;76158:67:0;;15956:2:1;76158:67:0::2;::::0;::::2;15938:21:1::0;15995:2;15975:18;;;15968:30;16034:34;16014:18;;;16007:62;-1:-1:-1;;;16085:18:1;;;16078:32;16127:19;;76158:67:0::2;15754:398:1::0;76158:67:0::2;53590:10:::0;76245:30:::2;::::0;;;:16:::2;:30;::::0;;;;;::::2;;76244:31;76236:68;;;::::0;-1:-1:-1;;;76236:68:0;;16359:2:1;76236:68:0::2;::::0;::::2;16341:21:1::0;16398:2;16378:18;;;16371:30;16437:26;16417:18;;;16410:54;16481:18;;76236:68:0::2;16157:348:1::0;76236:68:0::2;76340:30;::::0;-1:-1:-1;;53590:10:0;16659:2:1;16655:15;16651:53;76340:30:0::2;::::0;::::2;16639:66:1::0;76315:12:0::2;::::0;16721::1;;76340:30:0::2;;;;;;;;;;;;76330:41;;;;;;76315:56;;76404:50;76423:12;;76404:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;76437:10:0::2;::::0;;-1:-1:-1;76449:4:0;;-1:-1:-1;76404:18:0::2;:50::i;:::-;76382:114;;;::::0;-1:-1:-1;;;76382:114:0;;16946:2:1;76382:114:0::2;::::0;::::2;16928:21:1::0;16985:2;16965:18;;;16958:30;-1:-1:-1;;;17004:18:1;;;16997:44;17058:18;;76382:114:0::2;16744:338:1::0;76382:114:0::2;53590:10:::0;76509:30:::2;::::0;;;:16:::2;:30;::::0;;;;:37;;-1:-1:-1;;76509:37:0::2;76542:4;76509:37;::::0;;76557:36:::2;::::0;76581:11;76557:9:::2;:36::i;78107:87::-:0;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78169:8:::1;:17:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;78169:17:0;;::::1;::::0;;;::::1;::::0;;78107:87::o;77062:193::-;77166:11;75508:1;75494:11;:15;:52;;;;;75528:18;;75513:11;:33;;75494:52;75472:122;;;;-1:-1:-1;;;75472:122:0;;;;;;;:::i;:::-;75670:13;;75658:9;;:25;;;;:::i;:::-;75643:11;75627:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:56;;75605:126;;;;-1:-1:-1;;;75605:126:0;;;;;;;:::i;:::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23:::1;64252:68;;;;-1:-1:-1::0;;;64252:68:0::1;;;;;;;:::i;:::-;77214:33:::2;77224:9;77235:11;77214:9;:33::i;64949:238::-:0;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65052:22:0;::::1;65030:110;;;::::0;-1:-1:-1;;;65030:110:0;;17289:2:1;65030:110:0::1;::::0;::::1;17271:21:1::0;17328:2;17308:18;;;17301:30;17367:34;17347:18;;;17340:62;-1:-1:-1;;;17418:18:1;;;17411:36;17464:19;;65030:110:0::1;17087:402:1::0;65030:110:0::1;65151:28;65170:8;65151:18;:28::i;30828:282::-:0;30893:4;30949:7;77355:1;30930:26;;:66;;;;;30983:13;;30973:7;:23;30930:66;:153;;;;-1:-1:-1;;31034:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;31034:44:0;:49;;30828:282::o;25139:1307::-;25233:7;25273;;77355:1;25322:23;25318:1061;;25375:13;;25368:4;:20;25364:1015;;;25413:14;25430:23;;;:17;:23;;;;;;-1:-1:-1;;;25519:24:0;;25515:845;;26184:113;26191:11;26184:113;;-1:-1:-1;;;26262:6:0;26244:25;;;;:17;:25;;;;;;26184:113;;25515:845;25390:989;25364:1015;26407:31;;-1:-1:-1;;;26407:31:0;;;;;;;;;;;65347:191;65440:6;;;-1:-1:-1;;;;;65457:17:0;;;-1:-1:-1;;;;;;65457:17:0;;;;;;;65490:40;;65440:6;;;65457:17;65440:6;;65490:40;;65421:16;;65490:40;65410:128;65347:191;:::o;24546:202::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24715:24:0;;;;:17;:24;;;;;;24696:44;;:18;:44::i;47116:112::-;47193:27;47203:2;47207:8;47193:27;;;;;;;;;;;;:9;:27::i;39447:831::-;39644:171;;-1:-1:-1;;;39644:171:0;;39610:4;;-1:-1:-1;;;;;39644:45:0;;;;;:171;;53590:10;;39746:4;;39769:7;;39795:5;;39644:171;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39644:171:0;;;;;;;;-1:-1:-1;;39644:171:0;;;;;;;;;;;;:::i;:::-;;;39627:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40029:13:0;;40025:235;;40075:40;;-1:-1:-1;;;40075:40:0;;;;;;;;;;;40025:235;40218:6;40212:13;40203:6;40199:2;40195:15;40188:38;39627:644;-1:-1:-1;;;;;;39888:81:0;-1:-1:-1;;;39888:81:0;;-1:-1:-1;39627:644:0;39447:831;;;;;;:::o;24243:207::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24395:47:0;24414:27;24433:7;24414:18;:27::i;:::-;24395:18;:47::i;80275:110::-;80335:13;80368:9;80361:16;;;;;:::i;70928:1666::-;70984:13;71052:1;71149:5;-1:-1:-1;;;71173:19:0;;71169:110;;71261:2;71251:12;;;;;-1:-1:-1;;;71213:19:0;;71169:110;71310:6;71297:9;:19;71293:110;;71385:2;71375:12;;;;;71350:6;71337:19;;71293:110;71434:6;71421:9;:19;71417:110;;71509:2;71499:12;;;;;71474:6;71461:19;;71417:110;71558:5;71545:9;:18;71541:107;;71631:1;71621:11;;;;;71597:5;71584:18;;71541:107;71679:5;71666:9;:18;71662:107;;71752:1;71742:11;;;;;71718:5;71705:18;;71662:107;71800:5;71787:9;:18;71783:107;;71873:1;71863:11;;;;;71839:5;71826:18;;71783:107;71921:5;71908:9;:18;71904:70;;71957:1;71947:11;;;;71904:70;72038:20;72072:6;-1:-1:-1;;;;;72061:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72061:18:0;-1:-1:-1;72038:41:0;-1:-1:-1;72203:28:0;;;72219:2;72203:28;72260:288;-1:-1:-1;;72292:5:0;-1:-1:-1;;;72429:2:0;72418:14;;72413:30;72292:5;72400:44;72490:2;72481:11;;;-1:-1:-1;72515:10:0;72511:21;;72527:5;;72511:21;72260:288;;66457:190;66582:4;66635;66606:25;66619:5;66626:4;66606:12;:25::i;:::-;:33;;66457:190;-1:-1:-1;;;;66457:190:0:o;26545:398::-;-1:-1:-1;;;;;;;;;;;;;26687:41:0;;;;13937:3;26773:33;;;-1:-1:-1;;;;;26739:68:0;-1:-1:-1;;;26739:68:0;-1:-1:-1;;;26837:24:0;;:29;;-1:-1:-1;;;26818:48:0;;;;14458:3;26906:28;;;;-1:-1:-1;;;26877:58:0;-1:-1:-1;26545:398:0:o;46152:880::-;46283:19;46289:2;46293:8;46283:5;:19::i;:::-;-1:-1:-1;;;;;46344:14:0;;;:19;46340:674;;46384:11;46398:13;46446:14;;;46479:424;46536:205;46605:1;46638:2;46671:7;;;;;;46709:5;46536:30;:205::i;:::-;46505:358;;46799:40;;-1:-1:-1;;;46799:40:0;;;;;;;;;;;46505:358;46898:3;46890:5;:11;46479:424;;46985:3;46968:13;;:20;46964:34;;46990:8;;;46964:34;46365:649;;46152:880;;;:::o;67009:813::-;67119:7;67167:4;67119:7;67182:603;67206:5;:12;67202:1;:16;67182:603;;;67240:20;67263:5;67269:1;67263:8;;;;;;;;:::i;:::-;;;;;;;67240:31;;67306:12;67290;:28;67286:488;;67465:44;;;;;;18399:19:1;;;18434:12;;;18427:28;;;18471:12;;67465:44:0;;;;;;;;;;;;67433:95;;;;;;67418:110;;67286:488;;;67695:44;;;;;;18399:19:1;;;18434:12;;;18427:28;;;18471:12;;67695:44:0;;;;;;;;;;;;67663:95;;;;;;67648:110;;67286:488;-1:-1:-1;67220:3:0;;;;:::i;:::-;;;;67182:603;;;-1:-1:-1;67802:12:0;67009:813;-1:-1:-1;;;67009:813:0:o;40740:2509::-;40813:20;40836:13;40864;40860:44;;40886:18;;-1:-1:-1;;;40886:18:0;;;;;;;;;;;40860:44;-1:-1:-1;;;;;41392:22:0;;;;;;:18;:22;;;;13416:2;41392:22;;;:105;;41464:32;41435:62;;41392:105;;;41740:31;;;:17;:31;;;;;-1:-1:-1;27981:15:0;;27955:24;27951:46;27504:11;27479:23;27475:41;27472:52;27427:112;;41740:194;;41996:23;;;;41740:31;;41392:22;;42495:25;41392:22;;42348:335;42763:1;42749:12;42745:20;42703:346;42804:3;42795:7;42792:16;42703:346;;43022:7;43012:8;43009:1;42982:25;42979:1;42976;42971:59;42857:1;42844:15;42703:346;;;-1:-1:-1;43082:13:0;43078:45;;43104:19;;-1:-1:-1;;;43104:19:0;;;;;;;;;;;43078:45;43140:13;:19;-1:-1:-1;36181: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:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:127::-;2416:10;2411:3;2407:20;2404:1;2397:31;2447:4;2444:1;2437:15;2471:4;2468:1;2461:15;2487:632;2552:5;-1:-1:-1;;;;;2623:2:1;2615:6;2612:14;2609:40;;;2629:18;;:::i;:::-;2704:2;2698:9;2672:2;2758:15;;-1:-1:-1;;2754:24:1;;;2780:2;2750:33;2746:42;2734:55;;;2804:18;;;2824:22;;;2801:46;2798:72;;;2850:18;;:::i;:::-;2890:10;2886:2;2879:22;2919:6;2910:15;;2949:6;2941;2934:22;2989:3;2980:6;2975:3;2971:16;2968:25;2965:45;;;3006:1;3003;2996:12;2965:45;3056:6;3051:3;3044:4;3036:6;3032:17;3019:44;3111:1;3104:4;3095:6;3087;3083:19;3079:30;3072:41;;;;2487:632;;;;;:::o;3124:451::-;3193:6;3246:2;3234:9;3225:7;3221:23;3217:32;3214:52;;;3262:1;3259;3252:12;3214:52;3302:9;3289:23;-1:-1:-1;;;;;3327:6:1;3324:30;3321:50;;;3367:1;3364;3357:12;3321:50;3390:22;;3443:4;3435:13;;3431:27;-1:-1:-1;3421:55:1;;3472:1;3469;3462:12;3421:55;3495:74;3561:7;3556:2;3543:16;3538:2;3534;3530:11;3495:74;:::i;3580:160::-;3645:20;;3701:13;;3694:21;3684:32;;3674:60;;3730:1;3727;3720:12;3745:180;3801:6;3854:2;3842:9;3833:7;3829:23;3825:32;3822:52;;;3870:1;3867;3860:12;3822:52;3893:26;3909:9;3893:26;:::i;3930:328::-;4007:6;4015;4023;4076:2;4064:9;4055:7;4051:23;4047:32;4044:52;;;4092:1;4089;4082:12;4044:52;4115:29;4134:9;4115:29;:::i;:::-;4105:39;;4163:38;4197:2;4186:9;4182:18;4163:38;:::i;:::-;4153:48;;4248:2;4237:9;4233:18;4220:32;4210:42;;3930:328;;;;;:::o;4445:367::-;4508:8;4518:6;4572:3;4565:4;4557:6;4553:17;4549:27;4539:55;;4590:1;4587;4580:12;4539:55;-1:-1:-1;4613:20:1;;-1:-1:-1;;;;;4645:30:1;;4642:50;;;4688:1;4685;4678:12;4642:50;4725:4;4717:6;4713:17;4701:29;;4785:3;4778:4;4768:6;4765:1;4761:14;4753:6;4749:27;4745:38;4742:47;4739:67;;;4802:1;4799;4792:12;4739:67;4445:367;;;;;:::o;4817:437::-;4903:6;4911;4964:2;4952:9;4943:7;4939:23;4935:32;4932:52;;;4980:1;4977;4970:12;4932:52;5020:9;5007:23;-1:-1:-1;;;;;5045:6:1;5042:30;5039:50;;;5085:1;5082;5075:12;5039:50;5124:70;5186:7;5177:6;5166:9;5162:22;5124:70;:::i;:::-;5213:8;;5098:96;;-1:-1:-1;4817:437:1;-1:-1:-1;;;;4817:437:1:o;5259:349::-;5343:12;;-1:-1:-1;;;;;5339:38:1;5327:51;;5431:4;5420:16;;;5414:23;-1:-1:-1;;;;;5410:48:1;5394:14;;;5387:72;5522:4;5511:16;;;5505:23;5498:31;5491:39;5475:14;;;5468:63;5584:4;5573:16;;;5567:23;5592:8;5563:38;5547:14;;5540:62;5259:349::o;5613:720::-;5844:2;5896:21;;;5966:13;;5869:18;;;5988:22;;;5815:4;;5844:2;6067:15;;;;6041:2;6026:18;;;5815:4;6110:197;6124:6;6121:1;6118:13;6110:197;;;6173:52;6221:3;6212:6;6206:13;6173:52;:::i;:::-;6282:15;;;;6254:4;6245:14;;;;;6146:1;6139:9;6110:197;;6338:186;6397:6;6450:2;6438:9;6429:7;6425:23;6421:32;6418:52;;;6466:1;6463;6456:12;6418:52;6489:29;6508:9;6489:29;:::i;6714:632::-;6885:2;6937:21;;;7007:13;;6910:18;;;7029:22;;;6856:4;;6885:2;7108:15;;;;7082:2;7067:18;;;6856:4;7151:169;7165:6;7162:1;7159:13;7151:169;;;7226:13;;7214:26;;7295:15;;;;7260:12;;;;7187:1;7180:9;7151:169;;7351:322;7428:6;7436;7444;7497:2;7485:9;7476:7;7472:23;7468:32;7465:52;;;7513:1;7510;7503:12;7465:52;7536:29;7555:9;7536:29;:::i;:::-;7526:39;7612:2;7597:18;;7584:32;;-1:-1:-1;7663:2:1;7648:18;;;7635:32;;7351:322;-1:-1:-1;;;7351:322:1:o;7678:254::-;7743:6;7751;7804:2;7792:9;7783:7;7779:23;7775:32;7772:52;;;7820:1;7817;7810:12;7772:52;7843:29;7862:9;7843:29;:::i;:::-;7833:39;;7891:35;7922:2;7911:9;7907:18;7891:35;:::i;:::-;7881:45;;7678:254;;;;;:::o;7937:667::-;8032:6;8040;8048;8056;8109:3;8097:9;8088:7;8084:23;8080:33;8077:53;;;8126:1;8123;8116:12;8077:53;8149:29;8168:9;8149:29;:::i;:::-;8139:39;;8197:38;8231:2;8220:9;8216:18;8197:38;:::i;:::-;8187:48;;8282:2;8271:9;8267:18;8254:32;8244:42;;8337:2;8326:9;8322:18;8309:32;-1:-1:-1;;;;;8356:6:1;8353:30;8350:50;;;8396:1;8393;8386:12;8350:50;8419:22;;8472:4;8464:13;;8460:27;-1:-1:-1;8450:55:1;;8501:1;8498;8491:12;8450:55;8524:74;8590:7;8585:2;8572:16;8567:2;8563;8559:11;8524:74;:::i;:::-;8514:84;;;7937:667;;;;;;;:::o;8609:264::-;8803:3;8788:19;;8816:51;8792:9;8849:6;8816:51;:::i;8878:505::-;8973:6;8981;8989;9042:2;9030:9;9021:7;9017:23;9013:32;9010:52;;;9058:1;9055;9048:12;9010:52;9094:9;9081:23;9071:33;;9155:2;9144:9;9140:18;9127:32;-1:-1:-1;;;;;9174:6:1;9171:30;9168:50;;;9214:1;9211;9204:12;9168:50;9253:70;9315:7;9306:6;9295:9;9291:22;9253:70;:::i;:::-;8878:505;;9342:8;;-1:-1:-1;9227:96:1;;-1:-1:-1;;;;8878:505:1:o;9388:260::-;9456:6;9464;9517:2;9505:9;9496:7;9492:23;9488:32;9485:52;;;9533:1;9530;9523:12;9485:52;9556:29;9575:9;9556:29;:::i;:::-;9546:39;;9604:38;9638:2;9627:9;9623:18;9604:38;:::i;9653:254::-;9721:6;9729;9782:2;9770:9;9761:7;9757:23;9753:32;9750:52;;;9798:1;9795;9788:12;9750:52;9834:9;9821:23;9811:33;;9863:38;9897:2;9886:9;9882:18;9863:38;:::i;9912:380::-;9991:1;9987:12;;;;10034;;;10055:61;;10109:4;10101:6;10097:17;10087:27;;10055:61;10162:2;10154:6;10151:14;10131:18;10128:38;10125:161;;;10208:10;10203:3;10199:20;10196:1;10189:31;10243:4;10240:1;10233:15;10271:4;10268:1;10261:15;10125:161;;9912:380;;;:::o;10297:356::-;10499:2;10481:21;;;10518:18;;;10511:30;10577:34;10572:2;10557:18;;10550:62;10644:2;10629:18;;10297:356::o;11018:127::-;11079:10;11074:3;11070:20;11067:1;11060:31;11110:4;11107:1;11100:15;11134:4;11131:1;11124:15;11150:168;11190:7;11256:1;11252;11248:6;11244:14;11241:1;11238:21;11233:1;11226:9;11219:17;11215:45;11212:71;;;11263:18;;:::i;:::-;-1:-1:-1;11303:9:1;;11150:168::o;11455:217::-;11495:1;11521;11511:132;;11565:10;11560:3;11556:20;11553:1;11546:31;11600:4;11597:1;11590:15;11628:4;11625:1;11618:15;11511:132;-1:-1:-1;11657:9:1;;11455:217::o;11887:127::-;11948:10;11943:3;11939:20;11936:1;11929:31;11979:4;11976:1;11969:15;12003:4;12000:1;11993:15;12019:344;12221:2;12203:21;;;12260:2;12240:18;;;12233:30;-1:-1:-1;;;12294:2:1;12279:18;;12272:50;12354:2;12339:18;;12019:344::o;12368:125::-;12408:4;12436:1;12433;12430:8;12427:34;;;12441:18;;:::i;:::-;-1:-1:-1;12478:9:1;;12368:125::o;12498:128::-;12538:3;12569:1;12565:6;12562:1;12559:13;12556:39;;;12575:18;;:::i;:::-;-1:-1:-1;12611:9:1;;12498:128::o;12631:344::-;12833:2;12815:21;;;12872:2;12852:18;;;12845:30;-1:-1:-1;;;12906:2:1;12891:18;;12884:50;12966:2;12951:18;;12631:344::o;14222:1527::-;14446:3;14484:6;14478:13;14510:4;14523:51;14567:6;14562:3;14557:2;14549:6;14545:15;14523:51;:::i;:::-;14637:13;;14596:16;;;;14659:55;14637:13;14596:16;14681:15;;;14659:55;:::i;:::-;14803:13;;14736:20;;;14776:1;;14863;14885:18;;;;14938;;;;14965:93;;15043:4;15033:8;15029:19;15017:31;;14965:93;15106:2;15096:8;15093:16;15073:18;15070:40;15067:167;;;-1:-1:-1;;;15133:33:1;;15189:4;15186:1;15179:15;15219:4;15140:3;15207:17;15067:167;15250:18;15277:110;;;;15401:1;15396:328;;;;15243:481;;15277:110;-1:-1:-1;;15312:24:1;;15298:39;;15357:20;;;;-1:-1:-1;15277:110:1;;15396:328;14169:1;14162:14;;;14206:4;14193:18;;15491:1;15505:169;15519:8;15516:1;15513:15;15505:169;;;15601:14;;15586:13;;;15579:37;15644:16;;;;15536:10;;15505:169;;;15509:3;;15705:8;15698:5;15694:20;15687:27;;15243:481;-1:-1:-1;15740:3:1;;14222:1527;-1:-1:-1;;;;;;;;;;;14222:1527:1:o;17494:489::-;-1:-1:-1;;;;;17763:15:1;;;17745:34;;17815:15;;17810:2;17795:18;;17788:43;17862:2;17847:18;;17840:34;;;17910:3;17905:2;17890:18;;17883:31;;;17688:4;;17931:46;;17957:19;;17949:6;17931:46;:::i;:::-;17923:54;17494:489;-1:-1:-1;;;;;;17494:489:1:o;17988:249::-;18057:6;18110:2;18098:9;18089:7;18085:23;18081:32;18078:52;;;18126:1;18123;18116:12;18078:52;18158:9;18152:16;18177:30;18201:5;18177:30;:::i;18494:135::-;18533:3;-1:-1:-1;;18554:17:1;;18551:43;;;18574:18;;:::i;:::-;-1:-1:-1;18621:1:1;18610:13;;18494:135::o

Swarm Source

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