ETH Price: $2,980.88 (+1.69%)
Gas: 1 Gwei

Token

INKEPASS (IPT)
 

Overview

Max Total Supply

1,111 IPT

Holders

308

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 IPT
0x2e9778ae970d4d641a59b81acf3e14015a1ea318
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

INKEPASS is the mintpass and the core membership of INKE metaverse, and the key to start the journey of INKE metaverse.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
InkePass

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 16 : InkePass.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "erc721a/contracts/ERC721A.sol";

contract InkePass is Ownable, ReentrancyGuard, Pausable, ERC721A {
    event BaseURIChanged(string url);
    event WhitelistSaleConfigChanged(WhitelistSaleConfig config, bytes32 root);
    event MerkleRootChanged(bytes32 root);
    event PublicSaleConfigChanged(PublicSaleConfig config);
    event Withdraw(address indexed account, uint256 amount);
    event Refund(address indexed account, uint256 tokenId, uint256 amount);
    event ContractSealed();

    /**
     * @notice for security reasons, CA is not allowed to call sensitive methods.
     */
    modifier callerIsUser() {
        require(tx.origin == _msgSender(), "caller is another contract");
        _;
    }

    /**
     * @notice function call is only allowed when the contract has not been sealed
     */
    modifier notSealed() {
        require(!contractSealed, "contract sealed");
        _;
    }

    struct WhitelistSaleConfig {
        uint64 mintQuota;           // whitelist allow mint quota
        uint256 firstStartTime;     // first start time
        uint256 firstEndTime;       // first end time
        uint256 secondStartTime;    // second start time
        uint256 secondEndTime;      // second end time
        uint256 price;              // sale price, Unit: wei
    }

    struct PublicSaleConfig {
        uint256 startTime;
        uint256 price;
    }

    bool public contractSealed = false;

    WhitelistSaleConfig public whitelistSaleConfig;
    PublicSaleConfig public publicSaleConfig;
    bytes32 public merkleRoot;                      // merkle root for whitelist checking
    uint64 public maxSupply = 1;                    // The maximum number of tokens in this total mint
    uint64 public saleSupply = 1;                   // The maximum number of tokens in this sale mint
    uint64 public selfSupply = 1;                   // The maximum number of tokens in this self mint
    uint64 public selfMinted = 0;                   // The self minted number of tokens
    string public preURI = "";                      // The NFT base uri

    // mint State Variables
    mapping(uint256=>uint256) tokenSalePrices; // Token price map

    // refund config
    uint256 public constant refundPeriod = 30 days; // Refund period
    address public refundAddress;
    // refund State Variables
    mapping(uint256 => bool) public hasRefunded;    // One token can only be refunded once

    constructor(uint64 saleSupply_, uint64 selfSupply_, string memory url_) ERC721A("INKEPASS", "IPT") {
        saleSupply = saleSupply + saleSupply_;
        selfSupply = selfSupply + selfSupply_;
        maxSupply = maxSupply + saleSupply_ + selfSupply_; // value = 1 + origin value
        preURI = url_;

        refundAddress = msg.sender;
    }

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

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

    function setBaseURI(string calldata url_) external onlyOwner {
        preURI = url_;
        emit BaseURIChanged(url_);
    }

    function totalMinted() public view returns (uint256) {
        return _totalMinted();
    }
    function totalSale() public view returns (uint256) {
        return _totalMinted() - selfMinted;
    }

    /***********************************|
    |               Config              |
    |__________________________________*/

    // whitelist sale config
    function isWhitelistAddress(address address_, bytes32[] calldata signature_) public view returns (bool) {
        if (merkleRoot == "") {
            return false;
        }
        return MerkleProof.verify(
            signature_,
            merkleRoot,
            keccak256(abi.encodePacked(address_))
        );
    }

    function isWhitelistSaleEnabled() public view returns (bool) {
        return isFirstWhitelistSaleEnabled() || isSecondWhitelistSaleEnabled();
    }

    // first whitelist sale
    function isFirstWhitelistSaleEnabled() public view returns (bool) {
        if (whitelistSaleConfig.firstEndTime > 0 && block.timestamp > whitelistSaleConfig.firstEndTime) {
            return false;
        }
        return whitelistSaleConfig.firstStartTime > 0 &&
        block.timestamp > whitelistSaleConfig.firstStartTime &&
        whitelistSaleConfig.price > 0 &&
        merkleRoot != "";
    }

    // second whitelist sale
    function isSecondWhitelistSaleEnabled() public view returns (bool) {
        if (whitelistSaleConfig.secondEndTime > 0 && block.timestamp > whitelistSaleConfig.secondEndTime) {
            return false;
        }
        return whitelistSaleConfig.secondStartTime > 0
        && block.timestamp > whitelistSaleConfig.secondStartTime &&
        whitelistSaleConfig.price > 0 &&
        merkleRoot != "";
    }

    function getWhitelistSalePrice() public view returns (uint256) {
        return whitelistSaleConfig.price;
    }

    function setWhitelistSaleConfig(WhitelistSaleConfig calldata config_, bytes32 root_) external onlyOwner {
        require(config_.price > 0, "sale price must greater than zero");
        whitelistSaleConfig = config_;
        merkleRoot = root_;
        emit WhitelistSaleConfigChanged(config_, root_);
    }

    function setMerkleRoot(bytes32 root_) external onlyOwner {
        merkleRoot = root_;
        emit MerkleRootChanged(root_);
    }

    // public sale config
    function isPublicSaleEnabled() public view returns (bool) {
        return publicSaleConfig.startTime > 0 &&
        block.timestamp > publicSaleConfig.startTime &&
        publicSaleConfig.price > 0;
    }

    function getPublicSalePrice() public view returns (uint256) {
        return publicSaleConfig.price;
    }

    function setPublicSaleConfig(PublicSaleConfig calldata config_) external onlyOwner {
        require(config_.price > 0, "sale price must greater than zero");
        publicSaleConfig = config_;
        emit PublicSaleConfigChanged(config_);
    }

    // refund config
    function isRefundEnabled() public view returns (bool) {
        return isPublicSaleEnabled() &&
            block.timestamp < publicSaleConfig.startTime + refundPeriod;
    }
    function setRefundAddress(address refundAddress_) external onlyOwner {
        refundAddress = refundAddress_;
    }

    /***********************************|
    |               Core                |
    |__________________________________*/

    // The maximum number of mint tokens allowed selfSupply
    function selfMint(uint64 numberOfTokens_) external onlyOwner nonReentrant {
        require(numberOfTokens_ > 0, "invalid number of tokens");
        require(numberOfTokens_ < selfSupply, "can only mint max self supply at a time");
        uint64 nextMinted = selfMinted + numberOfTokens_;
        require(nextMinted < selfSupply, "max self supply exceeded");
        _mint(_msgSender(), numberOfTokens_);
        selfMinted = nextMinted;
    }

    // Only one token can be mint at a time
    function whitelistSale(bytes32[] calldata signature_) external payable callerIsUser nonReentrant {
        require(isWhitelistSaleEnabled(), "whitelist sale has not enabled");
        require(isWhitelistAddress(_msgSender(), signature_), "caller is not in whitelist or invalid signature");
        require(_getAux(_msgSender()) < 1, "max mint 1 amount for per wallet exceeded");
        require(totalMinted() < whitelistSaleConfig.mintQuota + selfMinted, "max mint amount for whitelist exceeded");
        _sale(1, getWhitelistSalePrice());
        _setAux(_msgSender(), 1);
    }

    function publicSale(uint64 numberOfTokens_) external payable callerIsUser nonReentrant {
        require(isPublicSaleEnabled(), "public sale has not enabled");
        _sale(numberOfTokens_, getPublicSalePrice());
    }

    function refund(uint256 tokenId) external callerIsUser nonReentrant {
        require(msg.sender == ownerOf(tokenId), "Not token owner");
        require(!hasRefunded[tokenId], "Already refunded");
        require(isRefundEnabled(), "Outside the refundable period");
        uint256 tokenPrice = tokenSalePrices[tokenId];
        require(tokenPrice > 0, "Not sale token");
        transferFrom(msg.sender, refundAddress, tokenId);
        Address.sendValue(payable(msg.sender), tokenPrice);
        hasRefunded[tokenId] = true;
        emit Refund(_msgSender(), tokenId, tokenPrice);
    }

    // The maximum number of mint tokens allowed 2 per/token
    // The maximum number of mint tokens allowed saleSupply
    function _sale(uint64 numberOfTokens_, uint256 price_) internal {
        require(numberOfTokens_ > 0, "invalid number of tokens");
        require(numberOfTokens_ < 3, "can only mint 2 tokens at a time");
        require(totalMinted() + numberOfTokens_ < saleSupply + selfMinted, "max sale supply exceeded");
        uint256 amount = price_ * numberOfTokens_;
        require(amount <= msg.value, "ether value sent is not correct");
        _safeMint(_msgSender(), numberOfTokens_);
        _setSaleState(numberOfTokens_, price_);
        refundExcessPayment(amount);
    }
    function _setSaleState(uint256 numberOfTokens_, uint256 price_) internal{
        if (numberOfTokens_ == 1) {
            tokenSalePrices[totalMinted()] = price_;
        } else {
            tokenSalePrices[totalMinted()] = price_;
            tokenSalePrices[totalMinted()-1] = price_;
        }
    }

    /**
     * @notice when the amount paid by the user exceeds the actual need, the refund logic will be executed.
     * @param amount_ the actual amount that should be paid
     */
    function refundExcessPayment(uint256 amount_) private {
        if (msg.value > amount_) {
            payable(_msgSender()).transfer(msg.value - amount_);
        }
    }

    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        payable(_msgSender()).transfer(balance);
        emit Withdraw(_msgSender(), balance);
    }

    /***********************************|
    |               Pause               |
    |__________________________________*/

    /**
     * @notice hook function, used to intercept the transfer of token.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override {
        super._beforeTokenTransfers(from, to, startTokenId, quantity);
        require(!paused(), "token transfer paused");
    }

    /**
     * @notice for the purpose of protecting user assets, under extreme conditions,
     * the circulation of all tokens in the contract needs to be frozen.
     * This process is under the supervision of the community.
     */
    function emergencyPause() external onlyOwner notSealed {
        _pause();
    }

    /**
     * @notice unpause the contract
     */
    function unpause() external onlyOwner notSealed {
        _unpause();
    }

    /**
     * @notice when the project is stable enough, the issuer will call sealContract
     * to give up the permission to call emergencyPause and unpause.
     */
    function sealContract() external onlyOwner {
        contractSealed = true;
        emit ContractSealed();
    }
}

File 2 of 16 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

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

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

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

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

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

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

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

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

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

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Returns the auxillary 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

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

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

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

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

File 3 of 16 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 4 of 16 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     * @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, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 5 of 16 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 6 of 16 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 7 of 16 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

File 8 of 16 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 16 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 10 of 16 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 11 of 16 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 12 of 16 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 13 of 16 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}

File 14 of 16 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 15 of 16 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 16 of 16 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint64","name":"saleSupply_","type":"uint64"},{"internalType":"uint64","name":"selfSupply_","type":"uint64"},{"internalType":"string","name":"url_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":false,"internalType":"string","name":"url","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractSealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"MerkleRootChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"indexed":false,"internalType":"struct InkePass.PublicSaleConfig","name":"config","type":"tuple"}],"name":"PublicSaleConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refund","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"mintQuota","type":"uint64"},{"internalType":"uint256","name":"firstStartTime","type":"uint256"},{"internalType":"uint256","name":"firstEndTime","type":"uint256"},{"internalType":"uint256","name":"secondStartTime","type":"uint256"},{"internalType":"uint256","name":"secondEndTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"indexed":false,"internalType":"struct InkePass.WhitelistSaleConfig","name":"config","type":"tuple"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"WhitelistSaleConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyPause","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":[],"name":"getPublicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hasRefunded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFirstWhitelistSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRefundEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSecondWhitelistSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"signature_","type":"bytes32[]"}],"name":"isWhitelistAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"numberOfTokens_","type":"uint64"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sealContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"numberOfTokens_","type":"uint64"}],"name":"selfMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selfMinted","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"selfSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct InkePass.PublicSaleConfig","name":"config_","type":"tuple"}],"name":"setPublicSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"refundAddress_","type":"address"}],"name":"setRefundAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"mintQuota","type":"uint64"},{"internalType":"uint256","name":"firstStartTime","type":"uint256"},{"internalType":"uint256","name":"firstEndTime","type":"uint256"},{"internalType":"uint256","name":"secondStartTime","type":"uint256"},{"internalType":"uint256","name":"secondEndTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct InkePass.WhitelistSaleConfig","name":"config_","type":"tuple"},{"internalType":"bytes32","name":"root_","type":"bytes32"}],"name":"setWhitelistSaleConfig","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"signature_","type":"bytes32[]"}],"name":"whitelistSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSaleConfig","outputs":[{"internalType":"uint64","name":"mintQuota","type":"uint64"},{"internalType":"uint256","name":"firstStartTime","type":"uint256"},{"internalType":"uint256","name":"firstEndTime","type":"uint256"},{"internalType":"uint256","name":"secondStartTime","type":"uint256"},{"internalType":"uint256","name":"secondEndTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600b805460ff1916905570010000000000000001000000000000000160155560a06040819052600060808190526200003a9160169162000258565b503480156200004857600080fd5b5060405162003576380380620035768339810160408190526200006b9162000331565b60405180604001604052806008815260200167494e4b455041535360c01b8152506040518060400160405280600381526020016212541560ea1b815250620000c2620000bc6200020460201b60201c565b62000208565b600180556002805460ff191690558151620000e590600590602085019062000258565b508051620000fb90600690602084019062000258565b5060016003555050601554620001289084906801000000000000000090046001600160401b031662000435565b60158054600160401b600160801b031916680100000000000000006001600160401b0393841602179081905562000169918491600160801b90041662000435565b601580546001600160401b03928316600160801b02600160801b600160c01b0319821681179092558492620001a692879290821691161762000435565b620001b2919062000435565b601580546001600160401b0319166001600160401b03929092169190911790558051620001e790601690602084019062000258565b5050601880546001600160a01b0319163317905550620004ab9050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000266906200046f565b90600052602060002090601f0160209004810192826200028a5760008555620002d5565b82601f10620002a557805160ff1916838001178555620002d5565b82800160010185558215620002d5579182015b82811115620002d5578251825591602001919060010190620002b8565b50620002e3929150620002e7565b5090565b5b80821115620002e35760008155600101620002e8565b80516001600160401b03811681146200031657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156200034757600080fd5b6200035284620002fe565b9250602062000363818601620002fe565b60408601519093506001600160401b03808211156200038157600080fd5b818701915087601f8301126200039657600080fd5b815181811115620003ab57620003ab6200031b565b604051601f8201601f19908116603f01168101908382118183101715620003d657620003d66200031b565b816040528281528a86848701011115620003ef57600080fd5b600093505b82841015620004135784840186015181850187015292850192620003f4565b82841115620004255760008684830101525b8096505050505050509250925092565b60006001600160401b038281168482168083038211156200046657634e487b7160e01b600052601160045260246000fd5b01949350505050565b600181811c908216806200048457607f821691505b602082108103620004a557634e487b7160e01b600052602260045260246000fd5b50919050565b6130bb80620004bb6000396000f3fe6080604052600436106103195760003560e01c80638746475a116101ab578063bba9aa51116100f7578063d5abeb0111610095578063ea4ce2391161006f578063ea4ce2391461096b578063ecbd68df14610980578063f2fde38b14610995578063f73e16e6146109b557600080fd5b8063d5abeb01146108ef578063e2bb193a1461090f578063e985e9c51461092257600080fd5b8063c87b56dd116100d1578063c87b56dd14610861578063caeff92b14610881578063d41da0e0146108a8578063d53ed300146108c857600080fd5b8063bba9aa5114610807578063bd28c3541461081c578063c23fcdef1461083157600080fd5b8063a3fd2c4411610164578063b65016371161013e578063b65016371461079a578063b87ced4e146107b4578063b88d4fde146107d4578063ba0987b7146107f457600080fd5b8063a3fd2c4414610714578063a6a3b5b414610744578063a96af0f41461075b57600080fd5b80638746475a146106825780638da5cb5b146106975780638e8bdd0d146106b557806395d89b41146106ca578063a22cb465146106df578063a2309ff8146106ff57600080fd5b80633f4ba83a1161026a5780635c975abb1161022357806368bd580e116101fd57806368bd580e1461061857806370a082311461062d578063715018a61461064d5780637cb647591461066257600080fd5b80635c975abb146105755780636352211e1461058d578063656cf918146105ad57600080fd5b80633f4ba83a146104d65780634009920d146104eb57806342842e0e146105005780635089fec31461052057806351858e271461054057806355f804b31461055557600080fd5b806315b75bea116102d757806323b872dd116102b157806323b872dd1461046b578063278ecde11461048b5780632eb4a7ab146104ab5780633ccfd60b146104c157600080fd5b806315b75bea1461040457806318160ddd14610424578063205b18341461044b57600080fd5b8062f2be341461031e57806301ffc9a71461034857806306fdde0314610368578063081812fc1461038a578063095ea7b3146103c25780630cb61f6c146103e4575b600080fd5b34801561032a57600080fd5b506103336109ca565b60405190151581526020015b60405180910390f35b34801561035457600080fd5b506103336103633660046128c2565b610a1b565b34801561037457600080fd5b5061037d610a6d565b60405161033f9190612937565b34801561039657600080fd5b506103aa6103a536600461294a565b610aff565b6040516001600160a01b03909116815260200161033f565b3480156103ce57600080fd5b506103e26103dd36600461297f565b610b43565b005b3480156103f057600080fd5b506018546103aa906001600160a01b031681565b34801561041057600080fd5b506103e261041f3660046129a9565b610c15565b34801561043057600080fd5b5060045460035403600019015b60405190815260200161033f565b34801561045757600080fd5b506103e26104663660046129d9565b610c6a565b34801561047757600080fd5b506103e26104863660046129f6565b610e4a565b34801561049757600080fd5b506103e26104a636600461294a565b610e5a565b3480156104b757600080fd5b5061043d60145481565b3480156104cd57600080fd5b506103e2611083565b3480156104e257600080fd5b506103e2611140565b3480156104f757600080fd5b506103336111b9565b34801561050c57600080fd5b506103e261051b3660046129f6565b6111de565b34801561052c57600080fd5b506103e261053b366004612a32565b6111f9565b34801561054c57600080fd5b506103e2611299565b34801561056157600080fd5b506103e2610570366004612a63565b611310565b34801561058157600080fd5b5060025460ff16610333565b34801561059957600080fd5b506103aa6105a836600461294a565b611378565b3480156105b957600080fd5b50600c54600d54600e54600f546010546011546105e1956001600160401b0316949392919086565b604080516001600160401b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161033f565b34801561062457600080fd5b506103e2611383565b34801561063957600080fd5b5061043d6106483660046129a9565b6113e5565b34801561065957600080fd5b506103e2611433565b34801561066e57600080fd5b506103e261067d36600461294a565b611467565b34801561068e57600080fd5b506103336114cd565b3480156106a357600080fd5b506000546001600160a01b03166103aa565b3480156106c157600080fd5b5060135461043d565b3480156106d657600080fd5b5061037d6114f6565b3480156106eb57600080fd5b506103e26106fa366004612ad4565b611505565b34801561070b57600080fd5b5061043d61159a565b34801561072057600080fd5b5060125460135461072f919082565b6040805192835260208301919091520161033f565b34801561075057600080fd5b5061043d62278d0081565b34801561076757600080fd5b5060155461078290600160401b90046001600160401b031681565b6040516001600160401b03909116815260200161033f565b3480156107a657600080fd5b50600b546103339060ff1681565b3480156107c057600080fd5b506103e26107cf366004612b10565b6115a9565b3480156107e057600080fd5b506103e26107ef366004612b3e565b61163c565b6103e2610802366004612c64565b611686565b34801561081357600080fd5b5061037d6118e8565b34801561082857600080fd5b5060115461043d565b34801561083d57600080fd5b5061033361084c36600461294a565b60196020526000908152604090205460ff1681565b34801561086d57600080fd5b5061037d61087c36600461294a565b611976565b34801561088d57600080fd5b5060155461078290600160c01b90046001600160401b031681565b3480156108b457600080fd5b506103336108c3366004612ca5565b6119fa565b3480156108d457600080fd5b5060155461078290600160801b90046001600160401b031681565b3480156108fb57600080fd5b50601554610782906001600160401b031681565b6103e261091d3660046129d9565b611a8c565b34801561092e57600080fd5b5061033361093d366004612cf7565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b34801561097757600080fd5b5061043d611b3a565b34801561098c57600080fd5b50610333611b67565b3480156109a157600080fd5b506103e26109b03660046129a9565b611b7f565b3480156109c157600080fd5b50610333611c1a565b601054600090158015906109df575060105442115b156109ea5750600090565b600f54158015906109fc5750600f5442115b8015610a09575060115415155b8015610a16575060145415155b905090565b60006301ffc9a760e01b6001600160e01b031983161480610a4c57506380ac58cd60e01b6001600160e01b03198316145b80610a675750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060058054610a7c90612d2a565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa890612d2a565b8015610af55780601f10610aca57610100808354040283529160200191610af5565b820191906000526020600020905b815481529060010190602001808311610ad857829003601f168201915b5050505050905090565b6000610b0a82611c67565b610b27576040516333d1c03960e21b815260040160405180910390fd5b506000908152600960205260409020546001600160a01b031690565b6000610b4e82611c9c565b9050806001600160a01b0316836001600160a01b031603610b825760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610bb957610b9c813361093d565b610bb9576040516367d9dca160e11b815260040160405180910390fd5b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000546001600160a01b03163314610c485760405162461bcd60e51b8152600401610c3f90612d5e565b60405180910390fd5b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c945760405162461bcd60e51b8152600401610c3f90612d5e565b600260015403610cb65760405162461bcd60e51b8152600401610c3f90612d93565b60026001556001600160401b038116610d0c5760405162461bcd60e51b8152602060048201526018602482015277696e76616c6964206e756d626572206f6620746f6b656e7360401b6044820152606401610c3f565b6015546001600160401b03600160801b909104811690821610610d815760405162461bcd60e51b815260206004820152602760248201527f63616e206f6e6c79206d696e74206d61782073656c6620737570706c7920617460448201526620612074696d6560c81b6064820152608401610c3f565b601554600090610da2908390600160c01b90046001600160401b0316612de0565b6015549091506001600160401b03600160801b909104811690821610610e0a5760405162461bcd60e51b815260206004820152601860248201527f6d61782073656c6620737570706c7920657863656564656400000000000000006044820152606401610c3f565b610e1d33836001600160401b0316611d0b565b601580546001600160401b03909216600160c01b026001600160c01b039092169190911790555060018055565b610e55838383611de7565b505050565b323314610e795760405162461bcd60e51b8152600401610c3f90612e0b565b600260015403610e9b5760405162461bcd60e51b8152600401610c3f90612d93565b6002600155610ea981611378565b6001600160a01b0316336001600160a01b031614610efb5760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b6044820152606401610c3f565b60008181526019602052604090205460ff1615610f4d5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c99599d5b99195960821b6044820152606401610c3f565b610f556114cd565b610fa15760405162461bcd60e51b815260206004820152601d60248201527f4f7574736964652074686520726566756e6461626c6520706572696f640000006044820152606401610c3f565b60008181526017602052604090205480610fee5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1039b0b632903a37b5b2b760911b6044820152606401610c3f565b6018546110069033906001600160a01b031684610e4a565b6110103382611f89565b6000828152601960205260409020805460ff191660011790556110303390565b6001600160a01b03167f73f04af9dcc582a923ec15d3eea990fe34adabfff2879e28d44572e01a54abb68383604051611073929190918252602082015260400190565b60405180910390a2505060018055565b6000546001600160a01b031633146110ad5760405162461bcd60e51b8152600401610c3f90612d5e565b6002600154036110cf5760405162461bcd60e51b8152600401610c3f90612d93565b60026001556040514790339082156108fc029083906000818181858888f19350505050158015611103573d6000803e3d6000fd5b5060405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25060018055565b6000546001600160a01b0316331461116a5760405162461bcd60e51b8152600401610c3f90612d5e565b600b5460ff16156111af5760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610c3f565b6111b76120a2565b565b601254600090158015906111ce575060125442115b8015610a16575050601354151590565b610e558383836040518060200160405280600081525061163c565b6000546001600160a01b031633146112235760405162461bcd60e51b8152600401610c3f90612d5e565b60008260a00135116112475760405162461bcd60e51b8152600401610c3f90612e42565b81600c6112548282612e83565b505060148190556040517fd8aacc5a686ce0c56b1887495e7757a190b4826f1a2364e0b384638695dc01989061128d9084908490612ede565b60405180910390a15050565b6000546001600160a01b031633146112c35760405162461bcd60e51b8152600401610c3f90612d5e565b600b5460ff16156113085760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610c3f565b6111b7612135565b6000546001600160a01b0316331461133a5760405162461bcd60e51b8152600401610c3f90612d5e565b61134660168383612813565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6828260405161128d929190612f39565b6000610a6782611c9c565b6000546001600160a01b031633146113ad5760405162461bcd60e51b8152600401610c3f90612d5e565b600b805460ff191660011790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b60006001600160a01b03821661140e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600860205260409020546001600160401b031690565b6000546001600160a01b0316331461145d5760405162461bcd60e51b8152600401610c3f90612d5e565b6111b760006121b0565b6000546001600160a01b031633146114915760405162461bcd60e51b8152600401610c3f90612d5e565b60148190556040518181527f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c906020015b60405180910390a150565b60006114d76111b9565b8015610a1657506012546114ef9062278d0090612f68565b4210905090565b606060068054610a7c90612d2a565b336001600160a01b0383160361152e5760405163b06307db60e01b815260040160405180910390fd5b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610a166003546000190190565b6000546001600160a01b031633146115d35760405162461bcd60e51b8152600401610c3f90612d5e565b60008160200135116115f75760405162461bcd60e51b8152600401610c3f90612e42565b80356012819055602080830135601381905560408051938452918301527fd815bc9e7873606b1c4c2c8ea805b2b430b0c53a00235c5011043d6c486753dc91016114c2565b611647848484611de7565b6001600160a01b0383163b156116805761166384848484612200565b611680576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b3233146116a55760405162461bcd60e51b8152600401610c3f90612e0b565b6002600154036116c75760405162461bcd60e51b8152600401610c3f90612d93565b60026001556116d4611b67565b6117205760405162461bcd60e51b815260206004820152601e60248201527f77686974656c6973742073616c6520686173206e6f7420656e61626c656400006044820152606401610c3f565b61172b3383836119fa565b61178f5760405162461bcd60e51b815260206004820152602f60248201527f63616c6c6572206973206e6f7420696e2077686974656c697374206f7220696e60448201526e76616c6964207369676e617475726560881b6064820152608401610c3f565b3360009081526008602052604090205460019060c01c6001600160401b03161061180d5760405162461bcd60e51b815260206004820152602960248201527f6d6178206d696e74203120616d6f756e7420666f72207065722077616c6c657460448201526808195e18d95959195960ba1b6064820152608401610c3f565b601554600c54611830916001600160401b03600160c01b90910481169116612de0565b6001600160401b031661184161159a565b1061189d5760405162461bcd60e51b815260206004820152602660248201527f6d6178206d696e7420616d6f756e7420666f722077686974656c69737420657860448201526518d95959195960d21b6064820152608401610c3f565b6118b060016118ab60115490565b6122eb565b6118e0336001600160a01b0316600090815260086020526040902080546001600160c01b0316600160c01b179055565b505060018055565b601680546118f590612d2a565b80601f016020809104026020016040519081016040528092919081815260200182805461192190612d2a565b801561196e5780601f106119435761010080835404028352916020019161196e565b820191906000526020600020905b81548152906001019060200180831161195157829003601f168201915b505050505081565b606061198182611c67565b61199e57604051630a14c4b560e41b815260040160405180910390fd5b60006119a86124c6565b905080516000036119c857604051806020016040528060008152506119f3565b806119d2846124d5565b6040516020016119e3929190612f80565b6040516020818303038152906040525b9392505050565b6000601454600003611a0e575060006119f3565b611a84838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506014546040516bffffffffffffffffffffffff1960608b901b166020820152909250603401905060405160208183030381529060405280519060200120612524565b949350505050565b323314611aab5760405162461bcd60e51b8152600401610c3f90612e0b565b600260015403611acd5760405162461bcd60e51b8152600401610c3f90612d93565b6002600155611ada6111b9565b611b265760405162461bcd60e51b815260206004820152601b60248201527f7075626c69632073616c6520686173206e6f7420656e61626c656400000000006044820152606401610c3f565b611b33816118ab60135490565b5060018055565b601554600090600160c01b90046001600160401b0316611b5d6003546000190190565b610a169190612fa6565b6000611b71611c1a565b80610a165750610a166109ca565b6000546001600160a01b03163314611ba95760405162461bcd60e51b8152600401610c3f90612d5e565b6001600160a01b038116611c0e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c3f565b611c17816121b0565b50565b600e5460009015801590611c2f5750600e5442115b15611c3a5750600090565b600d54158015906109fc5750600d5442118015610a09575060115415158015610a16575050601454151590565b600081600111158015611c7b575060035482105b8015610a67575050600090815260076020526040902054600160e01b161590565b60008180600111611cf257600354811015611cf25760008181526007602052604081205490600160e01b82169003611cf0575b806000036119f3575060001901600081815260076020526040902054611ccf565b505b604051636f96cda160e11b815260040160405180910390fd5b6003546001600160a01b038316611d3457604051622e076360e81b815260040160405180910390fd5b81600003611d555760405163b562e8dd60e01b815260040160405180910390fd5b611d62600084838561253a565b6001600160a01b03831660009081526008602090815260408083208054680100000000000000018702019055838352600790915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b03871690600090600080516020613066833981519152908290a4808210611dad5750600355505050565b6000611df282611c9c565b9050836001600160a01b0316816001600160a01b031614611e255760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611e435750611e43853361093d565b80611e5e575033611e5384610aff565b6001600160a01b0316145b905080611e7e57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611ea557604051633a954ecd60e21b815260040160405180910390fd5b611eb2858585600161253a565b600083815260096020908152604080832080546001600160a01b03191690556001600160a01b038881168452600883528184208054600019019055871683528083208054600101905585835260079091528120600160e11b4260a01b8717811790915583169003611f5357600183016000818152600760205260408120549003611f51576003548114611f515760008181526007602052604090208390555b505b82846001600160a01b0316866001600160a01b031660008051602061306683398151915260405160405180910390a45050505050565b80471015611fd95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c3f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612026576040519150601f19603f3d011682016040523d82523d6000602084013e61202b565b606091505b5050905080610e555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c3f565b60025460ff166120eb5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c3f565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60025460ff161561217b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c3f565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121183390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612235903390899088908890600401612fbd565b6020604051808303816000875af1925050508015612270575060408051601f3d908101601f1916820190925261226d91810190612ffa565b60015b6122ce573d80801561229e576040519150601f19603f3d011682016040523d82523d6000602084013e6122a3565b606091505b5080516000036122c6576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000826001600160401b03161161233f5760405162461bcd60e51b8152602060048201526018602482015277696e76616c6964206e756d626572206f6620746f6b656e7360401b6044820152606401610c3f565b6003826001600160401b0316106123985760405162461bcd60e51b815260206004820181905260248201527f63616e206f6e6c79206d696e74203220746f6b656e7320617420612074696d656044820152606401610c3f565b6015546123be906001600160401b03600160c01b8204811691600160401b900416612de0565b6001600160401b0316826001600160401b03166123d961159a565b6123e39190612f68565b106124305760405162461bcd60e51b815260206004820152601860248201527f6d61782073616c6520737570706c7920657863656564656400000000000000006044820152606401610c3f565b60006124456001600160401b03841683613017565b9050348111156124975760405162461bcd60e51b815260206004820152601f60248201527f65746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610c3f565b6124aa33846001600160401b0316612585565b6124bd836001600160401b0316836125a3565b610e5581612605565b606060168054610a7c90612d2a565b604080516080810191829052607f0190826030600a8206018353600a90045b801561251257600183039250600a81066030018353600a90046124f4565b50819003601f19909101908152919050565b6000826125318584612643565b14949350505050565b60025460ff16156116805760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c881c185d5cd959605a1b6044820152606401610c3f565b61259f8282604051806020016040528060008152506126b7565b5050565b816001036125cd5780601760006125b861159a565b81526020810191909152604001600020555050565b80601760006125da61159a565b815260200190815260200160002081905550806017600060016125fb61159a565b6125b89190612fa6565b80341115611c1757336108fc61261b8334612fa6565b6040518115909202916000818181858888f1935050505015801561259f573d6000803e3d6000fd5b600081815b84518110156126af57600085828151811061266557612665613036565b6020026020010151905080831161268b576000838152602082905260409020925061269c565b600081815260208490526040902092505b50806126a78161304c565b915050612648565b509392505050565b6003546001600160a01b0384166126e057604051622e076360e81b815260040160405180910390fd5b826000036127015760405163b562e8dd60e01b815260040160405180910390fd5b61270e600085838661253a565b6001600160a01b03841660008181526008602090815260408083208054680100000000000000018902019055848352600790915290204260a01b86176001861460e11b1790558190818501903b156127d1575b60405182906001600160a01b03881690600090600080516020613066833981519152908290a461279a6000878480600101955087612200565b6127b7576040516368d2bf6b60e11b815260040160405180910390fd5b8082106127615782600354146127cc57600080fd5b612804565b5b6040516001830192906001600160a01b03881690600090600080516020613066833981519152908290a48082106127d2575b50600355611680600085838684565b82805461281f90612d2a565b90600052602060002090601f0160209004810192826128415760008555612887565b82601f1061285a5782800160ff19823516178555612887565b82800160010185558215612887579182015b8281111561288757823582559160200191906001019061286c565b50612893929150612897565b5090565b5b808211156128935760008155600101612898565b6001600160e01b031981168114611c1757600080fd5b6000602082840312156128d457600080fd5b81356119f3816128ac565b60005b838110156128fa5781810151838201526020016128e2565b838111156116805750506000910152565b600081518084526129238160208601602086016128df565b601f01601f19169290920160200192915050565b6020815260006119f3602083018461290b565b60006020828403121561295c57600080fd5b5035919050565b80356001600160a01b038116811461297a57600080fd5b919050565b6000806040838503121561299257600080fd5b61299b83612963565b946020939093013593505050565b6000602082840312156129bb57600080fd5b6119f382612963565b6001600160401b0381168114611c1757600080fd5b6000602082840312156129eb57600080fd5b81356119f3816129c4565b600080600060608486031215612a0b57600080fd5b612a1484612963565b9250612a2260208501612963565b9150604084013590509250925092565b60008082840360e0811215612a4657600080fd5b60c0811215612a5457600080fd5b50919360c08501359350915050565b60008060208385031215612a7657600080fd5b82356001600160401b0380821115612a8d57600080fd5b818501915085601f830112612aa157600080fd5b813581811115612ab057600080fd5b866020828501011115612ac257600080fd5b60209290920196919550909350505050565b60008060408385031215612ae757600080fd5b612af083612963565b915060208301358015158114612b0557600080fd5b809150509250929050565b600060408284031215612b2257600080fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612b5457600080fd5b612b5d85612963565b9350612b6b60208601612963565b92506040850135915060608501356001600160401b0380821115612b8e57600080fd5b818701915087601f830112612ba257600080fd5b813581811115612bb457612bb4612b28565b604051601f8201601f19908116603f01168101908382118183101715612bdc57612bdc612b28565b816040528281528a6020848701011115612bf557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008083601f840112612c2b57600080fd5b5081356001600160401b03811115612c4257600080fd5b6020830191508360208260051b8501011115612c5d57600080fd5b9250929050565b60008060208385031215612c7757600080fd5b82356001600160401b03811115612c8d57600080fd5b612c9985828601612c19565b90969095509350505050565b600080600060408486031215612cba57600080fd5b612cc384612963565b925060208401356001600160401b03811115612cde57600080fd5b612cea86828701612c19565b9497909650939450505050565b60008060408385031215612d0a57600080fd5b612d1383612963565b9150612d2160208401612963565b90509250929050565b600181811c90821680612d3e57607f821691505b602082108103612b2257634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b03808316818516808303821115612e0257612e02612dca565b01949350505050565b6020808252601a908201527f63616c6c657220697320616e6f7468657220636f6e7472616374000000000000604082015260600190565b60208082526021908201527f73616c65207072696365206d7573742067726561746572207468616e207a65726040820152606f60f81b606082015260800190565b8135612e8e816129c4565b6001600160401b0381166001600160401b0319835416178255506020820135600182015560408201356002820155606082013560038201556080820135600482015560a082013560058201555050565b60e081018335612eed816129c4565b6001600160401b0381168352506020840135602083015260408401356040830152606084013560608301526080840135608083015260a084013560a08301528260c08301529392505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60008219821115612f7b57612f7b612dca565b500190565b60008351612f928184602088016128df565b835190830190612e028183602088016128df565b600082821015612fb857612fb8612dca565b500390565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ff09083018461290b565b9695505050505050565b60006020828403121561300c57600080fd5b81516119f3816128ac565b600081600019048311821515161561303157613031612dca565b500290565b634e487b7160e01b600052603260045260246000fd5b60006001820161305e5761305e612dca565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204abf11f01fec535bb51cacb6ccaf2e3f9631b214dd9489eb3d839203270abe7a64736f6c634300080e003300000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000005868747470733a2f2f6261667962656962626f683334706b64626c746c6163666d76657863766a786b6568623676757568726a686d6a696f6477663333726833683577692e697066732e696e667572612d697066732e696f2f0000000000000000

Deployed Bytecode

0x6080604052600436106103195760003560e01c80638746475a116101ab578063bba9aa51116100f7578063d5abeb0111610095578063ea4ce2391161006f578063ea4ce2391461096b578063ecbd68df14610980578063f2fde38b14610995578063f73e16e6146109b557600080fd5b8063d5abeb01146108ef578063e2bb193a1461090f578063e985e9c51461092257600080fd5b8063c87b56dd116100d1578063c87b56dd14610861578063caeff92b14610881578063d41da0e0146108a8578063d53ed300146108c857600080fd5b8063bba9aa5114610807578063bd28c3541461081c578063c23fcdef1461083157600080fd5b8063a3fd2c4411610164578063b65016371161013e578063b65016371461079a578063b87ced4e146107b4578063b88d4fde146107d4578063ba0987b7146107f457600080fd5b8063a3fd2c4414610714578063a6a3b5b414610744578063a96af0f41461075b57600080fd5b80638746475a146106825780638da5cb5b146106975780638e8bdd0d146106b557806395d89b41146106ca578063a22cb465146106df578063a2309ff8146106ff57600080fd5b80633f4ba83a1161026a5780635c975abb1161022357806368bd580e116101fd57806368bd580e1461061857806370a082311461062d578063715018a61461064d5780637cb647591461066257600080fd5b80635c975abb146105755780636352211e1461058d578063656cf918146105ad57600080fd5b80633f4ba83a146104d65780634009920d146104eb57806342842e0e146105005780635089fec31461052057806351858e271461054057806355f804b31461055557600080fd5b806315b75bea116102d757806323b872dd116102b157806323b872dd1461046b578063278ecde11461048b5780632eb4a7ab146104ab5780633ccfd60b146104c157600080fd5b806315b75bea1461040457806318160ddd14610424578063205b18341461044b57600080fd5b8062f2be341461031e57806301ffc9a71461034857806306fdde0314610368578063081812fc1461038a578063095ea7b3146103c25780630cb61f6c146103e4575b600080fd5b34801561032a57600080fd5b506103336109ca565b60405190151581526020015b60405180910390f35b34801561035457600080fd5b506103336103633660046128c2565b610a1b565b34801561037457600080fd5b5061037d610a6d565b60405161033f9190612937565b34801561039657600080fd5b506103aa6103a536600461294a565b610aff565b6040516001600160a01b03909116815260200161033f565b3480156103ce57600080fd5b506103e26103dd36600461297f565b610b43565b005b3480156103f057600080fd5b506018546103aa906001600160a01b031681565b34801561041057600080fd5b506103e261041f3660046129a9565b610c15565b34801561043057600080fd5b5060045460035403600019015b60405190815260200161033f565b34801561045757600080fd5b506103e26104663660046129d9565b610c6a565b34801561047757600080fd5b506103e26104863660046129f6565b610e4a565b34801561049757600080fd5b506103e26104a636600461294a565b610e5a565b3480156104b757600080fd5b5061043d60145481565b3480156104cd57600080fd5b506103e2611083565b3480156104e257600080fd5b506103e2611140565b3480156104f757600080fd5b506103336111b9565b34801561050c57600080fd5b506103e261051b3660046129f6565b6111de565b34801561052c57600080fd5b506103e261053b366004612a32565b6111f9565b34801561054c57600080fd5b506103e2611299565b34801561056157600080fd5b506103e2610570366004612a63565b611310565b34801561058157600080fd5b5060025460ff16610333565b34801561059957600080fd5b506103aa6105a836600461294a565b611378565b3480156105b957600080fd5b50600c54600d54600e54600f546010546011546105e1956001600160401b0316949392919086565b604080516001600160401b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161033f565b34801561062457600080fd5b506103e2611383565b34801561063957600080fd5b5061043d6106483660046129a9565b6113e5565b34801561065957600080fd5b506103e2611433565b34801561066e57600080fd5b506103e261067d36600461294a565b611467565b34801561068e57600080fd5b506103336114cd565b3480156106a357600080fd5b506000546001600160a01b03166103aa565b3480156106c157600080fd5b5060135461043d565b3480156106d657600080fd5b5061037d6114f6565b3480156106eb57600080fd5b506103e26106fa366004612ad4565b611505565b34801561070b57600080fd5b5061043d61159a565b34801561072057600080fd5b5060125460135461072f919082565b6040805192835260208301919091520161033f565b34801561075057600080fd5b5061043d62278d0081565b34801561076757600080fd5b5060155461078290600160401b90046001600160401b031681565b6040516001600160401b03909116815260200161033f565b3480156107a657600080fd5b50600b546103339060ff1681565b3480156107c057600080fd5b506103e26107cf366004612b10565b6115a9565b3480156107e057600080fd5b506103e26107ef366004612b3e565b61163c565b6103e2610802366004612c64565b611686565b34801561081357600080fd5b5061037d6118e8565b34801561082857600080fd5b5060115461043d565b34801561083d57600080fd5b5061033361084c36600461294a565b60196020526000908152604090205460ff1681565b34801561086d57600080fd5b5061037d61087c36600461294a565b611976565b34801561088d57600080fd5b5060155461078290600160c01b90046001600160401b031681565b3480156108b457600080fd5b506103336108c3366004612ca5565b6119fa565b3480156108d457600080fd5b5060155461078290600160801b90046001600160401b031681565b3480156108fb57600080fd5b50601554610782906001600160401b031681565b6103e261091d3660046129d9565b611a8c565b34801561092e57600080fd5b5061033361093d366004612cf7565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b34801561097757600080fd5b5061043d611b3a565b34801561098c57600080fd5b50610333611b67565b3480156109a157600080fd5b506103e26109b03660046129a9565b611b7f565b3480156109c157600080fd5b50610333611c1a565b601054600090158015906109df575060105442115b156109ea5750600090565b600f54158015906109fc5750600f5442115b8015610a09575060115415155b8015610a16575060145415155b905090565b60006301ffc9a760e01b6001600160e01b031983161480610a4c57506380ac58cd60e01b6001600160e01b03198316145b80610a675750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060058054610a7c90612d2a565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa890612d2a565b8015610af55780601f10610aca57610100808354040283529160200191610af5565b820191906000526020600020905b815481529060010190602001808311610ad857829003601f168201915b5050505050905090565b6000610b0a82611c67565b610b27576040516333d1c03960e21b815260040160405180910390fd5b506000908152600960205260409020546001600160a01b031690565b6000610b4e82611c9c565b9050806001600160a01b0316836001600160a01b031603610b825760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610bb957610b9c813361093d565b610bb9576040516367d9dca160e11b815260040160405180910390fd5b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000546001600160a01b03163314610c485760405162461bcd60e51b8152600401610c3f90612d5e565b60405180910390fd5b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c945760405162461bcd60e51b8152600401610c3f90612d5e565b600260015403610cb65760405162461bcd60e51b8152600401610c3f90612d93565b60026001556001600160401b038116610d0c5760405162461bcd60e51b8152602060048201526018602482015277696e76616c6964206e756d626572206f6620746f6b656e7360401b6044820152606401610c3f565b6015546001600160401b03600160801b909104811690821610610d815760405162461bcd60e51b815260206004820152602760248201527f63616e206f6e6c79206d696e74206d61782073656c6620737570706c7920617460448201526620612074696d6560c81b6064820152608401610c3f565b601554600090610da2908390600160c01b90046001600160401b0316612de0565b6015549091506001600160401b03600160801b909104811690821610610e0a5760405162461bcd60e51b815260206004820152601860248201527f6d61782073656c6620737570706c7920657863656564656400000000000000006044820152606401610c3f565b610e1d33836001600160401b0316611d0b565b601580546001600160401b03909216600160c01b026001600160c01b039092169190911790555060018055565b610e55838383611de7565b505050565b323314610e795760405162461bcd60e51b8152600401610c3f90612e0b565b600260015403610e9b5760405162461bcd60e51b8152600401610c3f90612d93565b6002600155610ea981611378565b6001600160a01b0316336001600160a01b031614610efb5760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b6044820152606401610c3f565b60008181526019602052604090205460ff1615610f4d5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c99599d5b99195960821b6044820152606401610c3f565b610f556114cd565b610fa15760405162461bcd60e51b815260206004820152601d60248201527f4f7574736964652074686520726566756e6461626c6520706572696f640000006044820152606401610c3f565b60008181526017602052604090205480610fee5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1039b0b632903a37b5b2b760911b6044820152606401610c3f565b6018546110069033906001600160a01b031684610e4a565b6110103382611f89565b6000828152601960205260409020805460ff191660011790556110303390565b6001600160a01b03167f73f04af9dcc582a923ec15d3eea990fe34adabfff2879e28d44572e01a54abb68383604051611073929190918252602082015260400190565b60405180910390a2505060018055565b6000546001600160a01b031633146110ad5760405162461bcd60e51b8152600401610c3f90612d5e565b6002600154036110cf5760405162461bcd60e51b8152600401610c3f90612d93565b60026001556040514790339082156108fc029083906000818181858888f19350505050158015611103573d6000803e3d6000fd5b5060405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25060018055565b6000546001600160a01b0316331461116a5760405162461bcd60e51b8152600401610c3f90612d5e565b600b5460ff16156111af5760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610c3f565b6111b76120a2565b565b601254600090158015906111ce575060125442115b8015610a16575050601354151590565b610e558383836040518060200160405280600081525061163c565b6000546001600160a01b031633146112235760405162461bcd60e51b8152600401610c3f90612d5e565b60008260a00135116112475760405162461bcd60e51b8152600401610c3f90612e42565b81600c6112548282612e83565b505060148190556040517fd8aacc5a686ce0c56b1887495e7757a190b4826f1a2364e0b384638695dc01989061128d9084908490612ede565b60405180910390a15050565b6000546001600160a01b031633146112c35760405162461bcd60e51b8152600401610c3f90612d5e565b600b5460ff16156113085760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610c3f565b6111b7612135565b6000546001600160a01b0316331461133a5760405162461bcd60e51b8152600401610c3f90612d5e565b61134660168383612813565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6828260405161128d929190612f39565b6000610a6782611c9c565b6000546001600160a01b031633146113ad5760405162461bcd60e51b8152600401610c3f90612d5e565b600b805460ff191660011790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b60006001600160a01b03821661140e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600860205260409020546001600160401b031690565b6000546001600160a01b0316331461145d5760405162461bcd60e51b8152600401610c3f90612d5e565b6111b760006121b0565b6000546001600160a01b031633146114915760405162461bcd60e51b8152600401610c3f90612d5e565b60148190556040518181527f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c906020015b60405180910390a150565b60006114d76111b9565b8015610a1657506012546114ef9062278d0090612f68565b4210905090565b606060068054610a7c90612d2a565b336001600160a01b0383160361152e5760405163b06307db60e01b815260040160405180910390fd5b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610a166003546000190190565b6000546001600160a01b031633146115d35760405162461bcd60e51b8152600401610c3f90612d5e565b60008160200135116115f75760405162461bcd60e51b8152600401610c3f90612e42565b80356012819055602080830135601381905560408051938452918301527fd815bc9e7873606b1c4c2c8ea805b2b430b0c53a00235c5011043d6c486753dc91016114c2565b611647848484611de7565b6001600160a01b0383163b156116805761166384848484612200565b611680576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b3233146116a55760405162461bcd60e51b8152600401610c3f90612e0b565b6002600154036116c75760405162461bcd60e51b8152600401610c3f90612d93565b60026001556116d4611b67565b6117205760405162461bcd60e51b815260206004820152601e60248201527f77686974656c6973742073616c6520686173206e6f7420656e61626c656400006044820152606401610c3f565b61172b3383836119fa565b61178f5760405162461bcd60e51b815260206004820152602f60248201527f63616c6c6572206973206e6f7420696e2077686974656c697374206f7220696e60448201526e76616c6964207369676e617475726560881b6064820152608401610c3f565b3360009081526008602052604090205460019060c01c6001600160401b03161061180d5760405162461bcd60e51b815260206004820152602960248201527f6d6178206d696e74203120616d6f756e7420666f72207065722077616c6c657460448201526808195e18d95959195960ba1b6064820152608401610c3f565b601554600c54611830916001600160401b03600160c01b90910481169116612de0565b6001600160401b031661184161159a565b1061189d5760405162461bcd60e51b815260206004820152602660248201527f6d6178206d696e7420616d6f756e7420666f722077686974656c69737420657860448201526518d95959195960d21b6064820152608401610c3f565b6118b060016118ab60115490565b6122eb565b6118e0336001600160a01b0316600090815260086020526040902080546001600160c01b0316600160c01b179055565b505060018055565b601680546118f590612d2a565b80601f016020809104026020016040519081016040528092919081815260200182805461192190612d2a565b801561196e5780601f106119435761010080835404028352916020019161196e565b820191906000526020600020905b81548152906001019060200180831161195157829003601f168201915b505050505081565b606061198182611c67565b61199e57604051630a14c4b560e41b815260040160405180910390fd5b60006119a86124c6565b905080516000036119c857604051806020016040528060008152506119f3565b806119d2846124d5565b6040516020016119e3929190612f80565b6040516020818303038152906040525b9392505050565b6000601454600003611a0e575060006119f3565b611a84838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506014546040516bffffffffffffffffffffffff1960608b901b166020820152909250603401905060405160208183030381529060405280519060200120612524565b949350505050565b323314611aab5760405162461bcd60e51b8152600401610c3f90612e0b565b600260015403611acd5760405162461bcd60e51b8152600401610c3f90612d93565b6002600155611ada6111b9565b611b265760405162461bcd60e51b815260206004820152601b60248201527f7075626c69632073616c6520686173206e6f7420656e61626c656400000000006044820152606401610c3f565b611b33816118ab60135490565b5060018055565b601554600090600160c01b90046001600160401b0316611b5d6003546000190190565b610a169190612fa6565b6000611b71611c1a565b80610a165750610a166109ca565b6000546001600160a01b03163314611ba95760405162461bcd60e51b8152600401610c3f90612d5e565b6001600160a01b038116611c0e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c3f565b611c17816121b0565b50565b600e5460009015801590611c2f5750600e5442115b15611c3a5750600090565b600d54158015906109fc5750600d5442118015610a09575060115415158015610a16575050601454151590565b600081600111158015611c7b575060035482105b8015610a67575050600090815260076020526040902054600160e01b161590565b60008180600111611cf257600354811015611cf25760008181526007602052604081205490600160e01b82169003611cf0575b806000036119f3575060001901600081815260076020526040902054611ccf565b505b604051636f96cda160e11b815260040160405180910390fd5b6003546001600160a01b038316611d3457604051622e076360e81b815260040160405180910390fd5b81600003611d555760405163b562e8dd60e01b815260040160405180910390fd5b611d62600084838561253a565b6001600160a01b03831660009081526008602090815260408083208054680100000000000000018702019055838352600790915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b03871690600090600080516020613066833981519152908290a4808210611dad5750600355505050565b6000611df282611c9c565b9050836001600160a01b0316816001600160a01b031614611e255760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611e435750611e43853361093d565b80611e5e575033611e5384610aff565b6001600160a01b0316145b905080611e7e57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611ea557604051633a954ecd60e21b815260040160405180910390fd5b611eb2858585600161253a565b600083815260096020908152604080832080546001600160a01b03191690556001600160a01b038881168452600883528184208054600019019055871683528083208054600101905585835260079091528120600160e11b4260a01b8717811790915583169003611f5357600183016000818152600760205260408120549003611f51576003548114611f515760008181526007602052604090208390555b505b82846001600160a01b0316866001600160a01b031660008051602061306683398151915260405160405180910390a45050505050565b80471015611fd95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c3f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612026576040519150601f19603f3d011682016040523d82523d6000602084013e61202b565b606091505b5050905080610e555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c3f565b60025460ff166120eb5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c3f565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60025460ff161561217b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c3f565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121183390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612235903390899088908890600401612fbd565b6020604051808303816000875af1925050508015612270575060408051601f3d908101601f1916820190925261226d91810190612ffa565b60015b6122ce573d80801561229e576040519150601f19603f3d011682016040523d82523d6000602084013e6122a3565b606091505b5080516000036122c6576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000826001600160401b03161161233f5760405162461bcd60e51b8152602060048201526018602482015277696e76616c6964206e756d626572206f6620746f6b656e7360401b6044820152606401610c3f565b6003826001600160401b0316106123985760405162461bcd60e51b815260206004820181905260248201527f63616e206f6e6c79206d696e74203220746f6b656e7320617420612074696d656044820152606401610c3f565b6015546123be906001600160401b03600160c01b8204811691600160401b900416612de0565b6001600160401b0316826001600160401b03166123d961159a565b6123e39190612f68565b106124305760405162461bcd60e51b815260206004820152601860248201527f6d61782073616c6520737570706c7920657863656564656400000000000000006044820152606401610c3f565b60006124456001600160401b03841683613017565b9050348111156124975760405162461bcd60e51b815260206004820152601f60248201527f65746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610c3f565b6124aa33846001600160401b0316612585565b6124bd836001600160401b0316836125a3565b610e5581612605565b606060168054610a7c90612d2a565b604080516080810191829052607f0190826030600a8206018353600a90045b801561251257600183039250600a81066030018353600a90046124f4565b50819003601f19909101908152919050565b6000826125318584612643565b14949350505050565b60025460ff16156116805760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c881c185d5cd959605a1b6044820152606401610c3f565b61259f8282604051806020016040528060008152506126b7565b5050565b816001036125cd5780601760006125b861159a565b81526020810191909152604001600020555050565b80601760006125da61159a565b815260200190815260200160002081905550806017600060016125fb61159a565b6125b89190612fa6565b80341115611c1757336108fc61261b8334612fa6565b6040518115909202916000818181858888f1935050505015801561259f573d6000803e3d6000fd5b600081815b84518110156126af57600085828151811061266557612665613036565b6020026020010151905080831161268b576000838152602082905260409020925061269c565b600081815260208490526040902092505b50806126a78161304c565b915050612648565b509392505050565b6003546001600160a01b0384166126e057604051622e076360e81b815260040160405180910390fd5b826000036127015760405163b562e8dd60e01b815260040160405180910390fd5b61270e600085838661253a565b6001600160a01b03841660008181526008602090815260408083208054680100000000000000018902019055848352600790915290204260a01b86176001861460e11b1790558190818501903b156127d1575b60405182906001600160a01b03881690600090600080516020613066833981519152908290a461279a6000878480600101955087612200565b6127b7576040516368d2bf6b60e11b815260040160405180910390fd5b8082106127615782600354146127cc57600080fd5b612804565b5b6040516001830192906001600160a01b03881690600090600080516020613066833981519152908290a48082106127d2575b50600355611680600085838684565b82805461281f90612d2a565b90600052602060002090601f0160209004810192826128415760008555612887565b82601f1061285a5782800160ff19823516178555612887565b82800160010185558215612887579182015b8281111561288757823582559160200191906001019061286c565b50612893929150612897565b5090565b5b808211156128935760008155600101612898565b6001600160e01b031981168114611c1757600080fd5b6000602082840312156128d457600080fd5b81356119f3816128ac565b60005b838110156128fa5781810151838201526020016128e2565b838111156116805750506000910152565b600081518084526129238160208601602086016128df565b601f01601f19169290920160200192915050565b6020815260006119f3602083018461290b565b60006020828403121561295c57600080fd5b5035919050565b80356001600160a01b038116811461297a57600080fd5b919050565b6000806040838503121561299257600080fd5b61299b83612963565b946020939093013593505050565b6000602082840312156129bb57600080fd5b6119f382612963565b6001600160401b0381168114611c1757600080fd5b6000602082840312156129eb57600080fd5b81356119f3816129c4565b600080600060608486031215612a0b57600080fd5b612a1484612963565b9250612a2260208501612963565b9150604084013590509250925092565b60008082840360e0811215612a4657600080fd5b60c0811215612a5457600080fd5b50919360c08501359350915050565b60008060208385031215612a7657600080fd5b82356001600160401b0380821115612a8d57600080fd5b818501915085601f830112612aa157600080fd5b813581811115612ab057600080fd5b866020828501011115612ac257600080fd5b60209290920196919550909350505050565b60008060408385031215612ae757600080fd5b612af083612963565b915060208301358015158114612b0557600080fd5b809150509250929050565b600060408284031215612b2257600080fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612b5457600080fd5b612b5d85612963565b9350612b6b60208601612963565b92506040850135915060608501356001600160401b0380821115612b8e57600080fd5b818701915087601f830112612ba257600080fd5b813581811115612bb457612bb4612b28565b604051601f8201601f19908116603f01168101908382118183101715612bdc57612bdc612b28565b816040528281528a6020848701011115612bf557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008083601f840112612c2b57600080fd5b5081356001600160401b03811115612c4257600080fd5b6020830191508360208260051b8501011115612c5d57600080fd5b9250929050565b60008060208385031215612c7757600080fd5b82356001600160401b03811115612c8d57600080fd5b612c9985828601612c19565b90969095509350505050565b600080600060408486031215612cba57600080fd5b612cc384612963565b925060208401356001600160401b03811115612cde57600080fd5b612cea86828701612c19565b9497909650939450505050565b60008060408385031215612d0a57600080fd5b612d1383612963565b9150612d2160208401612963565b90509250929050565b600181811c90821680612d3e57607f821691505b602082108103612b2257634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b03808316818516808303821115612e0257612e02612dca565b01949350505050565b6020808252601a908201527f63616c6c657220697320616e6f7468657220636f6e7472616374000000000000604082015260600190565b60208082526021908201527f73616c65207072696365206d7573742067726561746572207468616e207a65726040820152606f60f81b606082015260800190565b8135612e8e816129c4565b6001600160401b0381166001600160401b0319835416178255506020820135600182015560408201356002820155606082013560038201556080820135600482015560a082013560058201555050565b60e081018335612eed816129c4565b6001600160401b0381168352506020840135602083015260408401356040830152606084013560608301526080840135608083015260a084013560a08301528260c08301529392505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60008219821115612f7b57612f7b612dca565b500190565b60008351612f928184602088016128df565b835190830190612e028183602088016128df565b600082821015612fb857612fb8612dca565b500390565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ff09083018461290b565b9695505050505050565b60006020828403121561300c57600080fd5b81516119f3816128ac565b600081600019048311821515161561303157613031612dca565b500290565b634e487b7160e01b600052603260045260246000fd5b60006001820161305e5761305e612dca565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204abf11f01fec535bb51cacb6ccaf2e3f9631b214dd9489eb3d839203270abe7a64736f6c634300080e0033

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

00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000005868747470733a2f2f6261667962656962626f683334706b64626c746c6163666d76657863766a786b6568623676757568726a686d6a696f6477663333726833683577692e697066732e696e667572612d697066732e696f2f0000000000000000

-----Decoded View---------------
Arg [0] : saleSupply_ (uint64): 1000
Arg [1] : selfSupply_ (uint64): 111
Arg [2] : url_ (string): https://bafybeibboh34pkdbltlacfmvexcvjxkehb6vuuhrjhmjiodwf33rh3h5wi.ipfs.infura-ipfs.io/

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [1] : 000000000000000000000000000000000000000000000000000000000000006f
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000058
Arg [4] : 68747470733a2f2f6261667962656962626f683334706b64626c746c6163666d
Arg [5] : 76657863766a786b6568623676757568726a686d6a696f647766333372683368
Arg [6] : 3577692e697066732e696e667572612d697066732e696f2f0000000000000000


Deployed Bytecode Sourcemap

399:11222:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4798:408;;;;;;;;;;;;;:::i;:::-;;;179:14:16;;172:22;154:41;;142:2;127:18;4798:408:13;;;;;;;;4880:607:14;;;;;;;;;;-1:-1:-1;4880:607:14;;;;;:::i;:::-;;:::i;9768:98::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11769:200::-;;;;;;;;;;-1:-1:-1;11769:200:14;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:16;;;1674:51;;1662:2;1647:18;11769:200:14;1528:203:16;11245:463:14;;;;;;;;;;-1:-1:-1;11245:463:14;;;;;:::i;:::-;;:::i;:::-;;2632:28:13;;;;;;;;;;-1:-1:-1;2632:28:13;;;;-1:-1:-1;;;;;2632:28:13;;;6583:116;;;;;;;;;;-1:-1:-1;6583:116:13;;;;;:::i;:::-;;:::i;3963:309:14:-;;;;;;;;;;-1:-1:-1;4225:12:14;;4209:13;;:28;-1:-1:-1;;4209:46:14;3963:309;;;2510:25:16;;;2498:2;2483:18;3963:309:14;2364:177:16;6892:444:13;;;;;;;;;;-1:-1:-1;6892:444:13;;;;;:::i;:::-;;:::i;12629:164:14:-;;;;;;;;;;-1:-1:-1;12629:164:14;;;;;:::i;:::-;;:::i;8197:589:13:-;;;;;;;;;;-1:-1:-1;8197:589:13;;;;;:::i;:::-;;:::i;1889:25::-;;;;;;;;;;;;;;;;10162:203;;;;;;;;;;;;;:::i;11257:75::-;;;;;;;;;;;;;:::i;5807:206::-;;;;;;;;;;;;;:::i;12859:179:14:-;;;;;;;;;;-1:-1:-1;12859:179:14;;;;;:::i;:::-;;:::i;5330:308:13:-;;;;;;;;;;-1:-1:-1;5330:308:13;;;;;:::i;:::-;;:::i;11119:80::-;;;;;;;;;;;;;:::i;3357:126::-;;;;;;;;;;-1:-1:-1;3357:126:13;;;;;:::i;:::-;;:::i;1098:84:1:-;;;;;;;;;;-1:-1:-1;1168:7:1;;;;1098:84;;9564:142:14;;;;;;;;;;-1:-1:-1;9564:142:14;;;;;:::i;:::-;;:::i;1791:46:13:-;;;;;;;;;;-1:-1:-1;1791:46:13;;;;;;;;;;;;;;-1:-1:-1;;;;;1791:46:13;;;;;;;;;;;;-1:-1:-1;;;;;4687:31:16;;;4669:50;;4750:2;4735:18;;4728:34;;;;4778:18;;;4771:34;;;;4836:2;4821:18;;4814:34;4879:3;4864:19;;4857:35;4923:3;4908:19;;4901:35;4656:3;4641:19;1791:46:13;4384:558:16;11507:112:13;;;;;;;;;;;;;:::i;5546:221:14:-;;;;;;;;;;-1:-1:-1;5546:221:14;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;5644:131:13:-;;;;;;;;;;-1:-1:-1;5644:131:13;;;;;:::i;:::-;;:::i;6404:174::-;;;;;;;;;;;;;:::i;1036:85:0:-;;;;;;;;;;-1:-1:-1;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;1036:85;;6019:106:13;;;;;;;;;;-1:-1:-1;6096:22:13;;6019:106;;9930:102:14;;;;;;;;;;;;;:::i;12036:303::-;;;;;;;;;;-1:-1:-1;12036:303:14;;;;;:::i;:::-;;:::i;3489:91:13:-;;;;;;;;;;;;;:::i;1843:40::-;;;;;;;;;;-1:-1:-1;1843:40:13;;;;;;;;;;;;;5658:25:16;;;5714:2;5699:18;;5692:34;;;;5631:18;1843:40:13;5484:248:16;2563:46:13;;;;;;;;;;;;2602:7;2563:46;;2082:28;;;;;;;;;;-1:-1:-1;2082:28:13;;;;-1:-1:-1;;;2082:28:13;;-1:-1:-1;;;;;2082:28:13;;;;;;-1:-1:-1;;;;;5899:31:16;;;5881:50;;5869:2;5854:18;2082:28:13;5737:200:16;1750:34:13;;;;;;;;;;-1:-1:-1;1750:34:13;;;;;;;;6131:246;;;;;;;;;;-1:-1:-1;6131:246:13;;;;;:::i;:::-;;:::i;13104:385:14:-;;;;;;;;;;-1:-1:-1;13104:385:14;;;;;:::i;:::-;;:::i;7386:580:13:-;;;;;;:::i;:::-;;:::i;2374:25::-;;;;;;;;;;;;;:::i;5212:112::-;;;;;;;;;;-1:-1:-1;5292:25:13;;5212:112;;2696:43;;;;;;;;;;-1:-1:-1;2696:43:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;10098:313:14;;;;;;;;;;-1:-1:-1;10098:313:14;;;;;:::i;:::-;;:::i;2286:28:13:-;;;;;;;;;;-1:-1:-1;2286:28:13;;;;-1:-1:-1;;;2286:28:13;;-1:-1:-1;;;;;2286:28:13;;;3849:323;;;;;;;;;;-1:-1:-1;3849:323:13;;;;;:::i;:::-;;:::i;2184:28::-;;;;;;;;;;-1:-1:-1;2184:28:13;;;;-1:-1:-1;;;2184:28:13;;-1:-1:-1;;;;;2184:28:13;;;1979:27;;;;;;;;;;-1:-1:-1;1979:27:13;;;;-1:-1:-1;;;;;1979:27:13;;;7972:219;;;;;;:::i;:::-;;:::i;12405:162:14:-;;;;;;;;;;-1:-1:-1;12405:162:14;;;;;:::i;:::-;-1:-1:-1;;;;;12525:25:14;;;12502:4;12525:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;12405:162;3585:102:13;;;;;;;;;;;;;:::i;4178:148::-;;;;;;;;;;;;;:::i;1918:198:0:-;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;4360:403:13:-;;;;;;;;;;;;;:::i;4798:408::-;4879:33;;4859:4;;4879:37;;;;:92;;-1:-1:-1;4938:33:13;;4920:15;:51;4879:92;4875:135;;;-1:-1:-1;4994:5:13;;4798:408::o;4875:135::-;5026:35;;:39;;;;:104;;-1:-1:-1;5095:35:13;;5077:15;:53;5026:104;:145;;;;-1:-1:-1;5142:25:13;;:29;;5026:145;:173;;;;-1:-1:-1;5183:10:13;;:16;;5026:173;5019:180;;4798:408;:::o;4880:607:14:-;4965:4;-1:-1:-1;;;;;;;;;5260:25:14;;;;:101;;-1:-1:-1;;;;;;;;;;5336:25:14;;;5260:101;:177;;;-1:-1:-1;;;;;;;;;;5412:25:14;;;5260:177;5241:196;4880:607;-1:-1:-1;;4880:607:14:o;9768:98::-;9822:13;9854:5;9847:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9768:98;:::o;11769:200::-;11837:7;11861:16;11869:7;11861;:16::i;:::-;11856:64;;11886:34;;-1:-1:-1;;;11886:34:14;;;;;;;;;;;11856:64;-1:-1:-1;11938:24:14;;;;:15;:24;;;;;;-1:-1:-1;;;;;11938:24:14;;11769:200::o;11245:463::-;11317:13;11349:27;11368:7;11349:18;:27::i;:::-;11317:61;;11398:5;-1:-1:-1;;;;;11392:11:14;:2;-1:-1:-1;;;;;11392:11:14;;11388:48;;11412:24;;-1:-1:-1;;;11412:24:14;;;;;;;;;;;11388:48;27446:10;-1:-1:-1;;;;;11451:28:14;;;11447:172;;11498:44;11515:5;27446:10;12405:162;:::i;11498:44::-;11493:126;;11569:35;;-1:-1:-1;;;11569:35:14;;;;;;;;;;;11493:126;11629:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;11629:29:14;-1:-1:-1;;;;;11629:29:14;;;;;;;;;11673:28;;11629:24;;11673:28;;;;;;;11307:401;11245:463;;:::o;6583:116:13:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;;;;;;;;;6662:13:13::1;:30:::0;;-1:-1:-1;;;;;;6662:30:13::1;-1:-1:-1::0;;;;;6662:30:13;;;::::1;::::0;;;::::1;::::0;;6583:116::o;6892:444::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;-1:-1:-1;;;;;6984:19:13;::::2;6976:56;;;::::0;-1:-1:-1;;;6976:56:13;;10327:2:16;6976:56:13::2;::::0;::::2;10309:21:16::0;10366:2;10346:18;;;10339:30;-1:-1:-1;;;10385:18:16;;;10378:54;10449:18;;6976:56:13::2;10125:348:16::0;6976:56:13::2;7068:10;::::0;-1:-1:-1;;;;;;;;7068:10:13;;::::2;::::0;::::2;7050:28:::0;;::::2;;7042:80;;;::::0;-1:-1:-1;;;7042:80:13;;10680:2:16;7042:80:13::2;::::0;::::2;10662:21:16::0;10719:2;10699:18;;;10692:30;10758:34;10738:18;;;10731:62;-1:-1:-1;;;10809:18:16;;;10802:37;10856:19;;7042:80:13::2;10478:403:16::0;7042:80:13::2;7152:10;::::0;7132:17:::2;::::0;7152:28:::2;::::0;7165:15;;-1:-1:-1;;;7152:10:13;::::2;-1:-1:-1::0;;;;;7152:10:13::2;:28;:::i;:::-;7211:10;::::0;7132:48;;-1:-1:-1;;;;;;;;;7211:10:13;;::::2;::::0;::::2;7198:23:::0;;::::2;;7190:60;;;::::0;-1:-1:-1;;;7190:60:13;;11461:2:16;7190:60:13::2;::::0;::::2;11443:21:16::0;11500:2;11480:18;;;11473:30;11539:26;11519:18;;;11512:54;11583:18;;7190:60:13::2;11259:348:16::0;7190:60:13::2;7260:36;27446:10:14::0;7280:15:13::2;-1:-1:-1::0;;;;;7260:36:13::2;:5;:36::i;:::-;7306:10;:23:::0;;-1:-1:-1;;;;;7306:23:13;;::::2;-1:-1:-1::0;;;7306:23:13::2;-1:-1:-1::0;;;;;7306:23:13;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;2628:22:2;;6892:444:13:o;12629:164:14:-;12758:28;12768:4;12774:2;12778:7;12758:9;:28::i;:::-;12629:164;;;:::o;8197:589:13:-;997:9;27446:10:14;997:25:13;989:64;;;;-1:-1:-1;;;989:64:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;8297:16:13::2;8305:7:::0;8297::::2;:16::i;:::-;-1:-1:-1::0;;;;;8283:30:13::2;:10;-1:-1:-1::0;;;;;8283:30:13::2;;8275:58;;;::::0;-1:-1:-1;;;8275:58:13;;12169:2:16;8275:58:13::2;::::0;::::2;12151:21:16::0;12208:2;12188:18;;;12181:30;-1:-1:-1;;;12227:18:16;;;12220:45;12282:18;;8275:58:13::2;11967:339:16::0;8275:58:13::2;8352:20;::::0;;;:11:::2;:20;::::0;;;;;::::2;;8351:21;8343:50;;;::::0;-1:-1:-1;;;8343:50:13;;12513:2:16;8343:50:13::2;::::0;::::2;12495:21:16::0;12552:2;12532:18;;;12525:30;-1:-1:-1;;;12571:18:16;;;12564:46;12627:18;;8343:50:13::2;12311:340:16::0;8343:50:13::2;8411:17;:15;:17::i;:::-;8403:59;;;::::0;-1:-1:-1;;;8403:59:13;;12858:2:16;8403:59:13::2;::::0;::::2;12840:21:16::0;12897:2;12877:18;;;12870:30;12936:31;12916:18;;;12909:59;12985:18;;8403:59:13::2;12656:353:16::0;8403:59:13::2;8472:18;8493:24:::0;;;:15:::2;:24;::::0;;;;;8535:14;8527:41:::2;;;::::0;-1:-1:-1;;;8527:41:13;;13216:2:16;8527:41:13::2;::::0;::::2;13198:21:16::0;13255:2;13235:18;;;13228:30;-1:-1:-1;;;13274:18:16;;;13267:44;13328:18;;8527:41:13::2;13014:338:16::0;8527:41:13::2;8603:13;::::0;8578:48:::2;::::0;8591:10:::2;::::0;-1:-1:-1;;;;;8603:13:13::2;8618:7:::0;8578:12:::2;:48::i;:::-;8636:50;8662:10;8675;8636:17;:50::i;:::-;8696:20;::::0;;;:11:::2;:20;::::0;;;;:27;;-1:-1:-1;;8696:27:13::2;8719:4;8696:27;::::0;;8745:12:::2;27446:10:14::0;;27360:103;8745:12:13::2;-1:-1:-1::0;;;;;8738:41:13::2;;8759:7;8768:10;8738:41;;;;;;5658:25:16::0;;;5714:2;5699:18;;5692:34;5646:2;5631:18;;5484:248;8738:41:13::2;;;;;;;;-1:-1:-1::0;;1701:1:2::1;2628:22:::0;;8197:589:13:o;10162:203::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;10273:39:13::2;::::0;10242:21:::2;::::0;27446:10:14;;10273:39:13;::::2;;;::::0;10242:21;;10273:39:::2;::::0;;;10242:21;27446:10:14;10273:39:13;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;10327:31:13::2;::::0;2510:25:16;;;27446:10:14;;10327:31:13::2;::::0;2498:2:16;2483:18;10327:31:13::2;;;;;;;-1:-1:-1::0;1701:1:2::1;2628:22:::0;;10162:203:13:o;11257:75::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1216:14:13::1;::::0;::::1;;1215:15;1207:43;;;::::0;-1:-1:-1;;;1207:43:13;;13559:2:16;1207:43:13::1;::::0;::::1;13541:21:16::0;13598:2;13578:18;;;13571:30;-1:-1:-1;;;13617:18:16;;;13610:45;13672:18;;1207:43:13::1;13357:339:16::0;1207:43:13::1;11315:10:::2;:8;:10::i;:::-;11257:75::o:0;5807:206::-;5882:16;:26;5859:4;;5882:30;;;;:86;;-1:-1:-1;5942:16:13;:26;5924:15;:44;5882:86;:124;;;;-1:-1:-1;;5980:22:13;;:26;;;5807:206::o;12859:179:14:-;12992:39;13009:4;13015:2;13019:7;12992:39;;;;;;;;;;;;:16;:39::i;5330:308:13:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5468:1:13::1;5452:7;:13;;;:17;5444:63;;;;-1:-1:-1::0;;;5444:63:13::1;;;;;;;:::i;:::-;5539:7:::0;5517:19:::1;:29;5539:7:::0;5517:19;:29:::1;:::i;:::-;-1:-1:-1::0;;5556:10:13::1;:18:::0;;;5589:42:::1;::::0;::::1;::::0;::::1;::::0;5616:7;;5569:5;;5589:42:::1;:::i;:::-;;;;;;;;5330:308:::0;;:::o;11119:80::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1216:14:13::1;::::0;::::1;;1215:15;1207:43;;;::::0;-1:-1:-1;;;1207:43:13;;13559:2:16;1207:43:13::1;::::0;::::1;13541:21:16::0;13598:2;13578:18;;;13571:30;-1:-1:-1;;;13617:18:16;;;13610:45;13672:18;;1207:43:13::1;13357:339:16::0;1207:43:13::1;11184:8:::2;:6;:8::i;3357:126::-:0;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3428:13:13::1;:6;3437:4:::0;;3428:13:::1;:::i;:::-;;3456:20;3471:4;;3456:20;;;;;;;:::i;9564:142:14:-:0;9628:7;9670:27;9689:7;9670:18;:27::i;11507:112:13:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;11560:14:13::1;:21:::0;;-1:-1:-1;;11560:21:13::1;11577:4;11560:21;::::0;;11596:16:::1;::::0;::::1;::::0;11560:14:::1;::::0;11596:16:::1;11507:112::o:0;5546:221:14:-;5610:7;-1:-1:-1;;;;;5633:19:14;;5629:60;;5661:28;;-1:-1:-1;;;5661:28:14;;;;;;;;;;;5629:60;-1:-1:-1;;;;;;5706:25:14;;;;;:18;:25;;;;;;-1:-1:-1;;;;;5706:54:14;;5546:221::o;1668:101:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;5644:131:13:-:0;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5711:10:13::1;:18:::0;;;5744:24:::1;::::0;2510:25:16;;;5744:24:13::1;::::0;2498:2:16;2483:18;5744:24:13::1;;;;;;;;5644:131:::0;:::o;6404:174::-;6452:4;6475:21;:19;:21::i;:::-;:96;;;;-1:-1:-1;6530:16:13;:26;:41;;2602:7;;6530:41;:::i;:::-;6512:15;:59;6468:103;;6404:174;:::o;9930:102:14:-;9986:13;10018:7;10011:14;;;;;:::i;12036:303::-;27446:10;-1:-1:-1;;;;;12134:31:14;;;12130:61;;12174:17;;-1:-1:-1;;;12174:17:14;;;;;;;;;;;12130:61;27446:10;12202:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;12202:49:14;;;;;;;;;;;;:60;;-1:-1:-1;;12202:60:14;;;;;;;;;;12277:55;;154:41:16;;;12202:49:14;;27446:10;12277:55;;127:18:16;12277:55:14;;;;;;;12036:303;;:::o;3489:91:13:-;3533:7;3559:14;4596:13:14;;-1:-1:-1;;4596:31:14;;4365:279;6131:246:13;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;6248:1:13::1;6232:7;:13;;;:17;6224:63;;;;-1:-1:-1::0;;;6224:63:13::1;;;;;;;:::i;:::-;16231:19:16::0;;6297:16:13::1;16218:33:16::0;;;16305:2;16294:14;;;16281:28;16267:12;16260:50;;;6338:32:13::1;::::0;;16537:39:16;;;16592:20;;;16585:61;6338:32:13::1;::::0;16510:18:16;6338:32:13::1;16321:331:16::0;13104:385:14;13265:28;13275:4;13281:2;13285:7;13265:9;:28::i;:::-;-1:-1:-1;;;;;13307:14:14;;;:19;13303:180;;13345:56;13376:4;13382:2;13386:7;13395:5;13345:30;:56::i;:::-;13340:143;;13428:40;;-1:-1:-1;;;13428:40:14;;;;;;;;;;;13340:143;13104:385;;;;:::o;7386:580:13:-;997:9;27446:10:14;997:25:13;989:64;;;;-1:-1:-1;;;989:64:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;7501:24:13::2;:22;:24::i;:::-;7493:67;;;::::0;-1:-1:-1;;;7493:67:13;;16859:2:16;7493:67:13::2;::::0;::::2;16841:21:16::0;16898:2;16878:18;;;16871:30;16937:32;16917:18;;;16910:60;16987:18;;7493:67:13::2;16657:354:16::0;7493:67:13::2;7578:44;27446:10:14::0;7611::13::2;;7578:18;:44::i;:::-;7570:104;;;::::0;-1:-1:-1;;;7570:104:13;;17218:2:16;7570:104:13::2;::::0;::::2;17200:21:16::0;17257:2;17237:18;;;17230:30;17296:34;17276:18;;;17269:62;-1:-1:-1;;;17347:18:16;;;17340:45;17402:19;;7570:104:13::2;17016:411:16::0;7570:104:13::2;27446:10:14::0;6453:6;6485:25;;;:18;:25;;;;;;7716:1:13::2;::::0;1379:3:14;6485:39;-1:-1:-1;;;;;7692:25:13::2;;7684:79;;;::::0;-1:-1:-1;;;7684:79:13;;17634:2:16;7684:79:13::2;::::0;::::2;17616:21:16::0;17673:2;17653:18;;;17646:30;17712:34;17692:18;;;17685:62;-1:-1:-1;;;17763:18:16;;;17756:39;17812:19;;7684:79:13::2;17432:405:16::0;7684:79:13::2;7829:10;::::0;7797:19:::2;:29:::0;:42:::2;::::0;-1:-1:-1;;;;;;;;7829:10:13;;::::2;::::0;::::2;::::0;7797:29:::2;:42;:::i;:::-;-1:-1:-1::0;;;;;7781:58:13::2;:13;:11;:13::i;:::-;:58;7773:109;;;::::0;-1:-1:-1;;;7773:109:13;;18044:2:16;7773:109:13::2;::::0;::::2;18026:21:16::0;18083:2;18063:18;;;18056:30;18122:34;18102:18;;;18095:62;-1:-1:-1;;;18173:18:16;;;18166:36;18219:19;;7773:109:13::2;17842:402:16::0;7773:109:13::2;7892:33;7898:1;7901:23;5292:25:::0;;;5212:112;7901:23:::2;7892:5;:33::i;:::-;7935:24;27446:10:14::0;-1:-1:-1;;;;;6794:25:14;6777:14;6794:25;;;:18;:25;;;;;;;-1:-1:-1;;;;;6953:31:14;-1:-1:-1;;;6952:61:14;7023:34;;6714:350;7935:24:13::2;-1:-1:-1::0;;1701:1:2::1;2628:22:::0;;7386:580:13:o;2374:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10098:313:14:-;10171:13;10201:16;10209:7;10201;:16::i;:::-;10196:59;;10226:29;;-1:-1:-1;;;10226:29:14;;;;;;;;;;;10196:59;10266:21;10290:10;:8;:10::i;:::-;10266:34;;10323:7;10317:21;10342:1;10317:26;:87;;;;;;;;;;;;;;;;;10370:7;10379:18;10389:7;10379:9;:18::i;:::-;10353:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10317:87;10310:94;10098:313;-1:-1:-1;;;10098:313:14:o;3849:323:13:-;3947:4;3967:10;;:16;;3963:59;;-1:-1:-1;4006:5:13;3999:12;;3963:59;4038:127;4070:10;;4038:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4094:10:13;;4128:26;;-1:-1:-1;;18873:2:16;18869:15;;;18865:53;4128:26:13;;;18853:66:16;4094:10:13;;-1:-1:-1;18935:12:16;;;-1:-1:-1;4128:26:13;;;;;;;;;;;;4118:37;;;;;;4038:18;:127::i;:::-;4031:134;3849:323;-1:-1:-1;;;;3849:323:13:o;7972:219::-;997:9;27446:10:14;997:25:13;989:64;;;;-1:-1:-1;;;989:64:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;8077:21:13::2;:19;:21::i;:::-;8069:61;;;::::0;-1:-1:-1;;;8069:61:13;;19160:2:16;8069:61:13::2;::::0;::::2;19142:21:16::0;19199:2;19179:18;;;19172:30;19238:29;19218:18;;;19211:57;19285:18;;8069:61:13::2;18958:351:16::0;8069:61:13::2;8140:44;8146:15;8163:20;6096:22:::0;;;6019:106;8140:44:::2;-1:-1:-1::0;1701:1:2::1;2628:22:::0;;7972:219:13:o;3585:102::-;3670:10;;3627:7;;-1:-1:-1;;;3670:10:13;;-1:-1:-1;;;;;3670:10:13;3653:14;4596:13:14;;-1:-1:-1;;4596:31:14;;4365:279;3653:14:13;:27;;;;:::i;4178:148::-;4233:4;4256:29;:27;:29::i;:::-;:63;;;;4289:30;:28;:30::i;1918:198:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;27446:10:14;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;19646:2:16;1998:73:0::1;::::0;::::1;19628:21:16::0;19685:2;19665:18;;;19658:30;19724:34;19704:18;;;19697:62;-1:-1:-1;;;19775:18:16;;;19768:36;19821:19;;1998:73:0::1;19444:402:16::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;4360:403:13:-;4440:32;;4420:4;;4440:36;;;;:90;;-1:-1:-1;4498:32:13;;4480:15;:50;4440:90;4436:133;;;-1:-1:-1;4553:5:13;;4360:403::o;4436:133::-;4585:34;;:38;;;;:102;;-1:-1:-1;4653:34:13;;4635:15;:52;4585:143;;;;-1:-1:-1;4699:25:13;;:29;;4585:171;;;;-1:-1:-1;;4740:10:13;;:16;;;4360:403::o;13735:268:14:-;13792:4;13846:7;3232:1:13;13827:26:14;;:65;;;;;13879:13;;13869:7;:23;13827:65;:150;;;;-1:-1:-1;;13929:26:14;;;;:17;:26;;;;;;-1:-1:-1;;;13929:43:14;:48;;13735:268::o;7141:1105::-;7208:7;7242;;3232:1:13;7288:23:14;7284:898;;7340:13;;7333:4;:20;7329:853;;;7377:14;7394:23;;;:17;:23;;;;;;;-1:-1:-1;;;7481:23:14;;:28;;7477:687;;7992:111;7999:6;8009:1;7999:11;7992:111;;-1:-1:-1;;;8069:6:14;8051:25;;;;:17;:25;;;;;;7992:111;;7477:687;7355:827;7329:853;8208:31;;-1:-1:-1;;;8208:31:14;;;;;;;;;;;16975:1618;17062:13;;-1:-1:-1;;;;;17089:16:14;;17085:48;;17114:19;;-1:-1:-1;;;17114:19:14;;;;;;;;;;;17085:48;17147:8;17159:1;17147:13;17143:44;;17169:18;;-1:-1:-1;;;17169:18:14;;;;;;;;;;;17143:44;17198:61;17228:1;17232:2;17236:12;17250:8;17198:21;:61::i;:::-;-1:-1:-1;;;;;17723:22:14;;;;;;:18;:22;;;;1151:2;17723:22;;;:70;;17761:31;17749:44;;17723:70;;;18029:31;;;:17;:31;;;;;18120:15;1656:3;18120:41;18079:83;;-1:-1:-1;18197:13:14;;1913:3;18182:56;18079:160;18029:210;;:31;18317:23;;;18355:109;18381:40;;18406:14;;;;;-1:-1:-1;;;;;18381:40:14;;;18398:1;;-1:-1:-1;;;;;;;;;;;18381:40:14;18398:1;;18381:40;18459:3;18444:12;:18;18355:109;;-1:-1:-1;18478:13:14;:28;12629:164;;;:::o;18835:2460::-;18945:27;18975;18994:7;18975:18;:27::i;:::-;18945:57;;19058:4;-1:-1:-1;;;;;19017:45:14;19033:19;-1:-1:-1;;;;;19017:45:14;;19013:86;;19071:28;;-1:-1:-1;;;19071:28:14;;;;;;;;;;;19013:86;19110:22;27446:10;-1:-1:-1;;;;;19136:27:14;;;;:86;;-1:-1:-1;19179:43:14;19196:4;27446:10;12405:162;:::i;19179:43::-;19136:145;;;-1:-1:-1;27446:10:14;19238:20;19250:7;19238:11;:20::i;:::-;-1:-1:-1;;;;;19238:43:14;;19136:145;19110:172;;19298:17;19293:66;;19324:35;;-1:-1:-1;;;19324:35:14;;;;;;;;;;;19293:66;-1:-1:-1;;;;;19373:16:14;;19369:52;;19398:23;;-1:-1:-1;;;19398:23:14;;;;;;;;;;;19369:52;19432:43;19454:4;19460:2;19464:7;19473:1;19432:21;:43::i;:::-;19545:24;;;;:15;:24;;;;;;;;19538:31;;-1:-1:-1;;;;;;19538:31:14;;;-1:-1:-1;;;;;19930:24:14;;;;;:18;:24;;;;;19928:26;;-1:-1:-1;;19928:26:14;;;19998:22;;;;;;;19996:24;;-1:-1:-1;19996:24:14;;;20284:26;;;:17;:26;;;;;-1:-1:-1;;;20370:15:14;1656:3;20370:41;20329:83;;:126;;20284:171;;;20572:46;;:51;;20568:616;;20675:1;20665:11;;20643:19;20796:30;;;:17;:30;;;;;;:35;;20792:378;;20932:13;;20917:11;:28;20913:239;;21077:30;;;;:17;:30;;;;;:52;;;20913:239;20625:559;20568:616;21228:7;21224:2;-1:-1:-1;;;;;21209:27:14;21218:4;-1:-1:-1;;;;;21209:27:14;-1:-1:-1;;;;;;;;;;;21209:27:14;;;;;;;;;18935:2360;;18835:2460;;;:::o;2412:312:7:-;2526:6;2501:21;:31;;2493:73;;;;-1:-1:-1;;;2493:73:7;;20053:2:16;2493:73:7;;;20035:21:16;20092:2;20072:18;;;20065:30;20131:31;20111:18;;;20104:59;20180:18;;2493:73:7;19851:353:16;2493:73:7;2578:12;2596:9;-1:-1:-1;;;;;2596:14:7;2618:6;2596:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2577:52;;;2647:7;2639:78;;;;-1:-1:-1;;;2639:78:7;;20621:2:16;2639:78:7;;;20603:21:16;20660:2;20640:18;;;20633:30;20699:34;20679:18;;;20672:62;20770:28;20750:18;;;20743:56;20816:19;;2639:78:7;20419:422:16;2110:117:1;1168:7;;;;1669:41;;;;-1:-1:-1;;;1669:41:1;;21048:2:16;1669:41:1;;;21030:21:16;21087:2;21067:18;;;21060:30;-1:-1:-1;;;21106:18:16;;;21099:50;21166:18;;1669:41:1;20846:344:16;1669:41:1;2168:7:::1;:15:::0;;-1:-1:-1;;2168:15:1::1;::::0;;2198:22:::1;27446:10:14::0;2207:12:1::1;2198:22;::::0;-1:-1:-1;;;;;1692:32:16;;;1674:51;;1662:2;1647:18;2198:22:1::1;;;;;;;2110:117::o:0;1863:115::-;1168:7;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;21397:2:16;1403:38:1;;;21379:21:16;21436:2;21416:18;;;21409:30;-1:-1:-1;;;21455:18:16;;;21448:46;21511:18;;1403:38:1;21195:340:16;1403:38:1;1922:7:::1;:14:::0;;-1:-1:-1;;1922:14:1::1;1932:4;1922:14;::::0;;1951:20:::1;1958:12;27446:10:14::0;;27360:103;2270:187:0;2343:16;2362:6;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;2410:40;;2362:6;;;;;;;2410:40;;2343:16;2410:40;2333:124;2270:187;:::o;24900:697:14:-;25078:88;;-1:-1:-1;;;25078:88:14;;25058:4;;-1:-1:-1;;;;;25078:45:14;;;;;:88;;27446:10;;25145:4;;25151:7;;25160:5;;25078:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25078:88:14;;;;;;;;-1:-1:-1;;25078:88:14;;;;;;;;;;;;:::i;:::-;;;25074:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25356:6;:13;25373:1;25356:18;25352:229;;25401:40;;-1:-1:-1;;;25401:40:14;;;;;;;;;;;25352:229;25541:6;25535:13;25526:6;25522:2;25518:15;25511:38;25074:517;-1:-1:-1;;;;;;25234:64:14;-1:-1:-1;;;25234:64:14;;-1:-1:-1;24900:697:14;;;;;;:::o;8913:574:13:-;9013:1;8995:15;-1:-1:-1;;;;;8995:19:13;;8987:56;;;;-1:-1:-1;;;8987:56:13;;10327:2:16;8987:56:13;;;10309:21:16;10366:2;10346:18;;;10339:30;-1:-1:-1;;;10385:18:16;;;10378:54;10449:18;;8987:56:13;10125:348:16;8987:56:13;9079:1;9061:15;-1:-1:-1;;;;;9061:19:13;;9053:64;;;;-1:-1:-1;;;9053:64:13;;22490:2:16;9053:64:13;;;22472:21:16;;;22509:18;;;22502:30;22568:34;22548:18;;;22541:62;22620:18;;9053:64:13;22288:356:16;9053:64:13;9182:10;;9169:23;;-1:-1:-1;;;;;;;;9182:10:13;;;;;-1:-1:-1;;;9169:10:13;;;:23;:::i;:::-;-1:-1:-1;;;;;9135:57:13;9151:15;-1:-1:-1;;;;;9135:31:13;:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:57;9127:94;;;;-1:-1:-1;;;9127:94:13;;22851:2:16;9127:94:13;;;22833:21:16;22890:2;22870:18;;;22863:30;22929:26;22909:18;;;22902:54;22973:18;;9127:94:13;22649:348:16;9127:94:13;9231:14;9248:24;-1:-1:-1;;;;;9248:24:13;;:6;:24;:::i;:::-;9231:41;;9300:9;9290:6;:19;;9282:63;;;;-1:-1:-1;;;9282:63:13;;23377:2:16;9282:63:13;;;23359:21:16;23416:2;23396:18;;;23389:30;23455:33;23435:18;;;23428:61;23506:18;;9282:63:13;23175:355:16;9282:63:13;9355:40;27446:10:14;9379:15:13;-1:-1:-1;;;;;9355:40:13;:9;:40::i;:::-;9405:38;9419:15;-1:-1:-1;;;;;9405:38:13;9436:6;9405:13;:38::i;:::-;9453:27;9473:6;9453:19;:27::i;3246:105::-;3306:13;3338:6;3331:13;;;;;:::i;27564:1920:14:-;28029:4;28023:11;;28036:3;28019:21;;28112:17;;;;28796:11;;;28677:5;28926:2;28940;28930:13;;28922:22;28796:11;28909:36;28980:2;28970:13;;28570:668;28998:4;28570:668;;;29169:1;29164:3;29160:11;29153:18;;29219:2;29213:4;29209:13;29205:2;29201:22;29196:3;29188:36;29092:2;29082:13;;28570:668;;;-1:-1:-1;29278:13:14;;;-1:-1:-1;;29391:12:14;;;29449:19;;;29391:12;27564:1920;-1:-1:-1;27564:1920:14:o;1154:184:10:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;;1154:184;-1:-1:-1;;;;1154:184:10:o;10585:292:13:-;1168:7:1;;;;10835:9:13;10827:43;;;;-1:-1:-1;;;10827:43:13;;23737:2:16;10827:43:13;;;23719:21:16;23776:2;23756:18;;;23749:30;-1:-1:-1;;;23795:18:16;;;23788:51;23856:18;;10827:43:13;23535:345:16;14082:102:14;14150:27;14160:2;14164:8;14150:27;;;;;;;;;;;;:9;:27::i;:::-;14082:102;;:::o;9492:303:13:-;9578:15;9597:1;9578:20;9574:215;;9647:6;9614:15;:30;9630:13;:11;:13::i;:::-;9614:30;;;;;;;;;;;-1:-1:-1;9614:30:13;:39;14082:102:14;;:::o;9574:215:13:-;9717:6;9684:15;:30;9700:13;:11;:13::i;:::-;9684:30;;;;;;;;;;;:39;;;;9772:6;9737:15;:32;9767:1;9753:13;:11;:13::i;:::-;:15;;;;:::i;9985:171::-;10065:7;10053:9;:19;10049:101;;;27446:10:14;10088:51:13;10119:19;10131:7;10119:9;:19;:::i;:::-;10088:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1689:662:10;1772:7;1814:4;1772:7;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2425:13;2473:15;;;2508:4;2501:15;;;2554:4;2538:21;;2060:57;;1930:376;;;2425:13;2473:15;;;2508:4;2501:15;;;2554:4;2538:21;;2234:57;;1930:376;-1:-1:-1;1866:3:10;;;;:::i;:::-;;;;1828:488;;;-1:-1:-1;2332:12:10;1689:662;-1:-1:-1;;;1689:662:10:o;14544:2184:14:-;14685:13;;-1:-1:-1;;;;;14712:16:14;;14708:48;;14737:19;;-1:-1:-1;;;14737:19:14;;;;;;;;;;;14708:48;14770:8;14782:1;14770:13;14766:44;;14792:18;;-1:-1:-1;;;14792:18:14;;;;;;;;;;;14766:44;14821:61;14851:1;14855:2;14859:12;14873:8;14821:21;:61::i;:::-;-1:-1:-1;;;;;15346:22:14;;;;;;:18;:22;;;;1151:2;15346:22;;;:70;;15384:31;15372:44;;15346:70;;;15652:31;;;:17;:31;;;;;15743:15;1656:3;15743:41;15702:83;;-1:-1:-1;15820:13:14;;1913:3;15805:56;15702:160;15652:210;;:31;;15940:23;;;;15982:14;:19;15978:622;;16021:308;16051:38;;16076:12;;-1:-1:-1;;;;;16051:38:14;;;16068:1;;-1:-1:-1;;;;;;;;;;;16051:38:14;16068:1;;16051:38;16116:69;16155:1;16159:2;16163:14;;;;;;16179:5;16116:30;:69::i;:::-;16111:172;;16220:40;;-1:-1:-1;;;16220:40:14;;;;;;;;;;;16111:172;16324:3;16309:12;:18;16021:308;;16408:12;16391:13;;:29;16387:43;;16422:8;;;16387:43;15978:622;;;16469:117;16499:40;;16524:14;;;;;-1:-1:-1;;;;;16499:40:14;;;16516:1;;-1:-1:-1;;;;;;;;;;;16499:40:14;16516:1;;16499:40;16581:3;16566:12;:18;16469:117;;15978:622;-1:-1:-1;16613:13:14;:28;16661:60;16690:1;16694:2;16698:12;16712:8;16661:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;206:131:16;-1:-1:-1;;;;;;280:32:16;;270:43;;260:71;;327:1;324;317:12;342:245;400:6;453:2;441:9;432:7;428:23;424:32;421:52;;;469:1;466;459:12;421:52;508:9;495:23;527:30;551:5;527:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:16;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:16;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:16:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:16;;1343:180;-1:-1:-1;1343:180:16:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:16;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:16:o;2173:186::-;2232:6;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:29;2343:9;2324:29;:::i;2546:129::-;-1:-1:-1;;;;;2624:5:16;2620:30;2613:5;2610:41;2600:69;;2665:1;2662;2655:12;2680:245;2738:6;2791:2;2779:9;2770:7;2766:23;2762:32;2759:52;;;2807:1;2804;2797:12;2759:52;2846:9;2833:23;2865:30;2889:5;2865:30;:::i;2930:328::-;3007:6;3015;3023;3076:2;3064:9;3055:7;3051:23;3047:32;3044:52;;;3092:1;3089;3082:12;3044:52;3115:29;3134:9;3115:29;:::i;:::-;3105:39;;3163:38;3197:2;3186:9;3182:18;3163:38;:::i;:::-;3153:48;;3248:2;3237:9;3233:18;3220:32;3210:42;;2930:328;;;;;:::o;3445:337::-;3552:6;3560;3604:9;3595:7;3591:23;3634:3;3630:2;3626:12;3623:32;;;3651:1;3648;3641:12;3623:32;3675:3;3671:2;3667:12;3664:32;;;3692:1;3689;3682:12;3664:32;-1:-1:-1;3715:9:16;;3771:3;3756:19;;3743:33;;-1:-1:-1;3445:337:16;-1:-1:-1;;3445:337:16:o;3787:592::-;3858:6;3866;3919:2;3907:9;3898:7;3894:23;3890:32;3887:52;;;3935:1;3932;3925:12;3887:52;3975:9;3962:23;-1:-1:-1;;;;;4045:2:16;4037:6;4034:14;4031:34;;;4061:1;4058;4051:12;4031:34;4099:6;4088:9;4084:22;4074:32;;4144:7;4137:4;4133:2;4129:13;4125:27;4115:55;;4166:1;4163;4156:12;4115:55;4206:2;4193:16;4232:2;4224:6;4221:14;4218:34;;;4248:1;4245;4238:12;4218:34;4293:7;4288:2;4279:6;4275:2;4271:15;4267:24;4264:37;4261:57;;;4314:1;4311;4304:12;4261:57;4345:2;4337:11;;;;;4367:6;;-1:-1:-1;3787:592:16;;-1:-1:-1;;;;3787:592:16:o;5132:347::-;5197:6;5205;5258:2;5246:9;5237:7;5233:23;5229:32;5226:52;;;5274:1;5271;5264:12;5226:52;5297:29;5316:9;5297:29;:::i;:::-;5287:39;;5376:2;5365:9;5361:18;5348:32;5423:5;5416:13;5409:21;5402:5;5399:32;5389:60;;5445:1;5442;5435:12;5389:60;5468:5;5458:15;;;5132:347;;;;;:::o;5942:202::-;6037:6;6090:2;6078:9;6069:7;6065:23;6061:32;6058:52;;;6106:1;6103;6096:12;6058:52;-1:-1:-1;6129:9:16;5942:202;-1:-1:-1;5942:202:16:o;6149:127::-;6210:10;6205:3;6201:20;6198:1;6191:31;6241:4;6238:1;6231:15;6265:4;6262:1;6255:15;6281:1138;6376:6;6384;6392;6400;6453:3;6441:9;6432:7;6428:23;6424:33;6421:53;;;6470:1;6467;6460:12;6421:53;6493:29;6512:9;6493:29;:::i;:::-;6483:39;;6541:38;6575:2;6564:9;6560:18;6541:38;:::i;:::-;6531:48;;6626:2;6615:9;6611:18;6598:32;6588:42;;6681:2;6670:9;6666:18;6653:32;-1:-1:-1;;;;;6745:2:16;6737:6;6734:14;6731:34;;;6761:1;6758;6751:12;6731:34;6799:6;6788:9;6784:22;6774:32;;6844:7;6837:4;6833:2;6829:13;6825:27;6815:55;;6866:1;6863;6856:12;6815:55;6902:2;6889:16;6924:2;6920;6917:10;6914:36;;;6930:18;;:::i;:::-;7005:2;6999:9;6973:2;7059:13;;-1:-1:-1;;7055:22:16;;;7079:2;7051:31;7047:40;7035:53;;;7103:18;;;7123:22;;;7100:46;7097:72;;;7149:18;;:::i;:::-;7189:10;7185:2;7178:22;7224:2;7216:6;7209:18;7264:7;7259:2;7254;7250;7246:11;7242:20;7239:33;7236:53;;;7285:1;7282;7275:12;7236:53;7341:2;7336;7332;7328:11;7323:2;7315:6;7311:15;7298:46;7386:1;7381:2;7376;7368:6;7364:15;7360:24;7353:35;7407:6;7397:16;;;;;;;6281:1138;;;;;;;:::o;7424:367::-;7487:8;7497:6;7551:3;7544:4;7536:6;7532:17;7528:27;7518:55;;7569:1;7566;7559:12;7518:55;-1:-1:-1;7592:20:16;;-1:-1:-1;;;;;7624:30:16;;7621:50;;;7667:1;7664;7657:12;7621:50;7704:4;7696:6;7692:17;7680:29;;7764:3;7757:4;7747:6;7744:1;7740:14;7732:6;7728:27;7724:38;7721:47;7718:67;;;7781:1;7778;7771:12;7718:67;7424:367;;;;;:::o;7796:437::-;7882:6;7890;7943:2;7931:9;7922:7;7918:23;7914:32;7911:52;;;7959:1;7956;7949:12;7911:52;7999:9;7986:23;-1:-1:-1;;;;;8024:6:16;8021:30;8018:50;;;8064:1;8061;8054:12;8018:50;8103:70;8165:7;8156:6;8145:9;8141:22;8103:70;:::i;:::-;8192:8;;8077:96;;-1:-1:-1;7796:437:16;-1:-1:-1;;;;7796:437:16:o;8238:511::-;8333:6;8341;8349;8402:2;8390:9;8381:7;8377:23;8373:32;8370:52;;;8418:1;8415;8408:12;8370:52;8441:29;8460:9;8441:29;:::i;:::-;8431:39;;8521:2;8510:9;8506:18;8493:32;-1:-1:-1;;;;;8540:6:16;8537:30;8534:50;;;8580:1;8577;8570:12;8534:50;8619:70;8681:7;8672:6;8661:9;8657:22;8619:70;:::i;:::-;8238:511;;8708:8;;-1:-1:-1;8593:96:16;;-1:-1:-1;;;;8238:511:16:o;8754:260::-;8822:6;8830;8883:2;8871:9;8862:7;8858:23;8854:32;8851:52;;;8899:1;8896;8889:12;8851:52;8922:29;8941:9;8922:29;:::i;:::-;8912:39;;8970:38;9004:2;8993:9;8989:18;8970:38;:::i;:::-;8960:48;;8754:260;;;;;:::o;9019:380::-;9098:1;9094:12;;;;9141;;;9162:61;;9216:4;9208:6;9204:17;9194:27;;9162:61;9269:2;9261:6;9258:14;9238:18;9235:38;9232:161;;9315:10;9310:3;9306:20;9303:1;9296:31;9350:4;9347:1;9340:15;9378:4;9375:1;9368:15;9404:356;9606:2;9588:21;;;9625:18;;;9618:30;9684:34;9679:2;9664:18;;9657:62;9751:2;9736:18;;9404:356::o;9765:355::-;9967:2;9949:21;;;10006:2;9986:18;;;9979:30;10045:33;10040:2;10025:18;;10018:61;10111:2;10096:18;;9765:355::o;10886:127::-;10947:10;10942:3;10938:20;10935:1;10928:31;10978:4;10975:1;10968:15;11002:4;10999:1;10992:15;11018:236;11057:3;-1:-1:-1;;;;;11130:2:16;11127:1;11123:10;11160:2;11157:1;11153:10;11191:3;11187:2;11183:12;11178:3;11175:21;11172:47;;;11199:18;;:::i;:::-;11235:13;;11018:236;-1:-1:-1;;;;11018:236:16:o;11612:350::-;11814:2;11796:21;;;11853:2;11833:18;;;11826:30;11892:28;11887:2;11872:18;;11865:56;11953:2;11938:18;;11612:350::o;13701:397::-;13903:2;13885:21;;;13942:2;13922:18;;;13915:30;13981:34;13976:2;13961:18;;13954:62;-1:-1:-1;;;14047:2:16;14032:18;;14025:31;14088:3;14073:19;;13701:397::o;14103:641::-;14292:5;14279:19;14307:32;14331:7;14307:32;:::i;:::-;-1:-1:-1;;;;;14411:7:16;14407:32;-1:-1:-1;;;;;14381:23:16;14374:4;14368:11;14364:41;14361:79;14355:4;14348:93;;14495:2;14488:5;14484:14;14471:28;14467:1;14461:4;14457:12;14450:50;14554:2;14547:5;14543:14;14530:28;14526:1;14520:4;14516:12;14509:50;14613:2;14606:5;14602:14;14589:28;14585:1;14579:4;14575:12;14568:50;14672:3;14665:5;14661:15;14648:29;14644:1;14638:4;14634:12;14627:51;14732:3;14725:5;14721:15;14708:29;14704:1;14698:4;14694:12;14687:51;14103:641;;:::o;14749:781::-;14987:3;14972:19;;15013:20;;15042:30;15013:20;15042:30;:::i;:::-;-1:-1:-1;;;;;15103:5:16;15099:30;15088:9;15081:49;;15193:4;15185:6;15181:17;15168:31;15161:4;15150:9;15146:20;15139:61;15263:4;15255:6;15251:17;15238:31;15231:4;15220:9;15216:20;15209:61;15333:4;15325:6;15321:17;15308:31;15301:4;15290:9;15286:20;15279:61;15403:4;15395:6;15391:17;15378:31;15371:4;15360:9;15356:20;15349:61;15473:4;15465:6;15461:17;15448:31;15441:4;15430:9;15426:20;15419:61;15517:6;15511:3;15500:9;15496:19;15489:35;14749:781;;;;;:::o;15535:390::-;15694:2;15683:9;15676:21;15733:6;15728:2;15717:9;15713:18;15706:34;15790:6;15782;15777:2;15766:9;15762:18;15749:48;15846:1;15817:22;;;15841:2;15813:31;;;15806:42;;;;15909:2;15888:15;;;-1:-1:-1;;15884:29:16;15869:45;15865:54;;15535:390;-1:-1:-1;15535:390:16:o;15930:128::-;15970:3;16001:1;15997:6;15994:1;15991:13;15988:39;;;16007:18;;:::i;:::-;-1:-1:-1;16043:9:16;;15930:128::o;18249:470::-;18428:3;18466:6;18460:13;18482:53;18528:6;18523:3;18516:4;18508:6;18504:17;18482:53;:::i;:::-;18598:13;;18557:16;;;;18620:57;18598:13;18557:16;18654:4;18642:17;;18620:57;:::i;19314:125::-;19354:4;19382:1;19379;19376:8;19373:34;;;19387:18;;:::i;:::-;-1:-1:-1;19424:9:16;;19314:125::o;21540:489::-;-1:-1:-1;;;;;21809:15:16;;;21791:34;;21861:15;;21856:2;21841:18;;21834:43;21908:2;21893:18;;21886:34;;;21956:3;21951:2;21936:18;;21929:31;;;21734:4;;21977:46;;22003:19;;21995:6;21977:46;:::i;:::-;21969:54;21540:489;-1:-1:-1;;;;;;21540:489:16:o;22034:249::-;22103:6;22156:2;22144:9;22135:7;22131:23;22127:32;22124:52;;;22172:1;22169;22162:12;22124:52;22204:9;22198:16;22223:30;22247:5;22223:30;:::i;23002:168::-;23042:7;23108:1;23104;23100:6;23096:14;23093:1;23090:21;23085:1;23078:9;23071:17;23067:45;23064:71;;;23115:18;;:::i;:::-;-1:-1:-1;23155:9:16;;23002:168::o;23885:127::-;23946:10;23941:3;23937:20;23934:1;23927:31;23977:4;23974:1;23967:15;24001:4;23998:1;23991:15;24017:135;24056:3;24077:17;;;24074:43;;24097:18;;:::i;:::-;-1:-1:-1;24144:1:16;24133:13;;24017:135::o

Swarm Source

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