ETH Price: $2,484.03 (-3.01%)

Roar Club (RCO)
 

Overview

TokenID

491

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
RoarClub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-27
*/

// File: contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

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

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


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

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

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

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

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

    unchecked {
        if (_startTokenId() <= curr)
            if (curr < _currentIndex) {
                uint256 packed = _packedOwnerships[curr];
                // If not burned.
                if (packed & _BITMASK_BURNED == 0) {
                    // Invariant:
                    // There will always be an initialized ownership slot
                    // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                    // before an unintialized ownership slot
                    // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                    // Hence, `curr` will not underflow.
                    //
                    // We can directly compare the packed value.
                    // If the address is zero, packed will be zero.
                    while (packed == 0) {
                        packed = _packedOwnerships[--curr];
                    }
                    return packed;
                }
            }
    }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
    unchecked {
        // We can directly increment and decrement the balances.
        --_packedAddressData[from]; // Updates: `balance -= 1`.
        ++_packedAddressData[to]; // Updates: `balance += 1`.

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
    unchecked {
        // Updates:
        // - `balance += quantity`.
        // - `numberMinted += quantity`.
        //
        // We can directly add to the `balance` and `numberMinted`.
        _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

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

        uint256 toMasked;
        uint256 end = startTokenId + quantity;

        // Use assembly to loop and emit the `Transfer` event for gas savings.
        assembly {
        // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
            toMasked := and(to, _BITMASK_ADDRESS)
        // Emit the `Transfer` event.
            log4(
            0, // Start of data (0, since no data).
            0, // End of data (0, since no data).
            _TRANSFER_EVENT_SIGNATURE, // Signature.
            0, // `address(0)`.
            toMasked, // `to`.
            startTokenId // `tokenId`.
            )

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

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

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

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

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

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

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

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

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

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
    unchecked {
        // Updates:
        // - `balance -= 1`.
        // - `numberBurned += 1`.
        //
        // We can directly decrement the balance, and increment the number burned.
        // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
        _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

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

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

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

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

            let length := sub(end, str)
        // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
        // Store the length.
            mstore(str, length)
        }
    }
}
// File: @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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

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

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

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

// File: contracts/RoarClub.sol



pragma solidity >=0.7.0 <0.9.0;




contract RoarClub is ERC721A, Ownable, ReentrancyGuard {
    uint256 public constant MAXIMUM_SUPPLY = 10000;
    uint256 public presalePrice = 0.08 ether;
    uint256 public presaleMaximumHoldingsPerHolder = 3;
    uint256 public publicPrice = 0.1 ether;
    uint256 public publicMaximumHoldingsPerHolder = 5;

    bool private allowMint = false;
    bool private presale = true;
    bool private revealed = false;

    string private revealedBaseURI = "ipfs://CID/";
    string private notRevealedBaseURI = "ipfs://QmQvKWJdn2s6YHWhmTSv1y3t7GQ7p84xaLmmnQRLz9Yto9/";

    mapping(address => bool) private presaleWhitelist;
    mapping(address => uint256) private presaleMintQuantityPerHolder;
    mapping(address => uint256) private publicMintQuantityPerHolder;

    event MemberReservedTotal(uint256 amount);

    constructor() ERC721A("Roar Club", "RCO") {
        _mint(0xBAD7f3B9Fe2DE230Fdec0f10cDD70AB43F2c2c1f, 3);
        _mint(0x25f97C1c0Cac9207186B566EE191360ED256416B, 3);
        _mint(0xFEee490c7F2944022c6CE25A285F4501B322cbed, 3);
        _mint(0x621027DF468ee49B29E931568dACf12824A4ca84, 3);
        _mint(0xd7A90717C955BcF19dBDE72687bb901184FA8Ad7, 3);
        _mint(0xD0c1CFfF980C9608B6F356F1e7c62042A2986AC0, 3);
        _mint(0xADE0788F9a732dbe52AE7CdF5e4Fe0dB72f7Ff66, 3);
        _mint(0xA5c554a9aE0b9C54b346aaDfFCdC3D455Fd3bFc1, 3);
        _mint(0x78f5AC24b641C23e42C9059F89d27818E1323278, 3);
        _mint(0x2DAE972bFC378fcC16701CC76286d552589f3F56, 3);
        _mint(0xe078a4029f2a8db5A50cd522f84F878AC9cD5A8A, 3);
        _mint(0x7301be38468cBB3784A385b1cf247FDF80631A78, 3);
        _mint(0x5dA8C072cE311D7129E7d2216b7497e624dceC45, 3);
        _mint(0x261F2A87eBCF59ce2668Fb3bEb6184433E6405ef, 3);
        _mint(0x49779F34A4cD539b7aA8df58E92d1d90A09A3c90, 3);
        _mint(0x46Df4501196c747C92670543f57C168fd57a16CD, 3);
        _mint(0x7aB7E5Dd408441d00811ba073FbAa0E62b752345, 3);
        _mint(0x462ca2Be187cd64060678e0b027D5853F8de1ba7, 3);
        _mint(0x07F5093Df1Ff499051B821B2D301a9141624322B, 3);
        _mint(0x59610f7a28Ef8221160dE691D385281285221469, 3);
        _mint(0x3aA3F8c0d9F70569A951d2359324e1AE9d578d97, 3);
        _mint(0x1d3a4d05e3C8C25fFCcae2BBCb67B2EC4C7d9650, 3);
        _mint(0xD47079251450d44005Ac30c4CA338E9C874eED92, 3);
        _mint(0x899913Fea631FFE8E970D9b8AA58223C23fd3EA3, 3);
        _mint(0x936fF8D0B9D960DFb73A7455A265A74326222527, 3);
        _mint(0xEa4926A3cE47B3b192481968F2A70327548041F8, 3);
        _mint(0x0A15D6eaE84c9cA5a112669551Ec24fD53E6c222, 3);
        _mint(0xE943f9901EAA787278DABDB4Cd3ccF78d0DD308B, 3);
        _mint(0xFe5FB7eB44caF144321D2212168A7fe59D5ED2aE, 3);
        _mint(0xB97626AfD74E49C65E382F453362f5Eda2117eCE, 3);
        _mint(0x922221e1F3c92C5cf76B4231dCFd294AadD05f38, 3);
        _mint(0x3E4F212eD2EAE859D24587862a80392494B32036, 3);
        _mint(0x053C05A30bAa89C624266759B66F72E2e28645ea, 3);
        _mint(0x8AE4825b9E4264e82941b66D2B804cebCffC0e5F, 3);
        _mint(0xA1191E7CeF910072740c3c2867ad0504c443E42C, 3);
        _mint(0x26227faF16C00bEcA97Ca91f730Fc8507354fa60, 3);
        _mint(0xf3B6068a6Ae17b9c37B5aF27757A4a63AD7565eB, 3);
        _mint(0x913e17b71307EaDF11a0238c0b571f7b38153708, 3);
        _mint(0x53989AA83b5E73732b24247353BDFf050a23303d, 3);
        _mint(0x085fd0D0b2De3586077D2C5A1281c08ca56c6650, 3);
        _mint(0xE7731811B1a45658A007Bb9DcF61e846348F6695, 3);
        _mint(0xd9e465295A13ed25226f7b684DDF1804d088dACB, 3);
        _mint(0xF6B4aF3de4889f43D006BcEcA5b6e0368E7620ce, 3);
        _mint(0xF8e6571645d5dB5A59E4184B07A8BF7b04B5dB32, 3);
        _mint(0x54f9E925c22c910170Cb49C8Fe3AC26422d3A30a, 3);
        _mint(0x9EC262ccfc6217cFE83dE207C2086C6708b99f36, 3);
        _mint(0x4c063103AFa727Fcf89139943Ac8823be23477A7, 3);
        _mint(0xe17Ca60cBB7E7BeF2a78027B5627f70D21A5C523, 3);
        _mint(0x201ba29E991274D84e092539fED2156c2979f12d, 3);
        _mint(0x3b2fF091e0d7cf55bB87DE225A40bf577132aFBf, 3);
        _mint(0x32676f8b659B04406822165b88e7574A382d9082, 3);
        _mint(0x467ef500769bb4208D8d462354790678b8338331, 3);
        _mint(0x3C883639411D5053692839e1ceB7878EE4c6501C, 3);
        _mint(0x9694c517b61671EF2D91DF71dAf530735b640Fd9, 3);
        _mint(0x71DB616ac262eDC0C87283386C3d1f9780c679D8, 3);
        _mint(0x91FA0a32AD123cb890eE645dF793Bf63a1A063cC, 3);
        _mint(0x675De6D6cB22eED3DAF0BCdb3408aCBe743EDF66, 3);
        _mint(0xcC9B3539e57001EdDfB521243D4da00393EfDBd6, 3);
        _mint(0xAA32daBb84DE51f0eD3850E7483f181D3d106B4E, 3);
        _mint(0x2a49E20195E722811E7215f64C5F4b635e9D64c6, 3);
        _mint(0x6310596C3568d3B51BFD49447F671Ec43f6db77F, 3);
        _mint(0x98Bff09b73C946d04EE48Dfe53DC2984762b1E6a, 3);
        _mint(0x484D42b5D7bD6DbA26Aa618eDDe29a5Ba777d5A6, 3);
        _mint(0xD0C590F7B41153988A3837b7FF0a476763D0D895, 3);
        _mint(0xc2495539587d5Cc8cd7Bc40686F3e5C006206305, 3);
        _mint(0x4278F6Fa68DAa9C42BAd0c122DaDf183De75B535, 3);
        _mint(0xbC5F70D73f97cCA7E72B3DF62d71BAE941b60b4f, 3);
        _mint(0x79C4ca68939F059A3176BA99d6cdc257279f80B8, 3);
        _mint(0xe4Fa3A953Db192745F5d0807f079c115262208e8, 3);
        _mint(0x288E453043B5609A87B1D6a856f59Aad5Dfa4437, 3);
        _mint(0xd497241619010E5d37C235E5e0DeA485645603be, 3);
        _mint(0xe93a6C35708F6940461797be57C4649B3b3acdB9, 3);
        _mint(0xC4C7ab2e3f90f78926e76b9684EAf2852CCf3e83, 3);
        _mint(0x6bA81C0C95EA19d248741c76CA71bBD255442496, 3);
        _mint(0xD3D3eBD383d1Ff85eB4B24E8735a58f5160Db572, 3);
        _mint(0xB1143E5363158aBD1d3e988eccAe4099264c73ca, 3);
        _mint(0xFf48Ff2814F57F84732366b819232BECDF3BA826, 3);
        _mint(0xE4dEF841D29635604ddd1a4eF2d163cfc26a32f8, 3);
        _mint(0xdbb7F23F97F9Df18Ee3E0d2BF73E952106Fdf049, 3);
        _mint(0x35a18BD98e5EB67EC989dFb64B06cc7c522685A7, 3);
        _mint(0x6d471422a855B499464eF97f31B880693A469192, 3);
        _mint(0x7419d8404ee6354Ea305725ED435135bF655F1F8, 3);
        _mint(0x2659caB3C56e654F62D02c203FB96fCc38F03062, 3);
        _mint(0xA5f2C5Ce4eCC79ABb1A3671f020ce664f0e4B1E3, 3);
        _mint(0x81Bc1CD5811Cf578c9Fc54e7f7954F9D5B45D956, 3);
        _mint(0x1b32dA60489DE3Fe0c6398c21D0b1CdEbeEaD4DD, 3);
        _mint(0x4c1597f1C65bc95a5F7831643B631262744AB663, 3);
        _mint(0xD2eB07b66A790bA2132aE95D2fD49b3c4528edfb, 3);
        _mint(0x060f36d6EEAf8A89f226d9C42d33df564773bA29, 3);
        _mint(0x78627243b800697612B93a823c1E16A7B165c706, 3);
        _mint(0x348eBCa3f1482287EBa4d40e1E34F4A2a5ecC113, 3);
        _mint(0x77898a01aeE8d184250468Dd049333262235401A, 3);
        _mint(0x105A9da4E37Fe355350610E0Aa97570709912990, 3);
        _mint(0x0bABCB5719A30f5238082b20ACD0dFF17582e6Cf, 3);
        _mint(0x03495185e86d354eEa486680eF14026A961Fb459, 3);
        _mint(0xAB6762274b3716ff29cf16b7d4B0A26be1aA0136, 3);
        _mint(0x92e3bE37AcC398484dbA8f8bA4B89B512041C202, 3);
        _mint(0xcda7e8C665Bf0Eb1E2A94eab14de92059f35a87b, 3);
        _mint(0x882383A232362F1e1cd3Ba09991C5c2C93Ac8F8C, 3);
        _mint(0x637cba0CC95884817CD63fe0147cf403505b2Ced, 3);
        _mint(0x1Ef661C462781700332F2e67397e293e0dEa8468, 3);
        _mint(0x93c090e4289bE0fb97CCcF94c4115a9509B92868, 3);
        _mint(0x42de51b67082C179B31A4aA2Ee47BD1975CAa5df, 3);
        _mint(0x71ef49A06C737ca8DbB59549C45fDDaf16f3D24B, 3);
        _mint(0x37f832b84631cC796485d578Ffcca484e6008205, 3);
    }

    function mint(uint256 quantity) public payable nonReentrant {
        require(allowMint, "Not yet on sale");

        if (presale) {
            require(msg.value == presalePrice * quantity, "The amount you paid is incorrect");
            require(presaleWhitelist[msg.sender], "You are not eligible for the pre-sale whitelist");
            require((presaleMintQuantityPerHolder[msg.sender] + quantity) <= presaleMaximumHoldingsPerHolder, "The mint quantity exceeds the holding quantity limit");
        } else {
            require(msg.value == publicPrice * quantity, "The amount you paid is incorrect");
            require((publicMintQuantityPerHolder[msg.sender] + quantity) <= publicMaximumHoldingsPerHolder, "The mint quantity exceeds the holding quantity limit");
        }

        require((quantity + totalSupply()) <= MAXIMUM_SUPPLY, "The mint quantity has exceeded the maximum supply quantity");

        if (presale) {
            presaleMintQuantityPerHolder[msg.sender] += quantity;
        } else {
            publicMintQuantityPerHolder[msg.sender] += quantity;
        }

        _mint(msg.sender, quantity);
    }

    function airdrop(address to, uint256 quantity) public onlyOwner {
        _mint(to, quantity);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = revealed ? revealedBaseURI : notRevealedBaseURI;
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), ".json")) : '';
    }

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

    function getCurrentPrice() public view returns (uint256) {
        if (presale) {
            return presalePrice;
        } else {
            return publicPrice;
        }
    }

    function getCurrentMintLimit(address add) public view returns (uint256) {
        if (presale) {
            return presaleMaximumHoldingsPerHolder - presaleMintQuantityPerHolder[add];
        } else {
            return publicMaximumHoldingsPerHolder - publicMintQuantityPerHolder[add];
        }
    }

    function getRemainingNft() public view returns(uint256) {
        return MAXIMUM_SUPPLY - _totalMinted();
    }

    function getPresalePrice() public view returns (uint256) {
        return presalePrice;
    }

    function setPresalePrice(uint256 _presalePrice) public onlyOwner {
        presalePrice = _presalePrice;
    }

    function getPresaleMaximumHoldingsPerHolder() public view returns (uint256) {
        return presaleMaximumHoldingsPerHolder;
    }

    function setPresaleMaximumHoldingsPerHolder(uint256 _presaleMaximumHoldingsPerHolder) public onlyOwner {
        presaleMaximumHoldingsPerHolder = _presaleMaximumHoldingsPerHolder;
    }

    function getPublicPrice() public view returns (uint256) {
        return publicPrice;
    }

    function setPublicPrice(uint256 _publicPrice) public onlyOwner {
        publicPrice = _publicPrice;
    }

    function getPublicMaximumHoldingsPerHolder() public view returns (uint256) {
        return publicMaximumHoldingsPerHolder;
    }

    function setPublicMaximumHoldingsPerHolder(uint256 _publicMaximumHoldingsPerHolder) public onlyOwner {
        publicMaximumHoldingsPerHolder = _publicMaximumHoldingsPerHolder;
    }

    function isAllowMint() public view returns (bool) {
        return allowMint;
    }

    function toggleAllowMint() public onlyOwner {
        allowMint = !allowMint;
    }

    function isPresale() public view returns (bool) {
        return presale;
    }

    function togglePresale() public onlyOwner {
        presale = !presale;
    }

    function isRevealed() public view returns (bool) {
        return revealed;
    }

    function toggleRevealed() public onlyOwner {
        revealed = !revealed;
    }

    function getRevealedBaseURI() public view returns (string memory) {
        return revealedBaseURI;
    }

    function setRevealedBaseURI(string memory _revealedBaseURI) public onlyOwner {
        revealedBaseURI = _revealedBaseURI;
    }

    function getNotRevealedBaseURI() public view returns (string memory) {
        return notRevealedBaseURI;
    }

    function setNotRevealedBaseURI(string memory _notRevealedBaseURI) public onlyOwner {
        notRevealedBaseURI = _notRevealedBaseURI;
    }

    function isPresaleWhitelisted(address add) public view returns (bool) {
        return presaleWhitelist[add];
    }

    function setPresaleWhitelist(address add, bool whitelisted) public onlyOwner {
        presaleWhitelist[add] = whitelisted;
    }

    function getPresaleMintQuantityPerHolder(address add) public view returns (uint256) {
        return presaleMintQuantityPerHolder[add];
    }

    function getPublicMintQuantityPerHolder(address add) public view returns (uint256) {
        return publicMintQuantityPerHolder[add];
    }

    function withdraw() public onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MemberReservedTotal","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":"MAXIMUM_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"getCurrentMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNotRevealedBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleMaximumHoldingsPerHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"getPresaleMintQuantityPerHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicMaximumHoldingsPerHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"getPublicMintQuantityPerHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRevealedBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"isPresaleWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","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":"presaleMaximumHoldingsPerHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaximumHoldingsPerHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_notRevealedBaseURI","type":"string"}],"name":"setNotRevealedBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleMaximumHoldingsPerHolder","type":"uint256"}],"name":"setPresaleMaximumHoldingsPerHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presalePrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"},{"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"setPresaleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMaximumHoldingsPerHolder","type":"uint256"}],"name":"setPublicMaximumHoldingsPerHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_revealedBaseURI","type":"string"}],"name":"setRevealedBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleAllowMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleRevealed","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"}]

608060405267011c37937e080000600a556003600b5567016345785d8a0000600c556005600d556000600e60006101000a81548160ff0219169083151502179055506001600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff0219169083151502179055506040518060400160405280600b81526020017f697066733a2f2f4349442f000000000000000000000000000000000000000000815250600f9080519060200190620000c492919062001528565b5060405180606001604052806036815260200162004d066036913960109080519060200190620000f692919062001528565b503480156200010457600080fd5b506040518060400160405280600981526020017f526f617220436c756200000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f52434f000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200018992919062001528565b508060039080519060200190620001a292919062001528565b50620001b3620011e860201b60201c565b6000819055505050620001db620001cf620011f160201b60201c565b620011f960201b60201c565b60016009819055506200020a73bad7f3b9fe2de230fdec0f10cdd70ab43f2c2c1f6003620012bf60201b60201c565b620002317325f97c1c0cac9207186b566ee191360ed256416b6003620012bf60201b60201c565b6200025873feee490c7f2944022c6ce25a285f4501b322cbed6003620012bf60201b60201c565b6200027f73621027df468ee49b29e931568dacf12824a4ca846003620012bf60201b60201c565b620002a673d7a90717c955bcf19dbde72687bb901184fa8ad76003620012bf60201b60201c565b620002cd73d0c1cfff980c9608b6f356f1e7c62042a2986ac06003620012bf60201b60201c565b620002f473ade0788f9a732dbe52ae7cdf5e4fe0db72f7ff666003620012bf60201b60201c565b6200031b73a5c554a9ae0b9c54b346aadffcdc3d455fd3bfc16003620012bf60201b60201c565b620003427378f5ac24b641c23e42c9059f89d27818e13232786003620012bf60201b60201c565b62000369732dae972bfc378fcc16701cc76286d552589f3f566003620012bf60201b60201c565b6200039073e078a4029f2a8db5a50cd522f84f878ac9cd5a8a6003620012bf60201b60201c565b620003b7737301be38468cbb3784a385b1cf247fdf80631a786003620012bf60201b60201c565b620003de735da8c072ce311d7129e7d2216b7497e624dcec456003620012bf60201b60201c565b6200040573261f2a87ebcf59ce2668fb3beb6184433e6405ef6003620012bf60201b60201c565b6200042c7349779f34a4cd539b7aa8df58e92d1d90a09a3c906003620012bf60201b60201c565b620004537346df4501196c747c92670543f57c168fd57a16cd6003620012bf60201b60201c565b6200047a737ab7e5dd408441d00811ba073fbaa0e62b7523456003620012bf60201b60201c565b620004a173462ca2be187cd64060678e0b027d5853f8de1ba76003620012bf60201b60201c565b620004c87307f5093df1ff499051b821b2d301a9141624322b6003620012bf60201b60201c565b620004ef7359610f7a28ef8221160de691d3852812852214696003620012bf60201b60201c565b62000516733aa3f8c0d9f70569a951d2359324e1ae9d578d976003620012bf60201b60201c565b6200053d731d3a4d05e3c8c25ffccae2bbcb67b2ec4c7d96506003620012bf60201b60201c565b6200056473d47079251450d44005ac30c4ca338e9c874eed926003620012bf60201b60201c565b6200058b73899913fea631ffe8e970d9b8aa58223c23fd3ea36003620012bf60201b60201c565b620005b273936ff8d0b9d960dfb73a7455a265a743262225276003620012bf60201b60201c565b620005d973ea4926a3ce47b3b192481968f2a70327548041f86003620012bf60201b60201c565b62000600730a15d6eae84c9ca5a112669551ec24fd53e6c2226003620012bf60201b60201c565b6200062773e943f9901eaa787278dabdb4cd3ccf78d0dd308b6003620012bf60201b60201c565b6200064e73fe5fb7eb44caf144321d2212168a7fe59d5ed2ae6003620012bf60201b60201c565b6200067573b97626afd74e49c65e382f453362f5eda2117ece6003620012bf60201b60201c565b6200069c73922221e1f3c92c5cf76b4231dcfd294aadd05f386003620012bf60201b60201c565b620006c3733e4f212ed2eae859d24587862a80392494b320366003620012bf60201b60201c565b620006ea73053c05a30baa89c624266759b66f72e2e28645ea6003620012bf60201b60201c565b62000711738ae4825b9e4264e82941b66d2b804cebcffc0e5f6003620012bf60201b60201c565b6200073873a1191e7cef910072740c3c2867ad0504c443e42c6003620012bf60201b60201c565b6200075f7326227faf16c00beca97ca91f730fc8507354fa606003620012bf60201b60201c565b6200078673f3b6068a6ae17b9c37b5af27757a4a63ad7565eb6003620012bf60201b60201c565b620007ad73913e17b71307eadf11a0238c0b571f7b381537086003620012bf60201b60201c565b620007d47353989aa83b5e73732b24247353bdff050a23303d6003620012bf60201b60201c565b620007fb73085fd0d0b2de3586077d2c5a1281c08ca56c66506003620012bf60201b60201c565b6200082273e7731811b1a45658a007bb9dcf61e846348f66956003620012bf60201b60201c565b6200084973d9e465295a13ed25226f7b684ddf1804d088dacb6003620012bf60201b60201c565b6200087073f6b4af3de4889f43d006bceca5b6e0368e7620ce6003620012bf60201b60201c565b6200089773f8e6571645d5db5a59e4184b07a8bf7b04b5db326003620012bf60201b60201c565b620008be7354f9e925c22c910170cb49c8fe3ac26422d3a30a6003620012bf60201b60201c565b620008e5739ec262ccfc6217cfe83de207c2086c6708b99f366003620012bf60201b60201c565b6200090c734c063103afa727fcf89139943ac8823be23477a76003620012bf60201b60201c565b6200093373e17ca60cbb7e7bef2a78027b5627f70d21a5c5236003620012bf60201b60201c565b6200095a73201ba29e991274d84e092539fed2156c2979f12d6003620012bf60201b60201c565b62000981733b2ff091e0d7cf55bb87de225a40bf577132afbf6003620012bf60201b60201c565b620009a87332676f8b659b04406822165b88e7574a382d90826003620012bf60201b60201c565b620009cf73467ef500769bb4208d8d462354790678b83383316003620012bf60201b60201c565b620009f6733c883639411d5053692839e1ceb7878ee4c6501c6003620012bf60201b60201c565b62000a1d739694c517b61671ef2d91df71daf530735b640fd96003620012bf60201b60201c565b62000a447371db616ac262edc0c87283386c3d1f9780c679d86003620012bf60201b60201c565b62000a6b7391fa0a32ad123cb890ee645df793bf63a1a063cc6003620012bf60201b60201c565b62000a9273675de6d6cb22eed3daf0bcdb3408acbe743edf666003620012bf60201b60201c565b62000ab973cc9b3539e57001eddfb521243d4da00393efdbd66003620012bf60201b60201c565b62000ae073aa32dabb84de51f0ed3850e7483f181d3d106b4e6003620012bf60201b60201c565b62000b07732a49e20195e722811e7215f64c5f4b635e9d64c66003620012bf60201b60201c565b62000b2e736310596c3568d3b51bfd49447f671ec43f6db77f6003620012bf60201b60201c565b62000b557398bff09b73c946d04ee48dfe53dc2984762b1e6a6003620012bf60201b60201c565b62000b7c73484d42b5d7bd6dba26aa618edde29a5ba777d5a66003620012bf60201b60201c565b62000ba373d0c590f7b41153988a3837b7ff0a476763d0d8956003620012bf60201b60201c565b62000bca73c2495539587d5cc8cd7bc40686f3e5c0062063056003620012bf60201b60201c565b62000bf1734278f6fa68daa9c42bad0c122dadf183de75b5356003620012bf60201b60201c565b62000c1873bc5f70d73f97cca7e72b3df62d71bae941b60b4f6003620012bf60201b60201c565b62000c3f7379c4ca68939f059a3176ba99d6cdc257279f80b86003620012bf60201b60201c565b62000c6673e4fa3a953db192745f5d0807f079c115262208e86003620012bf60201b60201c565b62000c8d73288e453043b5609a87b1d6a856f59aad5dfa44376003620012bf60201b60201c565b62000cb473d497241619010e5d37c235e5e0dea485645603be6003620012bf60201b60201c565b62000cdb73e93a6c35708f6940461797be57c4649b3b3acdb96003620012bf60201b60201c565b62000d0273c4c7ab2e3f90f78926e76b9684eaf2852ccf3e836003620012bf60201b60201c565b62000d29736ba81c0c95ea19d248741c76ca71bbd2554424966003620012bf60201b60201c565b62000d5073d3d3ebd383d1ff85eb4b24e8735a58f5160db5726003620012bf60201b60201c565b62000d7773b1143e5363158abd1d3e988eccae4099264c73ca6003620012bf60201b60201c565b62000d9e73ff48ff2814f57f84732366b819232becdf3ba8266003620012bf60201b60201c565b62000dc573e4def841d29635604ddd1a4ef2d163cfc26a32f86003620012bf60201b60201c565b62000dec73dbb7f23f97f9df18ee3e0d2bf73e952106fdf0496003620012bf60201b60201c565b62000e137335a18bd98e5eb67ec989dfb64b06cc7c522685a76003620012bf60201b60201c565b62000e3a736d471422a855b499464ef97f31b880693a4691926003620012bf60201b60201c565b62000e61737419d8404ee6354ea305725ed435135bf655f1f86003620012bf60201b60201c565b62000e88732659cab3c56e654f62d02c203fb96fcc38f030626003620012bf60201b60201c565b62000eaf73a5f2c5ce4ecc79abb1a3671f020ce664f0e4b1e36003620012bf60201b60201c565b62000ed67381bc1cd5811cf578c9fc54e7f7954f9d5b45d9566003620012bf60201b60201c565b62000efd731b32da60489de3fe0c6398c21d0b1cdebeead4dd6003620012bf60201b60201c565b62000f24734c1597f1c65bc95a5f7831643b631262744ab6636003620012bf60201b60201c565b62000f4b73d2eb07b66a790ba2132ae95d2fd49b3c4528edfb6003620012bf60201b60201c565b62000f7273060f36d6eeaf8a89f226d9c42d33df564773ba296003620012bf60201b60201c565b62000f997378627243b800697612b93a823c1e16a7b165c7066003620012bf60201b60201c565b62000fc073348ebca3f1482287eba4d40e1e34f4a2a5ecc1136003620012bf60201b60201c565b62000fe77377898a01aee8d184250468dd049333262235401a6003620012bf60201b60201c565b6200100e73105a9da4e37fe355350610e0aa975707099129906003620012bf60201b60201c565b62001035730babcb5719a30f5238082b20acd0dff17582e6cf6003620012bf60201b60201c565b6200105c7303495185e86d354eea486680ef14026a961fb4596003620012bf60201b60201c565b6200108373ab6762274b3716ff29cf16b7d4b0a26be1aa01366003620012bf60201b60201c565b620010aa7392e3be37acc398484dba8f8ba4b89b512041c2026003620012bf60201b60201c565b620010d173cda7e8c665bf0eb1e2a94eab14de92059f35a87b6003620012bf60201b60201c565b620010f873882383a232362f1e1cd3ba09991c5c2c93ac8f8c6003620012bf60201b60201c565b6200111f73637cba0cc95884817cd63fe0147cf403505b2ced6003620012bf60201b60201c565b62001146731ef661c462781700332f2e67397e293e0dea84686003620012bf60201b60201c565b6200116d7393c090e4289be0fb97cccf94c4115a9509b928686003620012bf60201b60201c565b620011947342de51b67082c179b31a4aa2ee47bd1975caa5df6003620012bf60201b60201c565b620011bb7371ef49a06c737ca8dbb59549c45fddaf16f3d24b6003620012bf60201b60201c565b620011e27337f832b84631cc796485d578ffcca484e60082056003620012bf60201b60201c565b6200163d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600082141562001301576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620013166000848385620014a860201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620013a583620013876000866000620014ae60201b60201c565b6200139885620014de60201b60201c565b17620014ee60201b60201c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146200144857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506200140b565b50600082141562001485576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050620014a360008483856200151960201b60201c565b505050565b50505050565b60008060e883901c905060e8620014cd8686846200151f60201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60009392505050565b8280546200153690620015d8565b90600052602060002090601f0160209004810192826200155a5760008555620015a6565b82601f106200157557805160ff1916838001178555620015a6565b82800160010185558215620015a6579182015b82811115620015a557825182559160200191906001019062001588565b5b509050620015b59190620015b9565b5090565b5b80821115620015d4576000816000905550600101620015ba565b5090565b60006002820490506001821680620015f157607f821691505b602082108114156200160857620016076200160e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6136b9806200164d6000396000f3fe6080604052600436106102c85760003560e01c80636352211e11610175578063a4198f30116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610a8a578063eb91d37e14610ac7578063f2163a2514610af2578063f2fde38b14610b2f576102c8565b8063c87b56dd146109f9578063cf1179c714610a36578063e77054de14610a5f576102c8565b8063a4198f30146108e9578063a945bf8014610914578063b3a7e0cf1461093f578063b5d2fc4f1461096a578063b88d4fde146109a7578063c6275255146109d0576102c8565b80638ba4cc3c1161012e5780638ba4cc3c146107fa5780638da5cb5b1461082357806395364a841461084e57806395d89b4114610879578063a0712d68146108a4578063a22cb465146108c0576102c8565b80636352211e146106ec5780636e83843a1461072957806370037a711461075257806370a082311461077b578063715018a6146107b857806377ee4b0f146107cf576102c8565b806334393743116102345780634732469f116101ed57806358776009116101c757806358776009146106425780635bc020bc1461067f5780635fca9984146106965780636090eb8f146106c1576102c8565b80634732469f146105af5780634ca15f9e146105ec57806354214f6914610617576102c8565b806334393743146104d95780633549345e146104f0578063363e86fe146105195780633ccfd60b146105445780633d0c49241461055b57806342842e0e14610586576102c8565b806318160ddd1161028657806318160ddd146103ef578063194c29361461041a57806323b872dd1461044357806328d8daf91461046c5780632984647b146104975780633101bd93146104ae576102c8565b80620e7fa8146102cd57806301ffc9a7146102f857806306fdde0314610335578063081812fc14610360578063095ea7b31461039d578063101f5033146103c6575b600080fd5b3480156102d957600080fd5b506102e2610b58565b6040516102ef919061308a565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a9190612bdc565b610b5e565b60405161032c9190612f4d565b60405180910390f35b34801561034157600080fd5b5061034a610bf0565b6040516103579190612f68565b60405180910390f35b34801561036c57600080fd5b5061038760048036038101906103829190612c7f565b610c82565b6040516103949190612ee6565b60405180910390f35b3480156103a957600080fd5b506103c460048036038101906103bf9190612b9c565b610d01565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190612c7f565b610e45565b005b3480156103fb57600080fd5b50610404610e57565b604051610411919061308a565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190612c36565b610e6e565b005b34801561044f57600080fd5b5061046a60048036038101906104659190612a86565b610e90565b005b34801561047857600080fd5b506104816111b5565b60405161048e919061308a565b60405180910390f35b3480156104a357600080fd5b506104ac6111bb565b005b3480156104ba57600080fd5b506104c36111ef565b6040516104d09190612f68565b60405180910390f35b3480156104e557600080fd5b506104ee611281565b005b3480156104fc57600080fd5b5061051760048036038101906105129190612c7f565b6112b5565b005b34801561052557600080fd5b5061052e6112c7565b60405161053b919061308a565b60405180910390f35b34801561055057600080fd5b506105596112d1565b005b34801561056757600080fd5b50610570611329565b60405161057d919061308a565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a89190612a86565b61132f565b005b3480156105bb57600080fd5b506105d660048036038101906105d19190612a19565b61134f565b6040516105e3919061308a565b60405180910390f35b3480156105f857600080fd5b50610601611398565b60405161060e919061308a565b60405180910390f35b34801561062357600080fd5b5061062c6113b4565b6040516106399190612f4d565b60405180910390f35b34801561064e57600080fd5b5061066960048036038101906106649190612a19565b6113cb565b604051610676919061308a565b60405180910390f35b34801561068b57600080fd5b5061069461148b565b005b3480156106a257600080fd5b506106ab6114bf565b6040516106b8919061308a565b60405180910390f35b3480156106cd57600080fd5b506106d66114c9565b6040516106e39190612f68565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612c7f565b61155b565b6040516107209190612ee6565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190612c36565b61156d565b005b34801561075e57600080fd5b5061077960048036038101906107749190612b5c565b61158f565b005b34801561078757600080fd5b506107a2600480360381019061079d9190612a19565b6115f2565b6040516107af919061308a565b60405180910390f35b3480156107c457600080fd5b506107cd6116ab565b005b3480156107db57600080fd5b506107e46116bf565b6040516107f1919061308a565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190612b9c565b6116c9565b005b34801561082f57600080fd5b506108386116df565b6040516108459190612ee6565b60405180910390f35b34801561085a57600080fd5b50610863611709565b6040516108709190612f4d565b60405180910390f35b34801561088557600080fd5b5061088e611720565b60405161089b9190612f68565b60405180910390f35b6108be60048036038101906108b99190612c7f565b6117b2565b005b3480156108cc57600080fd5b506108e760048036038101906108e29190612b5c565b611be5565b005b3480156108f557600080fd5b506108fe611d5d565b60405161090b919061308a565b60405180910390f35b34801561092057600080fd5b50610929611d67565b604051610936919061308a565b60405180910390f35b34801561094b57600080fd5b50610954611d6d565b604051610961919061308a565b60405180910390f35b34801561097657600080fd5b50610991600480360381019061098c9190612a19565b611d73565b60405161099e919061308a565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c99190612ad9565b611dbc565b005b3480156109dc57600080fd5b506109f760048036038101906109f29190612c7f565b611e2f565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190612c7f565b611e41565b604051610a2d9190612f68565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190612c7f565b611f7f565b005b348015610a6b57600080fd5b50610a74611f91565b604051610a819190612f4d565b60405180910390f35b348015610a9657600080fd5b50610ab16004803603810190610aac9190612a46565b611fa8565b604051610abe9190612f4d565b60405180910390f35b348015610ad357600080fd5b50610adc61203c565b604051610ae9919061308a565b60405180910390f35b348015610afe57600080fd5b50610b196004803603810190610b149190612a19565b612066565b604051610b269190612f4d565b60405180910390f35b348015610b3b57600080fd5b50610b566004803603810190610b519190612a19565b6120bc565b005b600a5481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bb957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610be95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610bff90613309565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2b90613309565b8015610c785780601f10610c4d57610100808354040283529160200191610c78565b820191906000526020600020905b815481529060010190602001808311610c5b57829003601f168201915b5050505050905090565b6000610c8d82612140565b610cc3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d0c8261155b565b90508073ffffffffffffffffffffffffffffffffffffffff16610d2d61219f565b73ffffffffffffffffffffffffffffffffffffffff1614610d9057610d5981610d5461219f565b611fa8565b610d8f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610e4d6121a7565b80600b8190555050565b6000610e61612225565b6001546000540303905090565b610e766121a7565b8060109080519060200190610e8c92919061282d565b5050565b6000610e9b8261222e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f02576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f0e846122fc565b91509150610f248187610f1f61219f565b612323565b610f7057610f3986610f3461219f565b611fa8565b610f6f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fd7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fe48686866001612367565b8015610fef57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110bd8561109988888761236d565b7c020000000000000000000000000000000000000000000000000000000017612395565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611145576000600185019050600060046000838152602001908152602001600020541415611143576000548114611142578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111ad86868660016123c0565b505050505050565b600b5481565b6111c36121a7565b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6060600f80546111fe90613309565b80601f016020809104026020016040519081016040528092919081815260200182805461122a90613309565b80156112775780601f1061124c57610100808354040283529160200191611277565b820191906000526020600020905b81548152906001019060200180831161125a57829003601f168201915b5050505050905090565b6112896121a7565b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b6112bd6121a7565b80600a8190555050565b6000600c54905090565b6112d96121a7565b6112e16116df565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611326573d6000803e3d6000fd5b50565b61271081565b61134a83838360405180602001604052806000815250611dbc565b505050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006113a26123c6565b6127106113af919061321f565b905090565b6000600e60029054906101000a900460ff16905090565b6000600e60019054906101000a900460ff161561143657601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b5461142f919061321f565b9050611486565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54611483919061321f565b90505b919050565b6114936121a7565b600e60029054906101000a900460ff1615600e60026101000a81548160ff021916908315150217905550565b6000600b54905090565b6060601080546114d890613309565b80601f016020809104026020016040519081016040528092919081815260200182805461150490613309565b80156115515780601f1061152657610100808354040283529160200191611551565b820191906000526020600020905b81548152906001019060200180831161153457829003601f168201915b5050505050905090565b60006115668261222e565b9050919050565b6115756121a7565b80600f908051906020019061158b92919061282d565b5050565b6115976121a7565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561165a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116b36121a7565b6116bd60006123d9565b565b6000600a54905090565b6116d16121a7565b6116db828261249f565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600e60019054906101000a900460ff16905090565b60606003805461172f90613309565b80601f016020809104026020016040519081016040528092919081815260200182805461175b90613309565b80156117a85780601f1061177d576101008083540402835291602001916117a8565b820191906000526020600020905b81548152906001019060200180831161178b57829003601f168201915b5050505050905090565b600260095414156117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef9061306a565b60405180910390fd5b6002600981905550600e60009054906101000a900460ff1661184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690612fca565b60405180910390fd5b600e60019054906101000a900460ff16156119d35780600a5461187291906131c5565b34146118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa9061304a565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661193f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193690612fea565b60405180910390fd5b600b5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461198d919061316f565b11156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c590612faa565b60405180910390fd5b611ab2565b80600c546119e191906131c5565b3414611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a199061304a565b60405180910390fd5b600d5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a70919061316f565b1115611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa890612faa565b60405180910390fd5b5b612710611abd610e57565b82611ac8919061316f565b1115611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b009061302a565b60405180910390fd5b600e60019054906101000a900460ff1615611b795780601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6d919061316f565b92505081905550611bd0565b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bc8919061316f565b925050819055505b611bda338261249f565b600160098190555050565b611bed61219f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c5f61219f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d0c61219f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d519190612f4d565b60405180910390a35050565b6000600d54905090565b600c5481565b600d5481565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611dc7848484610e90565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e2957611df28484848461265c565b611e28576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611e376121a7565b80600c8190555050565b6060611e4c82612140565b611e82576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600e60029054906101000a900460ff16611e9f576010611ea2565b600f5b8054611ead90613309565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed990613309565b8015611f265780601f10611efb57610100808354040283529160200191611f26565b820191906000526020600020905b815481529060010190602001808311611f0957829003601f168201915b50505050509050600081511415611f4c5760405180602001604052806000815250611f77565b80611f56846127bc565b604051602001611f67929190612eb7565b6040516020818303038152906040525b915050919050565b611f876121a7565b80600d8190555050565b6000600e60009054906101000a900460ff16905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e60019054906101000a900460ff161561205d57600a549050612063565b600c5490505b90565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6120c46121a7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90612f8a565b60405180910390fd5b61213d816123d9565b50565b60008161214b612225565b1115801561215a575060005482105b8015612198575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6121af61280c565b73ffffffffffffffffffffffffffffffffffffffff166121cd6116df565b73ffffffffffffffffffffffffffffffffffffffff1614612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a9061300a565b60405180910390fd5b565b60006001905090565b6000808290508061223d612225565b116122c5576000548110156122c45760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156122c2575b60008114156122b857600460008360019003935083815260200190815260200160002054905061228d565b80925050506122f7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612384868684612814565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006123d0612225565b60005403905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054905060008214156124e0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124ed6000848385612367565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061256483612555600086600061236d565b61255e8561281d565b17612395565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461260557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125ca565b506000821415612641576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061265760008483856123c0565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261268261219f565b8786866040518563ffffffff1660e01b81526004016126a49493929190612f01565b602060405180830381600087803b1580156126be57600080fd5b505af19250505080156126ef57506040513d601f19601f820116820180604052508101906126ec9190612c09565b60015b612769573d806000811461271f576040519150601f19603f3d011682016040523d82523d6000602084013e612724565b606091505b50600081511415612761576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060806040510190508060405280825b6001156127f857600183039250600a81066030018353600a81049050806127f3576127f8565b6127cd565b508181036020830392508083525050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b82805461283990613309565b90600052602060002090601f01602090048101928261285b57600085556128a2565b82601f1061287457805160ff19168380011785556128a2565b828001600101855582156128a2579182015b828111156128a1578251825591602001919060010190612886565b5b5090506128af91906128b3565b5090565b5b808211156128cc5760008160009055506001016128b4565b5090565b60006128e36128de846130ca565b6130a5565b9050828152602081018484840111156128ff576128fe6133fe565b5b61290a8482856132c7565b509392505050565b6000612925612920846130fb565b6130a5565b905082815260208101848484011115612941576129406133fe565b5b61294c8482856132c7565b509392505050565b60008135905061296381613627565b92915050565b6000813590506129788161363e565b92915050565b60008135905061298d81613655565b92915050565b6000815190506129a281613655565b92915050565b600082601f8301126129bd576129bc6133f9565b5b81356129cd8482602086016128d0565b91505092915050565b600082601f8301126129eb576129ea6133f9565b5b81356129fb848260208601612912565b91505092915050565b600081359050612a138161366c565b92915050565b600060208284031215612a2f57612a2e613408565b5b6000612a3d84828501612954565b91505092915050565b60008060408385031215612a5d57612a5c613408565b5b6000612a6b85828601612954565b9250506020612a7c85828601612954565b9150509250929050565b600080600060608486031215612a9f57612a9e613408565b5b6000612aad86828701612954565b9350506020612abe86828701612954565b9250506040612acf86828701612a04565b9150509250925092565b60008060008060808587031215612af357612af2613408565b5b6000612b0187828801612954565b9450506020612b1287828801612954565b9350506040612b2387828801612a04565b925050606085013567ffffffffffffffff811115612b4457612b43613403565b5b612b50878288016129a8565b91505092959194509250565b60008060408385031215612b7357612b72613408565b5b6000612b8185828601612954565b9250506020612b9285828601612969565b9150509250929050565b60008060408385031215612bb357612bb2613408565b5b6000612bc185828601612954565b9250506020612bd285828601612a04565b9150509250929050565b600060208284031215612bf257612bf1613408565b5b6000612c008482850161297e565b91505092915050565b600060208284031215612c1f57612c1e613408565b5b6000612c2d84828501612993565b91505092915050565b600060208284031215612c4c57612c4b613408565b5b600082013567ffffffffffffffff811115612c6a57612c69613403565b5b612c76848285016129d6565b91505092915050565b600060208284031215612c9557612c94613408565b5b6000612ca384828501612a04565b91505092915050565b612cb581613253565b82525050565b612cc481613265565b82525050565b6000612cd58261312c565b612cdf8185613142565b9350612cef8185602086016132d6565b612cf88161340d565b840191505092915050565b6000612d0e82613137565b612d188185613153565b9350612d288185602086016132d6565b612d318161340d565b840191505092915050565b6000612d4782613137565b612d518185613164565b9350612d618185602086016132d6565b80840191505092915050565b6000612d7a602683613153565b9150612d858261341e565b604082019050919050565b6000612d9d603483613153565b9150612da88261346d565b604082019050919050565b6000612dc0600f83613153565b9150612dcb826134bc565b602082019050919050565b6000612de3602f83613153565b9150612dee826134e5565b604082019050919050565b6000612e06600583613164565b9150612e1182613534565b600582019050919050565b6000612e29602083613153565b9150612e348261355d565b602082019050919050565b6000612e4c603a83613153565b9150612e5782613586565b604082019050919050565b6000612e6f602083613153565b9150612e7a826135d5565b602082019050919050565b6000612e92601f83613153565b9150612e9d826135fe565b602082019050919050565b612eb1816132bd565b82525050565b6000612ec38285612d3c565b9150612ecf8284612d3c565b9150612eda82612df9565b91508190509392505050565b6000602082019050612efb6000830184612cac565b92915050565b6000608082019050612f166000830187612cac565b612f236020830186612cac565b612f306040830185612ea8565b8181036060830152612f428184612cca565b905095945050505050565b6000602082019050612f626000830184612cbb565b92915050565b60006020820190508181036000830152612f828184612d03565b905092915050565b60006020820190508181036000830152612fa381612d6d565b9050919050565b60006020820190508181036000830152612fc381612d90565b9050919050565b60006020820190508181036000830152612fe381612db3565b9050919050565b6000602082019050818103600083015261300381612dd6565b9050919050565b6000602082019050818103600083015261302381612e1c565b9050919050565b6000602082019050818103600083015261304381612e3f565b9050919050565b6000602082019050818103600083015261306381612e62565b9050919050565b6000602082019050818103600083015261308381612e85565b9050919050565b600060208201905061309f6000830184612ea8565b92915050565b60006130af6130c0565b90506130bb828261333b565b919050565b6000604051905090565b600067ffffffffffffffff8211156130e5576130e46133ca565b5b6130ee8261340d565b9050602081019050919050565b600067ffffffffffffffff821115613116576131156133ca565b5b61311f8261340d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061317a826132bd565b9150613185836132bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131ba576131b961336c565b5b828201905092915050565b60006131d0826132bd565b91506131db836132bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132145761321361336c565b5b828202905092915050565b600061322a826132bd565b9150613235836132bd565b9250828210156132485761324761336c565b5b828203905092915050565b600061325e8261329d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132f45780820151818401526020810190506132d9565b83811115613303576000848401525b50505050565b6000600282049050600182168061332157607f821691505b602082108114156133355761333461339b565b5b50919050565b6133448261340d565b810181811067ffffffffffffffff82111715613363576133626133ca565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865206d696e74207175616e7469747920657863656564732074686520686f60008201527f6c64696e67207175616e74697479206c696d6974000000000000000000000000602082015250565b7f4e6f7420796574206f6e2073616c650000000000000000000000000000000000600082015250565b7f596f7520617265206e6f7420656c696769626c6520666f72207468652070726560008201527f2d73616c652077686974656c6973740000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546865206d696e74207175616e7469747920686173206578636565646564207460008201527f6865206d6178696d756d20737570706c79207175616e74697479000000000000602082015250565b7f54686520616d6f756e7420796f75207061696420697320696e636f7272656374600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61363081613253565b811461363b57600080fd5b50565b61364781613265565b811461365257600080fd5b50565b61365e81613271565b811461366957600080fd5b50565b613675816132bd565b811461368057600080fd5b5056fea26469706673582212201cbd620560c49dfdacb1656cf67cf60c96318c9fc123530aaec4ad34091967b564736f6c63430008070033697066733a2f2f516d51764b574a646e327336594857686d545376317933743747513770383478614c6d6d6e51524c7a3959746f392f

Deployed Bytecode

0x6080604052600436106102c85760003560e01c80636352211e11610175578063a4198f30116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610a8a578063eb91d37e14610ac7578063f2163a2514610af2578063f2fde38b14610b2f576102c8565b8063c87b56dd146109f9578063cf1179c714610a36578063e77054de14610a5f576102c8565b8063a4198f30146108e9578063a945bf8014610914578063b3a7e0cf1461093f578063b5d2fc4f1461096a578063b88d4fde146109a7578063c6275255146109d0576102c8565b80638ba4cc3c1161012e5780638ba4cc3c146107fa5780638da5cb5b1461082357806395364a841461084e57806395d89b4114610879578063a0712d68146108a4578063a22cb465146108c0576102c8565b80636352211e146106ec5780636e83843a1461072957806370037a711461075257806370a082311461077b578063715018a6146107b857806377ee4b0f146107cf576102c8565b806334393743116102345780634732469f116101ed57806358776009116101c757806358776009146106425780635bc020bc1461067f5780635fca9984146106965780636090eb8f146106c1576102c8565b80634732469f146105af5780634ca15f9e146105ec57806354214f6914610617576102c8565b806334393743146104d95780633549345e146104f0578063363e86fe146105195780633ccfd60b146105445780633d0c49241461055b57806342842e0e14610586576102c8565b806318160ddd1161028657806318160ddd146103ef578063194c29361461041a57806323b872dd1461044357806328d8daf91461046c5780632984647b146104975780633101bd93146104ae576102c8565b80620e7fa8146102cd57806301ffc9a7146102f857806306fdde0314610335578063081812fc14610360578063095ea7b31461039d578063101f5033146103c6575b600080fd5b3480156102d957600080fd5b506102e2610b58565b6040516102ef919061308a565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a9190612bdc565b610b5e565b60405161032c9190612f4d565b60405180910390f35b34801561034157600080fd5b5061034a610bf0565b6040516103579190612f68565b60405180910390f35b34801561036c57600080fd5b5061038760048036038101906103829190612c7f565b610c82565b6040516103949190612ee6565b60405180910390f35b3480156103a957600080fd5b506103c460048036038101906103bf9190612b9c565b610d01565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190612c7f565b610e45565b005b3480156103fb57600080fd5b50610404610e57565b604051610411919061308a565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190612c36565b610e6e565b005b34801561044f57600080fd5b5061046a60048036038101906104659190612a86565b610e90565b005b34801561047857600080fd5b506104816111b5565b60405161048e919061308a565b60405180910390f35b3480156104a357600080fd5b506104ac6111bb565b005b3480156104ba57600080fd5b506104c36111ef565b6040516104d09190612f68565b60405180910390f35b3480156104e557600080fd5b506104ee611281565b005b3480156104fc57600080fd5b5061051760048036038101906105129190612c7f565b6112b5565b005b34801561052557600080fd5b5061052e6112c7565b60405161053b919061308a565b60405180910390f35b34801561055057600080fd5b506105596112d1565b005b34801561056757600080fd5b50610570611329565b60405161057d919061308a565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a89190612a86565b61132f565b005b3480156105bb57600080fd5b506105d660048036038101906105d19190612a19565b61134f565b6040516105e3919061308a565b60405180910390f35b3480156105f857600080fd5b50610601611398565b60405161060e919061308a565b60405180910390f35b34801561062357600080fd5b5061062c6113b4565b6040516106399190612f4d565b60405180910390f35b34801561064e57600080fd5b5061066960048036038101906106649190612a19565b6113cb565b604051610676919061308a565b60405180910390f35b34801561068b57600080fd5b5061069461148b565b005b3480156106a257600080fd5b506106ab6114bf565b6040516106b8919061308a565b60405180910390f35b3480156106cd57600080fd5b506106d66114c9565b6040516106e39190612f68565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612c7f565b61155b565b6040516107209190612ee6565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190612c36565b61156d565b005b34801561075e57600080fd5b5061077960048036038101906107749190612b5c565b61158f565b005b34801561078757600080fd5b506107a2600480360381019061079d9190612a19565b6115f2565b6040516107af919061308a565b60405180910390f35b3480156107c457600080fd5b506107cd6116ab565b005b3480156107db57600080fd5b506107e46116bf565b6040516107f1919061308a565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190612b9c565b6116c9565b005b34801561082f57600080fd5b506108386116df565b6040516108459190612ee6565b60405180910390f35b34801561085a57600080fd5b50610863611709565b6040516108709190612f4d565b60405180910390f35b34801561088557600080fd5b5061088e611720565b60405161089b9190612f68565b60405180910390f35b6108be60048036038101906108b99190612c7f565b6117b2565b005b3480156108cc57600080fd5b506108e760048036038101906108e29190612b5c565b611be5565b005b3480156108f557600080fd5b506108fe611d5d565b60405161090b919061308a565b60405180910390f35b34801561092057600080fd5b50610929611d67565b604051610936919061308a565b60405180910390f35b34801561094b57600080fd5b50610954611d6d565b604051610961919061308a565b60405180910390f35b34801561097657600080fd5b50610991600480360381019061098c9190612a19565b611d73565b60405161099e919061308a565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c99190612ad9565b611dbc565b005b3480156109dc57600080fd5b506109f760048036038101906109f29190612c7f565b611e2f565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190612c7f565b611e41565b604051610a2d9190612f68565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190612c7f565b611f7f565b005b348015610a6b57600080fd5b50610a74611f91565b604051610a819190612f4d565b60405180910390f35b348015610a9657600080fd5b50610ab16004803603810190610aac9190612a46565b611fa8565b604051610abe9190612f4d565b60405180910390f35b348015610ad357600080fd5b50610adc61203c565b604051610ae9919061308a565b60405180910390f35b348015610afe57600080fd5b50610b196004803603810190610b149190612a19565b612066565b604051610b269190612f4d565b60405180910390f35b348015610b3b57600080fd5b50610b566004803603810190610b519190612a19565b6120bc565b005b600a5481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bb957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610be95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610bff90613309565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2b90613309565b8015610c785780601f10610c4d57610100808354040283529160200191610c78565b820191906000526020600020905b815481529060010190602001808311610c5b57829003601f168201915b5050505050905090565b6000610c8d82612140565b610cc3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d0c8261155b565b90508073ffffffffffffffffffffffffffffffffffffffff16610d2d61219f565b73ffffffffffffffffffffffffffffffffffffffff1614610d9057610d5981610d5461219f565b611fa8565b610d8f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610e4d6121a7565b80600b8190555050565b6000610e61612225565b6001546000540303905090565b610e766121a7565b8060109080519060200190610e8c92919061282d565b5050565b6000610e9b8261222e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f02576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f0e846122fc565b91509150610f248187610f1f61219f565b612323565b610f7057610f3986610f3461219f565b611fa8565b610f6f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fd7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fe48686866001612367565b8015610fef57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110bd8561109988888761236d565b7c020000000000000000000000000000000000000000000000000000000017612395565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611145576000600185019050600060046000838152602001908152602001600020541415611143576000548114611142578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111ad86868660016123c0565b505050505050565b600b5481565b6111c36121a7565b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6060600f80546111fe90613309565b80601f016020809104026020016040519081016040528092919081815260200182805461122a90613309565b80156112775780601f1061124c57610100808354040283529160200191611277565b820191906000526020600020905b81548152906001019060200180831161125a57829003601f168201915b5050505050905090565b6112896121a7565b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b6112bd6121a7565b80600a8190555050565b6000600c54905090565b6112d96121a7565b6112e16116df565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611326573d6000803e3d6000fd5b50565b61271081565b61134a83838360405180602001604052806000815250611dbc565b505050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006113a26123c6565b6127106113af919061321f565b905090565b6000600e60029054906101000a900460ff16905090565b6000600e60019054906101000a900460ff161561143657601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b5461142f919061321f565b9050611486565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54611483919061321f565b90505b919050565b6114936121a7565b600e60029054906101000a900460ff1615600e60026101000a81548160ff021916908315150217905550565b6000600b54905090565b6060601080546114d890613309565b80601f016020809104026020016040519081016040528092919081815260200182805461150490613309565b80156115515780601f1061152657610100808354040283529160200191611551565b820191906000526020600020905b81548152906001019060200180831161153457829003601f168201915b5050505050905090565b60006115668261222e565b9050919050565b6115756121a7565b80600f908051906020019061158b92919061282d565b5050565b6115976121a7565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561165a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116b36121a7565b6116bd60006123d9565b565b6000600a54905090565b6116d16121a7565b6116db828261249f565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600e60019054906101000a900460ff16905090565b60606003805461172f90613309565b80601f016020809104026020016040519081016040528092919081815260200182805461175b90613309565b80156117a85780601f1061177d576101008083540402835291602001916117a8565b820191906000526020600020905b81548152906001019060200180831161178b57829003601f168201915b5050505050905090565b600260095414156117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef9061306a565b60405180910390fd5b6002600981905550600e60009054906101000a900460ff1661184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690612fca565b60405180910390fd5b600e60019054906101000a900460ff16156119d35780600a5461187291906131c5565b34146118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa9061304a565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661193f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193690612fea565b60405180910390fd5b600b5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461198d919061316f565b11156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c590612faa565b60405180910390fd5b611ab2565b80600c546119e191906131c5565b3414611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a199061304a565b60405180910390fd5b600d5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a70919061316f565b1115611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa890612faa565b60405180910390fd5b5b612710611abd610e57565b82611ac8919061316f565b1115611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b009061302a565b60405180910390fd5b600e60019054906101000a900460ff1615611b795780601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6d919061316f565b92505081905550611bd0565b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bc8919061316f565b925050819055505b611bda338261249f565b600160098190555050565b611bed61219f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c5f61219f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d0c61219f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d519190612f4d565b60405180910390a35050565b6000600d54905090565b600c5481565b600d5481565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611dc7848484610e90565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e2957611df28484848461265c565b611e28576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611e376121a7565b80600c8190555050565b6060611e4c82612140565b611e82576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600e60029054906101000a900460ff16611e9f576010611ea2565b600f5b8054611ead90613309565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed990613309565b8015611f265780601f10611efb57610100808354040283529160200191611f26565b820191906000526020600020905b815481529060010190602001808311611f0957829003601f168201915b50505050509050600081511415611f4c5760405180602001604052806000815250611f77565b80611f56846127bc565b604051602001611f67929190612eb7565b6040516020818303038152906040525b915050919050565b611f876121a7565b80600d8190555050565b6000600e60009054906101000a900460ff16905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e60019054906101000a900460ff161561205d57600a549050612063565b600c5490505b90565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6120c46121a7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90612f8a565b60405180910390fd5b61213d816123d9565b50565b60008161214b612225565b1115801561215a575060005482105b8015612198575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6121af61280c565b73ffffffffffffffffffffffffffffffffffffffff166121cd6116df565b73ffffffffffffffffffffffffffffffffffffffff1614612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a9061300a565b60405180910390fd5b565b60006001905090565b6000808290508061223d612225565b116122c5576000548110156122c45760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156122c2575b60008114156122b857600460008360019003935083815260200190815260200160002054905061228d565b80925050506122f7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612384868684612814565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006123d0612225565b60005403905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054905060008214156124e0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124ed6000848385612367565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061256483612555600086600061236d565b61255e8561281d565b17612395565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461260557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125ca565b506000821415612641576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061265760008483856123c0565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261268261219f565b8786866040518563ffffffff1660e01b81526004016126a49493929190612f01565b602060405180830381600087803b1580156126be57600080fd5b505af19250505080156126ef57506040513d601f19601f820116820180604052508101906126ec9190612c09565b60015b612769573d806000811461271f576040519150601f19603f3d011682016040523d82523d6000602084013e612724565b606091505b50600081511415612761576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060806040510190508060405280825b6001156127f857600183039250600a81066030018353600a81049050806127f3576127f8565b6127cd565b508181036020830392508083525050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b82805461283990613309565b90600052602060002090601f01602090048101928261285b57600085556128a2565b82601f1061287457805160ff19168380011785556128a2565b828001600101855582156128a2579182015b828111156128a1578251825591602001919060010190612886565b5b5090506128af91906128b3565b5090565b5b808211156128cc5760008160009055506001016128b4565b5090565b60006128e36128de846130ca565b6130a5565b9050828152602081018484840111156128ff576128fe6133fe565b5b61290a8482856132c7565b509392505050565b6000612925612920846130fb565b6130a5565b905082815260208101848484011115612941576129406133fe565b5b61294c8482856132c7565b509392505050565b60008135905061296381613627565b92915050565b6000813590506129788161363e565b92915050565b60008135905061298d81613655565b92915050565b6000815190506129a281613655565b92915050565b600082601f8301126129bd576129bc6133f9565b5b81356129cd8482602086016128d0565b91505092915050565b600082601f8301126129eb576129ea6133f9565b5b81356129fb848260208601612912565b91505092915050565b600081359050612a138161366c565b92915050565b600060208284031215612a2f57612a2e613408565b5b6000612a3d84828501612954565b91505092915050565b60008060408385031215612a5d57612a5c613408565b5b6000612a6b85828601612954565b9250506020612a7c85828601612954565b9150509250929050565b600080600060608486031215612a9f57612a9e613408565b5b6000612aad86828701612954565b9350506020612abe86828701612954565b9250506040612acf86828701612a04565b9150509250925092565b60008060008060808587031215612af357612af2613408565b5b6000612b0187828801612954565b9450506020612b1287828801612954565b9350506040612b2387828801612a04565b925050606085013567ffffffffffffffff811115612b4457612b43613403565b5b612b50878288016129a8565b91505092959194509250565b60008060408385031215612b7357612b72613408565b5b6000612b8185828601612954565b9250506020612b9285828601612969565b9150509250929050565b60008060408385031215612bb357612bb2613408565b5b6000612bc185828601612954565b9250506020612bd285828601612a04565b9150509250929050565b600060208284031215612bf257612bf1613408565b5b6000612c008482850161297e565b91505092915050565b600060208284031215612c1f57612c1e613408565b5b6000612c2d84828501612993565b91505092915050565b600060208284031215612c4c57612c4b613408565b5b600082013567ffffffffffffffff811115612c6a57612c69613403565b5b612c76848285016129d6565b91505092915050565b600060208284031215612c9557612c94613408565b5b6000612ca384828501612a04565b91505092915050565b612cb581613253565b82525050565b612cc481613265565b82525050565b6000612cd58261312c565b612cdf8185613142565b9350612cef8185602086016132d6565b612cf88161340d565b840191505092915050565b6000612d0e82613137565b612d188185613153565b9350612d288185602086016132d6565b612d318161340d565b840191505092915050565b6000612d4782613137565b612d518185613164565b9350612d618185602086016132d6565b80840191505092915050565b6000612d7a602683613153565b9150612d858261341e565b604082019050919050565b6000612d9d603483613153565b9150612da88261346d565b604082019050919050565b6000612dc0600f83613153565b9150612dcb826134bc565b602082019050919050565b6000612de3602f83613153565b9150612dee826134e5565b604082019050919050565b6000612e06600583613164565b9150612e1182613534565b600582019050919050565b6000612e29602083613153565b9150612e348261355d565b602082019050919050565b6000612e4c603a83613153565b9150612e5782613586565b604082019050919050565b6000612e6f602083613153565b9150612e7a826135d5565b602082019050919050565b6000612e92601f83613153565b9150612e9d826135fe565b602082019050919050565b612eb1816132bd565b82525050565b6000612ec38285612d3c565b9150612ecf8284612d3c565b9150612eda82612df9565b91508190509392505050565b6000602082019050612efb6000830184612cac565b92915050565b6000608082019050612f166000830187612cac565b612f236020830186612cac565b612f306040830185612ea8565b8181036060830152612f428184612cca565b905095945050505050565b6000602082019050612f626000830184612cbb565b92915050565b60006020820190508181036000830152612f828184612d03565b905092915050565b60006020820190508181036000830152612fa381612d6d565b9050919050565b60006020820190508181036000830152612fc381612d90565b9050919050565b60006020820190508181036000830152612fe381612db3565b9050919050565b6000602082019050818103600083015261300381612dd6565b9050919050565b6000602082019050818103600083015261302381612e1c565b9050919050565b6000602082019050818103600083015261304381612e3f565b9050919050565b6000602082019050818103600083015261306381612e62565b9050919050565b6000602082019050818103600083015261308381612e85565b9050919050565b600060208201905061309f6000830184612ea8565b92915050565b60006130af6130c0565b90506130bb828261333b565b919050565b6000604051905090565b600067ffffffffffffffff8211156130e5576130e46133ca565b5b6130ee8261340d565b9050602081019050919050565b600067ffffffffffffffff821115613116576131156133ca565b5b61311f8261340d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061317a826132bd565b9150613185836132bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131ba576131b961336c565b5b828201905092915050565b60006131d0826132bd565b91506131db836132bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132145761321361336c565b5b828202905092915050565b600061322a826132bd565b9150613235836132bd565b9250828210156132485761324761336c565b5b828203905092915050565b600061325e8261329d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132f45780820151818401526020810190506132d9565b83811115613303576000848401525b50505050565b6000600282049050600182168061332157607f821691505b602082108114156133355761333461339b565b5b50919050565b6133448261340d565b810181811067ffffffffffffffff82111715613363576133626133ca565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865206d696e74207175616e7469747920657863656564732074686520686f60008201527f6c64696e67207175616e74697479206c696d6974000000000000000000000000602082015250565b7f4e6f7420796574206f6e2073616c650000000000000000000000000000000000600082015250565b7f596f7520617265206e6f7420656c696769626c6520666f72207468652070726560008201527f2d73616c652077686974656c6973740000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546865206d696e74207175616e7469747920686173206578636565646564207460008201527f6865206d6178696d756d20737570706c79207175616e74697479000000000000602082015250565b7f54686520616d6f756e7420796f75207061696420697320696e636f7272656374600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61363081613253565b811461363b57600080fd5b50565b61364781613265565b811461365257600080fd5b50565b61365e81613271565b811461366957600080fd5b50565b613675816132bd565b811461368057600080fd5b5056fea26469706673582212201cbd620560c49dfdacb1656cf67cf60c96318c9fc123530aaec4ad34091967b564736f6c63430008070033

Deployed Bytecode Sourcemap

56422:12722:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56537:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18389:627;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19279:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25662:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25103:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66662:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15066:311;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68323:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29333:2709;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56584:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67499:85;;;;;;;;;;;;;:::i;:::-;;67949:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67681:79;;;;;;;;;;;;;:::i;:::-;;66401:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66858:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69037:104;;;;;;;;;;;;;:::i;:::-;;56484:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32138:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68737:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66177:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67768:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65860:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67859:82;;;;;;;;;;;;;:::i;:::-;;66521:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68202:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20672:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68064:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68598:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16226:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55525:103;;;;;;;;;;;;;:::i;:::-;;66298:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65092:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54877:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67592:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19455:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63929:1155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26220:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67075:131;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56641:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56686:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68888:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32921:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66959:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65202:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67214:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67406:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26685:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65667:185;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68473:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55783:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56537:40;;;;:::o;18389:627::-;18474:4;18809:10;18794:25;;:11;:25;;;;:98;;;;18882:10;18867:25;;:11;:25;;;;18794:98;:171;;;;18955:10;18940:25;;:11;:25;;;;18794:171;18778:187;;18389:627;;;:::o;19279:100::-;19333:13;19366:5;19359:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19279:100;:::o;25662:218::-;25738:7;25763:16;25771:7;25763;:16::i;:::-;25758:64;;25788:34;;;;;;;;;;;;;;25758:64;25842:15;:24;25858:7;25842:24;;;;;;;;;;;:30;;;;;;;;;;;;25835:37;;25662:218;;;:::o;25103:400::-;25184:13;25200:16;25208:7;25200;:16::i;:::-;25184:32;;25256:5;25233:28;;:19;:17;:19::i;:::-;:28;;;25229:175;;25281:44;25298:5;25305:19;:17;:19::i;:::-;25281:16;:44::i;:::-;25276:128;;25353:35;;;;;;;;;;;;;;25276:128;25229:175;25449:2;25416:15;:24;25432:7;25416:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25487:7;25483:2;25467:28;;25476:5;25467:28;;;;;;;;;;;;25173:330;25103:400;;:::o;66662:188::-;54763:13;:11;:13::i;:::-;66810:32:::1;66776:31;:66;;;;66662:188:::0;:::o;15066:311::-;15127:7;15347:15;:13;:15::i;:::-;15332:12;;15316:13;;:28;:46;15309:53;;15066:311;:::o;68323:142::-;54763:13;:11;:13::i;:::-;68438:19:::1;68417:18;:40;;;;;;;;;;;;:::i;:::-;;68323:142:::0;:::o;29333:2709::-;29467:27;29497;29516:7;29497:18;:27::i;:::-;29467:57;;29582:4;29541:45;;29557:19;29541:45;;;29537:86;;29595:28;;;;;;;;;;;;;;29537:86;29637:27;29666:23;29693:35;29720:7;29693:26;:35::i;:::-;29636:92;;;;29828:68;29853:15;29870:4;29876:19;:17;:19::i;:::-;29828:24;:68::i;:::-;29823:180;;29916:43;29933:4;29939:19;:17;:19::i;:::-;29916:16;:43::i;:::-;29911:92;;29968:35;;;;;;;;;;;;;;29911:92;29823:180;30034:1;30020:16;;:2;:16;;;30016:52;;;30045:23;;;;;;;;;;;;;;30016:52;30081:43;30103:4;30109:2;30113:7;30122:1;30081:21;:43::i;:::-;30217:15;30214:156;;;30353:1;30332:19;30325:30;30214:156;30738:18;:24;30757:4;30738:24;;;;;;;;;;;;;;;;30736:26;;;;;;;;;;;;30803:18;:22;30822:2;30803:22;;;;;;;;;;;;;;;;30801:24;;;;;;;;;;;31101:134;31134:2;31179:45;31194:4;31200:2;31204:19;31179:14;:45::i;:::-;11469:8;31151:73;31101:18;:134::i;:::-;31072:17;:26;31090:7;31072:26;;;;;;;;;;;:163;;;;31398:1;11469:8;31347:19;:47;:52;31343:587;;;31416:19;31448:1;31438:7;:11;31416:33;;31597:1;31563:17;:30;31581:11;31563:30;;;;;;;;;;;;:35;31559:360;;;31693:13;;31678:11;:28;31674:230;;31865:19;31832:17;:30;31850:11;31832:30;;;;;;;;;;;:52;;;;31674:230;31559:360;31401:529;31343:587;31973:7;31969:2;31954:27;;31963:4;31954:27;;;;;;;;;;;;31992:42;32013:4;32019:2;32023:7;32032:1;31992:20;:42::i;:::-;29456:2586;;;29333:2709;;;:::o;56584:50::-;;;;:::o;67499:85::-;54763:13;:11;:13::i;:::-;67567:9:::1;;;;;;;;;;;67566:10;67554:9;;:22;;;;;;;;;;;;;;;;;;67499:85::o:0;67949:107::-;68000:13;68033:15;68026:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67949:107;:::o;67681:79::-;54763:13;:11;:13::i;:::-;67745:7:::1;;;;;;;;;;;67744:8;67734:7;;:18;;;;;;;;;;;;;;;;;;67681:79::o:0;66401:112::-;54763:13;:11;:13::i;:::-;66492::::1;66477:12;:28;;;;66401:112:::0;:::o;66858:93::-;66905:7;66932:11;;66925:18;;66858:93;:::o;69037:104::-;54763:13;:11;:13::i;:::-;69093:7:::1;:5;:7::i;:::-;69085:25;;:48;69111:21;69085:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;69037:104::o:0;56484:46::-;56525:5;56484:46;:::o;32138:185::-;32276:39;32293:4;32299:2;32303:7;32276:39;;;;;;;;;;;;:16;:39::i;:::-;32138:185;;;:::o;68737:143::-;68812:7;68839:28;:33;68868:3;68839:33;;;;;;;;;;;;;;;;68832:40;;68737:143;;;:::o;66177:113::-;66224:7;66268:14;:12;:14::i;:::-;56525:5;66251:31;;;;:::i;:::-;66244:38;;66177:113;:::o;67768:83::-;67811:4;67835:8;;;;;;;;;;;67828:15;;67768:83;:::o;65860:309::-;65923:7;65947;;;;;;;;;;;65943:219;;;66012:28;:33;66041:3;66012:33;;;;;;;;;;;;;;;;65978:31;;:67;;;;:::i;:::-;65971:74;;;;65943:219;66118:27;:32;66146:3;66118:32;;;;;;;;;;;;;;;;66085:30;;:65;;;;:::i;:::-;66078:72;;65860:309;;;;:::o;67859:82::-;54763:13;:11;:13::i;:::-;67925:8:::1;;;;;;;;;;;67924:9;67913:8;;:20;;;;;;;;;;;;;;;;;;67859:82::o:0;66521:133::-;66588:7;66615:31;;66608:38;;66521:133;:::o;68202:113::-;68256:13;68289:18;68282:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68202:113;:::o;20672:152::-;20744:7;20787:27;20806:7;20787:18;:27::i;:::-;20764:52;;20672:152;;;:::o;68064:130::-;54763:13;:11;:13::i;:::-;68170:16:::1;68152:15;:34;;;;;;;;;;;;:::i;:::-;;68064:130:::0;:::o;68598:131::-;54763:13;:11;:13::i;:::-;68710:11:::1;68686:16;:21;68703:3;68686:21;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;68598:131:::0;;:::o;16226:233::-;16298:7;16339:1;16322:19;;:5;:19;;;16318:60;;;16350:28;;;;;;;;;;;;;;16318:60;10413:13;16396:18;:25;16415:5;16396:25;;;;;;;;;;;;;;;;:55;16389:62;;16226:233;;;:::o;55525:103::-;54763:13;:11;:13::i;:::-;55590:30:::1;55617:1;55590:18;:30::i;:::-;55525:103::o:0;66298:95::-;66346:7;66373:12;;66366:19;;66298:95;:::o;65092:102::-;54763:13;:11;:13::i;:::-;65167:19:::1;65173:2;65177:8;65167:5;:19::i;:::-;65092:102:::0;;:::o;54877:87::-;54923:7;54950:6;;;;;;;;;;;54943:13;;54877:87;:::o;67592:81::-;67634:4;67658:7;;;;;;;;;;;67651:14;;67592:81;:::o;19455:104::-;19511:13;19544:7;19537:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19455:104;:::o;63929:1155::-;51802:1;52400:7;;:19;;52392:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51802:1;52533:7;:18;;;;64008:9:::1;;;;;;;;;;;64000:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;64054:7;;;;;;;;;;;64050:671;;;64114:8;64099:12;;:23;;;;:::i;:::-;64086:9;:36;64078:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;64182:16;:28;64199:10;64182:28;;;;;;;;;;;;;;;;;;;;;;;;;64174:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;64342:31;;64329:8;64286:28;:40;64315:10;64286:40;;;;;;;;;;;;;;;;:51;;;;:::i;:::-;64285:88;;64277:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;64050:671;;;64498:8;64484:11;;:22;;;;:::i;:::-;64471:9;:35;64463:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;64622:30;;64609:8;64567:27;:39;64595:10;64567:39;;;;;;;;;;;;;;;;:50;;;;:::i;:::-;64566:86;;64558:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;64050:671;56525:5;64753:13;:11;:13::i;:::-;64742:8;:24;;;;:::i;:::-;64741:44;;64733:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;64865:7;;;;;;;;;;;64861:176;;;64933:8;64889:28;:40;64918:10;64889:40;;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;64861:176;;;65017:8;64974:27;:39;65002:10;64974:39;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;64861:176;65049:27;65055:10;65067:8;65049:5;:27::i;:::-;51758:1:::0;52712:7;:22;;;;63929:1155;:::o;26220:308::-;26331:19;:17;:19::i;:::-;26319:31;;:8;:31;;;26315:61;;;26359:17;;;;;;;;;;;;;;26315:61;26441:8;26389:18;:39;26408:19;:17;:19::i;:::-;26389:39;;;;;;;;;;;;;;;:49;26429:8;26389:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26501:8;26465:55;;26480:19;:17;:19::i;:::-;26465:55;;;26511:8;26465:55;;;;;;:::i;:::-;;;;;;;;26220:308;;:::o;67075:131::-;67141:7;67168:30;;67161:37;;67075:131;:::o;56641:38::-;;;;:::o;56686:49::-;;;;:::o;68888:141::-;68962:7;68989:27;:32;69017:3;68989:32;;;;;;;;;;;;;;;;68982:39;;68888:141;;;:::o;32921:399::-;33088:31;33101:4;33107:2;33111:7;33088:12;:31::i;:::-;33152:1;33134:2;:14;;;:19;33130:183;;33173:56;33204:4;33210:2;33214:7;33223:5;33173:30;:56::i;:::-;33168:145;;33257:40;;;;;;;;;;;;;;33168:145;33130:183;32921:399;;;;:::o;66959:108::-;54763:13;:11;:13::i;:::-;67047:12:::1;67033:11;:26;;;;66959:108:::0;:::o;65202:356::-;65267:13;65298:16;65306:7;65298;:16::i;:::-;65293:59;;65323:29;;;;;;;;;;;;;;65293:59;65365:21;65389:8;;;;;;;;;;;:47;;65418:18;65389:47;;;65400:15;65389:47;65365:71;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65479:1;65460:7;65454:21;:26;;:96;;;;;;;;;;;;;;;;;65507:7;65516:18;65526:7;65516:9;:18::i;:::-;65490:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65454:96;65447:103;;;65202:356;;;:::o;67214:184::-;54763:13;:11;:13::i;:::-;67359:31:::1;67326:30;:64;;;;67214:184:::0;:::o;67406:85::-;67450:4;67474:9;;;;;;;;;;;67467:16;;67406:85;:::o;26685:164::-;26782:4;26806:18;:25;26825:5;26806:25;;;;;;;;;;;;;;;:35;26832:8;26806:35;;;;;;;;;;;;;;;;;;;;;;;;;26799:42;;26685:164;;;;:::o;65667:185::-;65715:7;65739;;;;;;;;;;;65735:110;;;65770:12;;65763:19;;;;65735:110;65822:11;;65815:18;;65667:185;;:::o;68473:117::-;68537:4;68561:16;:21;68578:3;68561:21;;;;;;;;;;;;;;;;;;;;;;;;;68554:28;;68473:117;;;:::o;55783:201::-;54763:13;:11;:13::i;:::-;55892:1:::1;55872:22;;:8;:22;;;;55864:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55948:28;55967:8;55948:18;:28::i;:::-;55783:201:::0;:::o;27107:270::-;27172:4;27224:7;27205:15;:13;:15::i;:::-;:26;;:62;;;;;27254:13;;27244:7;:23;27205:62;:145;;;;;27349:1;11189:8;27301:17;:26;27319:7;27301:26;;;;;;;;;;;;:44;:49;27205:145;27189:161;;27107:270;;;:::o;48257:105::-;48317:7;48344:10;48337:17;;48257:105;:::o;55042:132::-;55117:12;:10;:12::i;:::-;55106:23;;:7;:5;:7::i;:::-;:23;;;55098:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55042:132::o;65566:93::-;65623:7;65650:1;65643:8;;65566:93;:::o;21827:1187::-;21894:7;21914:12;21929:7;21914:22;;21989:4;21970:15;:13;:15::i;:::-;:23;21966:985;;22019:13;;22012:4;:20;22008:943;;;22053:14;22070:17;:23;22088:4;22070:23;;;;;;;;;;;;22053:40;;22179:1;11189:8;22151:6;:24;:29;22147:789;;;22776:105;22793:1;22783:6;:11;22776:105;;;22832:17;:25;22850:6;;;;;;;22832:25;;;;;;;;;;;;22823:34;;22776:105;;;22910:6;22903:13;;;;;;22147:789;22034:917;22008:943;21966:985;22975:31;;;;;;;;;;;;;;21827:1187;;;;:::o;28246:467::-;28336:27;28365:23;28406:38;28447:15;:24;28463:7;28447:24;;;;;;;;;;;28406:65;;28618:18;28595:41;;28675:19;28669:26;28650:45;;28580:126;28246:467;;;:::o;27486:647::-;27635:11;27796:16;27789:5;27785:28;27776:37;;27952:16;27941:9;27937:32;27924:45;;28098:15;28087:9;28084:30;28076:5;28065:9;28062:20;28059:56;28049:66;;27486:647;;;;;:::o;33982:159::-;;;;;:::o;47566:311::-;47701:7;47721:16;11593:3;47747:19;:41;;47721:68;;11593:3;47815:31;47826:4;47832:2;47836:9;47815:10;:31::i;:::-;47807:40;;:62;;47800:69;;;47566:311;;;;;:::o;23562:442::-;23642:14;23806:16;23799:5;23795:28;23786:37;;23979:5;23965:11;23940:23;23936:41;23933:52;23926:5;23923:63;23913:73;;23562:442;;;;:::o;34806:158::-;;;;;:::o;15475:284::-;15530:7;15729:15;:13;:15::i;:::-;15713:13;;:31;15706:38;;15475:284;:::o;56144:191::-;56218:16;56237:6;;;;;;;;;;;56218:25;;56263:8;56254:6;;:17;;;;;;;;;;;;;;;;;;56318:8;56287:40;;56308:8;56287:40;;;;;;;;;;;;56207:128;56144:191;:::o;36582:2246::-;36655:20;36678:13;;36655:36;;36718:1;36706:8;:13;36702:44;;;36728:18;;;;;;;;;;;;;;36702:44;36759:61;36789:1;36793:2;36797:12;36811:8;36759:21;:61::i;:::-;37275:1;10551:2;37245:1;:26;;37244:32;37232:8;:45;37206:18;:22;37225:2;37206:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37530:127;37563:2;37613:33;37636:1;37640:2;37644:1;37613:14;:33::i;:::-;37580:30;37601:8;37580:20;:30::i;:::-;:66;37530:18;:127::i;:::-;37496:17;:31;37514:12;37496:31;;;;;;;;;;;:161;;;;37670:16;37697:11;37726:8;37711:12;:23;37697:37;;37961:16;37957:2;37953:25;37941:37;;38273:12;38241:8;38208:1;38154:25;38103:1;38050;38031:283;38386:1;38372:12;38368:20;38330:314;38423:3;38414:7;38411:16;38330:314;;38621:7;38611:8;38608:1;38581:25;38578:1;38575;38570:59;38472:1;38463:7;38459:15;38448:26;;38330:314;;;38334:69;38681:1;38669:8;:13;38665:45;;;38691:19;;;;;;;;;;;;;;38665:45;38739:3;38723:13;:19;;;;37004:1746;;38760:60;38789:1;38793:2;38797:12;38811:8;38760:20;:60::i;:::-;36644:2184;36582:2246;;:::o;35404:716::-;35567:4;35613:2;35588:45;;;35634:19;:17;:19::i;:::-;35655:4;35661:7;35670:5;35588:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35584:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35888:1;35871:6;:13;:18;35867:235;;;35917:40;;;;;;;;;;;;;;35867:235;36060:6;36054:13;36045:6;36041:2;36037:15;36030:38;35584:529;35757:54;;;35747:64;;;:6;:64;;;;35740:71;;;35404:716;;;;;;:::o;48464:1521::-;48529:17;48938:4;48931;48925:11;48921:22;48914:29;;49026:3;49020:4;49013:17;49128:3;49355:5;49337:412;49363:1;49337:412;;;49403:1;49398:3;49394:11;49387:18;;49566:2;49560:4;49556:13;49552:2;49548:22;49543:3;49535:36;49656:2;49650:4;49646:13;49638:21;;49719:4;49709:25;;49727:5;;49709:25;49337:412;;;49341:21;49788:3;49783;49779:13;49899:4;49894:3;49890:14;49883:21;;49960:6;49955:3;49948:19;48568:1410;;48464:1521;;;:::o;53428:98::-;53481:7;53508:10;53501:17;;53428:98;:::o;47267:147::-;47404:6;47267:147;;;;;:::o;24106:320::-;24176:14;24405:1;24395:8;24392:15;24366:24;24362:46;24352:56;;24106:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410: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:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:400::-;10164:3;10185:84;10267:1;10262:3;10185:84;:::i;:::-;10178:91;;10278:93;10367:3;10278:93;:::i;:::-;10396:1;10391:3;10387:11;10380:18;;10004:400;;;:::o;10410:366::-;10552:3;10573:67;10637:2;10632:3;10573:67;:::i;:::-;10566:74;;10649:93;10738:3;10649:93;:::i;:::-;10767:2;10762:3;10758:12;10751:19;;10410:366;;;:::o;10782:::-;10924:3;10945:67;11009:2;11004:3;10945:67;:::i;:::-;10938:74;;11021:93;11110:3;11021:93;:::i;:::-;11139:2;11134:3;11130:12;11123:19;;10782:366;;;:::o;11154:::-;11296:3;11317:67;11381:2;11376:3;11317:67;:::i;:::-;11310:74;;11393:93;11482:3;11393:93;:::i;:::-;11511:2;11506:3;11502:12;11495:19;;11154:366;;;:::o;11526:::-;11668:3;11689:67;11753:2;11748:3;11689:67;:::i;:::-;11682:74;;11765:93;11854:3;11765:93;:::i;:::-;11883:2;11878:3;11874:12;11867:19;;11526:366;;;:::o;11898:118::-;11985:24;12003:5;11985:24;:::i;:::-;11980:3;11973:37;11898:118;;:::o;12022:701::-;12303:3;12325:95;12416:3;12407:6;12325:95;:::i;:::-;12318:102;;12437:95;12528:3;12519:6;12437:95;:::i;:::-;12430:102;;12549:148;12693:3;12549:148;:::i;:::-;12542:155;;12714:3;12707:10;;12022:701;;;;;:::o;12729:222::-;12822:4;12860:2;12849:9;12845:18;12837:26;;12873:71;12941:1;12930:9;12926:17;12917:6;12873:71;:::i;:::-;12729:222;;;;:::o;12957:640::-;13152:4;13190:3;13179:9;13175:19;13167:27;;13204:71;13272:1;13261:9;13257:17;13248:6;13204:71;:::i;:::-;13285:72;13353:2;13342:9;13338:18;13329:6;13285:72;:::i;:::-;13367;13435:2;13424:9;13420:18;13411:6;13367:72;:::i;:::-;13486:9;13480:4;13476:20;13471:2;13460:9;13456:18;13449:48;13514:76;13585:4;13576:6;13514:76;:::i;:::-;13506:84;;12957:640;;;;;;;:::o;13603:210::-;13690:4;13728:2;13717:9;13713:18;13705:26;;13741:65;13803:1;13792:9;13788:17;13779:6;13741:65;:::i;:::-;13603:210;;;;:::o;13819:313::-;13932:4;13970:2;13959:9;13955:18;13947:26;;14019:9;14013:4;14009:20;14005:1;13994:9;13990:17;13983:47;14047:78;14120:4;14111:6;14047:78;:::i;:::-;14039:86;;13819:313;;;;:::o;14138:419::-;14304:4;14342:2;14331:9;14327:18;14319:26;;14391:9;14385:4;14381:20;14377:1;14366:9;14362:17;14355:47;14419:131;14545:4;14419:131;:::i;:::-;14411:139;;14138:419;;;:::o;14563:::-;14729:4;14767:2;14756:9;14752:18;14744:26;;14816:9;14810:4;14806:20;14802:1;14791:9;14787:17;14780:47;14844:131;14970:4;14844:131;:::i;:::-;14836:139;;14563:419;;;:::o;14988:::-;15154:4;15192:2;15181:9;15177:18;15169:26;;15241:9;15235:4;15231:20;15227:1;15216:9;15212:17;15205:47;15269:131;15395:4;15269:131;:::i;:::-;15261:139;;14988:419;;;:::o;15413:::-;15579:4;15617:2;15606:9;15602:18;15594:26;;15666:9;15660:4;15656:20;15652:1;15641:9;15637:17;15630:47;15694:131;15820:4;15694:131;:::i;:::-;15686:139;;15413:419;;;:::o;15838:::-;16004:4;16042:2;16031:9;16027:18;16019:26;;16091:9;16085:4;16081:20;16077:1;16066:9;16062:17;16055:47;16119:131;16245:4;16119:131;:::i;:::-;16111:139;;15838:419;;;:::o;16263:::-;16429:4;16467:2;16456:9;16452:18;16444:26;;16516:9;16510:4;16506:20;16502:1;16491:9;16487:17;16480:47;16544:131;16670:4;16544:131;:::i;:::-;16536:139;;16263:419;;;:::o;16688:::-;16854:4;16892:2;16881:9;16877:18;16869:26;;16941:9;16935:4;16931:20;16927:1;16916:9;16912:17;16905:47;16969:131;17095:4;16969:131;:::i;:::-;16961:139;;16688:419;;;:::o;17113:::-;17279:4;17317:2;17306:9;17302:18;17294:26;;17366:9;17360:4;17356:20;17352:1;17341:9;17337:17;17330:47;17394:131;17520:4;17394:131;:::i;:::-;17386:139;;17113:419;;;:::o;17538:222::-;17631:4;17669:2;17658:9;17654:18;17646:26;;17682:71;17750:1;17739:9;17735:17;17726:6;17682:71;:::i;:::-;17538:222;;;;:::o;17766:129::-;17800:6;17827:20;;:::i;:::-;17817:30;;17856:33;17884:4;17876:6;17856:33;:::i;:::-;17766:129;;;:::o;17901:75::-;17934:6;17967:2;17961:9;17951:19;;17901:75;:::o;17982:307::-;18043:4;18133:18;18125:6;18122:30;18119:56;;;18155:18;;:::i;:::-;18119:56;18193:29;18215:6;18193:29;:::i;:::-;18185:37;;18277:4;18271;18267:15;18259:23;;17982:307;;;:::o;18295:308::-;18357:4;18447:18;18439:6;18436:30;18433:56;;;18469:18;;:::i;:::-;18433:56;18507:29;18529:6;18507:29;:::i;:::-;18499:37;;18591:4;18585;18581:15;18573:23;;18295:308;;;:::o;18609:98::-;18660:6;18694:5;18688:12;18678:22;;18609:98;;;:::o;18713:99::-;18765:6;18799:5;18793:12;18783:22;;18713:99;;;:::o;18818:168::-;18901:11;18935:6;18930:3;18923:19;18975:4;18970:3;18966:14;18951:29;;18818:168;;;;:::o;18992:169::-;19076:11;19110:6;19105:3;19098:19;19150:4;19145:3;19141:14;19126:29;;18992:169;;;;:::o;19167:148::-;19269:11;19306:3;19291:18;;19167:148;;;;:::o;19321:305::-;19361:3;19380:20;19398:1;19380:20;:::i;:::-;19375:25;;19414:20;19432:1;19414:20;:::i;:::-;19409:25;;19568:1;19500:66;19496:74;19493:1;19490:81;19487:107;;;19574:18;;:::i;:::-;19487:107;19618:1;19615;19611:9;19604:16;;19321:305;;;;:::o;19632:348::-;19672:7;19695:20;19713:1;19695:20;:::i;:::-;19690:25;;19729:20;19747:1;19729:20;:::i;:::-;19724:25;;19917:1;19849:66;19845:74;19842:1;19839:81;19834:1;19827:9;19820:17;19816:105;19813:131;;;19924:18;;:::i;:::-;19813:131;19972:1;19969;19965:9;19954:20;;19632:348;;;;:::o;19986:191::-;20026:4;20046:20;20064:1;20046:20;:::i;:::-;20041:25;;20080:20;20098:1;20080:20;:::i;:::-;20075:25;;20119:1;20116;20113:8;20110:34;;;20124:18;;:::i;:::-;20110:34;20169:1;20166;20162:9;20154:17;;19986:191;;;;:::o;20183:96::-;20220:7;20249:24;20267:5;20249:24;:::i;:::-;20238:35;;20183:96;;;:::o;20285:90::-;20319:7;20362:5;20355:13;20348:21;20337:32;;20285:90;;;:::o;20381:149::-;20417:7;20457:66;20450:5;20446:78;20435:89;;20381:149;;;:::o;20536:126::-;20573:7;20613:42;20606:5;20602:54;20591:65;;20536:126;;;:::o;20668:77::-;20705:7;20734:5;20723:16;;20668:77;;;:::o;20751:154::-;20835:6;20830:3;20825;20812:30;20897:1;20888:6;20883:3;20879:16;20872:27;20751:154;;;:::o;20911:307::-;20979:1;20989:113;21003:6;21000:1;20997:13;20989:113;;;21088:1;21083:3;21079:11;21073:18;21069:1;21064:3;21060:11;21053:39;21025:2;21022:1;21018:10;21013:15;;20989:113;;;21120:6;21117:1;21114:13;21111:101;;;21200:1;21191:6;21186:3;21182:16;21175:27;21111:101;20960:258;20911:307;;;:::o;21224:320::-;21268:6;21305:1;21299:4;21295:12;21285:22;;21352:1;21346:4;21342:12;21373:18;21363:81;;21429:4;21421:6;21417:17;21407:27;;21363:81;21491:2;21483:6;21480:14;21460:18;21457:38;21454:84;;;21510:18;;:::i;:::-;21454:84;21275:269;21224:320;;;:::o;21550:281::-;21633:27;21655:4;21633:27;:::i;:::-;21625:6;21621:40;21763:6;21751:10;21748:22;21727:18;21715:10;21712:34;21709:62;21706:88;;;21774:18;;:::i;:::-;21706:88;21814:10;21810:2;21803:22;21593:238;21550:281;;:::o;21837:180::-;21885:77;21882:1;21875:88;21982:4;21979:1;21972:15;22006:4;22003:1;21996:15;22023:180;22071:77;22068:1;22061:88;22168:4;22165:1;22158:15;22192:4;22189:1;22182:15;22209:180;22257:77;22254:1;22247:88;22354:4;22351:1;22344:15;22378:4;22375:1;22368:15;22395:117;22504:1;22501;22494:12;22518:117;22627:1;22624;22617:12;22641:117;22750:1;22747;22740:12;22764:117;22873:1;22870;22863:12;22887:102;22928:6;22979:2;22975:7;22970:2;22963:5;22959:14;22955:28;22945:38;;22887:102;;;:::o;22995:225::-;23135:34;23131:1;23123:6;23119:14;23112:58;23204:8;23199:2;23191:6;23187:15;23180:33;22995:225;:::o;23226:239::-;23366:34;23362:1;23354:6;23350:14;23343:58;23435:22;23430:2;23422:6;23418:15;23411:47;23226:239;:::o;23471:165::-;23611:17;23607:1;23599:6;23595:14;23588:41;23471:165;:::o;23642:234::-;23782:34;23778:1;23770:6;23766:14;23759:58;23851:17;23846:2;23838:6;23834:15;23827:42;23642:234;:::o;23882:155::-;24022:7;24018:1;24010:6;24006:14;23999:31;23882:155;:::o;24043:182::-;24183:34;24179:1;24171:6;24167:14;24160:58;24043:182;:::o;24231:245::-;24371:34;24367:1;24359:6;24355:14;24348:58;24440:28;24435:2;24427:6;24423:15;24416:53;24231:245;:::o;24482:182::-;24622:34;24618:1;24610:6;24606:14;24599:58;24482:182;:::o;24670:181::-;24810:33;24806:1;24798:6;24794:14;24787:57;24670:181;:::o;24857:122::-;24930:24;24948:5;24930:24;:::i;:::-;24923:5;24920:35;24910:63;;24969:1;24966;24959:12;24910:63;24857:122;:::o;24985:116::-;25055:21;25070:5;25055:21;:::i;:::-;25048:5;25045:32;25035:60;;25091:1;25088;25081:12;25035:60;24985:116;:::o;25107:120::-;25179:23;25196:5;25179:23;:::i;:::-;25172:5;25169:34;25159:62;;25217:1;25214;25207:12;25159:62;25107:120;:::o;25233:122::-;25306:24;25324:5;25306:24;:::i;:::-;25299:5;25296:35;25286:63;;25345:1;25342;25335:12;25286:63;25233:122;:::o

Swarm Source

ipfs://1cbd620560c49dfdacb1656cf67cf60c96318c9fc123530aaec4ad34091967b5
Loading...
Loading
Loading...
Loading
[ 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.