ETH Price: $3,292.35 (-9.49%)

Token

r0cket flippers (r0cket)
 

Overview

Max Total Supply

168 r0cket

Holders

73

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
sh4rd.eth
Balance
2 r0cket
0x47C658B1Dd43fa98149650a25b238BD42b9D811a
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:
r0cketflippers

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 1300 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
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();

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

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

    // ==============================
    //            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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

    /**
     * @dev 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 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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 => address) private _tokenApprovals;

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

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

    /**
     * @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 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 {
        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;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @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 See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _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 '';
    }

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _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 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 {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` 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 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        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 Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function 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) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(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++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try 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))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        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 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;
    }

    /**
     * @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 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 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 returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 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: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

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

// File: erc721a/contracts/extensions/IERC721AQueryable.sol


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

pragma solidity ^0.8.4;


/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
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`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    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 pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

// File: erc721a/contracts/extensions/ERC721AQueryable.sol


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

pragma solidity ^0.8.4;



/**
 * @title ERC721A Queryable
 * @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 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[] memory tokenIds) external view 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 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 pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view 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/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

// File: @openzeppelin/contracts/interfaces/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol)

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

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


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

pragma solidity ^0.8.0;


/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
    /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: contracts/r0cketflippers.sol

/*
        _______          __           __      _____.__  .__                                   
_______ \   _  \   ____ |  | __ _____/  |_  _/ ____\  | |__|_____ ______   ___________  ______
\_  __ \/  /_\  \_/ ___\|  |/ // __ \   __\ \   __\|  | |  \____ \\____ \_/ __ \_  __ \/  ___/
 |  | \/\  \_/   \  \___|    <\  ___/|  |    |  |  |  |_|  |  |_> >  |_> >  ___/|  | \/\___ \ 
 |__|    \_____  /\___  >__|_ \\___  >__|    |__|  |____/__|   __/|   __/ \___  >__|  /____  >
               \/     \/     \/    \/                      |__|   |__|        \/           \/ 
*/

// Developer - ReservedSnow








// File: contracts/interfaces/ILayerZeroUserApplicationConfig.sol

pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint256 _configType,
        bytes calldata _config
    ) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress)
        external;
}

// File: contracts/interfaces/ILayerZeroEndpoint.sol

pragma solidity >=0.5.0;

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(
        uint16 _dstChainId,
        bytes calldata _destination,
        bytes calldata _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes calldata _adapterParams
    ) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        address _dstAddress,
        uint64 _nonce,
        uint256 _gasLimit,
        bytes calldata _payload
    ) external;

    // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress)
        external
        view
        returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress)
        external
        view
        returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(
        uint16 _dstChainId,
        address _userApplication,
        bytes calldata _payload,
        bool _payInZRO,
        bytes calldata _adapterParam
    ) external view returns (uint256 nativeFee, uint256 zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        bytes calldata _payload
    ) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress)
        external
        view
        returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication)
        external
        view
        returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication)
        external
        view
        returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(
        uint16 _version,
        uint16 _chainId,
        address _userApplication,
        uint256 _configType
    ) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication)
        external
        view
        returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication)
        external
        view
        returns (uint16);
}

// File: contracts/interfaces/ILayerZeroReceiver.sol

pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) external;
}

// File: contracts/NonblockingReceiver.sol

pragma solidity ^0.8.6;

abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {
    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint256 payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint256 => FailedMessages)))
        public failedMessages;
    mapping(uint16 => bytes) public trustedRemoteLookup;

    event MessageFailed(
        uint16 _srcChainId,
        bytes _srcAddress,
        uint64 _nonce,
        bytes _payload
    );

    function lzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(
            _srcAddress.length == trustedRemoteLookup[_srcChainId].length &&
                keccak256(_srcAddress) ==
                keccak256(trustedRemoteLookup[_srcChainId]),
            "NonblockingReceiver: invalid source sending contract"
        );

        // try-catch all errors/exceptions
        // having failed messages does not block messages passing
        try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(
                _payload.length,
                keccak256(_payload)
            );
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function onLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) public {
        // only internal transaction
        require(
            msg.sender == address(this),
            "NonblockingReceiver: caller must be Bridge."
        );

        // handle incoming message
        _LzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function
    function _LzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual;

    function _lzSend(
        uint16 _dstChainId,
        bytes memory _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _txParam
    ) internal {
        endpoint.send{value: msg.value}(
            _dstChainId,
            trustedRemoteLookup[_dstChainId],
            _payload,
            _refundAddress,
            _zroPaymentAddress,
            _txParam
        );
    }

    function retryMessage(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) external payable {
        // assert there is message to retry
        FailedMessages storage failedMsg = failedMessages[_srcChainId][
            _srcAddress
        ][_nonce];
        require(
            failedMsg.payloadHash != bytes32(0),
            "NonblockingReceiver: no stored message"
        );
        require(
            _payload.length == failedMsg.payloadLength &&
                keccak256(_payload) == failedMsg.payloadHash,
            "LayerZero: invalid payload"
        );
        // clear the stored message
        failedMsg.payloadLength = 0;
        failedMsg.payloadHash = bytes32(0);
        // execute the message. revert if it fails again
        this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote)
        external
        onlyOwner
    {
        trustedRemoteLookup[_chainId] = _trustedRemote;
    }
}

pragma solidity >=0.8.13 <0.9.0;

contract r0cketflippers is ERC721A, Ownable, ReentrancyGuard, NonblockingReceiver {

  using Strings for uint256;

// ================== Variables Start =======================
  
  // reveal uri - p.s set it in contructor (if sniper proof, else put some dummy text and set the actual revealed uri just before reveal)
  string public uri;
  string public uriSuffix = ".json";

  // hidden uri - replace it with yours
  string public hiddenMetadataUri = "ipfs://CID/filename.json";

  // prices - replace it with yours
  uint256 public price = 0.02022 ether;
  uint256 public freeprice = 0 ether;

  // supply - replace it with yours
  uint256 public tokenIDStart = 1016; // starting token id
  uint256 public supplyLimit = 1006; // limit

  // max per tx - replace it with yours
  uint256 public maxMintAmountPerTx = 1;

  // max per wallet - replace it with yours
  uint256 public maxLimitPerWallet = 50;

  // enabled
  bool public kickflipSale = false;
  bool public publicSale = false;

  // bridge enable/ disable

  bool public bridgeable = false;

  // claim mapping
  mapping(address => bool) public kickflipClaimed;

  // reveal
  bool public revealed = true;

  // gasForDestinationLzReceive
  uint256 gasForDestinationLzReceive = 350000;

  // collection address
  address public FreeMintCollection = 0x0D87D35Dc73056484E4E41300A810Dc58aD1D668;

// ================== Variables End =======================  

// ================== Constructor Start =======================

  // Token NAME and SYMBOL - Replace it with yours
  constructor(
    string memory _uri,
    address _layerZeroEndpoint
  ) ERC721A("r0cket flippers", "r0cket")  {
    seturi(_uri);
    endpoint = ILayerZeroEndpoint(_layerZeroEndpoint);
  }

// ================== Constructor End =======================

// ================== Mint Functions Start =======================


  function Kickflip(uint256 _mintAmount) public payable {

    // Verify collection requirements
    IERC721 collection = IERC721(FreeMintCollection);
    uint256 holderbalance;
    if(collection.balanceOf(msg.sender) == 0) {
      holderbalance = 0;
    }
    else {
      holderbalance = collection.balanceOf(msg.sender);
    }  

    // Normal requirements 
    require(kickflipSale, 'The kickflipSale is paused!');
    require(holderbalance != 0, 'You dont own any tokens');
    require(_mintAmount > 0 && _mintAmount <= holderbalance, 'Free Mint Exceeded');
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    require(msg.value >= freeprice * _mintAmount, 'Insufficient funds!');
    require(!kickflipClaimed[_msgSender()], 'Address already claimed!');

    kickflipClaimed[_msgSender()] = true;
     
    // Mint
     _safeMint(_msgSender(), _mintAmount);
  }

  function PublicMint(uint256 _mintAmount) public payable {
    
    // Normal requirements 
    require(publicSale, 'The PublicSale is paused!');
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    require(balanceOf(msg.sender) + _mintAmount <= maxLimitPerWallet, 'Max mint per wallet exceeded!');
    require(msg.value >= price * _mintAmount, 'Insufficient funds!');
     
    // Mint
     _safeMint(_msgSender(), _mintAmount);
  }  

  function Airdrop(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    _safeMint(_receiver, _mintAmount);
  }

// ================== Mint Functions End =======================  

// ================== Set Functions Start =======================

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

// uri
  function seturi(string memory _uri) public onlyOwner {
    uri = _uri;
  }

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

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

// sales toggle
  function setpublicSale(bool _publicSale) public onlyOwner {
    publicSale = _publicSale;
  }

  function setkickflipSale(bool _state) public onlyOwner {
    kickflipSale = _state;
  }

// bridge toggle
  function setBridgeStatus(bool _state) public onlyOwner {
    bridgeable = _state;
  }

// max per tx
  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }


// pax per wallet
  function setmaxLimitPerWallet(uint256 _maxLimitPerWallet) public onlyOwner {
    maxLimitPerWallet = _maxLimitPerWallet;
  }

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

  function setfreeprice(uint256 _price) public onlyOwner {
    freeprice = _price;
  }  


// supply limit
  function setsupplyLimit(uint256 _supplyLimit) public onlyOwner {
    supplyLimit = _supplyLimit;
  }

// collection address
  function setFreeMintCollectionAddress(address _contractaddress) public onlyOwner {
    FreeMintCollection = _contractaddress;
  }  

// ================== Set Functions End =======================

// ================== Withdraw Function Start =======================
  
  function withdraw() public onlyOwner nonReentrant {
    //owner withdraw
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
  }

function donate() external payable {
        // thank you
    }
// ================== Withdraw Function End=======================  

// ================== Read Functions Start =======================

function tokensOfOwner(address owner) external view returns (uint256[] memory) {
    unchecked {
        uint256[] memory a = new uint256[](balanceOf(owner)); 
        uint256 end = _nextTokenId();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;
        for (uint256 i; i < end; i++) {
            TokenOwnership memory ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                a[tokenIdsIdx++] = i;
            }
        }
        return a;    
    }
}

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

  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 _baseURI() internal view virtual override returns (string memory) {
    return uri;
  }

// ================== Read Functions End =======================

// ================== Layer Zero Stuff Start =======================

    // This function transfers the nft from your address on the
    // source chain to the same address on the destination chain
    function traverseChains(uint16 _chainId, uint256 tokenId) public payable {
        require(
            msg.sender == ownerOf(tokenId),
            "You must own the token to traverse"
        );
        require(
            trustedRemoteLookup[_chainId].length > 0,
            "This chain is currently unavailable for travel"
        );

        // burn NFT, eliminating it from circulation on src chain
        _burn(tokenId);

        // abi.encode() the payload with the values to send
        bytes memory payload = abi.encode(msg.sender, tokenId);

        // encode adapterParams to specify more gas for the destination
        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(
            version,
            gasForDestinationLzReceive
        );

        // get the fees we need to pay to LayerZero + Relayer to cover message delivery
        // you will be refunded for extra gas paid
        (uint256 messageFee, ) = endpoint.estimateFees(
            _chainId,
            address(this),
            payload,
            false,
            adapterParams
        );

        require(
            msg.value >= messageFee,
            "r0cket flippers: msg.value not enough to cover messageFee. Send gas for message fees"
        );

        require(bridgeable, 'The bridge is paused!');

        endpoint.send{value: msg.value}(
            _chainId, // destination chainId
            trustedRemoteLookup[_chainId], // destination address of nft contract
            payload, // abi.encoded()'ed bytes
            payable(msg.sender), // refund address
            address(0x0), // 'zroPaymentAddress' unused for this
            adapterParams // txParameters
        );
    }

        function _LzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal override {
        // decode
        (address toAddr, uint256 tokenId) = abi.decode(
            _payload,
            (address, uint256)
        );

        // mint the tokens back into existence on destination chain
        _safeMint(toAddr, tokenId);
    }

    // just in case this fixed variable limits us from future integrations
    function setGasForDestinationLzReceive(uint256 newVal) external onlyOwner {
        gasForDestinationLzReceive = newVal;
    }    

// ================== Layer Zero Stuff End =======================

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"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":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","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":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"FreeMintCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"Kickflip","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"","type":"address"}],"name":"kickflipClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kickflipSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","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":"bool","name":"_state","type":"bool"}],"name":"setBridgeStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractaddress","type":"address"}],"name":"setFreeMintCollectionAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setfreeprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setkickflipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLimitPerWallet","type":"uint256"}],"name":"setmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSale","type":"bool"}],"name":"setpublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyLimit","type":"uint256"}],"name":"setsupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"seturi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"tokenIDStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600e91906200028e565b506040805180820190915260188082527f697066733a2f2f4349442f66696c656e616d652e6a736f6e000000000000000060209092019182526200006f91600f916200028e565b506647d5fb9d5bc00060105560006011556103f86012556103ee6013556001601481905560326015556016805462ffffff191690556018805460ff1916909117905562055730601955601a80546001600160a01b031916730d87d35dc73056484e4e41300a810dc58ad1d668179055348015620000eb57600080fd5b50604051620040a4380380620040a48339810160408190526200010e9162000367565b604080518082018252600f81526e7230636b657420666c69707065727360881b6020808301918252835180850190945260068452651c8c18dad95d60d21b90840152815191929162000163916002916200028e565b508051620001799060039060208401906200028e565b5050601254600055506200018d33620001c4565b60016009556200019d8262000216565b600a80546001600160a01b0319166001600160a01b03929092169190911790555062000494565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620002755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200028a90600d9060208401906200028e565b5050565b8280546200029c9062000458565b90600052602060002090601f016020900481019282620002c057600085556200030b565b82601f10620002db57805160ff19168380011785556200030b565b828001600101855582156200030b579182015b828111156200030b578251825591602001919060010190620002ee565b50620003199291506200031d565b5090565b5b808211156200031957600081556001016200031e565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200036257600080fd5b919050565b600080604083850312156200037b57600080fd5b82516001600160401b03808211156200039357600080fd5b818501915085601f830112620003a857600080fd5b815181811115620003bd57620003bd62000334565b604051601f8201601f19908116603f01168101908382118183101715620003e857620003e862000334565b816040528281526020935088848487010111156200040557600080fd5b600091505b828210156200042957848201840151818301850152908301906200040a565b828211156200043b5760008484830101525b95506200044d9150508582016200034a565b925050509250929050565b600181811c908216806200046d57607f821691505b6020821081036200048e57634e487b7160e01b600052602260045260246000fd5b50919050565b613c0080620004a46000396000f3fe60806040526004361061038a5760003560e01c80637512ecfd116101dc578063b071401b11610102578063e0a80853116100a0578063ed88c68e1161006f578063ed88c68e146103af578063f2fde38b14610a63578063f4fb584614610a83578063f648498014610ab357600080fd5b8063e0a80853146109c5578063e985e9c5146109e5578063eac989f814610a2e578063eb8d72b714610a4357600080fd5b8063cf89fa03116100dc578063cf89fa031461095f578063d1deba1f14610972578063d58a848314610985578063d9f0a671146109a557600080fd5b8063b071401b146108ff578063b88d4fde1461091f578063c87b56dd1461093f57600080fd5b806391b7f5ed1161017a5780639fb17e34116101495780639fb17e34146108a1578063a035b1fe146108b4578063a22cb465146108ca578063a45ba8e7146108ea57600080fd5b806391b7f5ed1461083657806394354fd014610856578063943fb8721461086c57806395d89b411461088c57600080fd5b8063801903a4116101b6578063801903a4146107665780638462151c146107805780638da5cb5b146107ad5780638ee74912146107cb57600080fd5b80637512ecfd146107105780637533d788146107265780637871e1541461074657600080fd5b80633fbc67c5116102c15780635503a0e81161025f5780636352211e1161022e5780636352211e146106a857806370a08231146106c8578063715018a6146106e85780637454430b146106fd57600080fd5b80635503a0e81461063d578063596cf96e146106525780635a0b8b23146106725780635c22abd21461068857600080fd5b80634deb86751161029b5780634deb8675146105cd5780634fdd43cb146105e35780635183022714610603578063530da8ef1461061d57600080fd5b80633fbc67c51461056d57806340e1c23c1461058d57806342842e0e146105ad57600080fd5b806318160ddd1161032e57806323b872dd1161030857806323b872dd146104f957806331d97bc31461051957806333bc1c5c146105395780633ccfd60b1461055857600080fd5b806318160ddd146104a057806319d1997a146104c35780631c37a822146104d957600080fd5b806306fdde031161036a57806306fdde0314610406578063081812fc14610428578063095ea7b31461046057806316ba10e01461048057600080fd5b80621d35671461038f57806275770a146103b157806301ffc9a7146103d1575b600080fd5b34801561039b57600080fd5b506103af6103aa3660046131e8565b610ad3565b005b3480156103bd57600080fd5b506103af6103cc36600461326d565b610cd7565b3480156103dd57600080fd5b506103f16103ec36600461329c565b610d24565b60405190151581526020015b60405180910390f35b34801561041257600080fd5b5061041b610dc1565b6040516103fd9190613311565b34801561043457600080fd5b5061044861044336600461326d565b610e53565b6040516001600160a01b0390911681526020016103fd565b34801561046c57600080fd5b506103af61047b366004613339565b610eb0565b34801561048c57600080fd5b506103af61049b366004613365565b610f76565b3480156104ac57600080fd5b506104b5610fd5565b6040519081526020016103fd565b3480156104cf57600080fd5b506104b560135481565b3480156104e557600080fd5b506103af6104f43660046131e8565b610fed565b34801561050557600080fd5b506103af6105143660046133ae565b61106e565b34801561052557600080fd5b50601a54610448906001600160a01b031681565b34801561054557600080fd5b506016546103f190610100900460ff1681565b34801561056457600080fd5b506103af611244565b34801561057957600080fd5b506103af6105883660046133ef565b61135c565b34801561059957600080fd5b506103af6105a836600461341c565b6113d3565b3480156105b957600080fd5b506103af6105c83660046133ae565b61142e565b3480156105d957600080fd5b506104b560125481565b3480156105ef57600080fd5b506103af6105fe366004613365565b61144e565b34801561060f57600080fd5b506018546103f19060ff1681565b34801561062957600080fd5b506016546103f19062010000900460ff1681565b34801561064957600080fd5b5061041b6114a9565b34801561065e57600080fd5b506103af61066d36600461326d565b611537565b34801561067e57600080fd5b506104b560155481565b34801561069457600080fd5b506103af6106a336600461341c565b611584565b3480156106b457600080fd5b506104486106c336600461326d565b6115e6565b3480156106d457600080fd5b506104b56106e33660046133ef565b6115f1565b3480156106f457600080fd5b506103af611659565b6103af61070b36600461326d565b6116ad565b34801561071c57600080fd5b506104b560115481565b34801561073257600080fd5b5061041b610741366004613437565b6119db565b34801561075257600080fd5b506103af610761366004613452565b6119f4565b34801561077257600080fd5b506016546103f19060ff1681565b34801561078c57600080fd5b506107a061079b3660046133ef565b611aaa565b6040516103fd9190613482565b3480156107b957600080fd5b506008546001600160a01b0316610448565b3480156107d757600080fd5b506108216107e63660046134c6565b600b60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016103fd565b34801561084257600080fd5b506103af61085136600461326d565b611b9c565b34801561086257600080fd5b506104b560145481565b34801561087857600080fd5b506103af61088736600461326d565b611be9565b34801561089857600080fd5b5061041b611c36565b6103af6108af36600461326d565b611c45565b3480156108c057600080fd5b506104b560105481565b3480156108d657600080fd5b506103af6108e536600461351d565b611e2d565b3480156108f657600080fd5b5061041b611edb565b34801561090b57600080fd5b506103af61091a36600461326d565b611ee8565b34801561092b57600080fd5b506103af61093a366004613552565b611f35565b34801561094b57600080fd5b5061041b61095a36600461326d565b611f79565b6103af61096d3660046135b2565b6120f6565b6103af610980366004613617565b6124ae565b34801561099157600080fd5b506103af6109a036600461341c565b612653565b3480156109b157600080fd5b506103af6109c036600461326d565b6126b7565b3480156109d157600080fd5b506103af6109e036600461341c565b612704565b3480156109f157600080fd5b506103f1610a003660046136a3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a3a57600080fd5b5061041b61275f565b348015610a4f57600080fd5b506103af610a5e3660046136d1565b61276c565b348015610a6f57600080fd5b506103af610a7e3660046133ef565b6127d2565b348015610a8f57600080fd5b506103f1610a9e3660046133ef565b60176020526000908152604090205460ff1681565b348015610abf57600080fd5b506103af610ace366004613365565b61289f565b600a546001600160a01b03163314610aea57600080fd5b61ffff84166000908152600c602052604090208054610b0890613724565b90508351148015610b47575061ffff84166000908152600c6020526040908190209051610b3591906137cd565b60405180910390208380519060200120145b610bbe5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560448201527f7263652073656e64696e6720636f6e747261637400000000000000000000000060648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a82290610be79087908790879087906004016137d9565b600060405180830381600087803b158015610c0157600080fd5b505af1925050508015610c12575060015b610cd1576040518060400160405280825181526020018280519060200120815250600b60008661ffff1661ffff16815260200190815260200160002084604051610c5c9190613823565b90815260408051918290036020908101832067ffffffffffffffff8716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610cc89086908690869086906137d9565b60405180910390a15b50505050565b6008546001600160a01b03163314610d1f5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601355565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610d8757507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610dbb57507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060028054610dd090613724565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfc90613724565b8015610e495780601f10610e1e57610100808354040283529160200191610e49565b820191906000526020600020905b815481529060010190602001808311610e2c57829003601f168201915b5050505050905090565b6000610e5e826128fa565b610e94576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ebb826115e6565b9050336001600160a01b03821614610f0d57610ed78133610a00565b610f0d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610fbe5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600e906020840190613000565b5050565b6000610fe060125490565b6001546000540303905090565b3330146110625760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201527f206265204272696467652e0000000000000000000000000000000000000000006064820152608401610bb5565b610cd184848484612936565b60006110798261295b565b9050836001600160a01b0316816001600160a01b0316146110c6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040902080546110f28187335b6001600160a01b039081169116811491141790565b61111d576111008633610a00565b61111d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661115d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801561116857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036111fa576001840160008181526004602052604081205490036111f85760005481146111f85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b0316331461128c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6002600954036112de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb5565b600260095560006112f76008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611341576040519150601f19603f3d011682016040523d82523d6000602084013e611346565b606091505b505090508061135457600080fd5b506001600955565b6008546001600160a01b031633146113a45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461141b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6016805460ff1916911515919091179055565b61144983838360405180602001604052806000815250611f35565b505050565b6008546001600160a01b031633146114965760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600f906020840190613000565b600e80546114b690613724565b80601f01602080910402602001604051908101604052809291908181526020018280546114e290613724565b801561152f5780601f106115045761010080835404028352916020019161152f565b820191906000526020600020905b81548152906001019060200180831161151257829003601f168201915b505050505081565b6008546001600160a01b0316331461157f5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601155565b6008546001600160a01b031633146115cc5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601680549115156101000261ff0019909216919091179055565b6000610dbb8261295b565b60006001600160a01b038216611633576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146116a15760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6116ab60006129ea565b565b601a546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156116fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171e919061383f565b60000361172d57506000611798565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611795919061383f565b90505b60165460ff166117ea5760405162461bcd60e51b815260206004820152601b60248201527f546865206b69636b666c697053616c65206973207061757365642100000000006044820152606401610bb5565b8060000361183a5760405162461bcd60e51b815260206004820152601760248201527f596f7520646f6e74206f776e20616e7920746f6b656e730000000000000000006044820152606401610bb5565b60008311801561184a5750808311155b6118965760405162461bcd60e51b815260206004820152601260248201527f46726565204d696e7420457863656564656400000000000000000000000000006044820152606401610bb5565b601354836118a2610fd5565b6118ac919061386e565b11156118fa5760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b826011546119089190613886565b3410156119575760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610bb5565b3360009081526017602052604090205460ff16156119b75760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610bb5565b336000818152601760205260409020805460ff191660011790556114499084612a49565b600c60205260009081526040902080546114b690613724565b6008546001600160a01b03163314611a3c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b60135482611a48610fd5565b611a52919061386e565b1115611aa05760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b610fd18183612a49565b60606000611ab7836115f1565b67ffffffffffffffff811115611acf57611acf613124565b604051908082528060200260200182016040528015611af8578160200160208202803683370190505b5090506000611b0660005490565b905060008060005b83811015611b91576000611b2182612a63565b9050806040015115611b335750611b89565b80516001600160a01b031615611b4857805192505b876001600160a01b0316836001600160a01b031603611b875781868580600101965081518110611b7a57611b7a6138a5565b6020026020010181815250505b505b600101611b0e565b509295945050505050565b6008546001600160a01b03163314611be45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601055565b6008546001600160a01b03163314611c315760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601955565b606060038054610dd090613724565b601654610100900460ff16611c9c5760405162461bcd60e51b815260206004820152601960248201527f546865205075626c696353616c652069732070617573656421000000000000006044820152606401610bb5565b600081118015611cae57506014548111155b611cfa5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006044820152606401610bb5565b60135481611d06610fd5565b611d10919061386e565b1115611d5e5760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b60155481611d6b336115f1565b611d75919061386e565b1115611dc35760405162461bcd60e51b815260206004820152601d60248201527f4d6178206d696e74207065722077616c6c6574206578636565646564210000006044820152606401610bb5565b80601054611dd19190613886565b341015611e205760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610bb5565b611e2a3382612a49565b50565b336001600160a01b03831603611e6f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f80546114b690613724565b6008546001600160a01b03163314611f305760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601455565b611f4084848461106e565b6001600160a01b0383163b15610cd157611f5c84848484612ae2565b610cd1576040516368d2bf6b60e11b815260040160405180910390fd5b6060611f84826128fa565b611ff65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610bb5565b60185460ff16151560000361209757600f805461201290613724565b80601f016020809104026020016040519081016040528092919081815260200182805461203e90613724565b801561208b5780601f106120605761010080835404028352916020019161208b565b820191906000526020600020905b81548152906001019060200180831161206e57829003601f168201915b50505050509050919050565b60006120a1612bce565b905060008151116120c157604051806020016040528060008152506120ef565b806120cb84612bdd565b600e6040516020016120df939291906138bb565b6040516020818303038152906040525b9392505050565b6120ff816115e6565b6001600160a01b0316336001600160a01b0316146121855760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f2074726176657260448201527f73650000000000000000000000000000000000000000000000000000000000006064820152608401610bb5565b61ffff82166000908152600c6020526040812080546121a390613724565b9050116122185760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201527f626c6520666f722074726176656c0000000000000000000000000000000000006064820152608401610bb5565b61222181612d12565b604080513360208201528082018390528151808203830181526060820183526019547e0100000000000000000000000000000000000000000000000000000000000060808401526082808401919091528351808403909101815260a2830193849052600a547f40a7bb100000000000000000000000000000000000000000000000000000000090945290926001926000916001600160a01b0316906340a7bb10906122d8908990309089908790899060a6016138ed565b6040805180830381865afa1580156122f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612318919061393f565b509050803410156123b75760405162461bcd60e51b815260206004820152605460248201527f7230636b657420666c6970706572733a206d73672e76616c7565206e6f74206560448201527f6e6f75676820746f20636f766572206d6573736167654665652e2053656e642060648201527f67617320666f72206d6573736167652066656573000000000000000000000000608482015260a401610bb5565b60165462010000900460ff1661240f5760405162461bcd60e51b815260206004820152601560248201527f54686520627269646765206973207061757365642100000000000000000000006044820152606401610bb5565b600a5461ffff87166000908152600c602052604080822090517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b039093169263c5803100923492612474928c928b913391908b90600401613963565b6000604051808303818588803b15801561248d57600080fd5b505af11580156124a1573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600b602052604080822090516124cf908790613823565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020600181015490915061256e5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201527f65737361676500000000000000000000000000000000000000000000000000006064820152608401610bb5565b80548214801561259857508060010154838360405161258e929190613a43565b6040518091039020145b6125e45760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610bb5565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906126199089908990899089908990600401613a53565b600060405180830381600087803b15801561263357600080fd5b505af1158015612647573d6000803e3d6000fd5b50505050505050505050565b6008546001600160a01b0316331461269b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b60168054911515620100000262ff000019909216919091179055565b6008546001600160a01b031633146126ff5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601555565b6008546001600160a01b0316331461274c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6018805460ff1916911515919091179055565b600d80546114b690613724565b6008546001600160a01b031633146127b45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b61ffff83166000908152600c60205260409020610cd1908383613084565b6008546001600160a01b0316331461281a5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6001600160a01b0381166128965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bb5565b611e2a816129ea565b6008546001600160a01b031633146128e75760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600d906020840190613000565b60008161290660125490565b11158015612915575060005482105b8015610dbb575050600090815260046020526040902054600160e01b161590565b6000808280602001905181019061294d9190613ab5565b9150915061123c8282612a49565b6000818061296860125490565b116129b8576000548110156129b85760008181526004602052604081205490600160e01b821690036129b6575b806000036120ef575060001901600081815260046020526040902054612995565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610fd1828260405180602001604052806000815250612d1d565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610dbb90604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b17903390899088908890600401613ae3565b6020604051808303816000875af1925050508015612b52575060408051601f3d908101601f19168201909252612b4f91810190613b1f565b60015b612bb0573d808015612b80576040519150601f19603f3d011682016040523d82523d6000602084013e612b85565b606091505b508051600003612ba8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600d8054610dd090613724565b606081600003612c2057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c4a5780612c3481613b3c565b9150612c439050600a83613b6b565b9150612c24565b60008167ffffffffffffffff811115612c6557612c65613124565b6040519080825280601f01601f191660200182016040528015612c8f576020820181803683370190505b5090505b8415612bc657612ca4600183613b7f565b9150612cb1600a86613b96565b612cbc90603061386e565b60f81b818381518110612cd157612cd16138a5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d0b600a86613b6b565b9450612c93565b611e2a816000612d8a565b612d278383612eed565b6001600160a01b0383163b15611449576000548281035b612d516000868380600101945086612ae2565b612d6e576040516368d2bf6b60e11b815260040160405180910390fd5b818110612d3e578160005414612d8357600080fd5b5050505050565b6000612d958361295b565b905080600080612db386600090815260066020526040902080549091565b915091508415612df357612dc88184336110dd565b612df357612dd68333610a00565b612df357604051632ce44b5f60e11b815260040160405180910390fd5b8015612dfe57600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b177c030000000000000000000000000000000000000000000000000000000017600087815260046020526040812091909155600160e11b85169003612ea557600186016000818152600460205260408120549003612ea3576000548114612ea35760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b6000546001600160a01b038316612f30576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600003612f6a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612fb45760005550505050565b82805461300c90613724565b90600052602060002090601f01602090048101928261302e5760008555613074565b82601f1061304757805160ff1916838001178555613074565b82800160010185558215613074579182015b82811115613074578251825591602001919060010190613059565b506130809291506130f8565b5090565b82805461309090613724565b90600052602060002090601f0160209004810192826130b25760008555613074565b82601f106130cb5782800160ff19823516178555613074565b82800160010185558215613074579182015b828111156130745782358255916020019190600101906130dd565b5b8082111561308057600081556001016130f9565b803561ffff8116811461311f57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561315557613155613124565b604051601f8501601f19908116603f0116810190828211818310171561317d5761317d613124565b8160405280935085815286868601111561319657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126131c157600080fd5b6120ef8383356020850161313a565b803567ffffffffffffffff8116811461311f57600080fd5b600080600080608085870312156131fe57600080fd5b6132078561310d565b9350602085013567ffffffffffffffff8082111561322457600080fd5b613230888389016131b0565b945061323e604088016131d0565b9350606087013591508082111561325457600080fd5b50613261878288016131b0565b91505092959194509250565b60006020828403121561327f57600080fd5b5035919050565b6001600160e01b031981168114611e2a57600080fd5b6000602082840312156132ae57600080fd5b81356120ef81613286565b60005b838110156132d45781810151838201526020016132bc565b83811115610cd15750506000910152565b600081518084526132fd8160208601602086016132b9565b601f01601f19169290920160200192915050565b6020815260006120ef60208301846132e5565b6001600160a01b0381168114611e2a57600080fd5b6000806040838503121561334c57600080fd5b823561335781613324565b946020939093013593505050565b60006020828403121561337757600080fd5b813567ffffffffffffffff81111561338e57600080fd5b8201601f8101841361339f57600080fd5b612bc68482356020840161313a565b6000806000606084860312156133c357600080fd5b83356133ce81613324565b925060208401356133de81613324565b929592945050506040919091013590565b60006020828403121561340157600080fd5b81356120ef81613324565b8035801515811461311f57600080fd5b60006020828403121561342e57600080fd5b6120ef8261340c565b60006020828403121561344957600080fd5b6120ef8261310d565b6000806040838503121561346557600080fd5b82359150602083013561347781613324565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156134ba5783518352928401929184019160010161349e565b50909695505050505050565b6000806000606084860312156134db57600080fd5b6134e48461310d565b9250602084013567ffffffffffffffff81111561350057600080fd5b61350c868287016131b0565b925050604084013590509250925092565b6000806040838503121561353057600080fd5b823561353b81613324565b91506135496020840161340c565b90509250929050565b6000806000806080858703121561356857600080fd5b843561357381613324565b9350602085013561358381613324565b925060408501359150606085013567ffffffffffffffff8111156135a657600080fd5b613261878288016131b0565b600080604083850312156135c557600080fd5b6133578361310d565b60008083601f8401126135e057600080fd5b50813567ffffffffffffffff8111156135f857600080fd5b60208301915083602082850101111561361057600080fd5b9250929050565b60008060008060006080868803121561362f57600080fd5b6136388661310d565b9450602086013567ffffffffffffffff8082111561365557600080fd5b61366189838a016131b0565b955061366f604089016131d0565b9450606088013591508082111561368557600080fd5b50613692888289016135ce565b969995985093965092949392505050565b600080604083850312156136b657600080fd5b82356136c181613324565b9150602083013561347781613324565b6000806000604084860312156136e657600080fd5b6136ef8461310d565b9250602084013567ffffffffffffffff81111561370b57600080fd5b613717868287016135ce565b9497909650939450505050565b600181811c9082168061373857607f821691505b60208210810361375857634e487b7160e01b600052602260045260246000fd5b50919050565b6000815461376b81613724565b600182811680156137835760018114613794576137c3565b60ff198416875282870194506137c3565b8560005260208060002060005b858110156137ba5781548a8201529084019082016137a1565b50505082870194505b5050505092915050565b60006120ef828461375e565b61ffff851681526080602082015260006137f660808301866132e5565b67ffffffffffffffff85166040840152828103606084015261381881856132e5565b979650505050505050565b600082516138358184602087016132b9565b9190910192915050565b60006020828403121561385157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561388157613881613858565b500190565b60008160001904831182151516156138a0576138a0613858565b500290565b634e487b7160e01b600052603260045260246000fd5b600084516138cd8184602089016132b9565b8451908301906138e18183602089016132b9565b6138188183018661375e565b61ffff861681526001600160a01b038516602082015260a06040820152600061391960a08301866132e5565b8415156060840152828103608084015261393381856132e5565b98975050505050505050565b6000806040838503121561395257600080fd5b505080516020909101519092909150565b61ffff871681526000602060c0818401526000885461398181613724565b8060c087015260e06001808416600081146139a357600181146139b8576139e6565b60ff19851689840152610100890195506139e6565b8d6000528660002060005b858110156139de5781548b82018601529083019088016139c3565b8a0184019650505b505050505083810360408501526139fd81896132e5565b915050613a1560608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152613a3681856132e5565b9998505050505050505050565b8183823760009101908152919050565b61ffff86168152608060208201526000613a7060808301876132e5565b67ffffffffffffffff861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b60008060408385031215613ac857600080fd5b8251613ad381613324565b6020939093015192949293505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613b1560808301846132e5565b9695505050505050565b600060208284031215613b3157600080fd5b81516120ef81613286565b600060018201613b4e57613b4e613858565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082613b7a57613b7a613b55565b500490565b600082821015613b9157613b91613858565b500390565b600082613ba557613ba5613b55565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122053953fab0fb484c4824d187b273727cbc7ac8abf42ba7c4aa7c7e2da07a28ff164736f6c634300080e0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d577a793165544172757a41794b615863324e69467273434a7a426e414147555636777435526d314b554b6a382f000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061038a5760003560e01c80637512ecfd116101dc578063b071401b11610102578063e0a80853116100a0578063ed88c68e1161006f578063ed88c68e146103af578063f2fde38b14610a63578063f4fb584614610a83578063f648498014610ab357600080fd5b8063e0a80853146109c5578063e985e9c5146109e5578063eac989f814610a2e578063eb8d72b714610a4357600080fd5b8063cf89fa03116100dc578063cf89fa031461095f578063d1deba1f14610972578063d58a848314610985578063d9f0a671146109a557600080fd5b8063b071401b146108ff578063b88d4fde1461091f578063c87b56dd1461093f57600080fd5b806391b7f5ed1161017a5780639fb17e34116101495780639fb17e34146108a1578063a035b1fe146108b4578063a22cb465146108ca578063a45ba8e7146108ea57600080fd5b806391b7f5ed1461083657806394354fd014610856578063943fb8721461086c57806395d89b411461088c57600080fd5b8063801903a4116101b6578063801903a4146107665780638462151c146107805780638da5cb5b146107ad5780638ee74912146107cb57600080fd5b80637512ecfd146107105780637533d788146107265780637871e1541461074657600080fd5b80633fbc67c5116102c15780635503a0e81161025f5780636352211e1161022e5780636352211e146106a857806370a08231146106c8578063715018a6146106e85780637454430b146106fd57600080fd5b80635503a0e81461063d578063596cf96e146106525780635a0b8b23146106725780635c22abd21461068857600080fd5b80634deb86751161029b5780634deb8675146105cd5780634fdd43cb146105e35780635183022714610603578063530da8ef1461061d57600080fd5b80633fbc67c51461056d57806340e1c23c1461058d57806342842e0e146105ad57600080fd5b806318160ddd1161032e57806323b872dd1161030857806323b872dd146104f957806331d97bc31461051957806333bc1c5c146105395780633ccfd60b1461055857600080fd5b806318160ddd146104a057806319d1997a146104c35780631c37a822146104d957600080fd5b806306fdde031161036a57806306fdde0314610406578063081812fc14610428578063095ea7b31461046057806316ba10e01461048057600080fd5b80621d35671461038f57806275770a146103b157806301ffc9a7146103d1575b600080fd5b34801561039b57600080fd5b506103af6103aa3660046131e8565b610ad3565b005b3480156103bd57600080fd5b506103af6103cc36600461326d565b610cd7565b3480156103dd57600080fd5b506103f16103ec36600461329c565b610d24565b60405190151581526020015b60405180910390f35b34801561041257600080fd5b5061041b610dc1565b6040516103fd9190613311565b34801561043457600080fd5b5061044861044336600461326d565b610e53565b6040516001600160a01b0390911681526020016103fd565b34801561046c57600080fd5b506103af61047b366004613339565b610eb0565b34801561048c57600080fd5b506103af61049b366004613365565b610f76565b3480156104ac57600080fd5b506104b5610fd5565b6040519081526020016103fd565b3480156104cf57600080fd5b506104b560135481565b3480156104e557600080fd5b506103af6104f43660046131e8565b610fed565b34801561050557600080fd5b506103af6105143660046133ae565b61106e565b34801561052557600080fd5b50601a54610448906001600160a01b031681565b34801561054557600080fd5b506016546103f190610100900460ff1681565b34801561056457600080fd5b506103af611244565b34801561057957600080fd5b506103af6105883660046133ef565b61135c565b34801561059957600080fd5b506103af6105a836600461341c565b6113d3565b3480156105b957600080fd5b506103af6105c83660046133ae565b61142e565b3480156105d957600080fd5b506104b560125481565b3480156105ef57600080fd5b506103af6105fe366004613365565b61144e565b34801561060f57600080fd5b506018546103f19060ff1681565b34801561062957600080fd5b506016546103f19062010000900460ff1681565b34801561064957600080fd5b5061041b6114a9565b34801561065e57600080fd5b506103af61066d36600461326d565b611537565b34801561067e57600080fd5b506104b560155481565b34801561069457600080fd5b506103af6106a336600461341c565b611584565b3480156106b457600080fd5b506104486106c336600461326d565b6115e6565b3480156106d457600080fd5b506104b56106e33660046133ef565b6115f1565b3480156106f457600080fd5b506103af611659565b6103af61070b36600461326d565b6116ad565b34801561071c57600080fd5b506104b560115481565b34801561073257600080fd5b5061041b610741366004613437565b6119db565b34801561075257600080fd5b506103af610761366004613452565b6119f4565b34801561077257600080fd5b506016546103f19060ff1681565b34801561078c57600080fd5b506107a061079b3660046133ef565b611aaa565b6040516103fd9190613482565b3480156107b957600080fd5b506008546001600160a01b0316610448565b3480156107d757600080fd5b506108216107e63660046134c6565b600b60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016103fd565b34801561084257600080fd5b506103af61085136600461326d565b611b9c565b34801561086257600080fd5b506104b560145481565b34801561087857600080fd5b506103af61088736600461326d565b611be9565b34801561089857600080fd5b5061041b611c36565b6103af6108af36600461326d565b611c45565b3480156108c057600080fd5b506104b560105481565b3480156108d657600080fd5b506103af6108e536600461351d565b611e2d565b3480156108f657600080fd5b5061041b611edb565b34801561090b57600080fd5b506103af61091a36600461326d565b611ee8565b34801561092b57600080fd5b506103af61093a366004613552565b611f35565b34801561094b57600080fd5b5061041b61095a36600461326d565b611f79565b6103af61096d3660046135b2565b6120f6565b6103af610980366004613617565b6124ae565b34801561099157600080fd5b506103af6109a036600461341c565b612653565b3480156109b157600080fd5b506103af6109c036600461326d565b6126b7565b3480156109d157600080fd5b506103af6109e036600461341c565b612704565b3480156109f157600080fd5b506103f1610a003660046136a3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a3a57600080fd5b5061041b61275f565b348015610a4f57600080fd5b506103af610a5e3660046136d1565b61276c565b348015610a6f57600080fd5b506103af610a7e3660046133ef565b6127d2565b348015610a8f57600080fd5b506103f1610a9e3660046133ef565b60176020526000908152604090205460ff1681565b348015610abf57600080fd5b506103af610ace366004613365565b61289f565b600a546001600160a01b03163314610aea57600080fd5b61ffff84166000908152600c602052604090208054610b0890613724565b90508351148015610b47575061ffff84166000908152600c6020526040908190209051610b3591906137cd565b60405180910390208380519060200120145b610bbe5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560448201527f7263652073656e64696e6720636f6e747261637400000000000000000000000060648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a82290610be79087908790879087906004016137d9565b600060405180830381600087803b158015610c0157600080fd5b505af1925050508015610c12575060015b610cd1576040518060400160405280825181526020018280519060200120815250600b60008661ffff1661ffff16815260200190815260200160002084604051610c5c9190613823565b90815260408051918290036020908101832067ffffffffffffffff8716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610cc89086908690869086906137d9565b60405180910390a15b50505050565b6008546001600160a01b03163314610d1f5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601355565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610d8757507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610dbb57507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060028054610dd090613724565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfc90613724565b8015610e495780601f10610e1e57610100808354040283529160200191610e49565b820191906000526020600020905b815481529060010190602001808311610e2c57829003601f168201915b5050505050905090565b6000610e5e826128fa565b610e94576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ebb826115e6565b9050336001600160a01b03821614610f0d57610ed78133610a00565b610f0d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610fbe5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600e906020840190613000565b5050565b6000610fe060125490565b6001546000540303905090565b3330146110625760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201527f206265204272696467652e0000000000000000000000000000000000000000006064820152608401610bb5565b610cd184848484612936565b60006110798261295b565b9050836001600160a01b0316816001600160a01b0316146110c6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040902080546110f28187335b6001600160a01b039081169116811491141790565b61111d576111008633610a00565b61111d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661115d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801561116857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036111fa576001840160008181526004602052604081205490036111f85760005481146111f85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b0316331461128c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6002600954036112de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb5565b600260095560006112f76008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611341576040519150601f19603f3d011682016040523d82523d6000602084013e611346565b606091505b505090508061135457600080fd5b506001600955565b6008546001600160a01b031633146113a45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461141b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6016805460ff1916911515919091179055565b61144983838360405180602001604052806000815250611f35565b505050565b6008546001600160a01b031633146114965760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600f906020840190613000565b600e80546114b690613724565b80601f01602080910402602001604051908101604052809291908181526020018280546114e290613724565b801561152f5780601f106115045761010080835404028352916020019161152f565b820191906000526020600020905b81548152906001019060200180831161151257829003601f168201915b505050505081565b6008546001600160a01b0316331461157f5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601155565b6008546001600160a01b031633146115cc5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601680549115156101000261ff0019909216919091179055565b6000610dbb8261295b565b60006001600160a01b038216611633576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146116a15760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6116ab60006129ea565b565b601a546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156116fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171e919061383f565b60000361172d57506000611798565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611795919061383f565b90505b60165460ff166117ea5760405162461bcd60e51b815260206004820152601b60248201527f546865206b69636b666c697053616c65206973207061757365642100000000006044820152606401610bb5565b8060000361183a5760405162461bcd60e51b815260206004820152601760248201527f596f7520646f6e74206f776e20616e7920746f6b656e730000000000000000006044820152606401610bb5565b60008311801561184a5750808311155b6118965760405162461bcd60e51b815260206004820152601260248201527f46726565204d696e7420457863656564656400000000000000000000000000006044820152606401610bb5565b601354836118a2610fd5565b6118ac919061386e565b11156118fa5760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b826011546119089190613886565b3410156119575760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610bb5565b3360009081526017602052604090205460ff16156119b75760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610bb5565b336000818152601760205260409020805460ff191660011790556114499084612a49565b600c60205260009081526040902080546114b690613724565b6008546001600160a01b03163314611a3c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b60135482611a48610fd5565b611a52919061386e565b1115611aa05760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b610fd18183612a49565b60606000611ab7836115f1565b67ffffffffffffffff811115611acf57611acf613124565b604051908082528060200260200182016040528015611af8578160200160208202803683370190505b5090506000611b0660005490565b905060008060005b83811015611b91576000611b2182612a63565b9050806040015115611b335750611b89565b80516001600160a01b031615611b4857805192505b876001600160a01b0316836001600160a01b031603611b875781868580600101965081518110611b7a57611b7a6138a5565b6020026020010181815250505b505b600101611b0e565b509295945050505050565b6008546001600160a01b03163314611be45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601055565b6008546001600160a01b03163314611c315760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601955565b606060038054610dd090613724565b601654610100900460ff16611c9c5760405162461bcd60e51b815260206004820152601960248201527f546865205075626c696353616c652069732070617573656421000000000000006044820152606401610bb5565b600081118015611cae57506014548111155b611cfa5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006044820152606401610bb5565b60135481611d06610fd5565b611d10919061386e565b1115611d5e5760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b60155481611d6b336115f1565b611d75919061386e565b1115611dc35760405162461bcd60e51b815260206004820152601d60248201527f4d6178206d696e74207065722077616c6c6574206578636565646564210000006044820152606401610bb5565b80601054611dd19190613886565b341015611e205760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610bb5565b611e2a3382612a49565b50565b336001600160a01b03831603611e6f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f80546114b690613724565b6008546001600160a01b03163314611f305760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601455565b611f4084848461106e565b6001600160a01b0383163b15610cd157611f5c84848484612ae2565b610cd1576040516368d2bf6b60e11b815260040160405180910390fd5b6060611f84826128fa565b611ff65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610bb5565b60185460ff16151560000361209757600f805461201290613724565b80601f016020809104026020016040519081016040528092919081815260200182805461203e90613724565b801561208b5780601f106120605761010080835404028352916020019161208b565b820191906000526020600020905b81548152906001019060200180831161206e57829003601f168201915b50505050509050919050565b60006120a1612bce565b905060008151116120c157604051806020016040528060008152506120ef565b806120cb84612bdd565b600e6040516020016120df939291906138bb565b6040516020818303038152906040525b9392505050565b6120ff816115e6565b6001600160a01b0316336001600160a01b0316146121855760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f2074726176657260448201527f73650000000000000000000000000000000000000000000000000000000000006064820152608401610bb5565b61ffff82166000908152600c6020526040812080546121a390613724565b9050116122185760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201527f626c6520666f722074726176656c0000000000000000000000000000000000006064820152608401610bb5565b61222181612d12565b604080513360208201528082018390528151808203830181526060820183526019547e0100000000000000000000000000000000000000000000000000000000000060808401526082808401919091528351808403909101815260a2830193849052600a547f40a7bb100000000000000000000000000000000000000000000000000000000090945290926001926000916001600160a01b0316906340a7bb10906122d8908990309089908790899060a6016138ed565b6040805180830381865afa1580156122f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612318919061393f565b509050803410156123b75760405162461bcd60e51b815260206004820152605460248201527f7230636b657420666c6970706572733a206d73672e76616c7565206e6f74206560448201527f6e6f75676820746f20636f766572206d6573736167654665652e2053656e642060648201527f67617320666f72206d6573736167652066656573000000000000000000000000608482015260a401610bb5565b60165462010000900460ff1661240f5760405162461bcd60e51b815260206004820152601560248201527f54686520627269646765206973207061757365642100000000000000000000006044820152606401610bb5565b600a5461ffff87166000908152600c602052604080822090517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b039093169263c5803100923492612474928c928b913391908b90600401613963565b6000604051808303818588803b15801561248d57600080fd5b505af11580156124a1573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600b602052604080822090516124cf908790613823565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020600181015490915061256e5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201527f65737361676500000000000000000000000000000000000000000000000000006064820152608401610bb5565b80548214801561259857508060010154838360405161258e929190613a43565b6040518091039020145b6125e45760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610bb5565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906126199089908990899089908990600401613a53565b600060405180830381600087803b15801561263357600080fd5b505af1158015612647573d6000803e3d6000fd5b50505050505050505050565b6008546001600160a01b0316331461269b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b60168054911515620100000262ff000019909216919091179055565b6008546001600160a01b031633146126ff5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601555565b6008546001600160a01b0316331461274c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6018805460ff1916911515919091179055565b600d80546114b690613724565b6008546001600160a01b031633146127b45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b61ffff83166000908152600c60205260409020610cd1908383613084565b6008546001600160a01b0316331461281a5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6001600160a01b0381166128965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bb5565b611e2a816129ea565b6008546001600160a01b031633146128e75760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600d906020840190613000565b60008161290660125490565b11158015612915575060005482105b8015610dbb575050600090815260046020526040902054600160e01b161590565b6000808280602001905181019061294d9190613ab5565b9150915061123c8282612a49565b6000818061296860125490565b116129b8576000548110156129b85760008181526004602052604081205490600160e01b821690036129b6575b806000036120ef575060001901600081815260046020526040902054612995565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610fd1828260405180602001604052806000815250612d1d565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610dbb90604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b17903390899088908890600401613ae3565b6020604051808303816000875af1925050508015612b52575060408051601f3d908101601f19168201909252612b4f91810190613b1f565b60015b612bb0573d808015612b80576040519150601f19603f3d011682016040523d82523d6000602084013e612b85565b606091505b508051600003612ba8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600d8054610dd090613724565b606081600003612c2057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c4a5780612c3481613b3c565b9150612c439050600a83613b6b565b9150612c24565b60008167ffffffffffffffff811115612c6557612c65613124565b6040519080825280601f01601f191660200182016040528015612c8f576020820181803683370190505b5090505b8415612bc657612ca4600183613b7f565b9150612cb1600a86613b96565b612cbc90603061386e565b60f81b818381518110612cd157612cd16138a5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d0b600a86613b6b565b9450612c93565b611e2a816000612d8a565b612d278383612eed565b6001600160a01b0383163b15611449576000548281035b612d516000868380600101945086612ae2565b612d6e576040516368d2bf6b60e11b815260040160405180910390fd5b818110612d3e578160005414612d8357600080fd5b5050505050565b6000612d958361295b565b905080600080612db386600090815260066020526040902080549091565b915091508415612df357612dc88184336110dd565b612df357612dd68333610a00565b612df357604051632ce44b5f60e11b815260040160405180910390fd5b8015612dfe57600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b177c030000000000000000000000000000000000000000000000000000000017600087815260046020526040812091909155600160e11b85169003612ea557600186016000818152600460205260408120549003612ea3576000548114612ea35760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b6000546001600160a01b038316612f30576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600003612f6a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612fb45760005550505050565b82805461300c90613724565b90600052602060002090601f01602090048101928261302e5760008555613074565b82601f1061304757805160ff1916838001178555613074565b82800160010185558215613074579182015b82811115613074578251825591602001919060010190613059565b506130809291506130f8565b5090565b82805461309090613724565b90600052602060002090601f0160209004810192826130b25760008555613074565b82601f106130cb5782800160ff19823516178555613074565b82800160010185558215613074579182015b828111156130745782358255916020019190600101906130dd565b5b8082111561308057600081556001016130f9565b803561ffff8116811461311f57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561315557613155613124565b604051601f8501601f19908116603f0116810190828211818310171561317d5761317d613124565b8160405280935085815286868601111561319657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126131c157600080fd5b6120ef8383356020850161313a565b803567ffffffffffffffff8116811461311f57600080fd5b600080600080608085870312156131fe57600080fd5b6132078561310d565b9350602085013567ffffffffffffffff8082111561322457600080fd5b613230888389016131b0565b945061323e604088016131d0565b9350606087013591508082111561325457600080fd5b50613261878288016131b0565b91505092959194509250565b60006020828403121561327f57600080fd5b5035919050565b6001600160e01b031981168114611e2a57600080fd5b6000602082840312156132ae57600080fd5b81356120ef81613286565b60005b838110156132d45781810151838201526020016132bc565b83811115610cd15750506000910152565b600081518084526132fd8160208601602086016132b9565b601f01601f19169290920160200192915050565b6020815260006120ef60208301846132e5565b6001600160a01b0381168114611e2a57600080fd5b6000806040838503121561334c57600080fd5b823561335781613324565b946020939093013593505050565b60006020828403121561337757600080fd5b813567ffffffffffffffff81111561338e57600080fd5b8201601f8101841361339f57600080fd5b612bc68482356020840161313a565b6000806000606084860312156133c357600080fd5b83356133ce81613324565b925060208401356133de81613324565b929592945050506040919091013590565b60006020828403121561340157600080fd5b81356120ef81613324565b8035801515811461311f57600080fd5b60006020828403121561342e57600080fd5b6120ef8261340c565b60006020828403121561344957600080fd5b6120ef8261310d565b6000806040838503121561346557600080fd5b82359150602083013561347781613324565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156134ba5783518352928401929184019160010161349e565b50909695505050505050565b6000806000606084860312156134db57600080fd5b6134e48461310d565b9250602084013567ffffffffffffffff81111561350057600080fd5b61350c868287016131b0565b925050604084013590509250925092565b6000806040838503121561353057600080fd5b823561353b81613324565b91506135496020840161340c565b90509250929050565b6000806000806080858703121561356857600080fd5b843561357381613324565b9350602085013561358381613324565b925060408501359150606085013567ffffffffffffffff8111156135a657600080fd5b613261878288016131b0565b600080604083850312156135c557600080fd5b6133578361310d565b60008083601f8401126135e057600080fd5b50813567ffffffffffffffff8111156135f857600080fd5b60208301915083602082850101111561361057600080fd5b9250929050565b60008060008060006080868803121561362f57600080fd5b6136388661310d565b9450602086013567ffffffffffffffff8082111561365557600080fd5b61366189838a016131b0565b955061366f604089016131d0565b9450606088013591508082111561368557600080fd5b50613692888289016135ce565b969995985093965092949392505050565b600080604083850312156136b657600080fd5b82356136c181613324565b9150602083013561347781613324565b6000806000604084860312156136e657600080fd5b6136ef8461310d565b9250602084013567ffffffffffffffff81111561370b57600080fd5b613717868287016135ce565b9497909650939450505050565b600181811c9082168061373857607f821691505b60208210810361375857634e487b7160e01b600052602260045260246000fd5b50919050565b6000815461376b81613724565b600182811680156137835760018114613794576137c3565b60ff198416875282870194506137c3565b8560005260208060002060005b858110156137ba5781548a8201529084019082016137a1565b50505082870194505b5050505092915050565b60006120ef828461375e565b61ffff851681526080602082015260006137f660808301866132e5565b67ffffffffffffffff85166040840152828103606084015261381881856132e5565b979650505050505050565b600082516138358184602087016132b9565b9190910192915050565b60006020828403121561385157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561388157613881613858565b500190565b60008160001904831182151516156138a0576138a0613858565b500290565b634e487b7160e01b600052603260045260246000fd5b600084516138cd8184602089016132b9565b8451908301906138e18183602089016132b9565b6138188183018661375e565b61ffff861681526001600160a01b038516602082015260a06040820152600061391960a08301866132e5565b8415156060840152828103608084015261393381856132e5565b98975050505050505050565b6000806040838503121561395257600080fd5b505080516020909101519092909150565b61ffff871681526000602060c0818401526000885461398181613724565b8060c087015260e06001808416600081146139a357600181146139b8576139e6565b60ff19851689840152610100890195506139e6565b8d6000528660002060005b858110156139de5781548b82018601529083019088016139c3565b8a0184019650505b505050505083810360408501526139fd81896132e5565b915050613a1560608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152613a3681856132e5565b9998505050505050505050565b8183823760009101908152919050565b61ffff86168152608060208201526000613a7060808301876132e5565b67ffffffffffffffff861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b60008060408385031215613ac857600080fd5b8251613ad381613324565b6020939093015192949293505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613b1560808301846132e5565b9695505050505050565b600060208284031215613b3157600080fd5b81516120ef81613286565b600060018201613b4e57613b4e613858565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082613b7a57613b7a613b55565b500490565b600082821015613b9157613b91613858565b500390565b600082613ba557613ba5613b55565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122053953fab0fb484c4824d187b273727cbc7ac8abf42ba7c4aa7c7e2da07a28ff164736f6c634300080e0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d577a793165544172757a41794b615863324e69467273434a7a426e414147555636777435526d314b554b6a382f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://gateway.pinata.cloud/ipfs/QmWzy1eTAruzAyKaXc2NiFrsCJzBnAAGUV6wt5Rm1KUKj8/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [3] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [4] : 732f516d577a793165544172757a41794b615863324e69467273434a7a426e41
Arg [5] : 4147555636777435526d314b554b6a382f000000000000000000000000000000


Deployed Bytecode Sourcemap

83627:9985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80278:1098;;;;;;;;;;-1:-1:-1;80278:1098:0;;;;;:::i;:::-;;:::i;:::-;;88668:102;;;;;;;;;;-1:-1:-1;88668:102:0;;;;;:::i;:::-;;:::i;14592:615::-;;;;;;;;;;-1:-1:-1;14592:615:0;;;;;:::i;:::-;;:::i;:::-;;;2875:14:1;;2868:22;2850:41;;2838:2;2823:18;14592:615:0;;;;;;;;20239:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22185:204::-;;;;;;;;;;-1:-1:-1;22185:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3949:55:1;;;3931:74;;3919:2;3904:18;22185:204:0;3785:226:1;21733:386:0;;;;;;;;;;-1:-1:-1;21733:386:0;;;;;:::i;:::-;;:::i;87589:100::-;;;;;;;;;;-1:-1:-1;87589:100:0;;;;;:::i;:::-;;:::i;13646:315::-;;;;;;;;;;;;;:::i;:::-;;;5096:25:1;;;5084:2;5069:18;13646:315:0;4950:177:1;84340:33:0;;;;;;;;;;;;;;;;81384:435;;;;;;;;;;-1:-1:-1;81384:435:0;;;;;:::i;:::-;;:::i;31450:2800::-;;;;;;;;;;-1:-1:-1;31450:2800:0;;;;;:::i;:::-;;:::i;84948:78::-;;;;;;;;;;-1:-1:-1;84948:78:0;;;;-1:-1:-1;;;;;84948:78:0;;;84614:30;;;;;;;;;;-1:-1:-1;84614:30:0;;;;;;;;;;;89080:172;;;;;;;;;;;;;:::i;88799:131::-;;;;;;;;;;-1:-1:-1;88799:131:0;;;;;:::i;:::-;;:::i;87951:89::-;;;;;;;;;;-1:-1:-1;87951:89:0;;;;;:::i;:::-;;:::i;23075:185::-;;;;;;;;;;-1:-1:-1;23075:185:0;;;;;:::i;:::-;;:::i;84280:34::-;;;;;;;;;;;;;;;;87695:132;;;;;;;;;;-1:-1:-1;87695:132:0;;;;;:::i;:::-;;:::i;84806:27::-;;;;;;;;;;-1:-1:-1;84806:27:0;;;;;;;;84682:30;;;;;;;;;;-1:-1:-1;84682:30:0;;;;;;;;;;;83976:33;;;;;;;;;;;;;:::i;88555:86::-;;;;;;;;;;-1:-1:-1;88555:86:0;;;;;:::i;:::-;;:::i;84519:37::-;;;;;;;;;;;;;;;;87850:95;;;;;;;;;;-1:-1:-1;87850:95:0;;;;;:::i;:::-;;:::i;20028:144::-;;;;;;;;;;-1:-1:-1;20028:144:0;;;;;:::i;:::-;;:::i;15271:224::-;;;;;;;;;;-1:-1:-1;15271:224:0;;;;;:::i;:::-;;:::i;67075:103::-;;;;;;;;;;;;;:::i;85554:920::-;;;;;;:::i;:::-;;:::i;84202:34::-;;;;;;;;;;;;;;;;80077:51;;;;;;;;;;-1:-1:-1;80077:51:0;;;;;:::i;:::-;;:::i;87054:202::-;;;;;;;;;;-1:-1:-1;87054:202:0;;;;;:::i;:::-;;:::i;84577:32::-;;;;;;;;;;-1:-1:-1;84577:32:0;;;;;;;;89465:712;;;;;;;;;;-1:-1:-1;89465:712:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66424:87::-;;;;;;;;;;-1:-1:-1;66497:6:0;;-1:-1:-1;;;;;66497:6:0;66424:87;;79968:102;;;;;;;;;;-1:-1:-1;79968:102:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8203:25:1;;;8259:2;8244:18;;8237:34;;;;8176:18;79968:102:0;8029:248:1;88471:78:0;;;;;;;;;;-1:-1:-1;88471:78:0;;;;;:::i;:::-;;:::i;84430:37::-;;;;;;;;;;;;;;;;93405:128;;;;;;;;;;-1:-1:-1;93405:128:0;;;;;:::i;:::-;;:::i;20408:104::-;;;;;;;;;;;;;:::i;86480:566::-;;;;;;:::i;:::-;;:::i;84161:36::-;;;;;;;;;;;;;;;;22461:308;;;;;;;;;;-1:-1:-1;22461:308:0;;;;;:::i;:::-;;:::i;84057:60::-;;;;;;;;;;;;;:::i;88172:130::-;;;;;;;;;;-1:-1:-1;88172:130:0;;;;;:::i;:::-;;:::i;23331:399::-;;;;;;;;;;-1:-1:-1;23331:399:0;;;;;:::i;:::-;;:::i;90295:445::-;;;;;;;;;;-1:-1:-1;90295:445:0;;;;;:::i;:::-;;:::i;91123:1762::-;;;;;;:::i;:::-;;:::i;82479:916::-;;;;;;:::i;:::-;;:::i;88064:87::-;;;;;;;;;;-1:-1:-1;88064:87:0;;;;;:::i;:::-;;:::i;88329:126::-;;;;;;;;;;-1:-1:-1;88329:126:0;;;;;:::i;:::-;;:::i;87412:81::-;;;;;;;;;;-1:-1:-1;87412:81:0;;;;;:::i;:::-;;:::i;22840:164::-;;;;;;;;;;-1:-1:-1;22840:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;22961:25:0;;;22937:4;22961:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22840:164;83954:17;;;;;;;;;;;;;:::i;83403:181::-;;;;;;;;;;-1:-1:-1;83403:181:0;;;;;:::i;:::-;;:::i;67333:201::-;;;;;;;;;;-1:-1:-1;67333:201:0;;;;;:::i;:::-;;:::i;84739:47::-;;;;;;;;;;-1:-1:-1;84739:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;87507:76;;;;;;;;;;-1:-1:-1;87507:76:0;;;;;:::i;:::-;;:::i;80278:1098::-;80483:8;;-1:-1:-1;;;;;80483:8:0;80461:10;:31;80453:40;;;;;;80618:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;80596:11;:18;:61;:168;;;;-1:-1:-1;80731:32:0;;;;;;;:19;:32;;;;;;;80721:43;;;;80731:32;80721:43;:::i;:::-;;;;;;;;80688:11;80678:22;;;;;;:86;80596:168;80574:270;;;;-1:-1:-1;;;80574:270:0;;13078:2:1;80574:270:0;;;13060:21:1;13117:2;13097:18;;;13090:30;13156:34;13136:18;;;13129:62;13227:22;13207:18;;;13200:50;13267:19;;80574:270:0;;;;;;;;;80972:60;;-1:-1:-1;;;80972:60:0;;:4;;:16;;:60;;80989:11;;81002;;81015:6;;81023:8;;80972:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80968:401;;81179:101;;;;;;;;81212:8;:15;81179:101;;;;81256:8;81246:19;;;;;;81179:101;;;81128:14;:27;81143:11;81128:27;;;;;;;;;;;;;;;81156:11;81128:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;:152;;;;;;;;;;;;;;;81300:57;;;;81314:11;;81327;;81169:6;;81348:8;;81300:57;:::i;:::-;;;;;;;;80968:401;80278:1098;;;;:::o;88668:102::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88738:11:::1;:26:::0;88668:102::o;14592:615::-;14677:4;14977:25;-1:-1:-1;;;;;;14977:25:0;;;;:102;;-1:-1:-1;15054:25:0;-1:-1:-1;;;;;;15054:25:0;;;14977:102;:179;;;-1:-1:-1;15131:25:0;-1:-1:-1;;;;;;15131:25:0;;;14977:179;14957:199;14592:615;-1:-1:-1;;14592:615:0:o;20239:100::-;20293:13;20326:5;20319:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20239:100;:::o;22185:204::-;22253:7;22278:16;22286:7;22278;:16::i;:::-;22273:64;;22303:34;;;;;;;;;;;;;;22273:64;-1:-1:-1;22357:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22357:24:0;;22185:204::o;21733:386::-;21806:13;21822:16;21830:7;21822;:16::i;:::-;21806:32;-1:-1:-1;65228:10:0;-1:-1:-1;;;;;21855:28:0;;;21851:175;;21903:44;21920:5;65228:10;22840:164;:::i;21903:44::-;21898:128;;21975:35;;;;;;;;;;;;;;21898:128;22038:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;22038:29:0;-1:-1:-1;;;;;22038:29:0;;;;;;;;;22083:28;;22038:24;;22083:28;;;;;;;21795:324;21733:386;;:::o;87589:100::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87661:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;87589:100:::0;:::o;13646:315::-;13699:7;13927:15;90271:12;;;90183:106;13927:15;13912:12;;13896:13;;:28;:46;13889:53;;13646:315;:::o;81384:435::-;81610:10;81632:4;81610:27;81588:120;;;;-1:-1:-1;;;81588:120:0;;14701:2:1;81588:120:0;;;14683:21:1;14740:2;14720:18;;;14713:30;14779:34;14759:18;;;14752:62;14850:13;14830:18;;;14823:41;14881:19;;81588:120:0;14499:407:1;81588:120:0;81757:54;81768:11;81781;81794:6;81802:8;81757:10;:54::i;31450:2800::-;31584:27;31614;31633:7;31614:18;:27::i;:::-;31584:57;;31699:4;-1:-1:-1;;;;;31658:45:0;31674:19;-1:-1:-1;;;;;31658:45:0;;31654:86;;31712:28;;;;;;;;;;;;;;31654:86;31754:27;30180:21;;;30007:15;30222:4;30215:36;30304:4;30288:21;;30394:26;;31938:62;30394:26;31974:4;65228:10;31980:19;-1:-1:-1;;;;;30999:31:0;;;30845:26;;31126:19;;31147:30;;31123:55;;30551:645;31938:62;31933:174;;32020:43;32037:4;65228:10;22840:164;:::i;32020:43::-;32015:92;;32072:35;;-1:-1:-1;;;32072:35:0;;;;;;;;;;;32015:92;-1:-1:-1;;;;;32124:16:0;;32120:52;;32149:23;;;;;;;;;;;;;;32120:52;32321:15;32318:160;;;32461:1;32440:19;32433:30;32318:160;-1:-1:-1;;;;;32856:24:0;;;;;;;:18;:24;;;;;;32854:26;;-1:-1:-1;;32854:26:0;;;32925:22;;;;;;;;;32923:24;;-1:-1:-1;32923:24:0;;;19927:11;19903:22;19899:40;19886:62;-1:-1:-1;;;19886:62:0;33218:26;;;;:17;:26;;;;;:174;;;;-1:-1:-1;;;33512:46:0;;:51;;33508:626;;33616:1;33606:11;;33584:19;33739:30;;;:17;:30;;;;;;:35;;33735:384;;33877:13;;33862:11;:28;33858:242;;34024:30;;;;:17;:30;;;;;:52;;;33858:242;33565:569;33508:626;34181:7;34177:2;-1:-1:-1;;;;;34162:27:0;34171:4;-1:-1:-1;;;;;34162:27:0;;;;;;;;;;;34200:42;31573:2677;;;31450:2800;;;:::o;89080:172::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;69704:1:::1;70302:7;;:19:::0;70294:63:::1;;;::::0;-1:-1:-1;;;70294:63:0;;15113:2:1;70294:63:0::1;::::0;::::1;15095:21:1::0;15152:2;15132:18;;;15125:30;15191:33;15171:18;;;15164:61;15242:18;;70294:63:0::1;14911:355:1::0;70294:63:0::1;69704:1;70435:7;:18:::0;89160:7:::2;89181;66497:6:::0;;-1:-1:-1;;;;;66497:6:0;;66424:87;89181:7:::2;-1:-1:-1::0;;;;;89173:21:0::2;89202;89173:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89159:69;;;89243:2;89235:11;;;::::0;::::2;;-1:-1:-1::0;69660:1:0::1;70614:7;:22:::0;89080:172::o;88799:131::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88887:18:::1;:37:::0;;-1:-1:-1;;88887:37:0::1;-1:-1:-1::0;;;;;88887:37:0;;;::::1;::::0;;;::::1;::::0;;88799:131::o;87951:89::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88013:12:::1;:21:::0;;-1:-1:-1;;88013:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;87951:89::o;23075:185::-;23213:39;23230:4;23236:2;23240:7;23213:39;;;;;;;;;;;;:16;:39::i;:::-;23075:185;;;:::o;87695:132::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87783:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;83976:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88555:86::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88617:9:::1;:18:::0;88555:86::o;87850:95::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87915:10:::1;:24:::0;;;::::1;;;;-1:-1:-1::0;;87915:24:0;;::::1;::::0;;;::::1;::::0;;87850:95::o;20028:144::-;20092:7;20135:27;20154:7;20135:18;:27::i;15271:224::-;15335:7;-1:-1:-1;;;;;15359:19:0;;15355:60;;15387:28;;;;;;;;;;;;;;15355:60;-1:-1:-1;;;;;;15433:25:0;;;;;:18;:25;;;;;;9826:13;15433:54;;15271:224::o;67075:103::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;67140:30:::1;67167:1;67140:18;:30::i;:::-;67075:103::o:0;85554:920::-;85685:18;;85742:32;;-1:-1:-1;;;85742:32:0;;85763:10;85742:32;;;3931:74:1;-1:-1:-1;;;;;85685:18:0;;;;85656;;85685;;85742:20;;3904:18:1;;85742:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85778:1;85742:37;85739:152;;-1:-1:-1;85806:1:0;85739:152;;;85851:32;;-1:-1:-1;;;85851:32:0;;85872:10;85851:32;;;3931:74:1;-1:-1:-1;;;;;85851:20:0;;;;;3904:18:1;;85851:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85835:48;;85739:152;85938:12;;;;85930:52;;;;-1:-1:-1;;;85930:52:0;;15872:2:1;85930:52:0;;;15854:21:1;15911:2;15891:18;;;15884:30;15950:29;15930:18;;;15923:57;15997:18;;85930:52:0;15670:351:1;85930:52:0;85997:13;86014:1;85997:18;85989:54;;;;-1:-1:-1;;;85989:54:0;;16228:2:1;85989:54:0;;;16210:21:1;16267:2;16247:18;;;16240:30;16306:25;16286:18;;;16279:53;16349:18;;85989:54:0;16026:347:1;85989:54:0;86072:1;86058:11;:15;:47;;;;;86092:13;86077:11;:28;;86058:47;86050:78;;;;-1:-1:-1;;;86050:78:0;;16580:2:1;86050:78:0;;;16562:21:1;16619:2;16599:18;;;16592:30;16658:20;16638:18;;;16631:48;16696:18;;86050:78:0;16378:342:1;86050:78:0;86174:11;;86159;86143:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;86135:75;;;;-1:-1:-1;;;86135:75:0;;17249:2:1;86135:75:0;;;17231:21:1;17288:2;17268:18;;;17261:30;17327:22;17307:18;;;17300:50;17367:18;;86135:75:0;17047:344:1;86135:75:0;86250:11;86238:9;;:23;;;;:::i;:::-;86225:9;:36;;86217:68;;;;-1:-1:-1;;;86217:68:0;;17771:2:1;86217:68:0;;;17753:21:1;17810:2;17790:18;;;17783:30;17849:21;17829:18;;;17822:49;17888:18;;86217:68:0;17569:343:1;86217:68:0;65228:10;86301:29;;;;:15;:29;;;;;;;;86300:30;86292:67;;;;-1:-1:-1;;;86292:67:0;;18119:2:1;86292:67:0;;;18101:21:1;18158:2;18138:18;;;18131:30;18197:26;18177:18;;;18170:54;18241:18;;86292:67:0;17917:348:1;86292:67:0;65228:10;86368:29;;;;:15;:29;;;;;:36;;-1:-1:-1;;86368:36:0;86400:4;86368:36;;;86432;;86456:11;86432:9;:36::i;80077:51::-;;;;;;;;;;;;;;;;:::i;87054:202::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87174:11:::1;;87159;87143:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;87135:75;;;::::0;-1:-1:-1;;;87135:75:0;;17249:2:1;87135:75:0::1;::::0;::::1;17231:21:1::0;17288:2;17268:18;;;17261:30;17327:22;17307:18;;;17300:50;17367:18;;87135:75:0::1;17047:344:1::0;87135:75:0::1;87217:33;87227:9;87238:11;87217:9;:33::i;89465:712::-:0;89526:16;89572:18;89607:16;89617:5;89607:9;:16::i;:::-;89593:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89593:31:0;;89572:52;;89636:11;89650:14;13388:7;13415:13;;13341:95;89650:14;89636:28;;89675:19;89705:25;89746:9;89741:403;89761:3;89757:1;:7;89741:403;;;89786:31;89820:15;89833:1;89820:12;:15::i;:::-;89786:49;;89854:9;:16;;;89850:65;;;89891:8;;;89850:65;89933:14;;-1:-1:-1;;;;;89933:28:0;;89929:103;;90002:14;;;-1:-1:-1;89929:103:0;90071:5;-1:-1:-1;;;;;90050:26:0;:17;-1:-1:-1;;;;;90050:26:0;;90046:87;;90116:1;90097;90099:13;;;;;;90097:16;;;;;;;;:::i;:::-;;;;;;:20;;;;;90046:87;89771:373;89741:403;89766:3;;89741:403;;;-1:-1:-1;90161:1:0;;89465:712;-1:-1:-1;;;;;89465:712:0:o;88471:78::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88529:5:::1;:14:::0;88471:78::o;93405:128::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;93490:26:::1;:35:::0;93405:128::o;20408:104::-;20464:13;20497:7;20490:14;;;;;:::i;86480:566::-;86586:10;;;;;;;86578:48;;;;-1:-1:-1;;;86578:48:0;;18661:2:1;86578:48:0;;;18643:21:1;18700:2;18680:18;;;18673:30;18739:27;18719:18;;;18712:55;18784:18;;86578:48:0;18459:349:1;86578:48:0;86655:1;86641:11;:15;:52;;;;;86675:18;;86660:11;:33;;86641:52;86633:85;;;;-1:-1:-1;;;86633:85:0;;19015:2:1;86633:85:0;;;18997:21:1;19054:2;19034:18;;;19027:30;19093:22;19073:18;;;19066:50;19133:18;;86633:85:0;18813:344:1;86633:85:0;86764:11;;86749;86733:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;86725:75;;;;-1:-1:-1;;;86725:75:0;;17249:2:1;86725:75:0;;;17231:21:1;17288:2;17268:18;;;17261:30;17327:22;17307:18;;;17300:50;17367:18;;86725:75:0;17047:344:1;86725:75:0;86854:17;;86839:11;86815:21;86825:10;86815:9;:21::i;:::-;:35;;;;:::i;:::-;:56;;86807:98;;;;-1:-1:-1;;;86807:98:0;;19364:2:1;86807:98:0;;;19346:21:1;19403:2;19383:18;;;19376:30;19442:31;19422:18;;;19415:59;19491:18;;86807:98:0;19162:353:1;86807:98:0;86941:11;86933:5;;:19;;;;:::i;:::-;86920:9;:32;;86912:64;;;;-1:-1:-1;;;86912:64:0;;17771:2:1;86912:64:0;;;17753:21:1;17810:2;17790:18;;;17783:30;17849:21;17829:18;;;17822:49;17888:18;;86912:64:0;17569:343:1;86912:64:0;87004:36;65228:10;87028:11;87004:9;:36::i;:::-;86480:566;:::o;22461:308::-;65228:10;-1:-1:-1;;;;;22560:31:0;;;22556:61;;22600:17;;;;;;;;;;;;;;22556:61;65228:10;22630:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;22630:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;22630:60:0;;;;;;;;;;22706:55;;2850:41:1;;;22630:49:0;;65228:10;22706:55;;2823:18:1;22706:55:0;;;;;;;22461:308;;:::o;84057:60::-;;;;;;;:::i;88172:130::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88256:18:::1;:40:::0;88172:130::o;23331:399::-;23498:31;23511:4;23517:2;23521:7;23498:12;:31::i;:::-;-1:-1:-1;;;;;23544:14:0;;;:19;23540:183;;23583:56;23614:4;23620:2;23624:7;23633:5;23583:30;:56::i;:::-;23578:145;;23667:40;;-1:-1:-1;;;23667:40:0;;;;;;;;;;;90295:445;90369:13;90399:17;90407:8;90399:7;:17::i;:::-;90391:77;;;;-1:-1:-1;;;90391:77:0;;19722:2:1;90391:77:0;;;19704:21:1;19761:2;19741:18;;;19734:30;19800:34;19780:18;;;19773:62;19871:17;19851:18;;;19844:45;19906:19;;90391:77:0;19520:411:1;90391:77:0;90481:8;;;;:17;;:8;:17;90477:64;;90516:17;90509:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90295:445;;;:::o;90477:64::-;90549:28;90580:10;:8;:10::i;:::-;90549:41;;90635:1;90610:14;90604:28;:32;:130;;;;;;;;;;;;;;;;;90672:14;90688:19;:8;:17;:19::i;:::-;90709:9;90655:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90604:130;90597:137;90295:445;-1:-1:-1;;;90295:445:0:o;91123:1762::-;91243:16;91251:7;91243;:16::i;:::-;-1:-1:-1;;;;;91229:30:0;:10;-1:-1:-1;;;;;91229:30:0;;91207:114;;;;-1:-1:-1;;;91207:114:0;;20692:2:1;91207:114:0;;;20674:21:1;20731:2;20711:18;;;20704:30;20770:34;20750:18;;;20743:62;20841:4;20821:18;;;20814:32;20863:19;;91207:114:0;20490:398:1;91207:114:0;91354:29;;;91393:1;91354:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;91332:136;;;;-1:-1:-1;;;91332:136:0;;21095:2:1;91332:136:0;;;21077:21:1;21134:2;21114:18;;;21107:30;21173:34;21153:18;;;21146:62;21244:16;21224:18;;;21217:44;21278:19;;91332:136:0;20893:410:1;91332:136:0;91548:14;91554:7;91548:5;:14::i;:::-;91659:31;;;91670:10;91659:31;;;21482:74:1;21572:18;;;21565:34;;;91659:31:0;;;;;;;;;21455:18:1;;;91659:31:0;;91887:26;;21781:16:1;91834:90:0;;;21765:102:1;21883:11;;;;21876:27;;;;91834:90:0;;;;;;;;;;21919:12:1;;;91834:90:0;;;;92103:8;;:153;;;;91659:31;;91793:1;;-1:-1:-1;;;;;;;92103:8:0;;:21;;:153;;92139:8;;92170:4;;91659:31;;-1:-1:-1;;91834:90:0;;92103:153;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;92078:178;;;92304:10;92291:9;:23;;92269:157;;;;-1:-1:-1;;;92269:157:0;;23064:2:1;92269:157:0;;;23046:21:1;23103:2;23083:18;;;23076:30;23142:34;23122:18;;;23115:62;23213:34;23193:18;;;23186:62;23285:22;23264:19;;;23257:51;23325:19;;92269:157:0;22862:488:1;92269:157:0;92447:10;;;;;;;92439:44;;;;-1:-1:-1;;;92439:44:0;;23557:2:1;92439:44:0;;;23539:21:1;23596:2;23576:18;;;23569:30;23635:23;23615:18;;;23608:51;23676:18;;92439:44:0;23355:345:1;92439:44:0;92496:8;;92588:29;;;92496:8;92588:29;;;:19;:29;;;;;;92496:381;;;;;-1:-1:-1;;;;;92496:8:0;;;;:13;;92517:9;;92496:381;;92542:8;;92671:7;;92727:10;;92496:8;92837:13;;92496:381;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91196:1689;;;;91123:1762;;:::o;82479:916::-;82738:27;;;82703:32;82738:27;;;:14;:27;;;;;;:64;;;;82780:11;;82738:64;:::i;:::-;;;;;;;;;;;;;;;;:72;;;;;;;;;;;82843:21;;;;82738:72;;-1:-1:-1;82821:123:0;;;;-1:-1:-1;;;82821:123:0;;25396:2:1;82821:123:0;;;25378:21:1;25435:2;25415:18;;;25408:30;25474:34;25454:18;;;25447:62;25545:8;25525:18;;;25518:36;25571:19;;82821:123:0;25194:402:1;82821:123:0;82996:23;;82977:42;;:107;;;;;83063:9;:21;;;83050:8;;83040:19;;;;;;;:::i;:::-;;;;;;;;:44;82977:107;82955:183;;;;-1:-1:-1;;;82955:183:0;;26079:2:1;82955:183:0;;;26061:21:1;26118:2;26098:18;;;26091:30;26157:28;26137:18;;;26130:56;26203:18;;82955:183:0;25877:350:1;82955:183:0;83212:1;83186:27;;;83224:21;;;:34;83327:60;;-1:-1:-1;;;83327:60:0;;:4;;:16;;:60;;83344:11;;83357;;83370:6;;83378:8;;;;83327:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82647:748;82479:916;;;;;:::o;88064:87::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88126:10:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;88126:19:0;;::::1;::::0;;;::::1;::::0;;88064:87::o;88329:126::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88411:17:::1;:38:::0;88329:126::o;87412:81::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87470:8:::1;:17:::0;;-1:-1:-1;;87470:17:0::1;::::0;::::1;;::::0;;;::::1;::::0;;87412:81::o;83954:17::-;;;;;;;:::i;83403:181::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;83530:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;83562:14;;83530:46:::1;:::i;67333:201::-:0;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;-1:-1:-1;;;;;67422:22:0;::::1;67414:73;;;::::0;-1:-1:-1;;;67414:73:0;;27157:2:1;67414:73:0::1;::::0;::::1;27139:21:1::0;27196:2;27176:18;;;27169:30;27235:34;27215:18;;;27208:62;27306:8;27286:18;;;27279:36;27332:19;;67414:73:0::1;26955:402:1::0;67414:73:0::1;67498:28;67517:8;67498:18;:28::i;87507:76::-:0;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87567:10;;::::1;::::0;:3:::1;::::0;:10:::1;::::0;::::1;::::0;::::1;:::i;23985:273::-:0;24042:4;24098:7;24079:15;90271:12;;;90183:106;24079:15;:26;;:66;;;;;24132:13;;24122:7;:23;24079:66;:152;;;;-1:-1:-1;;24183:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;24183:43:0;:48;;23985:273::o;92897:424::-;93093:14;93109:15;93153:8;93128:77;;;;;;;;;;;;:::i;:::-;93092:113;;;;93287:26;93297:6;93305:7;93287:9;:26::i;16945:1129::-;17012:7;17047;;17096:15;90271:12;;;90183:106;17096:15;:23;17092:915;;17149:13;;17142:4;:20;17138:869;;;17187:14;17204:23;;;:17;:23;;;;;;;-1:-1:-1;;;17293:23:0;;:28;;17289:699;;17812:113;17819:6;17829:1;17819:11;17812:113;;-1:-1:-1;;;17890:6:0;17872:25;;;;:17;:25;;;;;;17812:113;;17289:699;17164:843;17138:869;18035:31;;;;;;;;;;;;;;67694:191;67787:6;;;-1:-1:-1;;;;;67804:17:0;;;-1:-1:-1;;67804:17:0;;;;;;;67837:40;;67787:6;;;67804:17;67787:6;;67837:40;;67768:16;;67837:40;67757:128;67694:191;:::o;24342:104::-;24411:27;24421:2;24425:8;24411:27;;;;;;;;;;;;:9;:27::i;18622:153::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18742:24:0;;;;:17;:24;;;;;;18723:44;;-1:-1:-1;;;;;;;;;;;;;18278:41:0;;;;10480:3;18364:32;;;18330:67;;-1:-1:-1;;;18330:67:0;-1:-1:-1;;;18427:23:0;;:28;;-1:-1:-1;;;18408:47:0;;;;10997:3;18495:27;;;;-1:-1:-1;;;18466:57:0;-1:-1:-1;18168:363:0;38201:716;38385:88;;-1:-1:-1;;;38385:88:0;;38364:4;;-1:-1:-1;;;;;38385:45:0;;;;;:88;;65228:10;;38452:4;;38458:7;;38467:5;;38385:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38385:88:0;;;;;;;;-1:-1:-1;;38385:88:0;;;;;;;;;;;;:::i;:::-;;;38381:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38668:6;:13;38685:1;38668:18;38664:235;;38714:40;;-1:-1:-1;;;38714:40:0;;;;;;;;;;;38664:235;38857:6;38851:13;38842:6;38838:2;38834:15;38827:38;38381:529;-1:-1:-1;;;;;;38544:64:0;-1:-1:-1;;;38544:64:0;;-1:-1:-1;38381:529:0;38201:716;;;;;;:::o;90746:98::-;90806:13;90835:3;90828:10;;;;;:::i;59839:723::-;59895:13;60116:5;60125:1;60116:10;60112:53;;-1:-1:-1;;60143:10:0;;;;;;;;;;;;;;;;;;59839:723::o;60112:53::-;60190:5;60175:12;60231:78;60238:9;;60231:78;;60264:8;;;;:::i;:::-;;-1:-1:-1;60287:10:0;;-1:-1:-1;60295:2:0;60287:10;;:::i;:::-;;;60231:78;;;60319:19;60351:6;60341:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60341:17:0;;60319:39;;60369:154;60376:10;;60369:154;;60403:11;60413:1;60403:11;;:::i;:::-;;-1:-1:-1;60472:10:0;60480:2;60472:5;:10;:::i;:::-;60459:24;;:2;:24;:::i;:::-;60446:39;;60429:6;60436;60429:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;60500:11:0;60509:2;60500:11;;:::i;:::-;;;60369:154;;34328:89;34388:21;34394:7;34403:5;34388;:21::i;24862:681::-;24985:19;24991:2;24995:8;24985:5;:19::i;:::-;-1:-1:-1;;;;;25046:14:0;;;:19;25042:483;;25086:11;25100:13;25148:14;;;25181:233;25212:62;25251:1;25255:2;25259:7;;;;;;25268:5;25212:30;:62::i;:::-;25207:167;;25310:40;;-1:-1:-1;;;25310:40:0;;;;;;;;;;;25207:167;25409:3;25401:5;:11;25181:233;;25496:3;25479:13;;:20;25475:34;;25501:8;;;25475:34;25067:458;;24862:681;;;:::o;34646:3063::-;34726:27;34756;34775:7;34756:18;:27::i;:::-;34726:57;-1:-1:-1;34726:57:0;34796:12;;34918:28;34938:7;29881:27;30180:21;;;30007:15;30222:4;30215:36;30304:4;30288:21;;30394:26;;30288:21;;29786:652;34918:28;34861:85;;;;34963:13;34959:310;;;35084:62;35103:15;35120:4;65228:10;35126:19;65148:98;35084:62;35079:178;;35170:43;35187:4;65228:10;22840:164;:::i;35170:43::-;35165:92;;35222:35;;-1:-1:-1;;;35222:35:0;;;;;;;;;;;35165:92;35425:15;35422:160;;;35565:1;35544:19;35537:30;35422:160;-1:-1:-1;;;;;36183:24:0;;;;;;:18;:24;;;;;:59;;36211:31;36183:59;;;19927:11;19903:22;19899:40;19886:62;36570:41;19886:62;36480:26;;;;:17;:26;;;;;:203;;;;-1:-1:-1;;;36803:46:0;;:51;;36799:626;;36907:1;36897:11;;36875:19;37030:30;;;:17;:30;;;;;;:35;;37026:384;;37168:13;;37153:11;:28;37149:242;;37315:30;;;;:17;:30;;;;;:52;;;37149:242;36856:569;36799:626;37453:35;;37480:7;;37476:1;;-1:-1:-1;;;;;37453:35:0;;;;;37476:1;;37453:35;-1:-1:-1;;37676:12:0;:14;;;;;;-1:-1:-1;;;;34646:3063:0:o;25816:1529::-;25881:20;25904:13;-1:-1:-1;;;;;25932:16:0;;25928:48;;25957:19;;;;;;;;;;;;;;25928:48;25991:8;26003:1;25991:13;25987:44;;26013:18;;;;;;;;;;;;;;25987:44;-1:-1:-1;;;;;26519:22:0;;;;;;:18;:22;;9963:2;26519:22;;:70;;26557:31;26545:44;;26519:70;;;19927:11;19903:22;19899:40;-1:-1:-1;21637:15:0;;21612:23;21608:45;19896:51;19886:62;26832:31;;;;:17;:31;;;;;:173;26850:12;27081:23;;;27119:101;27146:35;;27171:9;;;;;-1:-1:-1;;;;;27146:35:0;;;27163:1;;27146:35;;27163:1;;27146:35;27215:3;27205:7;:13;27119:101;;27236:13;:19;-1:-1:-1;23075:185:0;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:184::-;-1:-1:-1;;;227:1:1;220:88;327:4;324:1;317:15;351:4;348:1;341:15;367:631;431:5;461:18;502:2;494:6;491:14;488:40;;;508:18;;:::i;:::-;583:2;577:9;551:2;637:15;;-1:-1:-1;;633:24:1;;;659:2;629:33;625:42;613:55;;;683:18;;;703:22;;;680:46;677:72;;;729:18;;:::i;:::-;769:10;765:2;758:22;798:6;789:15;;828:6;820;813:22;868:3;859:6;854:3;850:16;847:25;844:45;;;885:1;882;875:12;844:45;935:6;930:3;923:4;915:6;911:17;898:44;990:1;983:4;974:6;966;962:19;958:30;951:41;;;;367:631;;;;;:::o;1003:220::-;1045:5;1098:3;1091:4;1083:6;1079:17;1075:27;1065:55;;1116:1;1113;1106:12;1065:55;1138:79;1213:3;1204:6;1191:20;1184:4;1176:6;1172:17;1138:79;:::i;1228:171::-;1295:20;;1355:18;1344:30;;1334:41;;1324:69;;1389:1;1386;1379:12;1404:684;1506:6;1514;1522;1530;1583:3;1571:9;1562:7;1558:23;1554:33;1551:53;;;1600:1;1597;1590:12;1551:53;1623:28;1641:9;1623:28;:::i;:::-;1613:38;;1702:2;1691:9;1687:18;1674:32;1725:18;1766:2;1758:6;1755:14;1752:34;;;1782:1;1779;1772:12;1752:34;1805:49;1846:7;1837:6;1826:9;1822:22;1805:49;:::i;:::-;1795:59;;1873:37;1906:2;1895:9;1891:18;1873:37;:::i;:::-;1863:47;;1963:2;1952:9;1948:18;1935:32;1919:48;;1992:2;1982:8;1979:16;1976:36;;;2008:1;2005;1998:12;1976:36;;2031:51;2074:7;2063:8;2052:9;2048:24;2031:51;:::i;:::-;2021:61;;;1404:684;;;;;;;:::o;2093:180::-;2152:6;2205:2;2193:9;2184:7;2180:23;2176:32;2173:52;;;2221:1;2218;2211:12;2173:52;-1:-1:-1;2244:23:1;;2093:180;-1:-1:-1;2093:180:1:o;2278:177::-;-1:-1:-1;;;;;;2356:5:1;2352:78;2345:5;2342:89;2332:117;;2445:1;2442;2435:12;2460:245;2518:6;2571:2;2559:9;2550:7;2546:23;2542:32;2539:52;;;2587:1;2584;2577:12;2539:52;2626:9;2613:23;2645:30;2669:5;2645:30;:::i;2902:258::-;2974:1;2984:113;2998:6;2995:1;2992:13;2984:113;;;3074:11;;;3068:18;3055:11;;;3048:39;3020:2;3013:10;2984:113;;;3115:6;3112:1;3109:13;3106:48;;;-1:-1:-1;;3150:1:1;3132:16;;3125:27;2902:258::o;3165:::-;3207:3;3245:5;3239:12;3272:6;3267:3;3260:19;3288:63;3344:6;3337:4;3332:3;3328:14;3321:4;3314:5;3310:16;3288:63;:::i;:::-;3405:2;3384:15;-1:-1:-1;;3380:29:1;3371:39;;;;3412:4;3367:50;;3165:258;-1:-1:-1;;3165:258:1:o;3428:220::-;3577:2;3566:9;3559:21;3540:4;3597:45;3638:2;3627:9;3623:18;3615:6;3597:45;:::i;4016:154::-;-1:-1:-1;;;;;4095:5:1;4091:54;4084:5;4081:65;4071:93;;4160:1;4157;4150:12;4175:315;4243:6;4251;4304:2;4292:9;4283:7;4279:23;4275:32;4272:52;;;4320:1;4317;4310:12;4272:52;4359:9;4346:23;4378:31;4403:5;4378:31;:::i;:::-;4428:5;4480:2;4465:18;;;;4452:32;;-1:-1:-1;;;4175:315:1:o;4495:450::-;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:52;;;4633:1;4630;4623:12;4585:52;4673:9;4660:23;4706:18;4698:6;4695:30;4692:50;;;4738:1;4735;4728:12;4692:50;4761:22;;4814:4;4806:13;;4802:27;-1:-1:-1;4792:55:1;;4843:1;4840;4833:12;4792:55;4866:73;4931:7;4926:2;4913:16;4908:2;4904;4900:11;4866:73;:::i;5132:456::-;5209:6;5217;5225;5278:2;5266:9;5257:7;5253:23;5249:32;5246:52;;;5294:1;5291;5284:12;5246:52;5333:9;5320:23;5352:31;5377:5;5352:31;:::i;:::-;5402:5;-1:-1:-1;5459:2:1;5444:18;;5431:32;5472:33;5431:32;5472:33;:::i;:::-;5132:456;;5524:7;;-1:-1:-1;;;5578:2:1;5563:18;;;;5550:32;;5132:456::o;5593:247::-;5652:6;5705:2;5693:9;5684:7;5680:23;5676:32;5673:52;;;5721:1;5718;5711:12;5673:52;5760:9;5747:23;5779:31;5804:5;5779:31;:::i;5845:160::-;5910:20;;5966:13;;5959:21;5949:32;;5939:60;;5995:1;5992;5985:12;6010:180;6066:6;6119:2;6107:9;6098:7;6094:23;6090:32;6087:52;;;6135:1;6132;6125:12;6087:52;6158:26;6174:9;6158:26;:::i;6195:184::-;6253:6;6306:2;6294:9;6285:7;6281:23;6277:32;6274:52;;;6322:1;6319;6312:12;6274:52;6345:28;6363:9;6345:28;:::i;6607:315::-;6675:6;6683;6736:2;6724:9;6715:7;6711:23;6707:32;6704:52;;;6752:1;6749;6742:12;6704:52;6788:9;6775:23;6765:33;;6848:2;6837:9;6833:18;6820:32;6861:31;6886:5;6861:31;:::i;:::-;6911:5;6901:15;;;6607:315;;;;;:::o;6927:632::-;7098:2;7150:21;;;7220:13;;7123:18;;;7242:22;;;7069:4;;7098:2;7321:15;;;;7295:2;7280:18;;;7069:4;7364:169;7378:6;7375:1;7372:13;7364:169;;;7439:13;;7427:26;;7508:15;;;;7473:12;;;;7400:1;7393:9;7364:169;;;-1:-1:-1;7550:3:1;;6927:632;-1:-1:-1;;;;;;6927:632:1:o;7564:460::-;7649:6;7657;7665;7718:2;7706:9;7697:7;7693:23;7689:32;7686:52;;;7734:1;7731;7724:12;7686:52;7757:28;7775:9;7757:28;:::i;:::-;7747:38;;7836:2;7825:9;7821:18;7808:32;7863:18;7855:6;7852:30;7849:50;;;7895:1;7892;7885:12;7849:50;7918:49;7959:7;7950:6;7939:9;7935:22;7918:49;:::i;:::-;7908:59;;;8014:2;8003:9;7999:18;7986:32;7976:42;;7564:460;;;;;:::o;8282:315::-;8347:6;8355;8408:2;8396:9;8387:7;8383:23;8379:32;8376:52;;;8424:1;8421;8414:12;8376:52;8463:9;8450:23;8482:31;8507:5;8482:31;:::i;:::-;8532:5;-1:-1:-1;8556:35:1;8587:2;8572:18;;8556:35;:::i;:::-;8546:45;;8282:315;;;;;:::o;8602:665::-;8697:6;8705;8713;8721;8774:3;8762:9;8753:7;8749:23;8745:33;8742:53;;;8791:1;8788;8781:12;8742:53;8830:9;8817:23;8849:31;8874:5;8849:31;:::i;:::-;8899:5;-1:-1:-1;8956:2:1;8941:18;;8928:32;8969:33;8928:32;8969:33;:::i;:::-;9021:7;-1:-1:-1;9075:2:1;9060:18;;9047:32;;-1:-1:-1;9130:2:1;9115:18;;9102:32;9157:18;9146:30;;9143:50;;;9189:1;9186;9179:12;9143:50;9212:49;9253:7;9244:6;9233:9;9229:22;9212:49;:::i;9272:252::-;9339:6;9347;9400:2;9388:9;9379:7;9375:23;9371:32;9368:52;;;9416:1;9413;9406:12;9368:52;9439:28;9457:9;9439:28;:::i;9529:347::-;9580:8;9590:6;9644:3;9637:4;9629:6;9625:17;9621:27;9611:55;;9662:1;9659;9652:12;9611:55;-1:-1:-1;9685:20:1;;9728:18;9717:30;;9714:50;;;9760:1;9757;9750:12;9714:50;9797:4;9789:6;9785:17;9773:29;;9849:3;9842:4;9833:6;9825;9821:19;9817:30;9814:39;9811:59;;;9866:1;9863;9856:12;9811:59;9529:347;;;;;:::o;9881:773::-;9985:6;9993;10001;10009;10017;10070:3;10058:9;10049:7;10045:23;10041:33;10038:53;;;10087:1;10084;10077:12;10038:53;10110:28;10128:9;10110:28;:::i;:::-;10100:38;;10189:2;10178:9;10174:18;10161:32;10212:18;10253:2;10245:6;10242:14;10239:34;;;10269:1;10266;10259:12;10239:34;10292:49;10333:7;10324:6;10313:9;10309:22;10292:49;:::i;:::-;10282:59;;10360:37;10393:2;10382:9;10378:18;10360:37;:::i;:::-;10350:47;;10450:2;10439:9;10435:18;10422:32;10406:48;;10479:2;10469:8;10466:16;10463:36;;;10495:1;10492;10485:12;10463:36;;10534:60;10586:7;10575:8;10564:9;10560:24;10534:60;:::i;:::-;9881:773;;;;-1:-1:-1;9881:773:1;;-1:-1:-1;10613:8:1;;10508:86;9881:773;-1:-1:-1;;;9881:773:1:o;10659:388::-;10727:6;10735;10788:2;10776:9;10767:7;10763:23;10759:32;10756:52;;;10804:1;10801;10794:12;10756:52;10843:9;10830:23;10862:31;10887:5;10862:31;:::i;:::-;10912:5;-1:-1:-1;10969:2:1;10954:18;;10941:32;10982:33;10941:32;10982:33;:::i;11052:481::-;11130:6;11138;11146;11199:2;11187:9;11178:7;11174:23;11170:32;11167:52;;;11215:1;11212;11205:12;11167:52;11238:28;11256:9;11238:28;:::i;:::-;11228:38;;11317:2;11306:9;11302:18;11289:32;11344:18;11336:6;11333:30;11330:50;;;11376:1;11373;11366:12;11330:50;11415:58;11465:7;11456:6;11445:9;11441:22;11415:58;:::i;:::-;11052:481;;11492:8;;-1:-1:-1;11389:84:1;;-1:-1:-1;;;;11052:481:1:o;11538:437::-;11617:1;11613:12;;;;11660;;;11681:61;;11735:4;11727:6;11723:17;11713:27;;11681:61;11788:2;11780:6;11777:14;11757:18;11754:38;11751:218;;-1:-1:-1;;;11822:1:1;11815:88;11926:4;11923:1;11916:15;11954:4;11951:1;11944:15;11751:218;;11538:437;;;:::o;11980:692::-;12029:3;12070:5;12064:12;12099:36;12125:9;12099:36;:::i;:::-;12154:1;12171:18;;;12198:104;;;;12316:1;12311:355;;;;12164:502;;12198:104;-1:-1:-1;;12231:24:1;;12219:37;;12276:16;;;;-1:-1:-1;12198:104:1;;12311:355;12342:5;12339:1;12332:16;12371:4;12416:2;12413:1;12403:16;12441:1;12455:165;12469:6;12466:1;12463:13;12455:165;;;12547:14;;12534:11;;;12527:35;12590:16;;;;12484:10;;12455:165;;;12459:3;;;12649:6;12644:3;12640:16;12633:23;;12164:502;;;;;11980:692;;;;:::o;12677:194::-;12803:3;12828:37;12861:3;12853:6;12828:37;:::i;13297:557::-;13554:6;13546;13542:19;13531:9;13524:38;13598:3;13593:2;13582:9;13578:18;13571:31;13505:4;13625:46;13666:3;13655:9;13651:19;13643:6;13625:46;:::i;:::-;13719:18;13711:6;13707:31;13702:2;13691:9;13687:18;13680:59;13787:9;13779:6;13775:22;13770:2;13759:9;13755:18;13748:50;13815:33;13841:6;13833;13815:33;:::i;:::-;13807:41;13297:557;-1:-1:-1;;;;;;;13297:557:1:o;13859:274::-;13988:3;14026:6;14020:13;14042:53;14088:6;14083:3;14076:4;14068:6;14064:17;14042:53;:::i;:::-;14111:16;;;;;13859:274;-1:-1:-1;;13859:274:1:o;15481:184::-;15551:6;15604:2;15592:9;15583:7;15579:23;15575:32;15572:52;;;15620:1;15617;15610:12;15572:52;-1:-1:-1;15643:16:1;;15481:184;-1:-1:-1;15481:184:1:o;16725:::-;-1:-1:-1;;;16774:1:1;16767:88;16874:4;16871:1;16864:15;16898:4;16895:1;16888:15;16914:128;16954:3;16985:1;16981:6;16978:1;16975:13;16972:39;;;16991:18;;:::i;:::-;-1:-1:-1;17027:9:1;;16914:128::o;17396:168::-;17436:7;17502:1;17498;17494:6;17490:14;17487:1;17484:21;17479:1;17472:9;17465:17;17461:45;17458:71;;;17509:18;;:::i;:::-;-1:-1:-1;17549:9:1;;17396:168::o;18270:184::-;-1:-1:-1;;;18319:1:1;18312:88;18419:4;18416:1;18409:15;18443:4;18440:1;18433:15;19936:549;20160:3;20198:6;20192:13;20214:53;20260:6;20255:3;20248:4;20240:6;20236:17;20214:53;:::i;:::-;20330:13;;20289:16;;;;20352:57;20330:13;20289:16;20386:4;20374:17;;20352:57;:::i;:::-;20425:54;20469:8;20462:5;20458:20;20450:6;20425:54;:::i;21942:665::-;22223:6;22215;22211:19;22200:9;22193:38;-1:-1:-1;;;;;22271:6:1;22267:55;22262:2;22251:9;22247:18;22240:83;22359:3;22354:2;22343:9;22339:18;22332:31;22174:4;22386:46;22427:3;22416:9;22412:19;22404:6;22386:46;:::i;:::-;22482:6;22475:14;22468:22;22463:2;22452:9;22448:18;22441:50;22540:9;22532:6;22528:22;22522:3;22511:9;22507:19;22500:51;22568:33;22594:6;22586;22568:33;:::i;:::-;22560:41;21942:665;-1:-1:-1;;;;;;;;21942:665:1:o;22612:245::-;22691:6;22699;22752:2;22740:9;22731:7;22727:23;22723:32;22720:52;;;22768:1;22765;22758:12;22720:52;-1:-1:-1;;22791:16:1;;22847:2;22832:18;;;22826:25;22791:16;;22826:25;;-1:-1:-1;22612:245:1:o;23705:1484::-;24051:6;24043;24039:19;24028:9;24021:38;24002:4;24078:2;24116:3;24111:2;24100:9;24096:18;24089:31;24140:1;24173:6;24167:13;24203:36;24229:9;24203:36;:::i;:::-;24276:6;24270:3;24259:9;24255:19;24248:35;24302:3;24324:1;24356:2;24345:9;24341:18;24373:1;24368:122;;;;24504:1;24499:354;;;;24334:519;;24368:122;-1:-1:-1;;24416:24:1;;24396:18;;;24389:52;24476:3;24461:19;;;-1:-1:-1;24368:122:1;;24499:354;24530:6;24527:1;24520:17;24578:2;24575:1;24565:16;24603:1;24617:180;24631:6;24628:1;24625:13;24617:180;;;24724:14;;24700:17;;;24696:26;;24689:50;24767:16;;;;24646:10;;24617:180;;;24821:17;;24817:26;;;-1:-1:-1;;24334:519:1;;;;;;24898:9;24893:3;24889:19;24884:2;24873:9;24869:18;24862:47;24932:30;24958:3;24950:6;24932:30;:::i;:::-;24918:44;;;24971:46;25013:2;25002:9;24998:18;24990:6;-1:-1:-1;;;;;3719:54:1;3707:67;;3653:127;24971:46;-1:-1:-1;;;;;3719:54:1;;25068:3;25053:19;;3707:67;25122:9;25114:6;25110:22;25104:3;25093:9;25089:19;25082:51;25150:33;25176:6;25168;25150:33;:::i;:::-;25142:41;23705:1484;-1:-1:-1;;;;;;;;;23705:1484:1:o;25601:271::-;25784:6;25776;25771:3;25758:33;25740:3;25810:16;;25835:13;;;25810:16;25601:271;-1:-1:-1;25601:271:1:o;26232:718::-;26499:6;26491;26487:19;26476:9;26469:38;26543:3;26538:2;26527:9;26523:18;26516:31;26450:4;26570:46;26611:3;26600:9;26596:19;26588:6;26570:46;:::i;:::-;26664:18;26656:6;26652:31;26647:2;26636:9;26632:18;26625:59;26732:9;26724:6;26720:22;26715:2;26704:9;26700:18;26693:50;26767:6;26759;26752:22;26821:6;26813;26808:2;26800:6;26796:15;26783:45;26874:1;26869:2;26860:6;26852;26848:19;26844:28;26837:39;26941:2;26934;26930:7;26925:2;26917:6;26913:15;26909:29;26901:6;26897:42;26893:51;26885:59;;;26232:718;;;;;;;;:::o;27362:320::-;27449:6;27457;27510:2;27498:9;27489:7;27485:23;27481:32;27478:52;;;27526:1;27523;27516:12;27478:52;27558:9;27552:16;27577:31;27602:5;27577:31;:::i;:::-;27672:2;27657:18;;;;27651:25;27627:5;;27651:25;;-1:-1:-1;;;27362:320:1:o;27687:512::-;27881:4;-1:-1:-1;;;;;27991:2:1;27983:6;27979:15;27968:9;27961:34;28043:2;28035:6;28031:15;28026:2;28015:9;28011:18;28004:43;;28083:6;28078:2;28067:9;28063:18;28056:34;28126:3;28121:2;28110:9;28106:18;28099:31;28147:46;28188:3;28177:9;28173:19;28165:6;28147:46;:::i;:::-;28139:54;27687:512;-1:-1:-1;;;;;;27687:512:1:o;28204:249::-;28273:6;28326:2;28314:9;28305:7;28301:23;28297:32;28294:52;;;28342:1;28339;28332:12;28294:52;28374:9;28368:16;28393:30;28417:5;28393:30;:::i;28458:135::-;28497:3;28518:17;;;28515:43;;28538:18;;:::i;:::-;-1:-1:-1;28585:1:1;28574:13;;28458:135::o;28598:184::-;-1:-1:-1;;;28647:1:1;28640:88;28747:4;28744:1;28737:15;28771:4;28768:1;28761:15;28787:120;28827:1;28853;28843:35;;28858:18;;:::i;:::-;-1:-1:-1;28892:9:1;;28787:120::o;28912:125::-;28952:4;28980:1;28977;28974:8;28971:34;;;28985:18;;:::i;:::-;-1:-1:-1;29022:9:1;;28912:125::o;29042:112::-;29074:1;29100;29090:35;;29105:18;;:::i;:::-;-1:-1:-1;29139:9:1;;29042:112::o

Swarm Source

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