ETH Price: $2,486.09 (-1.26%)

Token

Matryoshka Hub Adventure Club (MHAC)
 

Overview

Max Total Supply

4,491 MHAC

Holders

420

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
8 MHAC
0x2d4484310243c21b9bd3583ccc6dcb376e9cfc6b
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:
MatryoshkaHubAdventureClub

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-03
*/

// SPDX-License-Identifier: MIT
// File: 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: 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: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/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: contracts/MatryoshkaHubAdventureClub.sol


/***
................................................................................
................................................................................
.........PBBBB7......GBBBG...PBBY.....:BBB!......PBBBG.......~YG######BJ........
.........B@@@@&^....5@@@@&:..B@@P.....:@@@7.....5@@B@@P.....J@@&J!~~!7?!........
.........B@@Y&@B...7@@Y&@&...B@@P:::::~@@@7....?@@P.B@@?....G@@G................
.........B@@!7@@Y.:&@5^@@&...B@@@&&&&&&@@@7...~@@#:.^&@@~...G@@G................
.........B@@7.5@@7G@#.^@@&...B@@G:^^^:!@@@7..:#@@&BBB@@@#...G@@G................
.........B@@7..B@@@@~.^@@&...B@@P.....:@@@7..G@@5~!!!~G@@P..5@@&!:..::^^........
.........B@@7..^&@@J..^&@#...B@@5.....:&@@7.J@@B......:#@@?..JB&@&&&&&@P........
................................................................................
.........................Matryoshka Hub Adventure Club..........................
................................................................................
....................................:~!88!~:....................................
.................................~V#&&####&&#V~.................................
...............................^G@&8!:....:!8&@G^...............................
..............................~&@8............8@&~..............................
..............................&@J..............J@&..............................
[email protected]@B..............................
..............................J@@B~..........~B@@J..............................
...............................B@@@G?~::::~?G@@@B...............................
...............................:&@@@@@@&&@@@@@@&:...............................
..............................~8^B@@@@@@@@@@@@B^8~..............................
............................:P@@8^8@@@@@@@@@@8^8@@P:............................
...........................~&@@@@B!8#@@@@@@#8!B@@@@&~...........................
..........................:&@@@@@@@8~M#@@#M~8@@@@@@@&:..........................
..........................V@@@@@@@@@&V!GG!V&@@@@@@@@@V..........................
..........................M@@@@@@@@@@@&88&@@@@@@@@@@@M..........................
..........................V@@@@@@@@@@@@@@@@@@@@@@@@@@V..........................
..........................:&@@@@@@@@@@@@@@@@@@@@@@@@&:..........................
...........................~&@@@@@@@@@@@@@@@@@@@@@@&~...........................
............................:P@@@@@@@@@@@@@@@@@@@@P:............................
..............................~2#@@@@@@@@@@@@@@#4~..............................
.................................~JPB#&&&&#BPJ~.................................
................................................................................
................................................................................
***/

pragma solidity ^0.8.4;




contract MatryoshkaHubAdventureClub is Ownable, ReentrancyGuard, ERC721A {
    uint256 public constant PRICE = 0.004 ether;
    uint256 public constant MAX_PER_MINT = 44;
    uint256 public constant MAX_PER_TRANSACTION = 8;
    uint256 public constant MAX_SUPPLY = 8888;
    uint256 public constant FREE_SUPPLY = MAX_SUPPLY / 2;
    uint256 public startingIndex;
    string public provenance;
    string public baseURI;
    bool public isMintActive = false;

    event MatryoshkaBirth(uint256 indexed tokenId, uint256 indexed tokenIndex);

    constructor() ERC721A('Matryoshka Hub Adventure Club', 'MHAC') {}

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

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

    function mint(uint256 quantity) external payable {
        require(isMintActive, 'Mint is not active');
        require(tx.origin == msg.sender, 'Contracts not allowed to mint');

        uint256 totalMinted = _totalMinted();
        uint256 nextMinted = totalMinted + quantity;

        require(nextMinted <= MAX_SUPPLY, 'Reached max supply');
        require(quantity <= MAX_PER_TRANSACTION, 'Reached max amount per transaction');
        require(_numberMinted(msg.sender) + quantity <= MAX_PER_MINT, 'Reached max amount per mint');

        if (nextMinted > FREE_SUPPLY) {
            uint256 payableQuantity = quantity;

            if (totalMinted < FREE_SUPPLY) {
                payableQuantity = quantity - (FREE_SUPPLY - totalMinted);
            }

            uint256 payableValue = PRICE * payableQuantity;
            require(msg.value >= payableValue, 'Insufficient payment');
        }

        _mint(msg.sender, quantity);
    }

    function setProvenance(string memory _provenance) external onlyOwner {
        require(bytes(provenance).length == 0, 'Provenance already set');

        provenance = _provenance;
    }

    function setStartingIndex() external onlyOwner {
        require(bytes(provenance).length != 0, 'Provenance must be set');
        require(startingIndex == 0, 'Starting index already set');

        uint256 number = uint256(
            keccak256(
                abi.encodePacked(
                    provenance,
                    block.number,
                    block.timestamp
                )
            )
        );

        startingIndex = (number % MAX_SUPPLY) + _startTokenId();
    }

    function setBaseURI(string memory URI) external onlyOwner {
        baseURI = URI;
    }

    function toggleMintActive() external onlyOwner {
        isMintActive = !isMintActive;
    }

    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(balance > 0, 'No balance to withdraw');

        (bool success,) = payable(msg.sender).call{value: balance}('');
        require(success, 'Withdraw failed');
    }

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal override {
        if (from == address(0)) {
            for (uint256 tokenId = startTokenId; tokenId < startTokenId + quantity; tokenId++) {
                emit MatryoshkaBirth(
                    tokenId,
                    ((tokenId + startingIndex) % MAX_SUPPLY) + _startTokenId()
                );
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"MatryoshkaBirth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","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":"toggleMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600d60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280601d81526020017f4d617472796f73686b612048756220416476656e7475726520436c75620000008152506040518060400160405280600481526020017f4d48414300000000000000000000000000000000000000000000000000000000815250620000b9620000ad6200011060201b60201c565b6200011860201b60201c565b600180819055508160049080519060200190620000d8929190620001e5565b508060059080519060200190620000f1929190620001e5565b5062000102620001dc60201b60201c565b6002819055505050620002fa565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620001f39062000295565b90600052602060002090601f01602090048101928262000217576000855562000263565b82601f106200023257805160ff191683800117855562000263565b8280016001018555821562000263579182015b828111156200026257825182559160200191906001019062000245565b5b50905062000272919062000276565b5090565b5b808211156200029157600081600090555060010162000277565b5090565b60006002820490506001821680620002ae57607f821691505b60208210811415620002c557620002c4620002cb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61373e806200030a6000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063c87b56dd11610095578063e985e9c511610064578063e985e9c51461069f578063e9866550146106dc578063f2fde38b146106f3578063ffe630b51461071c576101e3565b8063c87b56dd146105f5578063cb14eb8714610632578063cb774d471461065d578063d02c2bf214610688576101e3565b80639858cf19116100d15780639858cf191461055c578063a0712d6814610587578063a22cb465146105a3578063b88d4fde146105cc576101e3565b8063715018a6146104c45780638d859f3e146104db5780638da5cb5b1461050657806395d89b4114610531576101e3565b806332cb6b0c1161017a5780635b92ac0d116101495780635b92ac0d146103f45780636352211e1461041f5780636c0360eb1461045c57806370a0823114610487576101e3565b806332cb6b0c146103605780633ccfd60b1461038b57806342842e0e146103a257806355f804b3146103cb576101e3565b806309d42b30116101b657806309d42b30146102b65780630f7309e8146102e157806318160ddd1461030c57806323b872dd14610337576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612896565b610745565b60405161021c9190612d9e565b60405180910390f35b34801561023157600080fd5b5061023a6107d7565b6040516102479190612db9565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612929565b610869565b6040516102849190612d37565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af919061285a565b6108e5565b005b3480156102c257600080fd5b506102cb610a26565b6040516102d89190612f9b565b60405180910390f35b3480156102ed57600080fd5b506102f6610a2b565b6040516103039190612db9565b60405180910390f35b34801561031857600080fd5b50610321610ab9565b60405161032e9190612f9b565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190612754565b610ad0565b005b34801561036c57600080fd5b50610375610df5565b6040516103829190612f9b565b60405180910390f35b34801561039757600080fd5b506103a0610dfb565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190612754565b610fc4565b005b3480156103d757600080fd5b506103f260048036038101906103ed91906128e8565b610fe4565b005b34801561040057600080fd5b5061040961107a565b6040516104169190612d9e565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190612929565b61108d565b6040516104539190612d37565b60405180910390f35b34801561046857600080fd5b5061047161109f565b60405161047e9190612db9565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a991906126ef565b61112d565b6040516104bb9190612f9b565b60405180910390f35b3480156104d057600080fd5b506104d96111e6565b005b3480156104e757600080fd5b506104f061126e565b6040516104fd9190612f9b565b60405180910390f35b34801561051257600080fd5b5061051b611279565b6040516105289190612d37565b60405180910390f35b34801561053d57600080fd5b506105466112a2565b6040516105539190612db9565b60405180910390f35b34801561056857600080fd5b50610571611334565b60405161057e9190612f9b565b60405180910390f35b6105a1600480360381019061059c9190612929565b611346565b005b3480156105af57600080fd5b506105ca60048036038101906105c5919061281e565b6115c4565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906127a3565b61173c565b005b34801561060157600080fd5b5061061c60048036038101906106179190612929565b6117af565b6040516106299190612db9565b60405180910390f35b34801561063e57600080fd5b5061064761184e565b6040516106549190612f9b565b60405180910390f35b34801561066957600080fd5b50610672611853565b60405161067f9190612f9b565b60405180910390f35b34801561069457600080fd5b5061069d611859565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190612718565b611901565b6040516106d39190612d9e565b60405180910390f35b3480156106e857600080fd5b506106f1611995565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906126ef565b611b04565b005b34801561072857600080fd5b50610743600480360381019061073e91906128e8565b611bfc565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600480546107e69061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546108129061326b565b801561085f5780601f106108345761010080835404028352916020019161085f565b820191906000526020600020905b81548152906001019060200180831161084257829003601f168201915b5050505050905090565b600061087482611ce3565b6108aa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f08261108d565b90508073ffffffffffffffffffffffffffffffffffffffff16610911611d42565b73ffffffffffffffffffffffffffffffffffffffff16146109745761093d81610938611d42565b611901565b610973576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b602c81565b600b8054610a389061326b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a649061326b565b8015610ab15780601f10610a8657610100808354040283529160200191610ab1565b820191906000526020600020905b815481529060010190602001808311610a9457829003601f168201915b505050505081565b6000610ac3611d4a565b6003546002540303905090565b6000610adb82611d53565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b42576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b4e84611e21565b91509150610b648187610b5f611d42565b611e43565b610bb057610b7986610b74611d42565b611901565b610baf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c17576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c248686866001611e87565b8015610c2f57600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cfd85610cd9888887611e8d565b7c020000000000000000000000000000000000000000000000000000000017611eb5565b600660008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d85576000600185019050600060066000838152602001908152602001600020541415610d83576002548114610d82578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ded8686866001611ee0565b505050505050565b6122b881565b610e03611fa3565b73ffffffffffffffffffffffffffffffffffffffff16610e21611279565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90612edb565b60405180910390fd5b60026001541415610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490612f7b565b60405180910390fd5b6002600181905550600047905060008111610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612f1b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610f3390612d22565b60006040518083038185875af1925050503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b5050905080610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb090612e1b565b60405180910390fd5b505060018081905550565b610fdf8383836040518060200160405280600081525061173c565b505050565b610fec611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661100a611279565b73ffffffffffffffffffffffffffffffffffffffff1614611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790612edb565b60405180910390fd5b80600c9080519060200190611076929190612513565b5050565b600d60009054906101000a900460ff1681565b600061109882611d53565b9050919050565b600c80546110ac9061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546110d89061326b565b80156111255780601f106110fa57610100808354040283529160200191611125565b820191906000526020600020905b81548152906001019060200180831161110857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611195576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111ee611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661120c611279565b73ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990612edb565b60405180910390fd5b61126c6000611fab565b565b660e35fa931a000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546112b19061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546112dd9061326b565b801561132a5780601f106112ff5761010080835404028352916020019161132a565b820191906000526020600020905b81548152906001019060200180831161130d57829003601f168201915b5050505050905090565b60026122b861134391906130f6565b81565b600d60009054906101000a900460ff16611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90612efb565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa90612ddb565b60405180910390fd5b600061140d61206f565b90506000828261141d91906130a0565b90506122b8811115611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90612e5b565b60405180910390fd5b60088311156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90612e7b565b60405180910390fd5b602c836114b433612082565b6114be91906130a0565b11156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690612e3b565b60405180910390fd5b60026122b861150e91906130f6565b8111156115b557600083905060026122b861152991906130f6565b831015611558578260026122b861154091906130f6565b61154a9190613181565b846115559190613181565b90505b600081660e35fa931a000061156d9190613127565b9050803410156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990612ebb565b60405180910390fd5b50505b6115bf33846120d9565b505050565b6115cc611d42565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611631576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806009600061163e611d42565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116eb611d42565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117309190612d9e565b60405180910390a35050565b611747848484610ad0565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117a957611772848484846122ae565b6117a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606117ba82611ce3565b6117f0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117fa61240e565b905060008151141561181b5760405180602001604052806000815250611846565b80611825846124a0565b604051602001611836929190612cc5565b6040516020818303038152906040525b915050919050565b600881565b600a5481565b611861611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661187f611279565b73ffffffffffffffffffffffffffffffffffffffff16146118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90612edb565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61199d611fa3565b73ffffffffffffffffffffffffffffffffffffffff166119bb611279565b73ffffffffffffffffffffffffffffffffffffffff1614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890612edb565b60405180910390fd5b6000600b8054611a209061326b565b90501415611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90612f3b565b60405180910390fd5b6000600a5414611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90612e9b565b60405180910390fd5b6000600b4342604051602001611ac093929190612ce9565b6040516020818303038152906040528051906020012060001c9050611ae3611d4a565b6122b882611af19190613321565b611afb91906130a0565b600a8190555050565b611b0c611fa3565b73ffffffffffffffffffffffffffffffffffffffff16611b2a611279565b73ffffffffffffffffffffffffffffffffffffffff1614611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790612edb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790612dfb565b60405180910390fd5b611bf981611fab565b50565b611c04611fa3565b73ffffffffffffffffffffffffffffffffffffffff16611c22611279565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90612edb565b60405180910390fd5b6000600b8054611c879061326b565b905014611cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc090612f5b565b60405180910390fd5b80600b9080519060200190611cdf929190612513565b5050565b600081611cee611d4a565b11158015611cfd575060025482105b8015611d3b575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611d62611d4a565b11611dea57600254811015611de95760006006600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611de7575b6000811415611ddd576006600083600190039350838152602001908152602001600020549050611db2565b8092505050611e1c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600890508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ea48686846124fa565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f9d5760008290505b8183611f2791906130a0565b811015611f9b57611f36611d4a565b6122b8600a5483611f4791906130a0565b611f519190613321565b611f5b91906130a0565b817f38906b6a557fb827c86319494d14fa70d229f1e7701d828e3cee3d7f2910e13360405160405180910390a38080611f93906132ce565b915050611f1b565b505b50505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612079611d4a565b60025403905090565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612147576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612182576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61218f6000848385611e87565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612206836121f76000866000611e8d565b61220085612503565b17611eb5565b60066000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061222a578060028190555050506122a96000848385611ee0565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d4611d42565b8786866040518563ffffffff1660e01b81526004016122f69493929190612d52565b602060405180830381600087803b15801561231057600080fd5b505af192505050801561234157506040513d601f19601f8201168201806040525081019061233e91906128bf565b60015b6123bb573d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b506000815114156123b3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c805461241d9061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546124499061326b565b80156124965780601f1061246b57610100808354040283529160200191612496565b820191906000526020600020905b81548152906001019060200180831161247957829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156124e657600183039250600a81066030018353600a810490506124c6565b508181036020830392508083525050919050565b60009392505050565b60006001821460e11b9050919050565b82805461251f9061326b565b90600052602060002090601f0160209004810192826125415760008555612588565b82601f1061255a57805160ff1916838001178555612588565b82800160010185558215612588579182015b8281111561258757825182559160200191906001019061256c565b5b5090506125959190612599565b5090565b5b808211156125b257600081600090555060010161259a565b5090565b60006125c96125c484612fdb565b612fb6565b9050828152602081018484840111156125e157600080fd5b6125ec848285613229565b509392505050565b60006126076126028461300c565b612fb6565b90508281526020810184848401111561261f57600080fd5b61262a848285613229565b509392505050565b600081359050612641816136ac565b92915050565b600081359050612656816136c3565b92915050565b60008135905061266b816136da565b92915050565b600081519050612680816136da565b92915050565b600082601f83011261269757600080fd5b81356126a78482602086016125b6565b91505092915050565b600082601f8301126126c157600080fd5b81356126d18482602086016125f4565b91505092915050565b6000813590506126e9816136f1565b92915050565b60006020828403121561270157600080fd5b600061270f84828501612632565b91505092915050565b6000806040838503121561272b57600080fd5b600061273985828601612632565b925050602061274a85828601612632565b9150509250929050565b60008060006060848603121561276957600080fd5b600061277786828701612632565b935050602061278886828701612632565b9250506040612799868287016126da565b9150509250925092565b600080600080608085870312156127b957600080fd5b60006127c787828801612632565b94505060206127d887828801612632565b93505060406127e9878288016126da565b925050606085013567ffffffffffffffff81111561280657600080fd5b61281287828801612686565b91505092959194509250565b6000806040838503121561283157600080fd5b600061283f85828601612632565b925050602061285085828601612647565b9150509250929050565b6000806040838503121561286d57600080fd5b600061287b85828601612632565b925050602061288c858286016126da565b9150509250929050565b6000602082840312156128a857600080fd5b60006128b68482850161265c565b91505092915050565b6000602082840312156128d157600080fd5b60006128df84828501612671565b91505092915050565b6000602082840312156128fa57600080fd5b600082013567ffffffffffffffff81111561291457600080fd5b612920848285016126b0565b91505092915050565b60006020828403121561293b57600080fd5b6000612949848285016126da565b91505092915050565b61295b816131b5565b82525050565b61296a816131c7565b82525050565b600061297b82613052565b6129858185613068565b9350612995818560208601613238565b61299e8161340e565b840191505092915050565b60006129b48261305d565b6129be8185613084565b93506129ce818560208601613238565b6129d78161340e565b840191505092915050565b60006129ed8261305d565b6129f78185613095565b9350612a07818560208601613238565b80840191505092915050565b60008154612a208161326b565b612a2a8186613095565b94506001821660008114612a455760018114612a5657612a89565b60ff19831686528186019350612a89565b612a5f8561303d565b60005b83811015612a8157815481890152600182019150602081019050612a62565b838801955050505b50505092915050565b6000612a9f601d83613084565b9150612aaa8261341f565b602082019050919050565b6000612ac2602683613084565b9150612acd82613448565b604082019050919050565b6000612ae5600f83613084565b9150612af082613497565b602082019050919050565b6000612b08601b83613084565b9150612b13826134c0565b602082019050919050565b6000612b2b601283613084565b9150612b36826134e9565b602082019050919050565b6000612b4e602283613084565b9150612b5982613512565b604082019050919050565b6000612b71601a83613084565b9150612b7c82613561565b602082019050919050565b6000612b94601483613084565b9150612b9f8261358a565b602082019050919050565b6000612bb7602083613084565b9150612bc2826135b3565b602082019050919050565b6000612bda601283613084565b9150612be5826135dc565b602082019050919050565b6000612bfd601683613084565b9150612c0882613605565b602082019050919050565b6000612c20601683613084565b9150612c2b8261362e565b602082019050919050565b6000612c43600083613079565b9150612c4e82613657565b600082019050919050565b6000612c66601683613084565b9150612c718261365a565b602082019050919050565b6000612c89601f83613084565b9150612c9482613683565b602082019050919050565b612ca88161321f565b82525050565b612cbf612cba8261321f565b613317565b82525050565b6000612cd182856129e2565b9150612cdd82846129e2565b91508190509392505050565b6000612cf58286612a13565b9150612d018285612cae565b602082019150612d118284612cae565b602082019150819050949350505050565b6000612d2d82612c36565b9150819050919050565b6000602082019050612d4c6000830184612952565b92915050565b6000608082019050612d676000830187612952565b612d746020830186612952565b612d816040830185612c9f565b8181036060830152612d938184612970565b905095945050505050565b6000602082019050612db36000830184612961565b92915050565b60006020820190508181036000830152612dd381846129a9565b905092915050565b60006020820190508181036000830152612df481612a92565b9050919050565b60006020820190508181036000830152612e1481612ab5565b9050919050565b60006020820190508181036000830152612e3481612ad8565b9050919050565b60006020820190508181036000830152612e5481612afb565b9050919050565b60006020820190508181036000830152612e7481612b1e565b9050919050565b60006020820190508181036000830152612e9481612b41565b9050919050565b60006020820190508181036000830152612eb481612b64565b9050919050565b60006020820190508181036000830152612ed481612b87565b9050919050565b60006020820190508181036000830152612ef481612baa565b9050919050565b60006020820190508181036000830152612f1481612bcd565b9050919050565b60006020820190508181036000830152612f3481612bf0565b9050919050565b60006020820190508181036000830152612f5481612c13565b9050919050565b60006020820190508181036000830152612f7481612c59565b9050919050565b60006020820190508181036000830152612f9481612c7c565b9050919050565b6000602082019050612fb06000830184612c9f565b92915050565b6000612fc0612fd1565b9050612fcc828261329d565b919050565b6000604051905090565b600067ffffffffffffffff821115612ff657612ff56133df565b5b612fff8261340e565b9050602081019050919050565b600067ffffffffffffffff821115613027576130266133df565b5b6130308261340e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006130ab8261321f565b91506130b68361321f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130eb576130ea613352565b5b828201905092915050565b60006131018261321f565b915061310c8361321f565b92508261311c5761311b613381565b5b828204905092915050565b60006131328261321f565b915061313d8361321f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561317657613175613352565b5b828202905092915050565b600061318c8261321f565b91506131978361321f565b9250828210156131aa576131a9613352565b5b828203905092915050565b60006131c0826131ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561325657808201518184015260208101905061323b565b83811115613265576000848401525b50505050565b6000600282049050600182168061328357607f821691505b60208210811415613297576132966133b0565b5b50919050565b6132a68261340e565b810181811067ffffffffffffffff821117156132c5576132c46133df565b5b80604052505050565b60006132d98261321f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561330c5761330b613352565b5b600182019050919050565b6000819050919050565b600061332c8261321f565b91506133378361321f565b92508261334757613346613381565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f436f6e747261637473206e6f7420616c6c6f77656420746f206d696e74000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f52656163686564206d617820616d6f756e7420706572206d696e740000000000600082015250565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f52656163686564206d617820616d6f756e7420706572207472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820616c726561647920736574000000000000600082015250565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b7f50726f76656e616e6365206d7573742062652073657400000000000000000000600082015250565b50565b7f50726f76656e616e636520616c72656164792073657400000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6136b5816131b5565b81146136c057600080fd5b50565b6136cc816131c7565b81146136d757600080fd5b50565b6136e3816131d3565b81146136ee57600080fd5b50565b6136fa8161321f565b811461370557600080fd5b5056fea2646970667358221220973b99fd3720ca6588e1b56d6e7fda536d68747411f3921531a22eb4b890cd0964736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101e35760003560e01c8063715018a611610102578063c87b56dd11610095578063e985e9c511610064578063e985e9c51461069f578063e9866550146106dc578063f2fde38b146106f3578063ffe630b51461071c576101e3565b8063c87b56dd146105f5578063cb14eb8714610632578063cb774d471461065d578063d02c2bf214610688576101e3565b80639858cf19116100d15780639858cf191461055c578063a0712d6814610587578063a22cb465146105a3578063b88d4fde146105cc576101e3565b8063715018a6146104c45780638d859f3e146104db5780638da5cb5b1461050657806395d89b4114610531576101e3565b806332cb6b0c1161017a5780635b92ac0d116101495780635b92ac0d146103f45780636352211e1461041f5780636c0360eb1461045c57806370a0823114610487576101e3565b806332cb6b0c146103605780633ccfd60b1461038b57806342842e0e146103a257806355f804b3146103cb576101e3565b806309d42b30116101b657806309d42b30146102b65780630f7309e8146102e157806318160ddd1461030c57806323b872dd14610337576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612896565b610745565b60405161021c9190612d9e565b60405180910390f35b34801561023157600080fd5b5061023a6107d7565b6040516102479190612db9565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612929565b610869565b6040516102849190612d37565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af919061285a565b6108e5565b005b3480156102c257600080fd5b506102cb610a26565b6040516102d89190612f9b565b60405180910390f35b3480156102ed57600080fd5b506102f6610a2b565b6040516103039190612db9565b60405180910390f35b34801561031857600080fd5b50610321610ab9565b60405161032e9190612f9b565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190612754565b610ad0565b005b34801561036c57600080fd5b50610375610df5565b6040516103829190612f9b565b60405180910390f35b34801561039757600080fd5b506103a0610dfb565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190612754565b610fc4565b005b3480156103d757600080fd5b506103f260048036038101906103ed91906128e8565b610fe4565b005b34801561040057600080fd5b5061040961107a565b6040516104169190612d9e565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190612929565b61108d565b6040516104539190612d37565b60405180910390f35b34801561046857600080fd5b5061047161109f565b60405161047e9190612db9565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a991906126ef565b61112d565b6040516104bb9190612f9b565b60405180910390f35b3480156104d057600080fd5b506104d96111e6565b005b3480156104e757600080fd5b506104f061126e565b6040516104fd9190612f9b565b60405180910390f35b34801561051257600080fd5b5061051b611279565b6040516105289190612d37565b60405180910390f35b34801561053d57600080fd5b506105466112a2565b6040516105539190612db9565b60405180910390f35b34801561056857600080fd5b50610571611334565b60405161057e9190612f9b565b60405180910390f35b6105a1600480360381019061059c9190612929565b611346565b005b3480156105af57600080fd5b506105ca60048036038101906105c5919061281e565b6115c4565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906127a3565b61173c565b005b34801561060157600080fd5b5061061c60048036038101906106179190612929565b6117af565b6040516106299190612db9565b60405180910390f35b34801561063e57600080fd5b5061064761184e565b6040516106549190612f9b565b60405180910390f35b34801561066957600080fd5b50610672611853565b60405161067f9190612f9b565b60405180910390f35b34801561069457600080fd5b5061069d611859565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190612718565b611901565b6040516106d39190612d9e565b60405180910390f35b3480156106e857600080fd5b506106f1611995565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906126ef565b611b04565b005b34801561072857600080fd5b50610743600480360381019061073e91906128e8565b611bfc565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600480546107e69061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546108129061326b565b801561085f5780601f106108345761010080835404028352916020019161085f565b820191906000526020600020905b81548152906001019060200180831161084257829003601f168201915b5050505050905090565b600061087482611ce3565b6108aa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f08261108d565b90508073ffffffffffffffffffffffffffffffffffffffff16610911611d42565b73ffffffffffffffffffffffffffffffffffffffff16146109745761093d81610938611d42565b611901565b610973576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b602c81565b600b8054610a389061326b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a649061326b565b8015610ab15780601f10610a8657610100808354040283529160200191610ab1565b820191906000526020600020905b815481529060010190602001808311610a9457829003601f168201915b505050505081565b6000610ac3611d4a565b6003546002540303905090565b6000610adb82611d53565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b42576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b4e84611e21565b91509150610b648187610b5f611d42565b611e43565b610bb057610b7986610b74611d42565b611901565b610baf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c17576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c248686866001611e87565b8015610c2f57600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cfd85610cd9888887611e8d565b7c020000000000000000000000000000000000000000000000000000000017611eb5565b600660008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d85576000600185019050600060066000838152602001908152602001600020541415610d83576002548114610d82578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ded8686866001611ee0565b505050505050565b6122b881565b610e03611fa3565b73ffffffffffffffffffffffffffffffffffffffff16610e21611279565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90612edb565b60405180910390fd5b60026001541415610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490612f7b565b60405180910390fd5b6002600181905550600047905060008111610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612f1b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610f3390612d22565b60006040518083038185875af1925050503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b5050905080610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb090612e1b565b60405180910390fd5b505060018081905550565b610fdf8383836040518060200160405280600081525061173c565b505050565b610fec611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661100a611279565b73ffffffffffffffffffffffffffffffffffffffff1614611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790612edb565b60405180910390fd5b80600c9080519060200190611076929190612513565b5050565b600d60009054906101000a900460ff1681565b600061109882611d53565b9050919050565b600c80546110ac9061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546110d89061326b565b80156111255780601f106110fa57610100808354040283529160200191611125565b820191906000526020600020905b81548152906001019060200180831161110857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611195576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111ee611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661120c611279565b73ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990612edb565b60405180910390fd5b61126c6000611fab565b565b660e35fa931a000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546112b19061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546112dd9061326b565b801561132a5780601f106112ff5761010080835404028352916020019161132a565b820191906000526020600020905b81548152906001019060200180831161130d57829003601f168201915b5050505050905090565b60026122b861134391906130f6565b81565b600d60009054906101000a900460ff16611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90612efb565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa90612ddb565b60405180910390fd5b600061140d61206f565b90506000828261141d91906130a0565b90506122b8811115611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90612e5b565b60405180910390fd5b60088311156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90612e7b565b60405180910390fd5b602c836114b433612082565b6114be91906130a0565b11156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690612e3b565b60405180910390fd5b60026122b861150e91906130f6565b8111156115b557600083905060026122b861152991906130f6565b831015611558578260026122b861154091906130f6565b61154a9190613181565b846115559190613181565b90505b600081660e35fa931a000061156d9190613127565b9050803410156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990612ebb565b60405180910390fd5b50505b6115bf33846120d9565b505050565b6115cc611d42565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611631576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806009600061163e611d42565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116eb611d42565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117309190612d9e565b60405180910390a35050565b611747848484610ad0565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117a957611772848484846122ae565b6117a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606117ba82611ce3565b6117f0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117fa61240e565b905060008151141561181b5760405180602001604052806000815250611846565b80611825846124a0565b604051602001611836929190612cc5565b6040516020818303038152906040525b915050919050565b600881565b600a5481565b611861611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661187f611279565b73ffffffffffffffffffffffffffffffffffffffff16146118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90612edb565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61199d611fa3565b73ffffffffffffffffffffffffffffffffffffffff166119bb611279565b73ffffffffffffffffffffffffffffffffffffffff1614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890612edb565b60405180910390fd5b6000600b8054611a209061326b565b90501415611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90612f3b565b60405180910390fd5b6000600a5414611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90612e9b565b60405180910390fd5b6000600b4342604051602001611ac093929190612ce9565b6040516020818303038152906040528051906020012060001c9050611ae3611d4a565b6122b882611af19190613321565b611afb91906130a0565b600a8190555050565b611b0c611fa3565b73ffffffffffffffffffffffffffffffffffffffff16611b2a611279565b73ffffffffffffffffffffffffffffffffffffffff1614611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790612edb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790612dfb565b60405180910390fd5b611bf981611fab565b50565b611c04611fa3565b73ffffffffffffffffffffffffffffffffffffffff16611c22611279565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90612edb565b60405180910390fd5b6000600b8054611c879061326b565b905014611cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc090612f5b565b60405180910390fd5b80600b9080519060200190611cdf929190612513565b5050565b600081611cee611d4a565b11158015611cfd575060025482105b8015611d3b575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611d62611d4a565b11611dea57600254811015611de95760006006600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611de7575b6000811415611ddd576006600083600190039350838152602001908152602001600020549050611db2565b8092505050611e1c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600890508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ea48686846124fa565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f9d5760008290505b8183611f2791906130a0565b811015611f9b57611f36611d4a565b6122b8600a5483611f4791906130a0565b611f519190613321565b611f5b91906130a0565b817f38906b6a557fb827c86319494d14fa70d229f1e7701d828e3cee3d7f2910e13360405160405180910390a38080611f93906132ce565b915050611f1b565b505b50505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612079611d4a565b60025403905090565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612147576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612182576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61218f6000848385611e87565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612206836121f76000866000611e8d565b61220085612503565b17611eb5565b60066000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061222a578060028190555050506122a96000848385611ee0565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d4611d42565b8786866040518563ffffffff1660e01b81526004016122f69493929190612d52565b602060405180830381600087803b15801561231057600080fd5b505af192505050801561234157506040513d601f19601f8201168201806040525081019061233e91906128bf565b60015b6123bb573d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b506000815114156123b3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c805461241d9061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546124499061326b565b80156124965780601f1061246b57610100808354040283529160200191612496565b820191906000526020600020905b81548152906001019060200180831161247957829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156124e657600183039250600a81066030018353600a810490506124c6565b508181036020830392508083525050919050565b60009392505050565b60006001821460e11b9050919050565b82805461251f9061326b565b90600052602060002090601f0160209004810192826125415760008555612588565b82601f1061255a57805160ff1916838001178555612588565b82800160010185558215612588579182015b8281111561258757825182559160200191906001019061256c565b5b5090506125959190612599565b5090565b5b808211156125b257600081600090555060010161259a565b5090565b60006125c96125c484612fdb565b612fb6565b9050828152602081018484840111156125e157600080fd5b6125ec848285613229565b509392505050565b60006126076126028461300c565b612fb6565b90508281526020810184848401111561261f57600080fd5b61262a848285613229565b509392505050565b600081359050612641816136ac565b92915050565b600081359050612656816136c3565b92915050565b60008135905061266b816136da565b92915050565b600081519050612680816136da565b92915050565b600082601f83011261269757600080fd5b81356126a78482602086016125b6565b91505092915050565b600082601f8301126126c157600080fd5b81356126d18482602086016125f4565b91505092915050565b6000813590506126e9816136f1565b92915050565b60006020828403121561270157600080fd5b600061270f84828501612632565b91505092915050565b6000806040838503121561272b57600080fd5b600061273985828601612632565b925050602061274a85828601612632565b9150509250929050565b60008060006060848603121561276957600080fd5b600061277786828701612632565b935050602061278886828701612632565b9250506040612799868287016126da565b9150509250925092565b600080600080608085870312156127b957600080fd5b60006127c787828801612632565b94505060206127d887828801612632565b93505060406127e9878288016126da565b925050606085013567ffffffffffffffff81111561280657600080fd5b61281287828801612686565b91505092959194509250565b6000806040838503121561283157600080fd5b600061283f85828601612632565b925050602061285085828601612647565b9150509250929050565b6000806040838503121561286d57600080fd5b600061287b85828601612632565b925050602061288c858286016126da565b9150509250929050565b6000602082840312156128a857600080fd5b60006128b68482850161265c565b91505092915050565b6000602082840312156128d157600080fd5b60006128df84828501612671565b91505092915050565b6000602082840312156128fa57600080fd5b600082013567ffffffffffffffff81111561291457600080fd5b612920848285016126b0565b91505092915050565b60006020828403121561293b57600080fd5b6000612949848285016126da565b91505092915050565b61295b816131b5565b82525050565b61296a816131c7565b82525050565b600061297b82613052565b6129858185613068565b9350612995818560208601613238565b61299e8161340e565b840191505092915050565b60006129b48261305d565b6129be8185613084565b93506129ce818560208601613238565b6129d78161340e565b840191505092915050565b60006129ed8261305d565b6129f78185613095565b9350612a07818560208601613238565b80840191505092915050565b60008154612a208161326b565b612a2a8186613095565b94506001821660008114612a455760018114612a5657612a89565b60ff19831686528186019350612a89565b612a5f8561303d565b60005b83811015612a8157815481890152600182019150602081019050612a62565b838801955050505b50505092915050565b6000612a9f601d83613084565b9150612aaa8261341f565b602082019050919050565b6000612ac2602683613084565b9150612acd82613448565b604082019050919050565b6000612ae5600f83613084565b9150612af082613497565b602082019050919050565b6000612b08601b83613084565b9150612b13826134c0565b602082019050919050565b6000612b2b601283613084565b9150612b36826134e9565b602082019050919050565b6000612b4e602283613084565b9150612b5982613512565b604082019050919050565b6000612b71601a83613084565b9150612b7c82613561565b602082019050919050565b6000612b94601483613084565b9150612b9f8261358a565b602082019050919050565b6000612bb7602083613084565b9150612bc2826135b3565b602082019050919050565b6000612bda601283613084565b9150612be5826135dc565b602082019050919050565b6000612bfd601683613084565b9150612c0882613605565b602082019050919050565b6000612c20601683613084565b9150612c2b8261362e565b602082019050919050565b6000612c43600083613079565b9150612c4e82613657565b600082019050919050565b6000612c66601683613084565b9150612c718261365a565b602082019050919050565b6000612c89601f83613084565b9150612c9482613683565b602082019050919050565b612ca88161321f565b82525050565b612cbf612cba8261321f565b613317565b82525050565b6000612cd182856129e2565b9150612cdd82846129e2565b91508190509392505050565b6000612cf58286612a13565b9150612d018285612cae565b602082019150612d118284612cae565b602082019150819050949350505050565b6000612d2d82612c36565b9150819050919050565b6000602082019050612d4c6000830184612952565b92915050565b6000608082019050612d676000830187612952565b612d746020830186612952565b612d816040830185612c9f565b8181036060830152612d938184612970565b905095945050505050565b6000602082019050612db36000830184612961565b92915050565b60006020820190508181036000830152612dd381846129a9565b905092915050565b60006020820190508181036000830152612df481612a92565b9050919050565b60006020820190508181036000830152612e1481612ab5565b9050919050565b60006020820190508181036000830152612e3481612ad8565b9050919050565b60006020820190508181036000830152612e5481612afb565b9050919050565b60006020820190508181036000830152612e7481612b1e565b9050919050565b60006020820190508181036000830152612e9481612b41565b9050919050565b60006020820190508181036000830152612eb481612b64565b9050919050565b60006020820190508181036000830152612ed481612b87565b9050919050565b60006020820190508181036000830152612ef481612baa565b9050919050565b60006020820190508181036000830152612f1481612bcd565b9050919050565b60006020820190508181036000830152612f3481612bf0565b9050919050565b60006020820190508181036000830152612f5481612c13565b9050919050565b60006020820190508181036000830152612f7481612c59565b9050919050565b60006020820190508181036000830152612f9481612c7c565b9050919050565b6000602082019050612fb06000830184612c9f565b92915050565b6000612fc0612fd1565b9050612fcc828261329d565b919050565b6000604051905090565b600067ffffffffffffffff821115612ff657612ff56133df565b5b612fff8261340e565b9050602081019050919050565b600067ffffffffffffffff821115613027576130266133df565b5b6130308261340e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006130ab8261321f565b91506130b68361321f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130eb576130ea613352565b5b828201905092915050565b60006131018261321f565b915061310c8361321f565b92508261311c5761311b613381565b5b828204905092915050565b60006131328261321f565b915061313d8361321f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561317657613175613352565b5b828202905092915050565b600061318c8261321f565b91506131978361321f565b9250828210156131aa576131a9613352565b5b828203905092915050565b60006131c0826131ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561325657808201518184015260208101905061323b565b83811115613265576000848401525b50505050565b6000600282049050600182168061328357607f821691505b60208210811415613297576132966133b0565b5b50919050565b6132a68261340e565b810181811067ffffffffffffffff821117156132c5576132c46133df565b5b80604052505050565b60006132d98261321f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561330c5761330b613352565b5b600182019050919050565b6000819050919050565b600061332c8261321f565b91506133378361321f565b92508261334757613346613381565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f436f6e747261637473206e6f7420616c6c6f77656420746f206d696e74000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f52656163686564206d617820616d6f756e7420706572206d696e740000000000600082015250565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f52656163686564206d617820616d6f756e7420706572207472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820616c726561647920736574000000000000600082015250565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b7f50726f76656e616e6365206d7573742062652073657400000000000000000000600082015250565b50565b7f50726f76656e616e636520616c72656164792073657400000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6136b5816131b5565b81146136c057600080fd5b50565b6136cc816131c7565b81146136d757600080fd5b50565b6136e3816131d3565b81146136ee57600080fd5b50565b6136fa8161321f565b811461370557600080fd5b5056fea2646970667358221220973b99fd3720ca6588e1b56d6e7fda536d68747411f3921531a22eb4b890cd0964736f6c63430008040033

Deployed Bytecode Sourcemap

53891:3524:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14607:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20254:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22200:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21748:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54021:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54265:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13661:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31465:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54123:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56623:288;;;;;;;;;;;;;:::i;:::-;;23090:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56423:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54324:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20043:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54296:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15286:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50102:103;;;;;;;;;;;;;:::i;:::-;;53971:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49451:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20423:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54171:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54730:967;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22476:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23346:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20598:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54069:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54230:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56521:94;;;;;;;;;;;;;:::i;:::-;;22855:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55902:513;;;;;;;;;;;;;:::i;:::-;;50360:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55705:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14607:615;14692:4;15007:10;14992:25;;:11;:25;;;;:102;;;;15084:10;15069:25;;:11;:25;;;;14992:102;:179;;;;15161:10;15146:25;;:11;:25;;;;14992:179;14972:199;;14607:615;;;:::o;20254:100::-;20308:13;20341:5;20334:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20254:100;:::o;22200:204::-;22268:7;22293:16;22301:7;22293;:16::i;:::-;22288:64;;22318:34;;;;;;;;;;;;;;22288:64;22372:15;:24;22388:7;22372:24;;;;;;;;;;;;;;;;;;;;;22365:31;;22200:204;;;:::o;21748:386::-;21821:13;21837:16;21845:7;21837;:16::i;:::-;21821:32;;21893:5;21870:28;;:19;:17;:19::i;:::-;:28;;;21866:175;;21918:44;21935:5;21942:19;:17;:19::i;:::-;21918:16;:44::i;:::-;21913:128;;21990:35;;;;;;;;;;;;;;21913:128;21866:175;22080:2;22053:15;:24;22069:7;22053:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22118:7;22114:2;22098:28;;22107:5;22098:28;;;;;;;;;;;;21748:386;;;:::o;54021:41::-;54060:2;54021:41;:::o;54265:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13661:315::-;13714:7;13942:15;:13;:15::i;:::-;13927:12;;13911:13;;:28;:46;13904:53;;13661:315;:::o;31465:2800::-;31599:27;31629;31648:7;31629:18;:27::i;:::-;31599:57;;31714:4;31673:45;;31689:19;31673:45;;;31669:86;;31727:28;;;;;;;;;;;;;;31669:86;31769:27;31798:23;31825:28;31845:7;31825:19;:28::i;:::-;31768:85;;;;31953:62;31972:15;31989:4;31995:19;:17;:19::i;:::-;31953:18;:62::i;:::-;31948:174;;32035:43;32052:4;32058:19;:17;:19::i;:::-;32035:16;:43::i;:::-;32030:92;;32087:35;;;;;;;;;;;;;;32030:92;31948:174;32153:1;32139:16;;:2;:16;;;32135:52;;;32164:23;;;;;;;;;;;;;;32135:52;32200:43;32222:4;32228:2;32232:7;32241:1;32200:21;:43::i;:::-;32336:15;32333:2;;;32476:1;32455:19;32448:30;32333:2;32871:18;:24;32890:4;32871:24;;;;;;;;;;;;;;;;32869:26;;;;;;;;;;;;32940:18;:22;32959:2;32940:22;;;;;;;;;;;;;;;;32938:24;;;;;;;;;;;33262:145;33299:2;33347:45;33362:4;33368:2;33372:19;33347:14;:45::i;:::-;10889:8;33320:72;33262:18;:145::i;:::-;33233:17;:26;33251:7;33233:26;;;;;;;;;;;:174;;;;33577:1;10889:8;33527:19;:46;:51;33523:626;;;33599:19;33631:1;33621:7;:11;33599:33;;33788:1;33754:17;:30;33772:11;33754:30;;;;;;;;;;;;:35;33750:384;;;33892:13;;33877:11;:28;33873:242;;34072:19;34039:17;:30;34057:11;34039:30;;;;;;;;;;;:52;;;;33873:242;33750:384;33523:626;;34196:7;34192:2;34177:27;;34186:4;34177:27;;;;;;;;;;;;34215:42;34236:4;34242:2;34246:7;34255:1;34215:20;:42::i;:::-;31465:2800;;;;;;:::o;54123:41::-;54160:4;54123:41;:::o;56623:288::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46549:1:::1;47147:7;;:19;;47139:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46549:1;47280:7;:18;;;;56686:15:::2;56704:21;56686:39;;56754:1;56744:7;:11;56736:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56796:12;56821:10;56813:24;;56845:7;56813:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56795:62;;;56876:7;56868:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;47311:1;;46505::::1;47459:7:::0;:22:::1;;;;56623:288::o:0;23090:185::-;23228:39;23245:4;23251:2;23255:7;23228:39;;;;;;;;;;;;:16;:39::i;:::-;23090:185;;;:::o;56423:90::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56502:3:::1;56492:7;:13;;;;;;;;;;;;:::i;:::-;;56423:90:::0;:::o;54324:32::-;;;;;;;;;;;;;:::o;20043:144::-;20107:7;20150:27;20169:7;20150:18;:27::i;:::-;20127:52;;20043:144;;;:::o;54296:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15286:224::-;15350:7;15391:1;15374:19;;:5;:19;;;15370:60;;;15402:28;;;;;;;;;;;;;;15370:60;9841:13;15448:18;:25;15467:5;15448:25;;;;;;;;;;;;;;;;:54;15441:61;;15286:224;;;:::o;50102:103::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50167:30:::1;50194:1;50167:18;:30::i;:::-;50102:103::o:0;53971:43::-;54003:11;53971:43;:::o;49451:87::-;49497:7;49524:6;;;;;;;;;;;49517:13;;49451:87;:::o;20423:104::-;20479:13;20512:7;20505:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20423:104;:::o;54171:52::-;54222:1;54160:4;54209:14;;;;:::i;:::-;54171:52;:::o;54730:967::-;54798:12;;;;;;;;;;;54790:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;54865:10;54852:23;;:9;:23;;;54844:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54922:19;54944:14;:12;:14::i;:::-;54922:36;;54969:18;55004:8;54990:11;:22;;;;:::i;:::-;54969:43;;54160:4;55033:10;:24;;55025:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54115:1;55099:8;:31;;55091:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;54060:2;55216:8;55188:25;55202:10;55188:13;:25::i;:::-;:36;;;;:::i;:::-;:52;;55180:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;54222:1;54160:4;54209:14;;;;:::i;:::-;55289:10;:24;55285:365;;;55330:23;55356:8;55330:34;;54222:1;54160:4;54209:14;;;;:::i;:::-;55385:11;:25;55381:122;;;55475:11;54222:1;54160:4;54209:14;;;;:::i;:::-;55461:25;;;;:::i;:::-;55449:8;:38;;;;:::i;:::-;55431:56;;55381:122;55519:20;55550:15;54003:11;55542:23;;;;:::i;:::-;55519:46;;55601:12;55588:9;:25;;55580:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55285:365;;;55662:27;55668:10;55680:8;55662:5;:27::i;:::-;54730:967;;;:::o;22476:308::-;22587:19;:17;:19::i;:::-;22575:31;;:8;:31;;;22571:61;;;22615:17;;;;;;;;;;;;;;22571:61;22697:8;22645:18;:39;22664:19;:17;:19::i;:::-;22645:39;;;;;;;;;;;;;;;:49;22685:8;22645:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22757:8;22721:55;;22736:19;:17;:19::i;:::-;22721:55;;;22767:8;22721:55;;;;;;:::i;:::-;;;;;;;;22476:308;;:::o;23346:399::-;23513:31;23526:4;23532:2;23536:7;23513:12;:31::i;:::-;23577:1;23559:2;:14;;;:19;23555:183;;23598:56;23629:4;23635:2;23639:7;23648:5;23598:30;:56::i;:::-;23593:145;;23682:40;;;;;;;;;;;;;;23593:145;23555:183;23346:399;;;;:::o;20598:318::-;20671:13;20702:16;20710:7;20702;:16::i;:::-;20697:59;;20727:29;;;;;;;;;;;;;;20697:59;20769:21;20793:10;:8;:10::i;:::-;20769:34;;20846:1;20827:7;20821:21;:26;;:87;;;;;;;;;;;;;;;;;20874:7;20883:18;20893:7;20883:9;:18::i;:::-;20857:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20821:87;20814:94;;;20598:318;;;:::o;54069:47::-;54115:1;54069:47;:::o;54230:28::-;;;;:::o;56521:94::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56595:12:::1;;;;;;;;;;;56594:13;56579:12;;:28;;;;;;;;;;;;;;;;;;56521:94::o:0;22855:164::-;22952:4;22976:18;:25;22995:5;22976:25;;;;;;;;;;;;;;;:35;23002:8;22976:35;;;;;;;;;;;;;;;;;;;;;;;;;22969:42;;22855:164;;;;:::o;55902:513::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55996:1:::1;55974:10;55968:24;;;;;:::i;:::-;;;:29;;55960:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56060:1;56043:13;;:18;56035:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56105:14;56211:10;56244:12;56279:15;56172:141;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56144:184;;;;;;56122:217;;56105:234;;56392:15;:13;:15::i;:::-;54160:4;56369:6;:19;;;;:::i;:::-;56368:39;;;;:::i;:::-;56352:13;:55;;;;49742:1;55902:513::o:0;50360:201::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50469:1:::1;50449:22;;:8;:22;;;;50441:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50525:28;50544:8;50525:18;:28::i;:::-;50360:201:::0;:::o;55705:189::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55821:1:::1;55799:10;55793:24;;;;;:::i;:::-;;;:29;55785:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;55875:11;55862:10;:24;;;;;;;;;;;;:::i;:::-;;55705:189:::0;:::o;24000:273::-;24057:4;24113:7;24094:15;:13;:15::i;:::-;:26;;:66;;;;;24147:13;;24137:7;:23;24094:66;:152;;;;;24245:1;10611:8;24198:17;:26;24216:7;24198:26;;;;;;;;;;;;:43;:48;24094:152;24074:172;;24000:273;;;:::o;42561:105::-;42621:7;42648:10;42641:17;;42561:105;:::o;54521:93::-;54578:7;54605:1;54598:8;;54521:93;:::o;16960:1129::-;17027:7;17047:12;17062:7;17047:22;;17130:4;17111:15;:13;:15::i;:::-;:23;17107:915;;17164:13;;17157:4;:20;17153:869;;;17202:14;17219:17;:23;17237:4;17219:23;;;;;;;;;;;;17202:40;;17335:1;10611:8;17308:6;:23;:28;17304:699;;;17827:113;17844:1;17834:6;:11;17827:113;;;17887:17;:25;17905:6;;;;;;;17887:25;;;;;;;;;;;;17878:34;;17827:113;;;17973:6;17966:13;;;;;;17304:699;17153:869;;17107:915;18050:31;;;;;;;;;;;;;;16960:1129;;;;:::o;29801:652::-;29896:27;29925:23;29966:53;30022:15;29966:71;;30208:7;30202:4;30195:21;30243:22;30237:4;30230:36;30319:4;30313;30303:21;30280:44;;30415:19;30409:26;30390:45;;30146:300;;;;:::o;30566:645::-;30708:11;30870:15;30864:4;30860:26;30852:34;;31029:15;31018:9;31014:31;31001:44;;31176:15;31165:9;31162:30;31155:4;31144:9;31141:19;31138:55;31128:65;;30741:463;;;;;:::o;41394:159::-;;;;;:::o;39706:309::-;39841:7;39861:16;11012:3;39887:19;:40;;39861:67;;11012:3;39954:31;39965:4;39971:2;39975:9;39954:10;:31::i;:::-;39946:40;;:61;;39939:68;;;39706:309;;;;;:::o;19534:447::-;19614:14;19782:15;19775:5;19771:27;19762:36;;19956:5;19942:11;19918:22;19914:40;19911:51;19904:5;19901:62;19891:72;;19650:324;;;;:::o;56919:493::-;57107:1;57091:18;;:4;:18;;;57087:318;;;57131:15;57149:12;57131:30;;57126:268;57188:8;57173:12;:23;;;;:::i;:::-;57163:7;:33;57126:268;;;57344:15;:13;:15::i;:::-;54160:4;57313:13;;57303:7;:23;;;;:::i;:::-;57302:38;;;;:::i;:::-;57301:58;;;;:::i;:::-;57271:7;57233:145;;;;;;;;;;57198:9;;;;;:::i;:::-;;;;57126:268;;;;57087:318;56919:493;;;;:::o;48175:98::-;48228:7;48255:10;48248:17;;48175:98;:::o;50721:191::-;50795:16;50814:6;;;;;;;;;;;50795:25;;50840:8;50831:6;;:17;;;;;;;;;;;;;;;;;;50895:8;50864:40;;50885:8;50864:40;;;;;;;;;;;;50721:191;;:::o;14074:285::-;14121:7;14325:15;:13;:15::i;:::-;14309:13;;:31;14302:38;;14074:285;:::o;15592:176::-;15653:7;9841:13;9978:2;15681:18;:25;15700:5;15681:25;;;;;;;;;;;;;;;;:49;;15680:80;15673:87;;15592:176;;;:::o;25831:1529::-;25896:20;25919:13;;25896:36;;25961:1;25947:16;;:2;:16;;;25943:48;;;25972:19;;;;;;;;;;;;;;25943:48;26018:1;26006:8;:13;26002:44;;;26028:18;;;;;;;;;;;;;;26002:44;26059:61;26089:1;26093:2;26097:12;26111:8;26059:21;:61::i;:::-;26602:1;9978:2;26573:1;:25;;26572:31;26560:8;:44;26534:18;:22;26553:2;26534:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;26881:139;26918:2;26972:33;26995:1;26999:2;27003:1;26972:14;:33::i;:::-;26939:30;26960:8;26939:20;:30::i;:::-;:66;26881:18;:139::i;:::-;26847:17;:31;26865:12;26847:31;;;;;;;;;;;:173;;;;27037:15;27055:12;27037:30;;27082:11;27111:8;27096:12;:23;27082:37;;27134:101;27186:9;;;;;;27182:2;27161:35;;27178:1;27161:35;;;;;;;;;;;;27230:3;27220:7;:13;27134:101;;27267:3;27251:13;:19;;;;25831:1529;;27292:60;27321:1;27325:2;27329:12;27343:8;27292:20;:60::i;:::-;25831:1529;;;:::o;38216:716::-;38379:4;38425:2;38400:45;;;38446:19;:17;:19::i;:::-;38467:4;38473:7;38482:5;38400:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38396:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38700:1;38683:6;:13;:18;38679:235;;;38729:40;;;;;;;;;;;;;;38679:235;38872:6;38866:13;38857:6;38853:2;38849:15;38842:38;38396:529;38569:54;;;38559:64;;;:6;:64;;;;38552:71;;;38216:716;;;;;;:::o;54622:100::-;54674:13;54707:7;54700:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54622:100;:::o;42772:1960::-;42829:17;43248:3;43241:4;43235:11;43231:21;43224:28;;43339:3;43333:4;43326:17;43445:3;43901:5;44031:1;44026:3;44022:11;44015:18;;44168:2;44162:4;44158:13;44154:2;44150:22;44145:3;44137:36;44209:2;44203:4;44199:13;44191:21;;43793:697;44228:4;43793:697;;;44419:1;44414:3;44410:11;44403:18;;44470:2;44464:4;44460:13;44456:2;44452:22;44447:3;44439:36;44323:2;44317:4;44313:13;44305:21;;43793:697;;;43797:430;44529:3;44524;44520:13;44644:2;44639:3;44635:12;44628:19;;44707:6;44702:3;44695:19;42868:1857;;;;;:::o;40591:147::-;40728:6;40591:147;;;;;:::o;21364:322::-;21434:14;21665:1;21655:8;21652:15;21627:23;21623:45;21613:55;;21536:143;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:118::-;6173:24;6191:5;6173:24;:::i;:::-;6168:3;6161:37;6151:53;;:::o;6210:109::-;6291:21;6306:5;6291:21;:::i;:::-;6286:3;6279:34;6269:50;;:::o;6325:360::-;6411:3;6439:38;6471:5;6439:38;:::i;:::-;6493:70;6556:6;6551:3;6493:70;:::i;:::-;6486:77;;6572:52;6617:6;6612:3;6605:4;6598:5;6594:16;6572:52;:::i;:::-;6649:29;6671:6;6649:29;:::i;:::-;6644:3;6640:39;6633:46;;6415:270;;;;;:::o;6691:364::-;6779:3;6807:39;6840:5;6807:39;:::i;:::-;6862:71;6926:6;6921:3;6862:71;:::i;:::-;6855:78;;6942:52;6987:6;6982:3;6975:4;6968:5;6964:16;6942:52;:::i;:::-;7019:29;7041:6;7019:29;:::i;:::-;7014:3;7010:39;7003:46;;6783:272;;;;;:::o;7061:377::-;7167:3;7195:39;7228:5;7195:39;:::i;:::-;7250:89;7332:6;7327:3;7250:89;:::i;:::-;7243:96;;7348:52;7393:6;7388:3;7381:4;7374:5;7370:16;7348:52;:::i;:::-;7425:6;7420:3;7416:16;7409:23;;7171:267;;;;;:::o;7468:845::-;7571:3;7608:5;7602:12;7637:36;7663:9;7637:36;:::i;:::-;7689:89;7771:6;7766:3;7689:89;:::i;:::-;7682:96;;7809:1;7798:9;7794:17;7825:1;7820:137;;;;7971:1;7966:341;;;;7787:520;;7820:137;7904:4;7900:9;7889;7885:25;7880:3;7873:38;7940:6;7935:3;7931:16;7924:23;;7820:137;;7966:341;8033:38;8065:5;8033:38;:::i;:::-;8093:1;8107:154;8121:6;8118:1;8115:13;8107:154;;;8195:7;8189:14;8185:1;8180:3;8176:11;8169:35;8245:1;8236:7;8232:15;8221:26;;8143:4;8140:1;8136:12;8131:17;;8107:154;;;8290:6;8285:3;8281:16;8274:23;;7973:334;;7787:520;;7575:738;;;;;;:::o;8319:366::-;8461:3;8482:67;8546:2;8541:3;8482:67;:::i;:::-;8475:74;;8558:93;8647:3;8558:93;:::i;:::-;8676:2;8671:3;8667:12;8660:19;;8465:220;;;:::o;8691:366::-;8833:3;8854:67;8918:2;8913:3;8854:67;:::i;:::-;8847:74;;8930:93;9019:3;8930:93;:::i;:::-;9048:2;9043:3;9039:12;9032:19;;8837:220;;;:::o;9063:366::-;9205:3;9226:67;9290:2;9285:3;9226:67;:::i;:::-;9219:74;;9302:93;9391:3;9302:93;:::i;:::-;9420:2;9415:3;9411:12;9404:19;;9209:220;;;:::o;9435:366::-;9577:3;9598:67;9662:2;9657:3;9598:67;:::i;:::-;9591:74;;9674:93;9763:3;9674:93;:::i;:::-;9792:2;9787:3;9783:12;9776:19;;9581:220;;;:::o;9807:366::-;9949:3;9970:67;10034:2;10029:3;9970:67;:::i;:::-;9963:74;;10046:93;10135:3;10046:93;:::i;:::-;10164:2;10159:3;10155:12;10148:19;;9953:220;;;:::o;10179:366::-;10321:3;10342:67;10406:2;10401:3;10342:67;:::i;:::-;10335:74;;10418:93;10507:3;10418:93;:::i;:::-;10536:2;10531:3;10527:12;10520:19;;10325:220;;;:::o;10551:366::-;10693:3;10714:67;10778:2;10773:3;10714:67;:::i;:::-;10707:74;;10790:93;10879:3;10790:93;:::i;:::-;10908:2;10903:3;10899:12;10892:19;;10697:220;;;:::o;10923:366::-;11065:3;11086:67;11150:2;11145:3;11086:67;:::i;:::-;11079:74;;11162:93;11251:3;11162:93;:::i;:::-;11280:2;11275:3;11271:12;11264:19;;11069:220;;;:::o;11295:366::-;11437:3;11458:67;11522:2;11517:3;11458:67;:::i;:::-;11451:74;;11534:93;11623:3;11534:93;:::i;:::-;11652:2;11647:3;11643:12;11636:19;;11441:220;;;:::o;11667:366::-;11809:3;11830:67;11894:2;11889:3;11830:67;:::i;:::-;11823:74;;11906:93;11995:3;11906:93;:::i;:::-;12024:2;12019:3;12015:12;12008:19;;11813:220;;;:::o;12039:366::-;12181:3;12202:67;12266:2;12261:3;12202:67;:::i;:::-;12195:74;;12278:93;12367:3;12278:93;:::i;:::-;12396:2;12391:3;12387:12;12380:19;;12185:220;;;:::o;12411:366::-;12553:3;12574:67;12638:2;12633:3;12574:67;:::i;:::-;12567:74;;12650:93;12739:3;12650:93;:::i;:::-;12768:2;12763:3;12759:12;12752:19;;12557:220;;;:::o;12783:398::-;12942:3;12963:83;13044:1;13039:3;12963:83;:::i;:::-;12956:90;;13055:93;13144:3;13055:93;:::i;:::-;13173:1;13168:3;13164:11;13157:18;;12946:235;;;:::o;13187:366::-;13329:3;13350:67;13414:2;13409:3;13350:67;:::i;:::-;13343:74;;13426:93;13515:3;13426:93;:::i;:::-;13544:2;13539:3;13535:12;13528:19;;13333:220;;;:::o;13559:366::-;13701:3;13722:67;13786:2;13781:3;13722:67;:::i;:::-;13715:74;;13798:93;13887:3;13798:93;:::i;:::-;13916:2;13911:3;13907:12;13900:19;;13705:220;;;:::o;13931:118::-;14018:24;14036:5;14018:24;:::i;:::-;14013:3;14006:37;13996:53;;:::o;14055:157::-;14160:45;14180:24;14198:5;14180:24;:::i;:::-;14160:45;:::i;:::-;14155:3;14148:58;14138:74;;:::o;14218:435::-;14398:3;14420:95;14511:3;14502:6;14420:95;:::i;:::-;14413:102;;14532:95;14623:3;14614:6;14532:95;:::i;:::-;14525:102;;14644:3;14637:10;;14402:251;;;;;:::o;14659:551::-;14844:3;14866:92;14954:3;14945:6;14866:92;:::i;:::-;14859:99;;14968:75;15039:3;15030:6;14968:75;:::i;:::-;15068:2;15063:3;15059:12;15052:19;;15081:75;15152:3;15143:6;15081:75;:::i;:::-;15181:2;15176:3;15172:12;15165:19;;15201:3;15194:10;;14848:362;;;;;;:::o;15216:379::-;15400:3;15422:147;15565:3;15422:147;:::i;:::-;15415:154;;15586:3;15579:10;;15404:191;;;:::o;15601:222::-;15694:4;15732:2;15721:9;15717:18;15709:26;;15745:71;15813:1;15802:9;15798:17;15789:6;15745:71;:::i;:::-;15699:124;;;;:::o;15829:640::-;16024:4;16062:3;16051:9;16047:19;16039:27;;16076:71;16144:1;16133:9;16129:17;16120:6;16076:71;:::i;:::-;16157:72;16225:2;16214:9;16210:18;16201:6;16157:72;:::i;:::-;16239;16307:2;16296:9;16292:18;16283:6;16239:72;:::i;:::-;16358:9;16352:4;16348:20;16343:2;16332:9;16328:18;16321:48;16386:76;16457:4;16448:6;16386:76;:::i;:::-;16378:84;;16029:440;;;;;;;:::o;16475:210::-;16562:4;16600:2;16589:9;16585:18;16577:26;;16613:65;16675:1;16664:9;16660:17;16651:6;16613:65;:::i;:::-;16567:118;;;;:::o;16691:313::-;16804:4;16842:2;16831:9;16827:18;16819:26;;16891:9;16885:4;16881:20;16877:1;16866:9;16862:17;16855:47;16919:78;16992:4;16983:6;16919:78;:::i;:::-;16911:86;;16809:195;;;;:::o;17010:419::-;17176:4;17214:2;17203:9;17199:18;17191:26;;17263:9;17257:4;17253:20;17249:1;17238:9;17234:17;17227:47;17291:131;17417:4;17291:131;:::i;:::-;17283:139;;17181:248;;;:::o;17435:419::-;17601:4;17639:2;17628:9;17624:18;17616:26;;17688:9;17682:4;17678:20;17674:1;17663:9;17659:17;17652:47;17716:131;17842:4;17716:131;:::i;:::-;17708:139;;17606:248;;;:::o;17860:419::-;18026:4;18064:2;18053:9;18049:18;18041:26;;18113:9;18107:4;18103:20;18099:1;18088:9;18084:17;18077:47;18141:131;18267:4;18141:131;:::i;:::-;18133:139;;18031:248;;;:::o;18285:419::-;18451:4;18489:2;18478:9;18474:18;18466:26;;18538:9;18532:4;18528:20;18524:1;18513:9;18509:17;18502:47;18566:131;18692:4;18566:131;:::i;:::-;18558:139;;18456:248;;;:::o;18710:419::-;18876:4;18914:2;18903:9;18899:18;18891:26;;18963:9;18957:4;18953:20;18949:1;18938:9;18934:17;18927:47;18991:131;19117:4;18991:131;:::i;:::-;18983:139;;18881:248;;;:::o;19135:419::-;19301:4;19339:2;19328:9;19324:18;19316:26;;19388:9;19382:4;19378:20;19374:1;19363:9;19359:17;19352:47;19416:131;19542:4;19416:131;:::i;:::-;19408:139;;19306:248;;;:::o;19560:419::-;19726:4;19764:2;19753:9;19749:18;19741:26;;19813:9;19807:4;19803:20;19799:1;19788:9;19784:17;19777:47;19841:131;19967:4;19841:131;:::i;:::-;19833:139;;19731:248;;;:::o;19985:419::-;20151:4;20189:2;20178:9;20174:18;20166:26;;20238:9;20232:4;20228:20;20224:1;20213:9;20209:17;20202:47;20266:131;20392:4;20266:131;:::i;:::-;20258:139;;20156:248;;;:::o;20410:419::-;20576:4;20614:2;20603:9;20599:18;20591:26;;20663:9;20657:4;20653:20;20649:1;20638:9;20634:17;20627:47;20691:131;20817:4;20691:131;:::i;:::-;20683:139;;20581:248;;;:::o;20835:419::-;21001:4;21039:2;21028:9;21024:18;21016:26;;21088:9;21082:4;21078:20;21074:1;21063:9;21059:17;21052:47;21116:131;21242:4;21116:131;:::i;:::-;21108:139;;21006:248;;;:::o;21260:419::-;21426:4;21464:2;21453:9;21449:18;21441:26;;21513:9;21507:4;21503:20;21499:1;21488:9;21484:17;21477:47;21541:131;21667:4;21541:131;:::i;:::-;21533:139;;21431:248;;;:::o;21685:419::-;21851:4;21889:2;21878:9;21874:18;21866:26;;21938:9;21932:4;21928:20;21924:1;21913:9;21909:17;21902:47;21966:131;22092:4;21966:131;:::i;:::-;21958:139;;21856:248;;;:::o;22110:419::-;22276:4;22314:2;22303:9;22299:18;22291:26;;22363:9;22357:4;22353:20;22349:1;22338:9;22334:17;22327:47;22391:131;22517:4;22391:131;:::i;:::-;22383:139;;22281:248;;;:::o;22535:419::-;22701:4;22739:2;22728:9;22724:18;22716:26;;22788:9;22782:4;22778:20;22774:1;22763:9;22759:17;22752:47;22816:131;22942:4;22816:131;:::i;:::-;22808:139;;22706:248;;;:::o;22960:222::-;23053:4;23091:2;23080:9;23076:18;23068:26;;23104:71;23172:1;23161:9;23157:17;23148:6;23104:71;:::i;:::-;23058:124;;;;:::o;23188:129::-;23222:6;23249:20;;:::i;:::-;23239:30;;23278:33;23306:4;23298:6;23278:33;:::i;:::-;23229:88;;;:::o;23323:75::-;23356:6;23389:2;23383:9;23373:19;;23363:35;:::o;23404:307::-;23465:4;23555:18;23547:6;23544:30;23541:2;;;23577:18;;:::i;:::-;23541:2;23615:29;23637:6;23615:29;:::i;:::-;23607:37;;23699:4;23693;23689:15;23681:23;;23470:241;;;:::o;23717:308::-;23779:4;23869:18;23861:6;23858:30;23855:2;;;23891:18;;:::i;:::-;23855:2;23929:29;23951:6;23929:29;:::i;:::-;23921:37;;24013:4;24007;24003:15;23995:23;;23784:241;;;:::o;24031:141::-;24080:4;24103:3;24095:11;;24126:3;24123:1;24116:14;24160:4;24157:1;24147:18;24139:26;;24085:87;;;:::o;24178:98::-;24229:6;24263:5;24257:12;24247:22;;24236:40;;;:::o;24282:99::-;24334:6;24368:5;24362:12;24352:22;;24341:40;;;:::o;24387:168::-;24470:11;24504:6;24499:3;24492:19;24544:4;24539:3;24535:14;24520:29;;24482:73;;;;:::o;24561:147::-;24662:11;24699:3;24684:18;;24674:34;;;;:::o;24714:169::-;24798:11;24832:6;24827:3;24820:19;24872:4;24867:3;24863:14;24848:29;;24810:73;;;;:::o;24889:148::-;24991:11;25028:3;25013:18;;25003:34;;;;:::o;25043:305::-;25083:3;25102:20;25120:1;25102:20;:::i;:::-;25097:25;;25136:20;25154:1;25136:20;:::i;:::-;25131:25;;25290:1;25222:66;25218:74;25215:1;25212:81;25209:2;;;25296:18;;:::i;:::-;25209:2;25340:1;25337;25333:9;25326:16;;25087:261;;;;:::o;25354:185::-;25394:1;25411:20;25429:1;25411:20;:::i;:::-;25406:25;;25445:20;25463:1;25445:20;:::i;:::-;25440:25;;25484:1;25474:2;;25489:18;;:::i;:::-;25474:2;25531:1;25528;25524:9;25519:14;;25396:143;;;;:::o;25545:348::-;25585:7;25608:20;25626:1;25608:20;:::i;:::-;25603:25;;25642:20;25660:1;25642:20;:::i;:::-;25637:25;;25830:1;25762:66;25758:74;25755:1;25752:81;25747:1;25740:9;25733:17;25729:105;25726:2;;;25837:18;;:::i;:::-;25726:2;25885:1;25882;25878:9;25867:20;;25593:300;;;;:::o;25899:191::-;25939:4;25959:20;25977:1;25959:20;:::i;:::-;25954:25;;25993:20;26011:1;25993:20;:::i;:::-;25988:25;;26032:1;26029;26026:8;26023:2;;;26037:18;;:::i;:::-;26023:2;26082:1;26079;26075:9;26067:17;;25944:146;;;;:::o;26096:96::-;26133:7;26162:24;26180:5;26162:24;:::i;:::-;26151:35;;26141:51;;;:::o;26198:90::-;26232:7;26275:5;26268:13;26261:21;26250:32;;26240:48;;;:::o;26294:149::-;26330:7;26370:66;26363:5;26359:78;26348:89;;26338:105;;;:::o;26449:126::-;26486:7;26526:42;26519:5;26515:54;26504:65;;26494:81;;;:::o;26581:77::-;26618:7;26647:5;26636:16;;26626:32;;;:::o;26664:154::-;26748:6;26743:3;26738;26725:30;26810:1;26801:6;26796:3;26792:16;26785:27;26715:103;;;:::o;26824:307::-;26892:1;26902:113;26916:6;26913:1;26910:13;26902:113;;;27001:1;26996:3;26992:11;26986:18;26982:1;26977:3;26973:11;26966:39;26938:2;26935:1;26931:10;26926:15;;26902:113;;;27033:6;27030:1;27027:13;27024:2;;;27113:1;27104:6;27099:3;27095:16;27088:27;27024:2;26873:258;;;;:::o;27137:320::-;27181:6;27218:1;27212:4;27208:12;27198:22;;27265:1;27259:4;27255:12;27286:18;27276:2;;27342:4;27334:6;27330:17;27320:27;;27276:2;27404;27396:6;27393:14;27373:18;27370:38;27367:2;;;27423:18;;:::i;:::-;27367:2;27188:269;;;;:::o;27463:281::-;27546:27;27568:4;27546:27;:::i;:::-;27538:6;27534:40;27676:6;27664:10;27661:22;27640:18;27628:10;27625:34;27622:62;27619:2;;;27687:18;;:::i;:::-;27619:2;27727:10;27723:2;27716:22;27506:238;;;:::o;27750:233::-;27789:3;27812:24;27830:5;27812:24;:::i;:::-;27803:33;;27858:66;27851:5;27848:77;27845:2;;;27928:18;;:::i;:::-;27845:2;27975:1;27968:5;27964:13;27957:20;;27793:190;;;:::o;27989:79::-;28028:7;28057:5;28046:16;;28036:32;;;:::o;28074:176::-;28106:1;28123:20;28141:1;28123:20;:::i;:::-;28118:25;;28157:20;28175:1;28157:20;:::i;:::-;28152:25;;28196:1;28186:2;;28201:18;;:::i;:::-;28186:2;28242:1;28239;28235:9;28230:14;;28108:142;;;;:::o;28256:180::-;28304:77;28301:1;28294:88;28401:4;28398:1;28391:15;28425:4;28422:1;28415:15;28442:180;28490:77;28487:1;28480:88;28587:4;28584:1;28577:15;28611:4;28608:1;28601:15;28628:180;28676:77;28673:1;28666:88;28773:4;28770:1;28763:15;28797:4;28794:1;28787:15;28814:180;28862:77;28859:1;28852:88;28959:4;28956:1;28949:15;28983:4;28980:1;28973:15;29000:102;29041:6;29092:2;29088:7;29083:2;29076:5;29072:14;29068:28;29058:38;;29048:54;;;:::o;29108:179::-;29248:31;29244:1;29236:6;29232:14;29225:55;29214:73;:::o;29293:225::-;29433:34;29429:1;29421:6;29417:14;29410:58;29502:8;29497:2;29489:6;29485:15;29478:33;29399:119;:::o;29524:165::-;29664:17;29660:1;29652:6;29648:14;29641:41;29630:59;:::o;29695:177::-;29835:29;29831:1;29823:6;29819:14;29812:53;29801:71;:::o;29878:168::-;30018:20;30014:1;30006:6;30002:14;29995:44;29984:62;:::o;30052:221::-;30192:34;30188:1;30180:6;30176:14;30169:58;30261:4;30256:2;30248:6;30244:15;30237:29;30158:115;:::o;30279:176::-;30419:28;30415:1;30407:6;30403:14;30396:52;30385:70;:::o;30461:170::-;30601:22;30597:1;30589:6;30585:14;30578:46;30567:64;:::o;30637:182::-;30777:34;30773:1;30765:6;30761:14;30754:58;30743:76;:::o;30825:168::-;30965:20;30961:1;30953:6;30949:14;30942:44;30931:62;:::o;30999:172::-;31139:24;31135:1;31127:6;31123:14;31116:48;31105:66;:::o;31177:172::-;31317:24;31313:1;31305:6;31301:14;31294:48;31283:66;:::o;31355:114::-;31461:8;:::o;31475:172::-;31615:24;31611:1;31603:6;31599:14;31592:48;31581:66;:::o;31653:181::-;31793:33;31789:1;31781:6;31777:14;31770:57;31759:75;:::o;31840:122::-;31913:24;31931:5;31913:24;:::i;:::-;31906:5;31903:35;31893:2;;31952:1;31949;31942:12;31893:2;31883:79;:::o;31968:116::-;32038:21;32053:5;32038:21;:::i;:::-;32031:5;32028:32;32018:2;;32074:1;32071;32064:12;32018:2;32008:76;:::o;32090:120::-;32162:23;32179:5;32162:23;:::i;:::-;32155:5;32152:34;32142:2;;32200:1;32197;32190:12;32142:2;32132:78;:::o;32216:122::-;32289:24;32307:5;32289:24;:::i;:::-;32282:5;32279:35;32269:2;;32328:1;32325;32318:12;32269:2;32259:79;:::o

Swarm Source

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