ETH Price: $3,320.33 (-8.72%)

Token

Furry Idiots (FIDS)
 

Overview

Max Total Supply

2,000 FIDS

Holders

431

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 FIDS
0x517bf1f015decdaf42f9216373b44a9af877d90b
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:
FurryIdiots

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: @rari-capital/solmate/src/auth/Owned.sol


pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnerUpdated(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnerUpdated(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function setOwner(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnerUpdated(msg.sender, newOwner);
    }
}

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// 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();

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// 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 {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    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 payable 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 {
        _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].value`.
        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 payable 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 payable 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 payable 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.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            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`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                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 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // 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: contracts/FurryIdiots.sol



pragma solidity ^0.8.4;



contract FurryIdiots is ERC721A, Owned {
    uint256 public maxPerWallet = 5;
    uint256 public maxSupply = 2000;
    uint256 public maxPerTx = 5;
    uint256 public price = 0.00 ether;

    bool public activated;

    string public baseURI = "https://ipfs.io/ipfs/QmWtqgu3F7n3BP9o47YBZSXytBwdxrMYapEJHMiUdHDi8s/";

    constructor() ERC721A("Furry Idiots", "FIDS") Owned(msg.sender) {}

    function mint(uint256 numberOfTokens) external payable {
        require(activated, "Inactive");
        require(totalSupply() + numberOfTokens <= maxSupply, "All minted");
        require(numberOfTokens <= maxPerTx, "Too many for Tx");
        require(_numberMinted(msg.sender) + numberOfTokens <= maxPerWallet,"Too many for address");
        require(msg.value >= price * numberOfTokens, "Not enought funds");
        _safeMint(msg.sender, numberOfTokens);
    }
    
    function _startTokenId() internal pure override returns (uint256) {
        return 1;
  }

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

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

    function setIsActive(bool _isActive) external onlyOwner {
        activated = _isActive;
    }

    function collectReserves() external onlyOwner {
    require(totalSupply() == 0, "RESERVES TAKEN");

    _mint(msg.sender, 50);
    }

    function withdraw() external onlyOwner {
    require(
      payable(owner).send(address(this).balance),
      "UNSUCCESSFUL"
      );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","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":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","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":"price","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":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260056009556107d0600a556005600b556000600c5560405180608001604052806044815260200162002d9460449139600e90805190602001906200004a929190620001bc565b503480156200005857600080fd5b50336040518060400160405280600c81526020017f4675727279204964696f747300000000000000000000000000000000000000008152506040518060400160405280600481526020017f46494453000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000de929190620001bc565b508060039080519060200190620000f7929190620001bc565b5062000108620001b360201b60201c565b600081905550505080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350620002d1565b60006001905090565b828054620001ca906200026c565b90600052602060002090601f016020900481019282620001ee57600085556200023a565b82601f106200020957805160ff19168380011785556200023a565b828001600101855582156200023a579182015b82811115620002395782518255916020019190600101906200021c565b5b5090506200024991906200024d565b5090565b5b80821115620002685760008160009055506001016200024e565b5090565b600060028204905060018216806200028557607f821691505b602082108114156200029c576200029b620002a2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612ab380620002e16000396000f3fe60806040526004361061019c5760003560e01c80636352211e116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd1461054b578063d5abeb0114610588578063e985e9c5146105b3578063f968adbe146105f05761019c565b8063a0712d68146104ea578063a22cb46514610506578063b88d4fde1461052f5761019c565b80638da5cb5b116100c65780638da5cb5b1461044057806391b7f5ed1461046b57806395d89b4114610494578063a035b1fe146104bf5761019c565b80636352211e1461039b5780636c0360eb146103d857806370a08231146104035761019c565b806318160ddd116101595780632750fc78116101335780632750fc78146103145780633ccfd60b1461033d57806342842e0e14610354578063453c2310146103705761019c565b806318160ddd146102a2578063186601ca146102cd57806323b872dd146102f85761019c565b806301ffc9a7146101a1578063029877b6146101de57806306fdde03146101f5578063081812fc14610220578063095ea7b31461025d57806313af403514610279575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612173565b61061b565b6040516101d5919061246d565b60405180910390f35b3480156101ea57600080fd5b506101f36106ad565b005b34801561020157600080fd5b5061020a610794565b6040516102179190612488565b60405180910390f35b34801561022c57600080fd5b50610247600480360381019061024291906121cd565b610826565b6040516102549190612406565b60405180910390f35b61027760048036038101906102729190612106565b6108a5565b005b34801561028557600080fd5b506102a0600480360381019061029b9190611f83565b6109e9565b005b3480156102ae57600080fd5b506102b7610b17565b6040516102c491906125aa565b60405180910390f35b3480156102d957600080fd5b506102e2610b2e565b6040516102ef919061246d565b60405180910390f35b610312600480360381019061030d9190611ff0565b610b41565b005b34801561032057600080fd5b5061033b60048036038101906103369190612146565b610e66565b005b34801561034957600080fd5b50610352610f13565b005b61036e60048036038101906103699190611ff0565b61103b565b005b34801561037c57600080fd5b5061038561105b565b60405161039291906125aa565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd91906121cd565b611061565b6040516103cf9190612406565b60405180910390f35b3480156103e457600080fd5b506103ed611073565b6040516103fa9190612488565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190611f83565b611101565b60405161043791906125aa565b60405180910390f35b34801561044c57600080fd5b506104556111ba565b6040516104629190612406565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d91906121cd565b6111e0565b005b3480156104a057600080fd5b506104a961127a565b6040516104b69190612488565b60405180910390f35b3480156104cb57600080fd5b506104d461130c565b6040516104e191906125aa565b60405180910390f35b61050460048036038101906104ff91906121cd565b611312565b005b34801561051257600080fd5b5061052d600480360381019061052891906120c6565b6114b2565b005b61054960048036038101906105449190612043565b6115bd565b005b34801561055757600080fd5b50610572600480360381019061056d91906121cd565b611630565b60405161057f9190612488565b60405180910390f35b34801561059457600080fd5b5061059d6116cf565b6040516105aa91906125aa565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190611fb0565b6116d5565b6040516105e7919061246d565b60405180910390f35b3480156105fc57600080fd5b50610605611769565b60405161061291906125aa565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461073d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610734906124ca565b60405180910390fd5b6000610747610b17565b14610787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e906124ea565b60405180910390fd5b61079233603261176f565b565b6060600280546107a3906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf906127c4565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b60006108318261192c565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b082611061565b90508073ffffffffffffffffffffffffffffffffffffffff166108d161198b565b73ffffffffffffffffffffffffffffffffffffffff1614610934576108fd816108f861198b565b6116d5565b610933576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a70906124ca565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b6000610b21611993565b6001546000540303905090565b600d60009054906101000a900460ff1681565b6000610b4c8261199c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bb3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bbf84611a6a565b91509150610bd58187610bd061198b565b611a91565b610c2157610bea86610be561198b565b6116d5565b610c20576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c88576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c958686866001611ad5565b8015610ca057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d6e85610d4a888887611adb565b7c020000000000000000000000000000000000000000000000000000000017611b03565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610df6576000600185019050600060046000838152602001908152602001600020541415610df4576000548114610df3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e5e8686866001611b2e565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906124ca565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a906124ca565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611039576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110309061250a565b60405180910390fd5b565b611056838383604051806020016040528060008152506115bd565b505050565b60095481565b600061106c8261199c565b9050919050565b600e8054611080906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac906127c4565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611169576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611267906124ca565b60405180910390fd5b80600c8190555050565b606060038054611289906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546112b5906127c4565b80156113025780601f106112d757610100808354040283529160200191611302565b820191906000526020600020905b8154815290600101906020018083116112e557829003601f168201915b5050505050905090565b600c5481565b600d60009054906101000a900460ff16611361576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113589061252a565b60405180910390fd5b600a548161136d610b17565b611377919061265e565b11156113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af906124aa565b60405180910390fd5b600b548111156113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f49061254a565b60405180910390fd5b6009548161140a33611b34565b611414919061265e565b1115611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c9061256a565b60405180910390fd5b80600c5461146391906126b4565b3410156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c9061258a565b60405180910390fd5b6114af3382611b8b565b50565b80600760006114bf61198b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661156c61198b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115b1919061246d565b60405180910390a35050565b6115c8848484610b41565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461162a576115f384848484611ba9565b611629576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061163b8261192c565b611671576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061167b611d09565b905060008151141561169c57604051806020016040528060008152506116c7565b806116a684611d9b565b6040516020016116b79291906123e2565b6040516020818303038152906040525b915050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b60008054905060008214156117b0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bd6000848385611ad5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611834836118256000866000611adb565b61182e85611df4565b17611b03565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146118d557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061189a565b506000821415611911576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506119276000848385611b2e565b505050565b600081611937611993565b11158015611946575060005482105b8015611984575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806119ab611993565b11611a3357600054811015611a325760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a30575b6000811415611a265760046000836001900393508381526020019081526020016000205490506119fb565b8092505050611a65565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611af2868684611e04565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611ba5828260405180602001604052806000815250611e0d565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bcf61198b565b8786866040518563ffffffff1660e01b8152600401611bf19493929190612421565b602060405180830381600087803b158015611c0b57600080fd5b505af1925050508015611c3c57506040513d601f19601f82011682018060405250810190611c3991906121a0565b60015b611cb6573d8060008114611c6c576040519150601f19603f3d011682016040523d82523d6000602084013e611c71565b606091505b50600081511415611cae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054611d18906127c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d44906127c4565b8015611d915780601f10611d6657610100808354040283529160200191611d91565b820191906000526020600020905b815481529060010190602001808311611d7457829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611ddf57600184039350600a81066030018453600a8104905080611dda57611ddf565b611db4565b50828103602084039350808452505050919050565b60006001821460e11b9050919050565b60009392505050565b611e17838361176f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ea557600080549050600083820390505b611e576000868380600101945086611ba9565b611e8d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611e44578160005414611ea257600080fd5b50505b505050565b6000611ebd611eb8846125ea565b6125c5565b905082815260208101848484011115611ed957611ed86128b9565b5b611ee4848285612782565b509392505050565b600081359050611efb81612a21565b92915050565b600081359050611f1081612a38565b92915050565b600081359050611f2581612a4f565b92915050565b600081519050611f3a81612a4f565b92915050565b600082601f830112611f5557611f546128b4565b5b8135611f65848260208601611eaa565b91505092915050565b600081359050611f7d81612a66565b92915050565b600060208284031215611f9957611f986128c3565b5b6000611fa784828501611eec565b91505092915050565b60008060408385031215611fc757611fc66128c3565b5b6000611fd585828601611eec565b9250506020611fe685828601611eec565b9150509250929050565b600080600060608486031215612009576120086128c3565b5b600061201786828701611eec565b935050602061202886828701611eec565b925050604061203986828701611f6e565b9150509250925092565b6000806000806080858703121561205d5761205c6128c3565b5b600061206b87828801611eec565b945050602061207c87828801611eec565b935050604061208d87828801611f6e565b925050606085013567ffffffffffffffff8111156120ae576120ad6128be565b5b6120ba87828801611f40565b91505092959194509250565b600080604083850312156120dd576120dc6128c3565b5b60006120eb85828601611eec565b92505060206120fc85828601611f01565b9150509250929050565b6000806040838503121561211d5761211c6128c3565b5b600061212b85828601611eec565b925050602061213c85828601611f6e565b9150509250929050565b60006020828403121561215c5761215b6128c3565b5b600061216a84828501611f01565b91505092915050565b600060208284031215612189576121886128c3565b5b600061219784828501611f16565b91505092915050565b6000602082840312156121b6576121b56128c3565b5b60006121c484828501611f2b565b91505092915050565b6000602082840312156121e3576121e26128c3565b5b60006121f184828501611f6e565b91505092915050565b6122038161270e565b82525050565b61221281612720565b82525050565b60006122238261261b565b61222d8185612631565b935061223d818560208601612791565b612246816128c8565b840191505092915050565b600061225c82612626565b6122668185612642565b9350612276818560208601612791565b61227f816128c8565b840191505092915050565b600061229582612626565b61229f8185612653565b93506122af818560208601612791565b80840191505092915050565b60006122c8600a83612642565b91506122d3826128d9565b602082019050919050565b60006122eb600c83612642565b91506122f682612902565b602082019050919050565b600061230e600e83612642565b91506123198261292b565b602082019050919050565b6000612331600c83612642565b915061233c82612954565b602082019050919050565b6000612354600883612642565b915061235f8261297d565b602082019050919050565b6000612377600f83612642565b9150612382826129a6565b602082019050919050565b600061239a601483612642565b91506123a5826129cf565b602082019050919050565b60006123bd601183612642565b91506123c8826129f8565b602082019050919050565b6123dc81612778565b82525050565b60006123ee828561228a565b91506123fa828461228a565b91508190509392505050565b600060208201905061241b60008301846121fa565b92915050565b600060808201905061243660008301876121fa565b61244360208301866121fa565b61245060408301856123d3565b81810360608301526124628184612218565b905095945050505050565b60006020820190506124826000830184612209565b92915050565b600060208201905081810360008301526124a28184612251565b905092915050565b600060208201905081810360008301526124c3816122bb565b9050919050565b600060208201905081810360008301526124e3816122de565b9050919050565b6000602082019050818103600083015261250381612301565b9050919050565b6000602082019050818103600083015261252381612324565b9050919050565b6000602082019050818103600083015261254381612347565b9050919050565b600060208201905081810360008301526125638161236a565b9050919050565b600060208201905081810360008301526125838161238d565b9050919050565b600060208201905081810360008301526125a3816123b0565b9050919050565b60006020820190506125bf60008301846123d3565b92915050565b60006125cf6125e0565b90506125db82826127f6565b919050565b6000604051905090565b600067ffffffffffffffff82111561260557612604612885565b5b61260e826128c8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061266982612778565b915061267483612778565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126a9576126a8612827565b5b828201905092915050565b60006126bf82612778565b91506126ca83612778565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561270357612702612827565b5b828202905092915050565b600061271982612758565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156127af578082015181840152602081019050612794565b838111156127be576000848401525b50505050565b600060028204905060018216806127dc57607f821691505b602082108114156127f0576127ef612856565b5b50919050565b6127ff826128c8565b810181811067ffffffffffffffff8211171561281e5761281d612885565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416c6c206d696e74656400000000000000000000000000000000000000000000600082015250565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b7f52455345525645532054414b454e000000000000000000000000000000000000600082015250565b7f554e5355434345535346554c0000000000000000000000000000000000000000600082015250565b7f496e616374697665000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722054780000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b612a2a8161270e565b8114612a3557600080fd5b50565b612a4181612720565b8114612a4c57600080fd5b50565b612a588161272c565b8114612a6357600080fd5b50565b612a6f81612778565b8114612a7a57600080fd5b5056fea264697066735822122052b545012a3d25e88000d3cdaba6bb0a83e8f631a620f8205f17e41f0e0cf0c264736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d57747167753346376e334250396f343759425a5358797442776478724d596170454a484d69556448446938732f

Deployed Bytecode

0x60806040526004361061019c5760003560e01c80636352211e116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd1461054b578063d5abeb0114610588578063e985e9c5146105b3578063f968adbe146105f05761019c565b8063a0712d68146104ea578063a22cb46514610506578063b88d4fde1461052f5761019c565b80638da5cb5b116100c65780638da5cb5b1461044057806391b7f5ed1461046b57806395d89b4114610494578063a035b1fe146104bf5761019c565b80636352211e1461039b5780636c0360eb146103d857806370a08231146104035761019c565b806318160ddd116101595780632750fc78116101335780632750fc78146103145780633ccfd60b1461033d57806342842e0e14610354578063453c2310146103705761019c565b806318160ddd146102a2578063186601ca146102cd57806323b872dd146102f85761019c565b806301ffc9a7146101a1578063029877b6146101de57806306fdde03146101f5578063081812fc14610220578063095ea7b31461025d57806313af403514610279575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612173565b61061b565b6040516101d5919061246d565b60405180910390f35b3480156101ea57600080fd5b506101f36106ad565b005b34801561020157600080fd5b5061020a610794565b6040516102179190612488565b60405180910390f35b34801561022c57600080fd5b50610247600480360381019061024291906121cd565b610826565b6040516102549190612406565b60405180910390f35b61027760048036038101906102729190612106565b6108a5565b005b34801561028557600080fd5b506102a0600480360381019061029b9190611f83565b6109e9565b005b3480156102ae57600080fd5b506102b7610b17565b6040516102c491906125aa565b60405180910390f35b3480156102d957600080fd5b506102e2610b2e565b6040516102ef919061246d565b60405180910390f35b610312600480360381019061030d9190611ff0565b610b41565b005b34801561032057600080fd5b5061033b60048036038101906103369190612146565b610e66565b005b34801561034957600080fd5b50610352610f13565b005b61036e60048036038101906103699190611ff0565b61103b565b005b34801561037c57600080fd5b5061038561105b565b60405161039291906125aa565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd91906121cd565b611061565b6040516103cf9190612406565b60405180910390f35b3480156103e457600080fd5b506103ed611073565b6040516103fa9190612488565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190611f83565b611101565b60405161043791906125aa565b60405180910390f35b34801561044c57600080fd5b506104556111ba565b6040516104629190612406565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d91906121cd565b6111e0565b005b3480156104a057600080fd5b506104a961127a565b6040516104b69190612488565b60405180910390f35b3480156104cb57600080fd5b506104d461130c565b6040516104e191906125aa565b60405180910390f35b61050460048036038101906104ff91906121cd565b611312565b005b34801561051257600080fd5b5061052d600480360381019061052891906120c6565b6114b2565b005b61054960048036038101906105449190612043565b6115bd565b005b34801561055757600080fd5b50610572600480360381019061056d91906121cd565b611630565b60405161057f9190612488565b60405180910390f35b34801561059457600080fd5b5061059d6116cf565b6040516105aa91906125aa565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190611fb0565b6116d5565b6040516105e7919061246d565b60405180910390f35b3480156105fc57600080fd5b50610605611769565b60405161061291906125aa565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461073d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610734906124ca565b60405180910390fd5b6000610747610b17565b14610787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e906124ea565b60405180910390fd5b61079233603261176f565b565b6060600280546107a3906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf906127c4565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b60006108318261192c565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b082611061565b90508073ffffffffffffffffffffffffffffffffffffffff166108d161198b565b73ffffffffffffffffffffffffffffffffffffffff1614610934576108fd816108f861198b565b6116d5565b610933576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a70906124ca565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b6000610b21611993565b6001546000540303905090565b600d60009054906101000a900460ff1681565b6000610b4c8261199c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bb3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bbf84611a6a565b91509150610bd58187610bd061198b565b611a91565b610c2157610bea86610be561198b565b6116d5565b610c20576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c88576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c958686866001611ad5565b8015610ca057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d6e85610d4a888887611adb565b7c020000000000000000000000000000000000000000000000000000000017611b03565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610df6576000600185019050600060046000838152602001908152602001600020541415610df4576000548114610df3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e5e8686866001611b2e565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906124ca565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a906124ca565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611039576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110309061250a565b60405180910390fd5b565b611056838383604051806020016040528060008152506115bd565b505050565b60095481565b600061106c8261199c565b9050919050565b600e8054611080906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac906127c4565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611169576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611267906124ca565b60405180910390fd5b80600c8190555050565b606060038054611289906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546112b5906127c4565b80156113025780601f106112d757610100808354040283529160200191611302565b820191906000526020600020905b8154815290600101906020018083116112e557829003601f168201915b5050505050905090565b600c5481565b600d60009054906101000a900460ff16611361576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113589061252a565b60405180910390fd5b600a548161136d610b17565b611377919061265e565b11156113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af906124aa565b60405180910390fd5b600b548111156113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f49061254a565b60405180910390fd5b6009548161140a33611b34565b611414919061265e565b1115611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c9061256a565b60405180910390fd5b80600c5461146391906126b4565b3410156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c9061258a565b60405180910390fd5b6114af3382611b8b565b50565b80600760006114bf61198b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661156c61198b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115b1919061246d565b60405180910390a35050565b6115c8848484610b41565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461162a576115f384848484611ba9565b611629576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061163b8261192c565b611671576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061167b611d09565b905060008151141561169c57604051806020016040528060008152506116c7565b806116a684611d9b565b6040516020016116b79291906123e2565b6040516020818303038152906040525b915050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b60008054905060008214156117b0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bd6000848385611ad5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611834836118256000866000611adb565b61182e85611df4565b17611b03565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146118d557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061189a565b506000821415611911576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506119276000848385611b2e565b505050565b600081611937611993565b11158015611946575060005482105b8015611984575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806119ab611993565b11611a3357600054811015611a325760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a30575b6000811415611a265760046000836001900393508381526020019081526020016000205490506119fb565b8092505050611a65565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611af2868684611e04565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611ba5828260405180602001604052806000815250611e0d565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bcf61198b565b8786866040518563ffffffff1660e01b8152600401611bf19493929190612421565b602060405180830381600087803b158015611c0b57600080fd5b505af1925050508015611c3c57506040513d601f19601f82011682018060405250810190611c3991906121a0565b60015b611cb6573d8060008114611c6c576040519150601f19603f3d011682016040523d82523d6000602084013e611c71565b606091505b50600081511415611cae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054611d18906127c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d44906127c4565b8015611d915780601f10611d6657610100808354040283529160200191611d91565b820191906000526020600020905b815481529060010190602001808311611d7457829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611ddf57600184039350600a81066030018453600a8104905080611dda57611ddf565b611db4565b50828103602084039350808452505050919050565b60006001821460e11b9050919050565b60009392505050565b611e17838361176f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ea557600080549050600083820390505b611e576000868380600101945086611ba9565b611e8d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611e44578160005414611ea257600080fd5b50505b505050565b6000611ebd611eb8846125ea565b6125c5565b905082815260208101848484011115611ed957611ed86128b9565b5b611ee4848285612782565b509392505050565b600081359050611efb81612a21565b92915050565b600081359050611f1081612a38565b92915050565b600081359050611f2581612a4f565b92915050565b600081519050611f3a81612a4f565b92915050565b600082601f830112611f5557611f546128b4565b5b8135611f65848260208601611eaa565b91505092915050565b600081359050611f7d81612a66565b92915050565b600060208284031215611f9957611f986128c3565b5b6000611fa784828501611eec565b91505092915050565b60008060408385031215611fc757611fc66128c3565b5b6000611fd585828601611eec565b9250506020611fe685828601611eec565b9150509250929050565b600080600060608486031215612009576120086128c3565b5b600061201786828701611eec565b935050602061202886828701611eec565b925050604061203986828701611f6e565b9150509250925092565b6000806000806080858703121561205d5761205c6128c3565b5b600061206b87828801611eec565b945050602061207c87828801611eec565b935050604061208d87828801611f6e565b925050606085013567ffffffffffffffff8111156120ae576120ad6128be565b5b6120ba87828801611f40565b91505092959194509250565b600080604083850312156120dd576120dc6128c3565b5b60006120eb85828601611eec565b92505060206120fc85828601611f01565b9150509250929050565b6000806040838503121561211d5761211c6128c3565b5b600061212b85828601611eec565b925050602061213c85828601611f6e565b9150509250929050565b60006020828403121561215c5761215b6128c3565b5b600061216a84828501611f01565b91505092915050565b600060208284031215612189576121886128c3565b5b600061219784828501611f16565b91505092915050565b6000602082840312156121b6576121b56128c3565b5b60006121c484828501611f2b565b91505092915050565b6000602082840312156121e3576121e26128c3565b5b60006121f184828501611f6e565b91505092915050565b6122038161270e565b82525050565b61221281612720565b82525050565b60006122238261261b565b61222d8185612631565b935061223d818560208601612791565b612246816128c8565b840191505092915050565b600061225c82612626565b6122668185612642565b9350612276818560208601612791565b61227f816128c8565b840191505092915050565b600061229582612626565b61229f8185612653565b93506122af818560208601612791565b80840191505092915050565b60006122c8600a83612642565b91506122d3826128d9565b602082019050919050565b60006122eb600c83612642565b91506122f682612902565b602082019050919050565b600061230e600e83612642565b91506123198261292b565b602082019050919050565b6000612331600c83612642565b915061233c82612954565b602082019050919050565b6000612354600883612642565b915061235f8261297d565b602082019050919050565b6000612377600f83612642565b9150612382826129a6565b602082019050919050565b600061239a601483612642565b91506123a5826129cf565b602082019050919050565b60006123bd601183612642565b91506123c8826129f8565b602082019050919050565b6123dc81612778565b82525050565b60006123ee828561228a565b91506123fa828461228a565b91508190509392505050565b600060208201905061241b60008301846121fa565b92915050565b600060808201905061243660008301876121fa565b61244360208301866121fa565b61245060408301856123d3565b81810360608301526124628184612218565b905095945050505050565b60006020820190506124826000830184612209565b92915050565b600060208201905081810360008301526124a28184612251565b905092915050565b600060208201905081810360008301526124c3816122bb565b9050919050565b600060208201905081810360008301526124e3816122de565b9050919050565b6000602082019050818103600083015261250381612301565b9050919050565b6000602082019050818103600083015261252381612324565b9050919050565b6000602082019050818103600083015261254381612347565b9050919050565b600060208201905081810360008301526125638161236a565b9050919050565b600060208201905081810360008301526125838161238d565b9050919050565b600060208201905081810360008301526125a3816123b0565b9050919050565b60006020820190506125bf60008301846123d3565b92915050565b60006125cf6125e0565b90506125db82826127f6565b919050565b6000604051905090565b600067ffffffffffffffff82111561260557612604612885565b5b61260e826128c8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061266982612778565b915061267483612778565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126a9576126a8612827565b5b828201905092915050565b60006126bf82612778565b91506126ca83612778565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561270357612702612827565b5b828202905092915050565b600061271982612758565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156127af578082015181840152602081019050612794565b838111156127be576000848401525b50505050565b600060028204905060018216806127dc57607f821691505b602082108114156127f0576127ef612856565b5b50919050565b6127ff826128c8565b810181811067ffffffffffffffff8211171561281e5761281d612885565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416c6c206d696e74656400000000000000000000000000000000000000000000600082015250565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b7f52455345525645532054414b454e000000000000000000000000000000000000600082015250565b7f554e5355434345535346554c0000000000000000000000000000000000000000600082015250565b7f496e616374697665000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722054780000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b612a2a8161270e565b8114612a3557600080fd5b50565b612a4181612720565b8114612a4c57600080fd5b50565b612a588161272c565b8114612a6357600080fd5b50565b612a6f81612778565b8114612a7a57600080fd5b5056fea264697066735822122052b545012a3d25e88000d3cdaba6bb0a83e8f631a620f8205f17e41f0e0cf0c264736f6c63430008070033

Deployed Bytecode Sourcemap

53041:1578:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19937:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54328:136;;;;;;;;;;;;;:::i;:::-;;20839:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27330:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26763:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1378:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16590:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53239:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30969:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54224:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54472:144;;;;;;;;;;;;;:::i;:::-;;33890:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53087:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22232:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53269:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17774:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;742:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54136:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21015:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53197:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53446:471;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27888:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34681:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21225:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53125:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28279:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53163:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19937:639;20022:4;20361:10;20346:25;;:11;:25;;;;:102;;;;20438:10;20423:25;;:11;:25;;;;20346:102;:179;;;;20515:10;20500:25;;:11;:25;;;;20346:179;20326:199;;19937:639;;;:::o;54328:136::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54406:1:::1;54389:13;:11;:13::i;:::-;:18;54381:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;54435:21;54441:10;54453:2;54435:5;:21::i;:::-;54328:136::o:0;20839:100::-;20893:13;20926:5;20919:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20839:100;:::o;27330:218::-;27406:7;27431:16;27439:7;27431;:16::i;:::-;27426:64;;27456:34;;;;;;;;;;;;;;27426:64;27510:15;:24;27526:7;27510:24;;;;;;;;;;;:30;;;;;;;;;;;;27503:37;;27330:218;;;:::o;26763:408::-;26852:13;26868:16;26876:7;26868;:16::i;:::-;26852:32;;26924:5;26901:28;;:19;:17;:19::i;:::-;:28;;;26897:175;;26949:44;26966:5;26973:19;:17;:19::i;:::-;26949:16;:44::i;:::-;26944:128;;27021:35;;;;;;;;;;;;;;26944:128;26897:175;27117:2;27084:15;:24;27100:7;27084:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;27155:7;27151:2;27135:28;;27144:5;27135:28;;;;;;;;;;;;26841:330;26763:408;;:::o;1378:148::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;1458:8:::1;1450:5;;:16;;;;;;;;;;;;;;;;;;1509:8;1484:34;;1497:10;1484:34;;;;;;;;;;;;1378:148:::0;:::o;16590:323::-;16651:7;16879:15;:13;:15::i;:::-;16864:12;;16848:13;;:28;:46;16841:53;;16590:323;:::o;53239:21::-;;;;;;;;;;;;;:::o;30969:2825::-;31111:27;31141;31160:7;31141:18;:27::i;:::-;31111:57;;31226:4;31185:45;;31201:19;31185:45;;;31181:86;;31239:28;;;;;;;;;;;;;;31181:86;31281:27;31310:23;31337:35;31364:7;31337:26;:35::i;:::-;31280:92;;;;31472:68;31497:15;31514:4;31520:19;:17;:19::i;:::-;31472:24;:68::i;:::-;31467:180;;31560:43;31577:4;31583:19;:17;:19::i;:::-;31560:16;:43::i;:::-;31555:92;;31612:35;;;;;;;;;;;;;;31555:92;31467:180;31678:1;31664:16;;:2;:16;;;31660:52;;;31689:23;;;;;;;;;;;;;;31660:52;31725:43;31747:4;31753:2;31757:7;31766:1;31725:21;:43::i;:::-;31861:15;31858:160;;;32001:1;31980:19;31973:30;31858:160;32398:18;:24;32417:4;32398:24;;;;;;;;;;;;;;;;32396:26;;;;;;;;;;;;32467:18;:22;32486:2;32467:22;;;;;;;;;;;;;;;;32465:24;;;;;;;;;;;32789:146;32826:2;32875:45;32890:4;32896:2;32900:19;32875:14;:45::i;:::-;12989:8;32847:73;32789:18;:146::i;:::-;32760:17;:26;32778:7;32760:26;;;;;;;;;;;:175;;;;33106:1;12989:8;33055:19;:47;:52;33051:627;;;33128:19;33160:1;33150:7;:11;33128:33;;33317:1;33283:17;:30;33301:11;33283:30;;;;;;;;;;;;:35;33279:384;;;33421:13;;33406:11;:28;33402:242;;33601:19;33568:17;:30;33586:11;33568:30;;;;;;;;;;;:52;;;;33402:242;33279:384;33109:569;33051:627;33725:7;33721:2;33706:27;;33715:4;33706:27;;;;;;;;;;;;33744:42;33765:4;33771:2;33775:7;33784:1;33744:20;:42::i;:::-;31100:2694;;;30969:2825;;;:::o;54224:96::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54303:9:::1;54291;;:21;;;;;;;;;;;;;;;;;;54224:96:::0;:::o;54472:144::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54542:5:::1;;;;;;;;;;;54534:19;;:42;54554:21;54534:42;;;;;;;;;;;;;;;;;;;;;;;54518:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;54472:144::o:0;33890:193::-;34036:39;34053:4;34059:2;34063:7;34036:39;;;;;;;;;;;;:16;:39::i;:::-;33890:193;;;:::o;53087:31::-;;;;:::o;22232:152::-;22304:7;22347:27;22366:7;22347:18;:27::i;:::-;22324:52;;22232:152;;;:::o;53269:94::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17774:233::-;17846:7;17887:1;17870:19;;:5;:19;;;17866:60;;;17898:28;;;;;;;;;;;;;;17866:60;11933:13;17944:18;:25;17963:5;17944:25;;;;;;;;;;;;;;;;:55;17937:62;;17774:233;;;:::o;742:20::-;;;;;;;;;;;;;:::o;54136:80::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54202:6:::1;54194:5;:14;;;;54136:80:::0;:::o;21015:104::-;21071:13;21104:7;21097:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21015:104;:::o;53197:33::-;;;;:::o;53446:471::-;53520:9;;;;;;;;;;;53512:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;53595:9;;53577:14;53561:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;53553:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53656:8;;53638:14;:26;;53630:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53749:12;;53731:14;53703:25;53717:10;53703:13;:25::i;:::-;:42;;;;:::i;:::-;:58;;53695:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;53825:14;53817:5;;:22;;;;:::i;:::-;53804:9;:35;;53796:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53872:37;53882:10;53894:14;53872:9;:37::i;:::-;53446:471;:::o;27888:234::-;28035:8;27983:18;:39;28002:19;:17;:19::i;:::-;27983:39;;;;;;;;;;;;;;;:49;28023:8;27983:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28095:8;28059:55;;28074:19;:17;:19::i;:::-;28059:55;;;28105:8;28059:55;;;;;;:::i;:::-;;;;;;;;27888:234;;:::o;34681:407::-;34856:31;34869:4;34875:2;34879:7;34856:12;:31::i;:::-;34920:1;34902:2;:14;;;:19;34898:183;;34941:56;34972:4;34978:2;34982:7;34991:5;34941:30;:56::i;:::-;34936:145;;35025:40;;;;;;;;;;;;;;34936:145;34898:183;34681:407;;;;:::o;21225:318::-;21298:13;21329:16;21337:7;21329;:16::i;:::-;21324:59;;21354:29;;;;;;;;;;;;;;21324:59;21396:21;21420:10;:8;:10::i;:::-;21396:34;;21473:1;21454:7;21448:21;:26;;:87;;;;;;;;;;;;;;;;;21501:7;21510:18;21520:7;21510:9;:18::i;:::-;21484:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21448:87;21441:94;;;21225:318;;;:::o;53125:31::-;;;;:::o;28279:164::-;28376:4;28400:18;:25;28419:5;28400:25;;;;;;;;;;;;;;;:35;28426:8;28400:35;;;;;;;;;;;;;;;;;;;;;;;;;28393:42;;28279:164;;;;:::o;53163:27::-;;;;:::o;38350:2966::-;38423:20;38446:13;;38423:36;;38486:1;38474:8;:13;38470:44;;;38496:18;;;;;;;;;;;;;;38470:44;38527:61;38557:1;38561:2;38565:12;38579:8;38527:21;:61::i;:::-;39071:1;12071:2;39041:1;:26;;39040:32;39028:8;:45;39002:18;:22;39021:2;39002:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;39350:139;39387:2;39441:33;39464:1;39468:2;39472:1;39441:14;:33::i;:::-;39408:30;39429:8;39408:20;:30::i;:::-;:66;39350:18;:139::i;:::-;39316:17;:31;39334:12;39316:31;;;;;;;;;;;:173;;;;39506:16;39537:11;39566:8;39551:12;:23;39537:37;;40087:16;40083:2;40079:25;40067:37;;40459:12;40419:8;40378:1;40316:25;40257:1;40196;40169:335;40830:1;40816:12;40812:20;40770:346;40871:3;40862:7;40859:16;40770:346;;41089:7;41079:8;41076:1;41049:25;41046:1;41043;41038:59;40924:1;40915:7;40911:15;40900:26;;40770:346;;;40774:77;41161:1;41149:8;:13;41145:45;;;41171:19;;;;;;;;;;;;;;41145:45;41223:3;41207:13;:19;;;;38776:2462;;41248:60;41277:1;41281:2;41285:12;41299:8;41248:20;:60::i;:::-;38412:2904;38350:2966;;:::o;28701:282::-;28766:4;28822:7;28803:15;:13;:15::i;:::-;:26;;:66;;;;;28856:13;;28846:7;:23;28803:66;:153;;;;;28955:1;12709:8;28907:17;:26;28925:7;28907:26;;;;;;;;;;;;:44;:49;28803:153;28783:173;;28701:282;;;:::o;51009:105::-;51069:7;51096:10;51089:17;;51009:105;:::o;53929:91::-;53986:7;54013:1;54006:8;;53929:91;:::o;23387:1275::-;23454:7;23474:12;23489:7;23474:22;;23557:4;23538:15;:13;:15::i;:::-;:23;23534:1061;;23591:13;;23584:4;:20;23580:1015;;;23629:14;23646:17;:23;23664:4;23646:23;;;;;;;;;;;;23629:40;;23763:1;12709:8;23735:6;:24;:29;23731:845;;;24400:113;24417:1;24407:6;:11;24400:113;;;24460:17;:25;24478:6;;;;;;;24460:25;;;;;;;;;;;;24451:34;;24400:113;;;24546:6;24539:13;;;;;;23731:845;23606:989;23580:1015;23534:1061;24623:31;;;;;;;;;;;;;;23387:1275;;;;:::o;29864:485::-;29966:27;29995:23;30036:38;30077:15;:24;30093:7;30077:24;;;;;;;;;;;30036:65;;30254:18;30231:41;;30311:19;30305:26;30286:45;;30216:126;29864:485;;;:::o;29092:659::-;29241:11;29406:16;29399:5;29395:28;29386:37;;29566:16;29555:9;29551:32;29538:45;;29716:15;29705:9;29702:30;29694:5;29683:9;29680:20;29677:56;29667:66;;29092:659;;;;;:::o;35750:159::-;;;;;:::o;50318:311::-;50453:7;50473:16;13113:3;50499:19;:41;;50473:68;;13113:3;50567:31;50578:4;50584:2;50588:9;50567:10;:31::i;:::-;50559:40;;:62;;50552:69;;;50318:311;;;;;:::o;25210:450::-;25290:14;25458:16;25451:5;25447:28;25438:37;;25635:5;25621:11;25596:23;25592:41;25589:52;25582:5;25579:63;25569:73;;25210:450;;;;:::o;36574:158::-;;;;;:::o;18089:178::-;18150:7;11933:13;12071:2;18178:18;:25;18197:5;18178:25;;;;;;;;;;;;;;;;:50;;18177:82;18170:89;;18089:178;;;:::o;44841:112::-;44918:27;44928:2;44932:8;44918:27;;;;;;;;;;;;:9;:27::i;:::-;44841:112;;:::o;37172:716::-;37335:4;37381:2;37356:45;;;37402:19;:17;:19::i;:::-;37423:4;37429:7;37438:5;37356:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37352:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37656:1;37639:6;:13;:18;37635:235;;;37685:40;;;;;;;;;;;;;;37635:235;37828:6;37822:13;37813:6;37809:2;37805:15;37798:38;37352:529;37525:54;;;37515:64;;;:6;:64;;;;37508:71;;;37172:716;;;;;;:::o;54028:100::-;54080:13;54113:7;54106:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54028:100;:::o;51216:1745::-;51281:17;51715:4;51708;51702:11;51698:22;51807:1;51801:4;51794:15;51882:4;51879:1;51875:12;51868:19;;51964:1;51959:3;51952:14;52068:3;52307:5;52289:428;52315:1;52289:428;;;52355:1;52350:3;52346:11;52339:18;;52526:2;52520:4;52516:13;52512:2;52508:22;52503:3;52495:36;52620:2;52614:4;52610:13;52602:21;;52687:4;52677:25;;52695:5;;52677:25;52289:428;;;52293:21;52756:3;52751;52747:13;52871:4;52866:3;52862:14;52855:21;;52936:6;52931:3;52924:19;51320:1634;;;51216:1745;;;:::o;25762:324::-;25832:14;26065:1;26055:8;26052:15;26026:24;26022:46;26012:56;;25762:324;;;:::o;50019:147::-;50156:6;50019:147;;;;;:::o;44068:689::-;44199:19;44205:2;44209:8;44199:5;:19::i;:::-;44278:1;44260:2;:14;;;:19;44256:483;;44300:11;44314:13;;44300:27;;44346:13;44368:8;44362:3;:14;44346:30;;44395:233;44426:62;44465:1;44469:2;44473:7;;;;;;44482:5;44426:30;:62::i;:::-;44421:167;;44524:40;;;;;;;;;;;;;;44421:167;44623:3;44615:5;:11;44395:233;;44710:3;44693:13;;:20;44689:34;;44715:8;;;44689:34;44281:458;;44256:483;44068:689;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:323::-;4898:6;4947:2;4935:9;4926:7;4922:23;4918:32;4915:119;;;4953:79;;:::i;:::-;4915:119;5073:1;5098:50;5140:7;5131:6;5120:9;5116:22;5098:50;:::i;:::-;5088:60;;5044:114;4842:323;;;;:::o;5171:327::-;5229:6;5278:2;5266:9;5257:7;5253:23;5249:32;5246:119;;;5284:79;;:::i;:::-;5246:119;5404:1;5429:52;5473:7;5464:6;5453:9;5449:22;5429:52;:::i;:::-;5419:62;;5375:116;5171:327;;;;:::o;5504:349::-;5573:6;5622:2;5610:9;5601:7;5597:23;5593:32;5590:119;;;5628:79;;:::i;:::-;5590:119;5748:1;5773:63;5828:7;5819:6;5808:9;5804:22;5773:63;:::i;:::-;5763:73;;5719:127;5504:349;;;;:::o;5859:329::-;5918:6;5967:2;5955:9;5946:7;5942:23;5938:32;5935:119;;;5973:79;;:::i;:::-;5935:119;6093:1;6118:53;6163:7;6154:6;6143:9;6139:22;6118:53;:::i;:::-;6108:63;;6064:117;5859:329;;;;:::o;6194:118::-;6281:24;6299:5;6281:24;:::i;:::-;6276:3;6269:37;6194:118;;:::o;6318:109::-;6399:21;6414:5;6399:21;:::i;:::-;6394:3;6387:34;6318:109;;:::o;6433:360::-;6519:3;6547:38;6579:5;6547:38;:::i;:::-;6601:70;6664:6;6659:3;6601:70;:::i;:::-;6594:77;;6680:52;6725:6;6720:3;6713:4;6706:5;6702:16;6680:52;:::i;:::-;6757:29;6779:6;6757:29;:::i;:::-;6752:3;6748:39;6741:46;;6523:270;6433:360;;;;:::o;6799:364::-;6887:3;6915:39;6948:5;6915:39;:::i;:::-;6970:71;7034:6;7029:3;6970:71;:::i;:::-;6963:78;;7050:52;7095:6;7090:3;7083:4;7076:5;7072:16;7050:52;:::i;:::-;7127:29;7149:6;7127:29;:::i;:::-;7122:3;7118:39;7111:46;;6891:272;6799:364;;;;:::o;7169:377::-;7275:3;7303:39;7336:5;7303:39;:::i;:::-;7358:89;7440:6;7435:3;7358:89;:::i;:::-;7351:96;;7456:52;7501:6;7496:3;7489:4;7482:5;7478:16;7456:52;:::i;:::-;7533:6;7528:3;7524:16;7517:23;;7279:267;7169:377;;;;:::o;7552:366::-;7694:3;7715:67;7779:2;7774:3;7715:67;:::i;:::-;7708:74;;7791:93;7880:3;7791:93;:::i;:::-;7909:2;7904:3;7900:12;7893:19;;7552:366;;;:::o;7924:::-;8066:3;8087:67;8151:2;8146:3;8087:67;:::i;:::-;8080:74;;8163:93;8252:3;8163:93;:::i;:::-;8281:2;8276:3;8272:12;8265:19;;7924:366;;;:::o;8296:::-;8438:3;8459:67;8523:2;8518:3;8459:67;:::i;:::-;8452:74;;8535:93;8624:3;8535:93;:::i;:::-;8653:2;8648:3;8644:12;8637:19;;8296:366;;;:::o;8668:::-;8810:3;8831:67;8895:2;8890:3;8831:67;:::i;:::-;8824:74;;8907:93;8996:3;8907:93;:::i;:::-;9025:2;9020:3;9016:12;9009:19;;8668:366;;;:::o;9040:365::-;9182:3;9203:66;9267:1;9262:3;9203:66;:::i;:::-;9196:73;;9278:93;9367:3;9278:93;:::i;:::-;9396:2;9391:3;9387:12;9380:19;;9040:365;;;:::o;9411:366::-;9553:3;9574:67;9638:2;9633:3;9574:67;:::i;:::-;9567:74;;9650:93;9739:3;9650:93;:::i;:::-;9768:2;9763:3;9759:12;9752:19;;9411:366;;;:::o;9783:::-;9925:3;9946:67;10010:2;10005:3;9946:67;:::i;:::-;9939:74;;10022:93;10111:3;10022:93;:::i;:::-;10140:2;10135:3;10131:12;10124:19;;9783:366;;;:::o;10155:::-;10297:3;10318:67;10382:2;10377:3;10318:67;:::i;:::-;10311:74;;10394:93;10483:3;10394:93;:::i;:::-;10512:2;10507:3;10503:12;10496:19;;10155:366;;;:::o;10527:118::-;10614:24;10632:5;10614:24;:::i;:::-;10609:3;10602:37;10527:118;;:::o;10651:435::-;10831:3;10853:95;10944:3;10935:6;10853:95;:::i;:::-;10846:102;;10965:95;11056:3;11047:6;10965:95;:::i;:::-;10958:102;;11077:3;11070:10;;10651:435;;;;;:::o;11092:222::-;11185:4;11223:2;11212:9;11208:18;11200:26;;11236:71;11304:1;11293:9;11289:17;11280:6;11236:71;:::i;:::-;11092:222;;;;:::o;11320:640::-;11515:4;11553:3;11542:9;11538:19;11530:27;;11567:71;11635:1;11624:9;11620:17;11611:6;11567:71;:::i;:::-;11648:72;11716:2;11705:9;11701:18;11692:6;11648:72;:::i;:::-;11730;11798:2;11787:9;11783:18;11774:6;11730:72;:::i;:::-;11849:9;11843:4;11839:20;11834:2;11823:9;11819:18;11812:48;11877:76;11948:4;11939:6;11877:76;:::i;:::-;11869:84;;11320:640;;;;;;;:::o;11966:210::-;12053:4;12091:2;12080:9;12076:18;12068:26;;12104:65;12166:1;12155:9;12151:17;12142:6;12104:65;:::i;:::-;11966:210;;;;:::o;12182:313::-;12295:4;12333:2;12322:9;12318:18;12310:26;;12382:9;12376:4;12372:20;12368:1;12357:9;12353:17;12346:47;12410:78;12483:4;12474:6;12410:78;:::i;:::-;12402:86;;12182:313;;;;:::o;12501:419::-;12667:4;12705:2;12694:9;12690:18;12682:26;;12754:9;12748:4;12744:20;12740:1;12729:9;12725:17;12718:47;12782:131;12908:4;12782:131;:::i;:::-;12774:139;;12501:419;;;:::o;12926:::-;13092:4;13130:2;13119:9;13115:18;13107:26;;13179:9;13173:4;13169:20;13165:1;13154:9;13150:17;13143:47;13207:131;13333:4;13207:131;:::i;:::-;13199:139;;12926:419;;;:::o;13351:::-;13517:4;13555:2;13544:9;13540:18;13532:26;;13604:9;13598:4;13594:20;13590:1;13579:9;13575:17;13568:47;13632:131;13758:4;13632:131;:::i;:::-;13624:139;;13351:419;;;:::o;13776:::-;13942:4;13980:2;13969:9;13965:18;13957:26;;14029:9;14023:4;14019:20;14015:1;14004:9;14000:17;13993:47;14057:131;14183:4;14057:131;:::i;:::-;14049:139;;13776:419;;;:::o;14201:::-;14367:4;14405:2;14394:9;14390:18;14382:26;;14454:9;14448:4;14444:20;14440:1;14429:9;14425:17;14418:47;14482:131;14608:4;14482:131;:::i;:::-;14474:139;;14201:419;;;:::o;14626:::-;14792:4;14830:2;14819:9;14815:18;14807:26;;14879:9;14873:4;14869:20;14865:1;14854:9;14850:17;14843:47;14907:131;15033:4;14907:131;:::i;:::-;14899:139;;14626:419;;;:::o;15051:::-;15217:4;15255:2;15244:9;15240:18;15232:26;;15304:9;15298:4;15294:20;15290:1;15279:9;15275:17;15268:47;15332:131;15458:4;15332:131;:::i;:::-;15324:139;;15051:419;;;:::o;15476:::-;15642:4;15680:2;15669:9;15665:18;15657:26;;15729:9;15723:4;15719:20;15715:1;15704:9;15700:17;15693:47;15757:131;15883:4;15757:131;:::i;:::-;15749:139;;15476:419;;;:::o;15901:222::-;15994:4;16032:2;16021:9;16017:18;16009:26;;16045:71;16113:1;16102:9;16098:17;16089:6;16045:71;:::i;:::-;15901:222;;;;:::o;16129:129::-;16163:6;16190:20;;:::i;:::-;16180:30;;16219:33;16247:4;16239:6;16219:33;:::i;:::-;16129:129;;;:::o;16264:75::-;16297:6;16330:2;16324:9;16314:19;;16264:75;:::o;16345:307::-;16406:4;16496:18;16488:6;16485:30;16482:56;;;16518:18;;:::i;:::-;16482:56;16556:29;16578:6;16556:29;:::i;:::-;16548:37;;16640:4;16634;16630:15;16622:23;;16345:307;;;:::o;16658:98::-;16709:6;16743:5;16737:12;16727:22;;16658:98;;;:::o;16762:99::-;16814:6;16848:5;16842:12;16832:22;;16762:99;;;:::o;16867:168::-;16950:11;16984:6;16979:3;16972:19;17024:4;17019:3;17015:14;17000:29;;16867:168;;;;:::o;17041:169::-;17125:11;17159:6;17154:3;17147:19;17199:4;17194:3;17190:14;17175:29;;17041:169;;;;:::o;17216:148::-;17318:11;17355:3;17340:18;;17216:148;;;;:::o;17370:305::-;17410:3;17429:20;17447:1;17429:20;:::i;:::-;17424:25;;17463:20;17481:1;17463:20;:::i;:::-;17458:25;;17617:1;17549:66;17545:74;17542:1;17539:81;17536:107;;;17623:18;;:::i;:::-;17536:107;17667:1;17664;17660:9;17653:16;;17370:305;;;;:::o;17681:348::-;17721:7;17744:20;17762:1;17744:20;:::i;:::-;17739:25;;17778:20;17796:1;17778:20;:::i;:::-;17773:25;;17966:1;17898:66;17894:74;17891:1;17888:81;17883:1;17876:9;17869:17;17865:105;17862:131;;;17973:18;;:::i;:::-;17862:131;18021:1;18018;18014:9;18003:20;;17681:348;;;;:::o;18035:96::-;18072:7;18101:24;18119:5;18101:24;:::i;:::-;18090:35;;18035:96;;;:::o;18137:90::-;18171:7;18214:5;18207:13;18200:21;18189:32;;18137:90;;;:::o;18233:149::-;18269:7;18309:66;18302:5;18298:78;18287:89;;18233:149;;;:::o;18388:126::-;18425:7;18465:42;18458:5;18454:54;18443:65;;18388:126;;;:::o;18520:77::-;18557:7;18586:5;18575:16;;18520:77;;;:::o;18603:154::-;18687:6;18682:3;18677;18664:30;18749:1;18740:6;18735:3;18731:16;18724:27;18603:154;;;:::o;18763:307::-;18831:1;18841:113;18855:6;18852:1;18849:13;18841:113;;;18940:1;18935:3;18931:11;18925:18;18921:1;18916:3;18912:11;18905:39;18877:2;18874:1;18870:10;18865:15;;18841:113;;;18972:6;18969:1;18966:13;18963:101;;;19052:1;19043:6;19038:3;19034:16;19027:27;18963:101;18812:258;18763:307;;;:::o;19076:320::-;19120:6;19157:1;19151:4;19147:12;19137:22;;19204:1;19198:4;19194:12;19225:18;19215:81;;19281:4;19273:6;19269:17;19259:27;;19215:81;19343:2;19335:6;19332:14;19312:18;19309:38;19306:84;;;19362:18;;:::i;:::-;19306:84;19127:269;19076:320;;;:::o;19402:281::-;19485:27;19507:4;19485:27;:::i;:::-;19477:6;19473:40;19615:6;19603:10;19600:22;19579:18;19567:10;19564:34;19561:62;19558:88;;;19626:18;;:::i;:::-;19558:88;19666:10;19662:2;19655:22;19445:238;19402:281;;:::o;19689:180::-;19737:77;19734:1;19727:88;19834:4;19831:1;19824:15;19858:4;19855:1;19848:15;19875:180;19923:77;19920:1;19913:88;20020:4;20017:1;20010:15;20044:4;20041:1;20034:15;20061:180;20109:77;20106:1;20099:88;20206:4;20203:1;20196:15;20230:4;20227:1;20220:15;20247:117;20356:1;20353;20346:12;20370:117;20479:1;20476;20469:12;20493:117;20602:1;20599;20592:12;20616:117;20725:1;20722;20715:12;20739:102;20780:6;20831:2;20827:7;20822:2;20815:5;20811:14;20807:28;20797:38;;20739:102;;;:::o;20847:160::-;20987:12;20983:1;20975:6;20971:14;20964:36;20847:160;:::o;21013:162::-;21153:14;21149:1;21141:6;21137:14;21130:38;21013:162;:::o;21181:164::-;21321:16;21317:1;21309:6;21305:14;21298:40;21181:164;:::o;21351:162::-;21491:14;21487:1;21479:6;21475:14;21468:38;21351:162;:::o;21519:158::-;21659:10;21655:1;21647:6;21643:14;21636:34;21519:158;:::o;21683:165::-;21823:17;21819:1;21811:6;21807:14;21800:41;21683:165;:::o;21854:170::-;21994:22;21990:1;21982:6;21978:14;21971:46;21854:170;:::o;22030:167::-;22170:19;22166:1;22158:6;22154:14;22147:43;22030:167;:::o;22203:122::-;22276:24;22294:5;22276:24;:::i;:::-;22269:5;22266:35;22256:63;;22315:1;22312;22305:12;22256:63;22203:122;:::o;22331:116::-;22401:21;22416:5;22401:21;:::i;:::-;22394:5;22391:32;22381:60;;22437:1;22434;22427:12;22381:60;22331:116;:::o;22453:120::-;22525:23;22542:5;22525:23;:::i;:::-;22518:5;22515:34;22505:62;;22563:1;22560;22553:12;22505:62;22453:120;:::o;22579:122::-;22652:24;22670:5;22652:24;:::i;:::-;22645:5;22642:35;22632:63;;22691:1;22688;22681:12;22632:63;22579:122;:::o

Swarm Source

ipfs://52b545012a3d25e88000d3cdaba6bb0a83e8f631a620f8205f17e41f0e0cf0c2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.