ETH Price: $3,470.52 (+0.55%)

Born to Mint (BTMINT)
 

Overview

TokenID

153

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
borntomint

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-28
*/

// File: erc721a/contracts/IERC721A.sol
    
    
    // ERC721A Contracts v4.2.3
    // Creator: Chiru Labs
    
    pragma solidity ^0.8.4;
    
    /**
     * @dev Interface of ERC721A.
     */
    interface IERC721A {
        /**
         * The caller must own the token or be an approved operator.
         */
        error ApprovalCallerNotOwnerNorApproved();
    
        /**
         * The token does not exist.
         */
        error ApprovalQueryForNonexistentToken();
    
        /**
         * Cannot query the balance for the zero address.
         */
        error BalanceQueryForZeroAddress();
    
        /**
         * Cannot mint to the zero address.
         */
        error MintToZeroAddress();
    
        /**
         * The quantity of tokens minted must be more than zero.
         */
        error MintZeroQuantity();
    
        /**
         * The token does not exist.
         */
        error OwnerQueryForNonexistentToken();
    
        /**
         * The caller must own the token or be an approved operator.
         */
        error TransferCallerNotOwnerNorApproved();
    
        /**
         * The token must be owned by 'from'.
         */
        error TransferFromIncorrectOwner();
    
        /**
         * Cannot safely transfer to a contract that does not implement the
         * ERC721Receiver interface.
         */
        error TransferToNonERC721ReceiverImplementer();
    
        /**
         * Cannot transfer to the zero address.
         */
        error TransferToZeroAddress();
    
        /**
         * The token does not exist.
         */
        error URIQueryForNonexistentToken();
    
        /**
         * The 'quantity' minted with ERC2309 exceeds the safety limit.
         */
        error MintERC2309QuantityExceedsLimit();
    
        /**
         * The 'extraData' cannot be set on an unintialized ownership slot.
         */
        error OwnershipNotInitializedForExtraData();
    
        // =============================================================
        //                            STRUCTS
        // =============================================================
    
        struct TokenOwnership {
            // The address of the owner.
            address addr;
            // Stores the start time of ownership with minimal overhead for tokenomics.
            uint64 startTimestamp;
            // Whether the token has been burned.
            bool burned;
            // Arbitrary data similar to 'startTimestamp' that can be set via {_extraData}.
            uint24 extraData;
        }
    
        // =============================================================
        //                         TOKEN COUNTERS
        // =============================================================
    
        /**
         * @dev Returns the total number of tokens in existence.
         * Burned tokens will reduce the count.
         * To get the total number of tokens minted, please see {_totalMinted}.
         */
        function totalSupply() external view returns (uint256);
    
        // =============================================================
        //                            IERC165
        // =============================================================
    
        /**
         * @dev Returns true if this contract implements the interface defined by
         * 'interfaceId'. See the corresponding
         * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
         * to learn more about how these ids are created.
         *
         * This function call must use less than 30000 gas.
         */
        function supportsInterface(bytes4 interfaceId) external view returns (bool);
    
        // =============================================================
        //                            IERC721
        // =============================================================
    
        /**
         * @dev Emitted when 'tokenId' token is transferred from 'from' to 'to'.
         */
        event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    
        /**
         * @dev Emitted when 'owner' enables 'approved' to manage the 'tokenId' token.
         */
        event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    
        /**
         * @dev Emitted when 'owner' enables or disables
         * ('approved') 'operator' to manage all of its assets.
         */
        event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
        /**
         * @dev Returns the number of tokens in 'owner''s account.
         */
        function balanceOf(address owner) external view returns (uint256 balance);
    
        /**
         * @dev Returns the owner of the 'tokenId' token.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         */
        function ownerOf(uint256 tokenId) external view returns (address owner);
    
        /**
         * @dev Safely transfers 'tokenId' token from 'from' to 'to',
         * checking first that contract recipients are aware of the ERC721 protocol
         * to prevent tokens from being forever locked.
         *
         * Requirements:
         *
         * - 'from' cannot be the zero address.
         * - 'to' cannot be the zero address.
         * - 'tokenId' token must exist and be owned by 'from'.
         * - If the caller is not 'from', it must be have been allowed to move
         * this token by either {approve} or {setApprovalForAll}.
         * - If 'to' refers to a smart contract, it must implement
         * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
         *
         * Emits a {Transfer} event.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 tokenId,
            bytes calldata data
        ) external payable;
    
        /**
         * @dev Equivalent to 'safeTransferFrom(from, to, tokenId, '')'.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 tokenId
        ) external payable;
    
        /**
         * @dev Transfers 'tokenId' from 'from' to 'to'.
         *
         * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
         * whenever possible.
         *
         * Requirements:
         *
         * - 'from' cannot be the zero address.
         * - 'to' cannot be the zero address.
         * - 'tokenId' token must be owned by 'from'.
         * - If the caller is not 'from', it must be approved to move this token
         * by either {approve} or {setApprovalForAll}.
         *
         * Emits a {Transfer} event.
         */
        function transferFrom(
            address from,
            address to,
            uint256 tokenId
        ) external payable;
    
        /**
         * @dev Gives permission to 'to' to transfer 'tokenId' token to another account.
         * The approval is cleared when the token is transferred.
         *
         * Only a single account can be approved at a time, so approving the
         * zero address clears previous approvals.
         *
         * Requirements:
         *
         * - The caller must own the token or be an approved operator.
         * - 'tokenId' must exist.
         *
         * Emits an {Approval} event.
         */
        function approve(address to, uint256 tokenId) external payable;
    
        /**
         * @dev Approve or remove 'operator' as an operator for the caller.
         * Operators can call {transferFrom} or {safeTransferFrom}
         * for any token owned by the caller.
         *
         * Requirements:
         *
         * - The 'operator' cannot be the caller.
         *
         * Emits an {ApprovalForAll} event.
         */
        function setApprovalForAll(address operator, bool _approved) external;
    
        /**
         * @dev Returns the account approved for 'tokenId' token.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         */
        function getApproved(uint256 tokenId) external view returns (address operator);
    
        /**
         * @dev Returns if the 'operator' is allowed to manage all of the assets of 'owner'.
         *
         * See {setApprovalForAll}.
         */
        function isApprovedForAll(address owner, address operator) external view returns (bool);
    
        // =============================================================
        //                        IERC721Metadata
        // =============================================================
    
        /**
         * @dev Returns the token collection name.
         */
        function name() external view returns (string memory);
    
        /**
         * @dev Returns the token collection symbol.
         */
        function symbol() external view returns (string memory);
    
        /**
         * @dev Returns the Uniform Resource Identifier (URI) for 'tokenId' token.
         */
        function tokenURI(uint256 tokenId) external view returns (string memory);
    
        // =============================================================
        //                           IERC2309
        // =============================================================
    
        /**
         * @dev Emitted when tokens in 'fromTokenId' to 'toTokenId'
         * (inclusive) is transferred from 'from' to 'to', as defined in the
         * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
         *
         * See {_mintERC2309} for more details.
         */
        event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
    }
    
    // File: erc721a/contracts/ERC721A.sol
    
    
    // ERC721A Contracts v4.2.3
    // Creator: Chiru Labs
    
    pragma solidity ^0.8.4;
    
    
    /**
     * @dev Interface of ERC721 token receiver.
     */
    interface ERC721A__IERC721Receiver {
        function onERC721Received(
            address operator,
            address from,
            uint256 tokenId,
            bytes calldata data
        ) external returns (bytes4);
    }
    
    /**
     * @title ERC721A
     *
     * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
     * Non-Fungible Token Standard, including the Metadata extension.
     * Optimized for lower gas during batch mints.
     *
     * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
     * starting from '_startTokenId()'.
     *
     * Assumptions:
     *
     * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
     * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
     */
    contract ERC721A is IERC721A {
        // Bypass for a '--via-ir' bug (https://github.com/chiru-labs/ERC721A/pull/364).
        struct TokenApprovalRef {
            address value;
        }
    
        // =============================================================
        //                           CONSTANTS
        // =============================================================
    
        // Mask of an entry in packed address data.
        uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
    
        // The bit position of 'numberMinted' in packed address data.
        uint256 private constant _BITPOS_NUMBER_MINTED = 64;
    
        // The bit position of 'numberBurned' in packed address data.
        uint256 private constant _BITPOS_NUMBER_BURNED = 128;
    
        // The bit position of 'aux' in packed address data.
        uint256 private constant _BITPOS_AUX = 192;
    
        // Mask of all 256 bits in packed address data except the 64 bits for 'aux'.
        uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
    
        // The bit position of 'startTimestamp' in packed ownership.
        uint256 private constant _BITPOS_START_TIMESTAMP = 160;
    
        // The bit mask of the 'burned' bit in packed ownership.
        uint256 private constant _BITMASK_BURNED = 1 << 224;
    
        // The bit position of the 'nextInitialized' bit in packed ownership.
        uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
    
        // The bit mask of the 'nextInitialized' bit in packed ownership.
        uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
    
        // The bit position of 'extraData' in packed ownership.
        uint256 private constant _BITPOS_EXTRA_DATA = 232;
    
        // Mask of all 256 bits in a packed ownership except the 24 bits for 'extraData'.
        uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
    
        // The mask of the lower 160 bits for addresses.
        uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
    
        // The maximum 'quantity' that can be minted with {_mintERC2309}.
        // This limit is to prevent overflows on the address data entries.
        // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
        // is required to cause an overflow, which is unrealistic.
        uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
    
        // The 'Transfer' event signature is given by:
        // 'keccak256(bytes("Transfer(address,address,uint256)"))'.
        bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
            0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
    
        // =============================================================
        //                            STORAGE
        // =============================================================
    
        // The next token ID to be minted.
        uint256 private _currentIndex;
    
        // The number of tokens burned.
        uint256 private _burnCounter;
    
        // Token name
        string private _name;
    
        // Token symbol
        string private _symbol;
    
        // Mapping from token ID to ownership details
        // An empty struct value does not necessarily mean the token is unowned.
        // See {_packedOwnershipOf} implementation for details.
        //
        // Bits Layout:
        // - [0..159]   'addr'
        // - [160..223] 'startTimestamp'
        // - [224]      'burned'
        // - [225]      'nextInitialized'
        // - [232..255] 'extraData'
        mapping(uint256 => uint256) private _packedOwnerships;
    
        // Mapping owner address to address data.
        //
        // Bits Layout:
        // - [0..63]    'balance'
        // - [64..127]  'numberMinted'
        // - [128..191] 'numberBurned'
        // - [192..255] 'aux'
        mapping(address => uint256) private _packedAddressData;
    
        // Mapping from token ID to approved address.
        mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
    
        // Mapping from owner to operator approvals
        mapping(address => mapping(address => bool)) private _operatorApprovals;
    
        // =============================================================
        //                          CONSTRUCTOR
        // =============================================================
    
        constructor(string memory name_, string memory symbol_) {
            _name = name_;
            _symbol = symbol_;
            _currentIndex = _startTokenId();
        }
    
        // =============================================================
        //                   TOKEN COUNTING OPERATIONS
        // =============================================================
    
        /**
         * @dev Returns the starting token ID.
         * To change the starting token ID, please override this function.
         */
        function _startTokenId() internal view virtual returns (uint256) {
            return 0;
        }
    
        /**
         * @dev Returns the next token ID to be minted.
         */
        function _nextTokenId() internal view virtual returns (uint256) {
            return _currentIndex;
        }
    
        /**
         * @dev Returns the total number of tokens in existence.
         * Burned tokens will reduce the count.
         * To get the total number of tokens minted, please see {_totalMinted}.
         */
        function totalSupply() public view virtual override returns (uint256) {
            // Counter underflow is impossible as _burnCounter cannot be incremented
            // more than '_currentIndex - _startTokenId()' times.
            unchecked {
                return _currentIndex - _burnCounter - _startTokenId();
            }
        }
    
        /**
         * @dev Returns the total amount of tokens minted in the contract.
         */
        function _totalMinted() internal view virtual returns (uint256) {
            // Counter underflow is impossible as '_currentIndex' does not decrement,
            // and it is initialized to '_startTokenId()'.
            unchecked {
                return _currentIndex - _startTokenId();
            }
        }
    
        /**
         * @dev Returns the total number of tokens burned.
         */
        function _totalBurned() internal view virtual returns (uint256) {
            return _burnCounter;
        }
    
        // =============================================================
        //                    ADDRESS DATA OPERATIONS
        // =============================================================
    
        /**
         * @dev Returns the number of tokens in 'owner''s account.
         */
        function balanceOf(address owner) public view virtual override returns (uint256) {
            if (owner == address(0)) revert BalanceQueryForZeroAddress();
            return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
        }
    
        /**
         * Returns the number of tokens minted by 'owner'.
         */
        function _numberMinted(address owner) internal view returns (uint256) {
            return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
        }
    
        /**
         * Returns the number of tokens burned by or on behalf of 'owner'.
         */
        function _numberBurned(address owner) internal view returns (uint256) {
            return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
        }
    
        /**
         * Returns the auxiliary data for 'owner'. (e.g. number of whitelist mint slots used).
         */
        function _getAux(address owner) internal view returns (uint64) {
            return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
        }
    
        /**
         * Sets the auxiliary data for 'owner'. (e.g. number of whitelist mint slots used).
         * If there are multiple variables, please pack them into a uint64.
         */
        function _setAux(address owner, uint64 aux) internal virtual {
            uint256 packed = _packedAddressData[owner];
            uint256 auxCasted;
            // Cast 'aux' with assembly to avoid redundant masking.
            assembly {
                auxCasted := aux
            }
            packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
            _packedAddressData[owner] = packed;
        }
    
        // =============================================================
        //                            IERC165
        // =============================================================
    
        /**
         * @dev Returns true if this contract implements the interface defined by
         * 'interfaceId'. See the corresponding
         * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
         * to learn more about how these ids are created.
         *
         * This function call must use less than 30000 gas.
         */
        function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
            // The interface IDs are constants representing the first 4 bytes
            // of the XOR of all function selectors in the interface.
            // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
            // (e.g. 'bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)')
            return
                interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
                interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
                interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
        }
    
        // =============================================================
        //                        IERC721Metadata
        // =============================================================
    
        /**
         * @dev Returns the token collection name.
         */
        function name() public view virtual override returns (string memory) {
            return _name;
        }
    
        /**
         * @dev Returns the token collection symbol.
         */
        function symbol() public view virtual override returns (string memory) {
            return _symbol;
        }
    
        /**
         * @dev Returns the Uniform Resource Identifier (URI) for 'tokenId' token.
         */
        function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
            if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
    
            string memory baseURI = _baseURI();
            return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
        }
    
        /**
         * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
         * token will be the concatenation of the 'baseURI' and the 'tokenId'. Empty
         * by default, it can be overridden in child contracts.
         */
        function _baseURI() internal view virtual returns (string memory) {
            return '';
        }
    
        // =============================================================
        //                     OWNERSHIPS OPERATIONS
        // =============================================================
    
        /**
         * @dev Returns the owner of the 'tokenId' token.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         */
        function ownerOf(uint256 tokenId) public view virtual override returns (address) {
            return address(uint160(_packedOwnershipOf(tokenId)));
        }
    
        /**
         * @dev Gas spent here starts off proportional to the maximum mint batch size.
         * It gradually moves to O(1) as tokens get transferred around over time.
         */
        function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
            return _unpackedOwnership(_packedOwnershipOf(tokenId));
        }
    
        /**
         * @dev Returns the unpacked 'TokenOwnership' struct at 'index'.
         */
        function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
            return _unpackedOwnership(_packedOwnerships[index]);
        }
    
        /**
         * @dev Initializes the ownership slot minted at 'index' for efficiency purposes.
         */
        function _initializeOwnershipAt(uint256 index) internal virtual {
            if (_packedOwnerships[index] == 0) {
                _packedOwnerships[index] = _packedOwnershipOf(index);
            }
        }
    
        /**
         * Returns the packed ownership data of 'tokenId'.
         */
        function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
            uint256 curr = tokenId;
    
            unchecked {
                if (_startTokenId() <= curr)
                    if (curr < _currentIndex) {
                        uint256 packed = _packedOwnerships[curr];
                        // If not burned.
                        if (packed & _BITMASK_BURNED == 0) {
                            // Invariant:
                            // There will always be an initialized ownership slot
                            // (i.e. 'ownership.addr != address(0) && ownership.burned == false')
                            // before an unintialized ownership slot
                            // (i.e. 'ownership.addr == address(0) && ownership.burned == false')
                            // Hence, 'curr' will not underflow.
                            //
                            // We can directly compare the packed value.
                            // If the address is zero, packed will be zero.
                            while (packed == 0) {
                                packed = _packedOwnerships[--curr];
                            }
                            return packed;
                        }
                    }
            }
            revert OwnerQueryForNonexistentToken();
        }
    
        /**
         * @dev Returns the unpacked 'TokenOwnership' struct from 'packed'.
         */
        function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
            ownership.addr = address(uint160(packed));
            ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
            ownership.burned = packed & _BITMASK_BURNED != 0;
            ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
        }
    
        /**
         * @dev Packs ownership data into a single uint256.
         */
        function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
            assembly {
                // Mask 'owner' to the lower 160 bits, in case the upper bits somehow aren't clean.
                owner := and(owner, _BITMASK_ADDRESS)
                // 'owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags'.
                result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
            }
        }
    
        /**
         * @dev Returns the 'nextInitialized' flag set if 'quantity' equals 1.
         */
        function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
            // For branchless setting of the 'nextInitialized' flag.
            assembly {
                // '(quantity == 1) << _BITPOS_NEXT_INITIALIZED'.
                result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
            }
        }
    
        // =============================================================
        //                      APPROVAL OPERATIONS
        // =============================================================
    
        /**
         * @dev Gives permission to 'to' to transfer 'tokenId' token to another account.
         * The approval is cleared when the token is transferred.
         *
         * Only a single account can be approved at a time, so approving the
         * zero address clears previous approvals.
         *
         * Requirements:
         *
         * - The caller must own the token or be an approved operator.
         * - 'tokenId' must exist.
         *
         * Emits an {Approval} event.
         */
        function approve(address to, uint256 tokenId) public payable virtual override {
            address owner = ownerOf(tokenId);
    
            if (_msgSenderERC721A() != owner)
                if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                    revert ApprovalCallerNotOwnerNorApproved();
                }
    
            _tokenApprovals[tokenId].value = to;
            emit Approval(owner, to, tokenId);
        }
    
        /**
         * @dev Returns the account approved for 'tokenId' token.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         */
        function getApproved(uint256 tokenId) public view virtual override returns (address) {
            if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
    
            return _tokenApprovals[tokenId].value;
        }
    
        /**
         * @dev Approve or remove 'operator' as an operator for the caller.
         * Operators can call {transferFrom} or {safeTransferFrom}
         * for any token owned by the caller.
         *
         * Requirements:
         *
         * - The 'operator' cannot be the caller.
         *
         * Emits an {ApprovalForAll} event.
         */
        function setApprovalForAll(address operator, bool approved) public virtual override {
            _operatorApprovals[_msgSenderERC721A()][operator] = approved;
            emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
        }
    
        /**
         * @dev Returns if the 'operator' is allowed to manage all of the assets of 'owner'.
         *
         * See {setApprovalForAll}.
         */
        function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
            return _operatorApprovals[owner][operator];
        }
    
        /**
         * @dev Returns whether 'tokenId' exists.
         *
         * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
         *
         * Tokens start existing when they are minted. See {_mint}.
         */
        function _exists(uint256 tokenId) internal view virtual returns (bool) {
            return
                _startTokenId() <= tokenId &&
                tokenId < _currentIndex && // If within bounds,
                _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
        }
    
        /**
         * @dev Returns whether 'msgSender' is equal to 'approvedAddress' or 'owner'.
         */
        function _isSenderApprovedOrOwner(
            address approvedAddress,
            address owner,
            address msgSender
        ) private pure returns (bool result) {
            assembly {
                // Mask 'owner' to the lower 160 bits, in case the upper bits somehow aren't clean.
                owner := and(owner, _BITMASK_ADDRESS)
                // Mask 'msgSender' to the lower 160 bits, in case the upper bits somehow aren't clean.
                msgSender := and(msgSender, _BITMASK_ADDRESS)
                // 'msgSender == owner || msgSender == approvedAddress'.
                result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
            }
        }
    
        /**
         * @dev Returns the storage slot and value for the approved address of 'tokenId'.
         */
        function _getApprovedSlotAndAddress(uint256 tokenId)
            private
            view
            returns (uint256 approvedAddressSlot, address approvedAddress)
        {
            TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
            // The following is equivalent to 'approvedAddress = _tokenApprovals[tokenId].value'.
            assembly {
                approvedAddressSlot := tokenApproval.slot
                approvedAddress := sload(approvedAddressSlot)
            }
        }
    
        // =============================================================
        //                      TRANSFER OPERATIONS
        // =============================================================
    
        /**
         * @dev Transfers 'tokenId' from 'from' to 'to'.
         *
         * Requirements:
         *
         * - 'from' cannot be the zero address.
         * - 'to' cannot be the zero address.
         * - 'tokenId' token must be owned by 'from'.
         * - If the caller is not 'from', it must be approved to move this token
         * by either {approve} or {setApprovalForAll}.
         *
         * Emits a {Transfer} event.
         */
        function transferFrom(
            address from,
            address to,
            uint256 tokenId
        ) public payable virtual override {
            uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
    
            if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
    
            (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
    
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
    
            if (to == address(0)) revert TransferToZeroAddress();
    
            _beforeTokenTransfers(from, to, tokenId, 1);
    
            // Clear approvals from the previous owner.
            assembly {
                if approvedAddress {
                    // This is equivalent to 'delete _tokenApprovals[tokenId]'.
                    sstore(approvedAddressSlot, 0)
                }
            }
    
            // Underflow of the sender's balance is impossible because we check for
            // ownership above and the recipient's balance can't realistically overflow.
            // Counter overflow is incredibly unrealistic as 'tokenId' would have to be 2**256.
            unchecked {
                // We can directly increment and decrement the balances.
                --_packedAddressData[from]; // Updates: 'balance -= 1'.
                ++_packedAddressData[to]; // Updates: 'balance += 1'.
    
                // Updates:
                // - 'address' to the next owner.
                // - 'startTimestamp' to the timestamp of transfering.
                // - 'burned' to 'false'.
                // - 'nextInitialized' to 'true'.
                _packedOwnerships[tokenId] = _packOwnershipData(
                    to,
                    _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
                );
    
                // If the next slot may not have been initialized (i.e. 'nextInitialized == false') .
                if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                    uint256 nextTokenId = tokenId + 1;
                    // If the next slot's address is zero and not burned (i.e. packed value is zero).
                    if (_packedOwnerships[nextTokenId] == 0) {
                        // If the next slot is within bounds.
                        if (nextTokenId != _currentIndex) {
                            // Initialize the next slot to maintain correctness for 'ownerOf(tokenId + 1)'.
                            _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                        }
                    }
                }
            }
    
            emit Transfer(from, to, tokenId);
            _afterTokenTransfers(from, to, tokenId, 1);
        }
    
        /**
         * @dev Equivalent to 'safeTransferFrom(from, to, tokenId, '')'.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 tokenId
        ) public payable virtual override {
            safeTransferFrom(from, to, tokenId, '');
        }
    
        /**
         * @dev Safely transfers 'tokenId' token from 'from' to 'to'.
         *
         * Requirements:
         *
         * - 'from' cannot be the zero address.
         * - 'to' cannot be the zero address.
         * - 'tokenId' token must exist and be owned by 'from'.
         * - If the caller is not 'from', it must be approved to move this token
         * by either {approve} or {setApprovalForAll}.
         * - If 'to' refers to a smart contract, it must implement
         * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
         *
         * Emits a {Transfer} event.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 tokenId,
            bytes memory _data
        ) public payable virtual override {
            transferFrom(from, to, tokenId);
            if (to.code.length != 0)
                if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
        }
    
        /**
         * @dev Hook that is called before a set of serially-ordered token IDs
         * are about to be transferred. This includes minting.
         * And also called before burning one token.
         *
         * 'startTokenId' - the first token ID to be transferred.
         * 'quantity' - the amount to be transferred.
         *
         * Calling conditions:
         *
         * - When 'from' and 'to' are both non-zero, 'from''s 'tokenId' will be
         * transferred to 'to'.
         * - When 'from' is zero, 'tokenId' will be minted for 'to'.
         * - When 'to' is zero, 'tokenId' will be burned by 'from'.
         * - 'from' and 'to' are never both zero.
         */
        function _beforeTokenTransfers(
            address from,
            address to,
            uint256 startTokenId,
            uint256 quantity
        ) internal virtual {}
    
        /**
         * @dev Hook that is called after a set of serially-ordered token IDs
         * have been transferred. This includes minting.
         * And also called after one token has been burned.
         *
         * 'startTokenId' - the first token ID to be transferred.
         * 'quantity' - the amount to be transferred.
         *
         * Calling conditions:
         *
         * - When 'from' and 'to' are both non-zero, 'from''s 'tokenId' has been
         * transferred to 'to'.
         * - When 'from' is zero, 'tokenId' has been minted for 'to'.
         * - When 'to' is zero, 'tokenId' has been burned by 'from'.
         * - 'from' and 'to' are never both zero.
         */
        function _afterTokenTransfers(
            address from,
            address to,
            uint256 startTokenId,
            uint256 quantity
        ) internal virtual {}
    
        /**
         * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
         *
         * 'from' - Previous owner of the given token ID.
         * 'to' - Target address that will receive the token.
         * 'tokenId' - Token ID to be transferred.
         * '_data' - Optional data to send along with the call.
         *
         * Returns whether the call correctly returned the expected magic value.
         */
        function _checkContractOnERC721Received(
            address from,
            address to,
            uint256 tokenId,
            bytes memory _data
        ) private returns (bool) {
            try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
                bytes4 retval
            ) {
                return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }
    
        // =============================================================
        //                        MINT OPERATIONS
        // =============================================================
    
        /**
         * @dev Mints 'quantity' tokens and transfers them to 'to'.
         *
         * Requirements:
         *
         * - 'to' cannot be the zero address.
         * - 'quantity' must be greater than 0.
         *
         * Emits a {Transfer} event for each mint.
         */
        function _mint(address to, uint256 quantity) internal virtual {
            uint256 startTokenId = _currentIndex;
            if (quantity == 0) revert MintZeroQuantity();
    
            _beforeTokenTransfers(address(0), to, startTokenId, quantity);
    
            // Overflows are incredibly unrealistic.
            // 'balance' and 'numberMinted' have a maximum limit of 2**64.
            // 'tokenId' has a maximum limit of 2**256.
            unchecked {
                // Updates:
                // - 'balance += quantity'.
                // - 'numberMinted += quantity'.
                //
                // We can directly add to the 'balance' and 'numberMinted'.
                _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
    
                // Updates:
                // - 'address' to the owner.
                // - 'startTimestamp' to the timestamp of minting.
                // - 'burned' to 'false'.
                // - 'nextInitialized' to 'quantity == 1'.
                _packedOwnerships[startTokenId] = _packOwnershipData(
                    to,
                    _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
                );
    
                uint256 toMasked;
                uint256 end = startTokenId + quantity;
    
                // Use assembly to loop and emit the 'Transfer' event for gas savings.
                // The duplicated 'log4' removes an extra check and reduces stack juggling.
                // The assembly, together with the surrounding Solidity code, have been
                // delicately arranged to nudge the compiler into producing optimized opcodes.
                assembly {
                    // Mask 'to' to the lower 160 bits, in case the upper bits somehow aren't clean.
                    toMasked := and(to, _BITMASK_ADDRESS)
                    // Emit the 'Transfer' event.
                    log4(
                        0, // Start of data (0, since no data).
                        0, // End of data (0, since no data).
                        _TRANSFER_EVENT_SIGNATURE, // Signature.
                        0, // 'address(0)'.
                        toMasked, // 'to'.
                        startTokenId // 'tokenId'.
                    )
    
                    // The 'iszero(eq(,))' check ensures that large values of 'quantity'
                    // that overflows uint256 will make the loop run out of gas.
                    // The compiler will optimize the 'iszero' away for performance.
                    for {
                        let tokenId := add(startTokenId, 1)
                    } iszero(eq(tokenId, end)) {
                        tokenId := add(tokenId, 1)
                    } {
                        // Emit the 'Transfer' event. Similar to above.
                        log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                    }
                }
                if (toMasked == 0) revert MintToZeroAddress();
    
                _currentIndex = end;
            }
            _afterTokenTransfers(address(0), to, startTokenId, quantity);
        }
    
        /**
         * @dev Mints 'quantity' tokens and transfers them to 'to'.
         *
         * This function is intended for efficient minting only during contract creation.
         *
         * It emits only one {ConsecutiveTransfer} as defined in
         * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
         * instead of a sequence of {Transfer} event(s).
         *
         * Calling this function outside of contract creation WILL make your contract
         * non-compliant with the ERC721 standard.
         * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
         * {ConsecutiveTransfer} event is only permissible during contract creation.
         *
         * Requirements:
         *
         * - 'to' cannot be the zero address.
         * - 'quantity' must be greater than 0.
         *
         * Emits a {ConsecutiveTransfer} event.
         */
        function _mintERC2309(address to, uint256 quantity) internal virtual {
            uint256 startTokenId = _currentIndex;
            if (to == address(0)) revert MintToZeroAddress();
            if (quantity == 0) revert MintZeroQuantity();
            if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
    
            _beforeTokenTransfers(address(0), to, startTokenId, quantity);
    
            // Overflows are unrealistic due to the above check for 'quantity' to be below the limit.
            unchecked {
                // Updates:
                // - 'balance += quantity'.
                // - 'numberMinted += quantity'.
                //
                // We can directly add to the 'balance' and 'numberMinted'.
                _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
    
                // Updates:
                // - 'address' to the owner.
                // - 'startTimestamp' to the timestamp of minting.
                // - 'burned' to 'false'.
                // - 'nextInitialized' to 'quantity == 1'.
                _packedOwnerships[startTokenId] = _packOwnershipData(
                    to,
                    _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
                );
    
                emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
    
                _currentIndex = startTokenId + quantity;
            }
            _afterTokenTransfers(address(0), to, startTokenId, quantity);
        }
    
        /**
         * @dev Safely mints 'quantity' tokens and transfers them to 'to'.
         *
         * Requirements:
         *
         * - If 'to' refers to a smart contract, it must implement
         * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
         * - 'quantity' must be greater than 0.
         *
         * See {_mint}.
         *
         * Emits a {Transfer} event for each mint.
         */
        function _safeMint(
            address to,
            uint256 quantity,
            bytes memory _data
        ) internal virtual {
            _mint(to, quantity);
    
            unchecked {
                if (to.code.length != 0) {
                    uint256 end = _currentIndex;
                    uint256 index = end - quantity;
                    do {
                        if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                            revert TransferToNonERC721ReceiverImplementer();
                        }
                    } while (index < end);
                    // Reentrancy protection.
                    if (_currentIndex != end) revert();
                }
            }
        }
    
        /**
         * @dev Equivalent to '_safeMint(to, quantity, '')'.
         */
        function _safeMint(address to, uint256 quantity) internal virtual {
            _safeMint(to, quantity, '');
        }
    
        // =============================================================
        //                        BURN OPERATIONS
        // =============================================================
    
        /**
         * @dev Equivalent to '_burn(tokenId, false)'.
         */
        function _burn(uint256 tokenId) internal virtual {
            _burn(tokenId, false);
        }
    
        /**
         * @dev Destroys 'tokenId'.
         * The approval is cleared when the token is burned.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         *
         * Emits a {Transfer} event.
         */
        function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
            uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
    
            address from = address(uint160(prevOwnershipPacked));
    
            (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
    
            if (approvalCheck) {
                // The nested ifs save around 20+ gas over a compound boolean condition.
                if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                    if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
            }
    
            _beforeTokenTransfers(from, address(0), tokenId, 1);
    
            // Clear approvals from the previous owner.
            assembly {
                if approvedAddress {
                    // This is equivalent to 'delete _tokenApprovals[tokenId]'.
                    sstore(approvedAddressSlot, 0)
                }
            }
    
            // Underflow of the sender's balance is impossible because we check for
            // ownership above and the recipient's balance can't realistically overflow.
            // Counter overflow is incredibly unrealistic as 'tokenId' would have to be 2**256.
            unchecked {
                // Updates:
                // - 'balance -= 1'.
                // - 'numberBurned += 1'.
                //
                // We can directly decrement the balance, and increment the number burned.
                // This is equivalent to 'packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;'.
                _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
    
                // Updates:
                // - 'address' to the last owner.
                // - 'startTimestamp' to the timestamp of burning.
                // - 'burned' to 'true'.
                // - 'nextInitialized' to 'true'.
                _packedOwnerships[tokenId] = _packOwnershipData(
                    from,
                    (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
                );
    
                // If the next slot may not have been initialized (i.e. 'nextInitialized == false') .
                if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                    uint256 nextTokenId = tokenId + 1;
                    // If the next slot's address is zero and not burned (i.e. packed value is zero).
                    if (_packedOwnerships[nextTokenId] == 0) {
                        // If the next slot is within bounds.
                        if (nextTokenId != _currentIndex) {
                            // Initialize the next slot to maintain correctness for 'ownerOf(tokenId + 1)'.
                            _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                        }
                    }
                }
            }
    
            emit Transfer(from, address(0), tokenId);
            _afterTokenTransfers(from, address(0), tokenId, 1);
    
            // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
            unchecked {
                _burnCounter++;
            }
        }
    
        // =============================================================
        //                     EXTRA DATA OPERATIONS
        // =============================================================
    
        /**
         * @dev Directly sets the extra data for the ownership data 'index'.
         */
        function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
            uint256 packed = _packedOwnerships[index];
            if (packed == 0) revert OwnershipNotInitializedForExtraData();
            uint256 extraDataCasted;
            // Cast 'extraData' with assembly to avoid redundant masking.
            assembly {
                extraDataCasted := extraData
            }
            packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
            _packedOwnerships[index] = packed;
        }
    
        /**
         * @dev Called during each token transfer to set the 24bit 'extraData' field.
         * Intended to be overridden by the cosumer contract.
         *
         * 'previousExtraData' - the value of 'extraData' before transfer.
         *
         * Calling conditions:
         *
         * - When 'from' and 'to' are both non-zero, 'from''s 'tokenId' will be
         * transferred to 'to'.
         * - When 'from' is zero, 'tokenId' will be minted for 'to'.
         * - When 'to' is zero, 'tokenId' will be burned by 'from'.
         * - 'from' and 'to' are never both zero.
         */
        function _extraData(
            address from,
            address to,
            uint24 previousExtraData
        ) internal view virtual returns (uint24) {}
    
        /**
         * @dev Returns the next extra data for the packed ownership data.
         * The returned result is shifted into position.
         */
        function _nextExtraData(
            address from,
            address to,
            uint256 prevOwnershipPacked
        ) private view returns (uint256) {
            uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
            return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
        }
    
        // =============================================================
        //                       OTHER OPERATIONS
        // =============================================================
    
        /**
         * @dev Returns the message sender (defaults to 'msg.sender').
         *
         * If you are writing GSN compatible contracts, you need to override this function.
         */
        function _msgSenderERC721A() internal view virtual returns (address) {
            return msg.sender;
        }
    
        /**
         * @dev Converts a uint256 to its ASCII string decimal representation.
         */
        function _toString(uint256 value) internal pure virtual returns (string memory str) {
            assembly {
                // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
                // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
                // We will need 1 word for the trailing zeros padding, 1 word for the length,
                // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
                let m := add(mload(0x40), 0xa0)
                // Update the free memory pointer to allocate.
                mstore(0x40, m)
                // Assign the 'str' to the end.
                str := sub(m, 0x20)
                // Zeroize the slot after the string.
                mstore(str, 0)
    
                // Cache the end of the memory to calculate the length later.
                let end := str
    
                // We write the string from rightmost digit to leftmost digit.
                // The following is essentially a do-while loop that also handles the zero case.
                // prettier-ignore
                for { let temp := value } 1 {} {
                    str := sub(str, 1)
                    // Write the character to the pointer.
                    // The ASCII index of the '0' character is 48.
                    mstore8(str, add(48, mod(temp, 10)))
                    // Keep dividing 'temp' until zero.
                    temp := div(temp, 10)
                    // prettier-ignore
                    if iszero(temp) { break }
                }
    
                let length := sub(end, str)
                // Move the pointer 32 bytes leftwards to make room for the length.
                str := sub(str, 0x20)
                // Store the length.
                mstore(str, length)
            }
        }
    }
    
    // File: erc721a/contracts/extensions/IERC721AQueryable.sol
    
    
    // ERC721A Contracts v4.2.3
    // Creator: Chiru Labs
    
    pragma solidity ^0.8.4;
    
    
    /**
     * @dev Interface of ERC721AQueryable.
     */
    interface IERC721AQueryable is IERC721A {
        /**
         * Invalid query range ('start' >= 'stop').
         */
        error InvalidQueryRange();
    
        /**
         * @dev Returns the 'TokenOwnership' struct at 'tokenId' without reverting.
         *
         * If the 'tokenId' is out of bounds:
         *
         * - 'addr = address(0)'
         * - 'startTimestamp = 0'
         * - 'burned = false'
         * - 'extraData = 0'
         *
         * If the 'tokenId' is burned:
         *
         * - 'addr = <Address of owner before token was burned>'
         * - 'startTimestamp = <Timestamp when token was burned>'
         * - 'burned = true'
         * - 'extraData = <Extra data when token was burned>'
         *
         * Otherwise:
         *
         * - 'addr = <Address of owner>'
         * - 'startTimestamp = <Timestamp of start of ownership>'
         * - 'burned = false'
         * - 'extraData = <Extra data at start of ownership>'
         */
        function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);
    
        /**
         * @dev Returns an array of 'TokenOwnership' structs at 'tokenIds' in order.
         * See {ERC721AQueryable-explicitOwnershipOf}
         */
        function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);
    
        /**
         * @dev Returns an array of token IDs owned by 'owner',
         * in the range ['start', 'stop')
         * (i.e. 'start <= tokenId < stop').
         *
         * This function allows for tokens to be queried if the collection
         * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
         *
         * Requirements:
         *
         * - 'start < stop'
         */
        function tokensOfOwnerIn(
            address owner,
            uint256 start,
            uint256 stop
        ) external view returns (uint256[] memory);
    
        /**
         * @dev Returns an array of token IDs owned by 'owner'.
         *
         * This function scans the ownership mapping and is O('totalSupply') in complexity.
         * It is meant to be called off-chain.
         *
         * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
         * multiple smaller scans if the collection is large enough to cause
         * an out-of-gas error (10K collections should be fine).
         */
        function tokensOfOwner(address owner) external view returns (uint256[] memory);
    }
    
    // File: contracts/IERC721L.sol
    
    pragma solidity ^0.8.4;
    
    
    interface IERC721L is IERC721AQueryable {
        error CannotIncreaseMaxMintableSupply();
        error CannotUpdatePermanentBaseURI();
        error GlobalWalletLimitOverflow();
        error InsufficientStageTimeGap();
        error InvalidProof();
        error InvalidStage();
        error InvalidStageArgsLength();
        error InvalidStartAndEndTimestamp();
        error NoSupplyLeft();
        error NotEnoughValue();
        error StageSupplyExceeded();
        error TimestampExpired();
        error WalletGlobalLimitExceeded();
        error WalletStageLimitExceeded();
        error WithdrawFailed();
    
        struct MintStageInfo {
            uint80 cost;
            uint32 walletLimit; // 0 for unlimited
            bytes32 merkleRoot; // 0x0 for no presale enforced
            uint24 maxStageSupply; // 0 for unlimited
            uint64 startTimeUnixSeconds;
            uint64 endTimeUnixSeconds;
        }
    
        event UpdateStage(
            uint256 stage,
            uint80 cost,
            uint32 walletLimit,
            bytes32 merkleRoot,
            uint24 maxStageSupply,
            uint64 startTimeUnixSeconds,
            uint64 endTimeUnixSeconds
        );
    
    
        event SetMaxMintableSupply(uint256 maxMintableSupply);
        event SetGlobalWalletLimit(uint256 globalWalletLimit);
        event SetActiveStage(uint256 activeStage);
        event SetBaseURI(string baseURI);
        event PermanentBaseURI(string baseURI);
        event Withdraw(uint256 value);
    
    
        function getNumberStages() external view returns (uint256);
    
        function getGlobalWalletLimit() external view returns (uint256);
    
        function getMaxMintableSupply() external view returns (uint256);
    
        function totalMintedByAddress(address a) external view returns (uint256);
    
        
    
        function getStageInfo(uint256 index)
            external
            view
            returns (
                MintStageInfo memory,
                uint32,
                uint256
            );
    
        function getActiveStageFromTimestamp(uint64 timestamp)
            external
            view
            returns (uint256);
    
    }
    // File: erc721a/contracts/extensions/ERC721AQueryable.sol
    
    
    // ERC721A Contracts v4.2.3
    // Creator: Chiru Labs
    
    pragma solidity ^0.8.4;
    
    
    
    /**
     * @title ERC721AQueryable.
     *
     * @dev ERC721A subclass with convenience query functions.
     */
    abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
        /**
         * @dev Returns the 'TokenOwnership' struct at 'tokenId' without reverting.
         *
         * If the 'tokenId' is out of bounds:
         *
         * - 'addr = address(0)'
         * - 'startTimestamp = 0'
         * - 'burned = false'
         * - 'extraData = 0'
         *
         * If the 'tokenId' is burned:
         *
         * - 'addr = <Address of owner before token was burned>'
         * - 'startTimestamp = <Timestamp when token was burned>'
         * - 'burned = true'
         * - 'extraData = <Extra data when token was burned>'
         *
         * Otherwise:
         *
         * - 'addr = <Address of owner>'
         * - 'startTimestamp = <Timestamp of start of ownership>'
         * - 'burned = false'
         * - 'extraData = <Extra data at start of ownership>'
         */
        function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
            TokenOwnership memory ownership;
            if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
                return ownership;
            }
            ownership = _ownershipAt(tokenId);
            if (ownership.burned) {
                return ownership;
            }
            return _ownershipOf(tokenId);
        }
    
        /**
         * @dev Returns an array of 'TokenOwnership' structs at 'tokenIds' in order.
         * See {ERC721AQueryable-explicitOwnershipOf}
         */
        function explicitOwnershipsOf(uint256[] calldata tokenIds)
            external
            view
            virtual
            override
            returns (TokenOwnership[] memory)
        {
            unchecked {
                uint256 tokenIdsLength = tokenIds.length;
                TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
                for (uint256 i; i != tokenIdsLength; ++i) {
                    ownerships[i] = explicitOwnershipOf(tokenIds[i]);
                }
                return ownerships;
            }
        }
    
        /**
         * @dev Returns an array of token IDs owned by 'owner',
         * in the range ['start', 'stop')
         * (i.e. 'start <= tokenId < stop').
         *
         * This function allows for tokens to be queried if the collection
         * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
         *
         * Requirements:
         *
         * - 'start < stop'
         */
        function tokensOfOwnerIn(
            address owner,
            uint256 start,
            uint256 stop
        ) external view virtual override returns (uint256[] memory) {
            unchecked {
                if (start >= stop) revert InvalidQueryRange();
                uint256 tokenIdsIdx;
                uint256 stopLimit = _nextTokenId();
                // Set 'start = max(start, _startTokenId())'.
                if (start < _startTokenId()) {
                    start = _startTokenId();
                }
                // Set 'stop = min(stop, stopLimit)'.
                if (stop > stopLimit) {
                    stop = stopLimit;
                }
                uint256 tokenIdsMaxLength = balanceOf(owner);
                // Set 'tokenIdsMaxLength = min(balanceOf(owner), stop - start)',
                // to cater for cases where 'balanceOf(owner)' is too big.
                if (start < stop) {
                    uint256 rangeLength = stop - start;
                    if (rangeLength < tokenIdsMaxLength) {
                        tokenIdsMaxLength = rangeLength;
                    }
                } else {
                    tokenIdsMaxLength = 0;
                }
                uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
                if (tokenIdsMaxLength == 0) {
                    return tokenIds;
                }
                // We need to call 'explicitOwnershipOf(start)',
                // because the slot at 'start' may not be initialized.
                TokenOwnership memory ownership = explicitOwnershipOf(start);
                address currOwnershipAddr;
                // If the starting slot exists (i.e. not burned), initialize 'currOwnershipAddr'.
                // 'ownership.address' will not be zero, as 'start' is clamped to the valid token ID range.
                if (!ownership.burned) {
                    currOwnershipAddr = ownership.addr;
                }
                for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                    ownership = _ownershipAt(i);
                    if (ownership.burned) {
                        continue;
                    }
                    if (ownership.addr != address(0)) {
                        currOwnershipAddr = ownership.addr;
                    }
                    if (currOwnershipAddr == owner) {
                        tokenIds[tokenIdsIdx++] = i;
                    }
                }
                // Downsize the array to fit.
                assembly {
                    mstore(tokenIds, tokenIdsIdx)
                }
                return tokenIds;
            }
        }
    
        /**
         * @dev Returns an array of token IDs owned by 'owner'.
         *
         * This function scans the ownership mapping and is O('totalSupply') in complexity.
         * It is meant to be called off-chain.
         *
         * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
         * multiple smaller scans if the collection is large enough to cause
         * an out-of-gas error (10K collections should be fine).
         */
        function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
            unchecked {
                uint256 tokenIdsIdx;
                address currOwnershipAddr;
                uint256 tokenIdsLength = balanceOf(owner);
                uint256[] memory tokenIds = new uint256[](tokenIdsLength);
                TokenOwnership memory ownership;
                for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                    ownership = _ownershipAt(i);
                    if (ownership.burned) {
                        continue;
                    }
                    if (ownership.addr != address(0)) {
                        currOwnershipAddr = ownership.addr;
                    }
                    if (currOwnershipAddr == owner) {
                        tokenIds[tokenIdsIdx++] = i;
                    }
                }
                return tokenIds;
            }
        }
    }
    
    
    // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
    
    
    // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)
    
    pragma solidity ^0.8.0;
    
    /**
     * @dev These functions deal with verification of Merkle Tree proofs.
     *
     * The tree and the proofs can be generated using our
     * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
     * You will find a quickstart guide in the readme.
     *
     * 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.
     * OpenZeppelin's JavaScript library generates merkle trees that are safe
     * against this attack out of the box.
     */
    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 Calldata version of {verify}
         *
         * _Available since v4.7._
         */
        function verifyCalldata(
            bytes32[] calldata proof,
            bytes32 root,
            bytes32 leaf
        ) internal pure returns (bool) {
            return processProofCalldata(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++) {
                computedHash = _hashPair(computedHash, proof[i]);
            }
            return computedHash;
        }
    
        /**
         * @dev Calldata version of {processProof}
         *
         * _Available since v4.7._
         */
        function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
            bytes32 computedHash = leaf;
            for (uint256 i = 0; i < proof.length; i++) {
                computedHash = _hashPair(computedHash, proof[i]);
            }
            return computedHash;
        }
    
        /**
         * @dev Returns true if the 'leaves' can be simultaneously proven to be a part of a merkle tree defined by
         * 'root', according to 'proof' and 'proofFlags' as described in {processMultiProof}.
         *
         * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
         *
         * _Available since v4.7._
         */
        function multiProofVerify(
            bytes32[] memory proof,
            bool[] memory proofFlags,
            bytes32 root,
            bytes32[] memory leaves
        ) internal pure returns (bool) {
            return processMultiProof(proof, proofFlags, leaves) == root;
        }
    
        /**
         * @dev Calldata version of {multiProofVerify}
         *
         * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
         *
         * _Available since v4.7._
         */
        function multiProofVerifyCalldata(
            bytes32[] calldata proof,
            bool[] calldata proofFlags,
            bytes32 root,
            bytes32[] memory leaves
        ) internal pure returns (bool) {
            return processMultiProofCalldata(proof, proofFlags, leaves) == root;
        }
    
        /**
         * @dev Returns the root of a tree reconstructed from 'leaves' and sibling nodes in 'proof'. The reconstruction
         * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
         * leaf/inner node or a proof sibling node, depending on whether each 'proofFlags' item is true or false
         * respectively.
         *
         * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
         * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
         * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
         *
         * _Available since v4.7._
         */
        function processMultiProof(
            bytes32[] memory proof,
            bool[] memory proofFlags,
            bytes32[] memory leaves
        ) internal pure returns (bytes32 merkleRoot) {
            // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
            // consuming and producing values on a queue. The queue starts with the 'leaves' array, then goes onto the
            // 'hashes' array. At the end of the process, the last hash in the 'hashes' array should contain the root of
            // the merkle tree.
            uint256 leavesLen = leaves.length;
            uint256 totalHashes = proofFlags.length;
    
            // Check proof validity.
            require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
    
            // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
            // 'xxx[xxxPos++]', which return the current value and increment the pointer, thus mimicking a queue's "pop".
            bytes32[] memory hashes = new bytes32[](totalHashes);
            uint256 leafPos = 0;
            uint256 hashPos = 0;
            uint256 proofPos = 0;
            // At each step, we compute the next hash using two values:
            // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
            //   get the next hash.
            // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
            //   'proof' array.
            for (uint256 i = 0; i < totalHashes; i++) {
                bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
                bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
                hashes[i] = _hashPair(a, b);
            }
    
            if (totalHashes > 0) {
                return hashes[totalHashes - 1];
            } else if (leavesLen > 0) {
                return leaves[0];
            } else {
                return proof[0];
            }
        }
    
        /**
         * @dev Calldata version of {processMultiProof}.
         *
         * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
         *
         * _Available since v4.7._
         */
        function processMultiProofCalldata(
            bytes32[] calldata proof,
            bool[] calldata proofFlags,
            bytes32[] memory leaves
        ) internal pure returns (bytes32 merkleRoot) {
            // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
            // consuming and producing values on a queue. The queue starts with the 'leaves' array, then goes onto the
            // 'hashes' array. At the end of the process, the last hash in the 'hashes' array should contain the root of
            // the merkle tree.
            uint256 leavesLen = leaves.length;
            uint256 totalHashes = proofFlags.length;
    
            // Check proof validity.
            require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
    
            // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
            // 'xxx[xxxPos++]', which return the current value and increment the pointer, thus mimicking a queue's "pop".
            bytes32[] memory hashes = new bytes32[](totalHashes);
            uint256 leafPos = 0;
            uint256 hashPos = 0;
            uint256 proofPos = 0;
            // At each step, we compute the next hash using two values:
            // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
            //   get the next hash.
            // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
            //   'proof' array.
            for (uint256 i = 0; i < totalHashes; i++) {
                bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
                bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
                hashes[i] = _hashPair(a, b);
            }
    
            if (totalHashes > 0) {
                return hashes[totalHashes - 1];
            } else if (leavesLen > 0) {
                return leaves[0];
            } else {
                return proof[0];
            }
        }
    
        function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
            return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
        }
    
        function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
            /// @solidity memory-safe-assembly
            assembly {
                mstore(0x00, a)
                mstore(0x20, b)
                value := keccak256(0x00, 0x40)
            }
        }
    }
    
    // File: @openzeppelin/contracts/security/ReentrancyGuard.sol
    
    
    // OpenZeppelin Contracts (last updated v4.8.0) (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() {
            _nonReentrantBefore();
            _;
            _nonReentrantAfter();
        }
    
        function _nonReentrantBefore() private {
            // On the first call to nonReentrant, _status will be _NOT_ENTERED
            require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
    
            // Any calls to nonReentrant after this point will fail
            _status = _ENTERED;
        }
    
        function _nonReentrantAfter() private {
            // By storing the original value once again, a refund is triggered (see
            // https://eips.ethereum.org/EIPS/eip-2200)
            _status = _NOT_ENTERED;
        }
    }
    
    // File: @openzeppelin/contracts/utils/Context.sol
    
    
    // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
    
    pragma solidity ^0.8.0;
    
    /**
     * @dev Provides information about the current execution context, including the
     * sender of the transaction and its data. While these are generally available
     * via msg.sender and msg.data, they should not be accessed in such a direct
     * manner, since when dealing with meta-transactions the account sending and
     * paying for execution may not be the actual sender (as far as an application
     * is concerned).
     *
     * This contract is only required for intermediate, library-like contracts.
     */
    abstract contract Context {
        function _msgSender() internal view virtual returns (address) {
            return msg.sender;
        }
    
        function _msgData() internal view virtual returns (bytes calldata) {
            return msg.data;
        }
    }
    
    // File: @openzeppelin/contracts/access/Ownable.sol
    
    
    // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
    
    pragma solidity ^0.8.0;
    
    
    /**
     * @dev Contract module which provides a basic access control mechanism, where
     * there is an account (an owner) that can be granted exclusive access to
     * specific functions.
     *
     * By default, the owner account will be the one that deploys the contract. This
     * can later be changed with {transferOwnership}.
     *
     * This module is used through inheritance. It will make available the modifier
     * 'onlyOwner', which can be applied to your functions to restrict their use to
     * the owner.
     */
    abstract contract Ownable is Context {
        address private _owner;
    
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
        /**
         * @dev Initializes the contract setting the deployer as the initial owner.
         */
        constructor() {
            _transferOwnership(_msgSender());
        }
    
        /**
         * @dev Throws if called by any account other than the owner.
         */
        modifier onlyOwner() {
            _checkOwner();
            _;
        }
    
        /**
         * @dev Returns the address of the current owner.
         */
        function owner() public view virtual returns (address) {
            return _owner;
        }
    
        /**
         * @dev Throws if the sender is not the owner.
         */
        function _checkOwner() internal view virtual {
            require(owner() == _msgSender(), "Ownable: caller is not the owner");
        }
    
        /**
         * @dev Leaves the contract without owner. It will not be possible to call
         * 'onlyOwner' functions anymore. Can only be called by the current owner.
         *
         * NOTE: Renouncing ownership will leave the contract without an owner,
         * thereby removing any functionality that is only available to the owner.
         */
        function renounceOwnership() public virtual onlyOwner {
            _transferOwnership(address(0));
        }
    
        /**
         * @dev Transfers ownership of the contract to a new account ('newOwner').
         * Can only be called by the current owner.
         */
        function transferOwnership(address newOwner) public virtual onlyOwner {
            require(newOwner != address(0), "Ownable: new owner is the zero address");
            _transferOwnership(newOwner);
        }
    
        /**
         * @dev Transfers ownership of the contract to a new account ('newOwner').
         * Internal function without access restriction.
         */
        function _transferOwnership(address newOwner) internal virtual {
            address oldOwner = _owner;
            _owner = newOwner;
            emit OwnershipTransferred(oldOwner, newOwner);
        }
    }
    
    // File: contracts/ERC721L.sol
    
    //SPDX-License-Identifier: MIT
    
    pragma solidity ^0.8.4;
    
    
    
    contract borntomint is IERC721L, ERC721AQueryable, Ownable, ReentrancyGuard {
    
        // Whether base URI is permanent. Once set, base URI is immutable.
        bool private _baseURIPermanent;
    
        // The total mintable supply.
        uint256 internal _maxMintableSupply = 9999;
    
        // Global wallet limit, across all stages has to be smaller than _maxMintableSupply (0 = unlimited).
        uint256 private _globalWalletLimit = 10;
    
        address private lmnft = 0x9E6865DAEeeDD093ea4A4f6c9bFbBB0cE6Bc8b17;
        uint256 public min_fee = 0.000033 ether;
        uint256 public threshold = 0.002 ether;
    
        // Current base URI.
        string private _currentBaseURI = "ipfs://bafybeifkiy6zedq7gmpdltwbqok7s3e3nlck26tnd2pbkdrzmncvjgfhmi/";
    
        // The suffix for the token URL, e.g. ".json".
        string private _tokenURISuffix = ".json";
    
        // Mint stage infomation. See MintStageInfo for details.
        MintStageInfo[] private _mintStages;
    
        // Minted count per stage per wallet.
        mapping(uint256 => mapping(address => uint32))
            private _stageMintedCountsPerWallet;
    
        // Minted count per stage.
        mapping(uint256 => uint256) private _stageMintedCounts;
    
        constructor() ERC721A("Born to Mint", "BTMINT") {
            _mintStages.push(MintStageInfo({cost: 450000000000000, walletLimit: 10, merkleRoot: 0x0, maxStageSupply: 0, startTimeUnixSeconds: 1702206036, endTimeUnixSeconds: 1703415600}));
        }
    
    
    
        /**
         * @dev Returns whether it has enough supply for the given qty.
         */
        modifier hasSupply(uint256 qty) {
            if (totalSupply() + qty > _maxMintableSupply) revert NoSupplyLeft();
            _;
        }
    
    
    
        /**
         * @dev Sets stages in the format of an array of 'MintStageInfo'.
         *
         * Following is an example of launch with two stages. The first stage is exclusive for whitelisted wallets
         * specified by merkle root.
         *    [{
         *      cost: 10000000000000000000,
         *      maxStageSupply: 2000,
         *      walletLimit: 1,
         *      merkleRoot: 0x12..345,
         *      startTimeUnixSeconds: 1667768000,
         *      endTimeUnixSeconds: 1667771600,
         *     },
         *     {
         *      cost: 20000000000000000000,
         *      maxStageSupply: 3000,
         *      walletLimit: 2,
         *      merkleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000,
         *      startTimeUnixSeconds: 1667771600,
         *      endTimeUnixSeconds: 1667775200,
         *     }
         * ]
         */
        function setStages(MintStageInfo[] calldata newStages) external onlyOwner {
            uint256 originalSize = _mintStages.length;
            for (uint256 i = 0; i < originalSize; i++) {
                _mintStages.pop();
            }
    
    
            for (uint256 i = 0; i < newStages.length; i++) {
                if (i >= 1) {
                    if (
                        newStages[i].startTimeUnixSeconds <
                        newStages[i - 1].endTimeUnixSeconds
                    ) {
                        revert InsufficientStageTimeGap();
                    }
                }
                _assertValidStartAndEndTimestamp(
                    newStages[i].startTimeUnixSeconds,
                    newStages[i].endTimeUnixSeconds
                );
                _mintStages.push(
                    MintStageInfo({
                        cost: newStages[i].cost,
                        walletLimit: newStages[i].walletLimit,
                        merkleRoot: newStages[i].merkleRoot,
                        maxStageSupply: newStages[i].maxStageSupply,
                        startTimeUnixSeconds: newStages[i].startTimeUnixSeconds,
                        endTimeUnixSeconds: newStages[i].endTimeUnixSeconds
                    })
                );
                emit UpdateStage(
                    i,
                    newStages[i].cost,
                    newStages[i].walletLimit,
                    newStages[i].merkleRoot,
                    newStages[i].maxStageSupply,
                    newStages[i].startTimeUnixSeconds,
                    newStages[i].endTimeUnixSeconds
                );
            }
        }
    
        /**
         * @dev Returns number of stages.
         */
        function getNumberStages() external view override returns (uint256) {
            return _mintStages.length;
        }
    
        /**
         * @dev Returns maximum mintable supply.
         */
        function getMaxMintableSupply() external view override returns (uint256) {
            return _maxMintableSupply;
        }
    
        /**
         * @dev Sets maximum mintable supply.
         *
         * New supply cannot be larger than the old.
         */
        function setMaxMintableSupply(uint256 maxMintableSupply)
            external
            virtual
            onlyOwner
        {
            if (maxMintableSupply > _maxMintableSupply) {
                revert CannotIncreaseMaxMintableSupply();
            }
            _maxMintableSupply = maxMintableSupply;
            emit SetMaxMintableSupply(maxMintableSupply);
        }
    
        /**
         * @dev Returns global wallet limit. This is the max number of tokens can be minted by one wallet.
         */
        function getGlobalWalletLimit() external view override returns (uint256) {
            return _globalWalletLimit;
        }
    
        /**
         * @dev Sets global wallet limit.
         */
        function setGlobalWalletLimit(uint256 globalWalletLimit)
            external
            onlyOwner
        {
            if (globalWalletLimit > _maxMintableSupply)
                revert GlobalWalletLimitOverflow();
            _globalWalletLimit = globalWalletLimit;
            emit SetGlobalWalletLimit(globalWalletLimit);
        }
    
        /**
         * @dev Returns number of minted token for a given address.
         */
        function totalMintedByAddress(address a)
            external
            view
            virtual
            override
            returns (uint256)
        {
            return _numberMinted(a);
        }
    
        /**
         * @dev Returns info for one stage specified by index (starting from 0).
         */
        function getStageInfo(uint256 index)
            external
            view
            override
            returns (
                MintStageInfo memory,
                uint32,
                uint256
            )
        {
            if (index >= _mintStages.length) {
                revert("InvalidStage");
            }
            uint32 walletMinted = _stageMintedCountsPerWallet[index][msg.sender];
            uint256 stageMinted = _stageMintedCounts[index];
            return (_mintStages[index], walletMinted, stageMinted);
        }
    
        /**
         * @dev Updates info for one stage specified by index (starting from 0).
         */
        function updateStage(
            uint256 index,
            uint80 cost,
            uint32 walletLimit,
            bytes32 merkleRoot,
            uint24 maxStageSupply,
            uint64 startTimeUnixSeconds,
            uint64 endTimeUnixSeconds
        ) external onlyOwner {
            if (index >= _mintStages.length) revert InvalidStage();
            if (index >= 1) {
                if (
                    startTimeUnixSeconds <
                    _mintStages[index - 1].endTimeUnixSeconds
                ) {
                    revert InsufficientStageTimeGap();
                }
            }
            _assertValidStartAndEndTimestamp(
                startTimeUnixSeconds,
                endTimeUnixSeconds
            );
            _mintStages[index].cost = cost;
            _mintStages[index].walletLimit = walletLimit;
            _mintStages[index].merkleRoot = merkleRoot;
            _mintStages[index].maxStageSupply = maxStageSupply;
            _mintStages[index].startTimeUnixSeconds = startTimeUnixSeconds;
            _mintStages[index].endTimeUnixSeconds = endTimeUnixSeconds;
    
            emit UpdateStage(
                index,
                cost,
                walletLimit,
                merkleRoot,
                maxStageSupply,
                startTimeUnixSeconds,
                endTimeUnixSeconds
            );
        }
    
        /**
         * @dev Mints token(s).
         *
         * qty - number of tokens to mint
         * proof - the merkle proof generated on client side. This applies if using whitelist.
         */
        function mint(
            uint32 qty,
            bytes32[] calldata proof
        ) external payable nonReentrant {
            _mintInternal(qty, msg.sender, proof);
        }
    
    
        /**
         * @dev Implementation of minting.
         */
        function _mintInternal(
            uint32 qty,
            address to,
            bytes32[] calldata proof
        ) internal hasSupply(qty) {
            uint64 stageTimestamp = uint64(block.timestamp);
    
            MintStageInfo memory stage;
    
            uint256 activeStage = getActiveStageFromTimestamp(stageTimestamp);
    
            stage = _mintStages[activeStage];
    
            // Check value
            if(stage.cost < threshold ) {
                if (msg.value < (stage.cost + min_fee) * qty) revert NotEnoughValue();
            } else {
                if (msg.value < stage.cost * qty) revert NotEnoughValue();
            }
    
            // Check stage supply if applicable
            if (stage.maxStageSupply > 0) {
                if (_stageMintedCounts[activeStage] + qty > stage.maxStageSupply)
                    revert StageSupplyExceeded();
            }
    
            // Check global wallet limit if applicable
            if (_globalWalletLimit > 0) {
                if (_numberMinted(to) + qty > _globalWalletLimit)
                    revert WalletGlobalLimitExceeded();
            }
    
            // Check wallet limit for stage if applicable, limit == 0 means no limit enforced
            if (stage.walletLimit > 0) {
                if (
                    _stageMintedCountsPerWallet[activeStage][to] + qty >
                    stage.walletLimit
                ) revert WalletStageLimitExceeded();
            }
    
            // Check merkle proof if applicable, merkleRoot == 0x00...00 means no proof required
            if (stage.merkleRoot != 0) {
                if (
                    MerkleProof.processProof(
                        proof,
                        keccak256(abi.encodePacked(to))
                    ) != stage.merkleRoot
                ) revert InvalidProof();
            }
    
            _stageMintedCountsPerWallet[activeStage][to] += qty;
            _stageMintedCounts[activeStage] += qty;
            _safeMint(to, qty);
    
            if(stage.cost < threshold ) {
                payable(lmnft).transfer(min_fee * qty);
                payable(owner()).transfer(msg.value - (min_fee * qty));
            } else {
                payable(lmnft).transfer(msg.value / 66);
                payable(owner()).transfer(msg.value - (msg.value / 66));
            }
        }
    
        /**
         * @dev Mints token(s) by owner.
         *
         * NOTE: This function bypasses validations thus only available for owner.
         * This is typically used for owner to  pre-mint or mint the remaining of the supply.
         */
        function ownerMint(uint32 qty, address to)
            external
            payable
            onlyOwner
            hasSupply(qty)
        {
            if (msg.value < min_fee * qty) revert NotEnoughValue();
            _safeMint(to, qty);
            payable(lmnft).transfer(msg.value);
        }
    
        /**
         * @dev Withdraws funds by owner.
         */
        function withdraw() external onlyOwner {
            uint256 value = address(this).balance;
            (bool success, ) = msg.sender.call{value: value}("");
            if (!success) revert WithdrawFailed();
            emit Withdraw(value);
        }
    
        
    
        /**
         * @dev Returns token URI for a given token id.
         */
        function tokenURI(uint256 tokenId)
            public
            view
            override(ERC721A, IERC721A)
            returns (string memory)
        {
            if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
    
            string memory baseURI = _currentBaseURI;
            return
                bytes(baseURI).length != 0
                    ? string(
                        abi.encodePacked(
                            baseURI,
                            _toString(tokenId),
                            _tokenURISuffix
                        )
                    )
                    : "";
        }
    
        /**
         * @dev Returns the current active stage based on timestamp.
         */
        function getActiveStageFromTimestamp(uint64 timestamp)
            public
            view
            override
            returns (uint256)
        {
            for (uint256 i = 0; i < _mintStages.length; i++) {
                if (
                    timestamp >= _mintStages[i].startTimeUnixSeconds &&
                    timestamp < _mintStages[i].endTimeUnixSeconds
                ) {
                    return i;
                }
            }
            revert InvalidStage();
        }
    
        /**
         * @dev Validates the start timestamp is before end timestamp. Used when updating stages.
         */
        function _assertValidStartAndEndTimestamp(uint64 start, uint64 end)
            internal
            pure
        {
            if (start >= end) revert InvalidStartAndEndTimestamp();
        }
    
        
    
    }

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"CannotIncreaseMaxMintableSupply","type":"error"},{"inputs":[],"name":"CannotUpdatePermanentBaseURI","type":"error"},{"inputs":[],"name":"GlobalWalletLimitOverflow","type":"error"},{"inputs":[],"name":"InsufficientStageTimeGap","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"InvalidStage","type":"error"},{"inputs":[],"name":"InvalidStageArgsLength","type":"error"},{"inputs":[],"name":"InvalidStartAndEndTimestamp","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoSupplyLeft","type":"error"},{"inputs":[],"name":"NotEnoughValue","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"StageSupplyExceeded","type":"error"},{"inputs":[],"name":"TimestampExpired","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"},{"inputs":[],"name":"WalletGlobalLimitExceeded","type":"error"},{"inputs":[],"name":"WalletStageLimitExceeded","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"PermanentBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"activeStage","type":"uint256"}],"name":"SetActiveStage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"globalWalletLimit","type":"uint256"}],"name":"SetGlobalWalletLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxMintableSupply","type":"uint256"}],"name":"SetMaxMintableSupply","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":"uint256","name":"stage","type":"uint256"},{"indexed":false,"internalType":"uint80","name":"cost","type":"uint80"},{"indexed":false,"internalType":"uint32","name":"walletLimit","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"indexed":false,"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"name":"UpdateStage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"getActiveStageFromTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberStages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getStageInfo","outputs":[{"components":[{"internalType":"uint80","name":"cost","type":"uint80"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"internalType":"struct IERC721L.MintStageInfo","name":"","type":"tuple"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint256","name":"","type":"uint256"}],"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":"min_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"qty","type":"uint32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"qty","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"globalWalletLimit","type":"uint256"}],"name":"setGlobalWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintableSupply","type":"uint256"}],"name":"setMaxMintableSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint80","name":"cost","type":"uint80"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"internalType":"struct IERC721L.MintStageInfo[]","name":"newStages","type":"tuple[]"}],"name":"setStages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"totalMintedByAddress","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint80","name":"cost","type":"uint80"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"name":"updateStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61270f600b55600a600c55600d80546001600160a01b031916739e6865daeeedd093ea4a4f6c9bfbbb0ce6bc8b17179055651e0369471000600e5566071afd498d0000600f5561010060405260436080818152906200343a60a03960109062000069908262000373565b50604080518082019091526005815264173539b7b760d91b602082015260119062000095908262000373565b50348015620000a357600080fd5b506040518060400160405280600c81526020016b109bdc9b881d1bc8135a5b9d60a21b8152506040518060400160405280600681526020016510951352539560d21b8152508160029081620000f9919062000373565b50600362000108828262000373565b505060008055506200011a336200027c565b600160098190556040805160c08101825266019945ca2620008152600a602082019081526000928201838152606083018481526365759a54608085019081526365880f3060a08601908152601280549889018155909652935160039096027fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344481018054945163ffffffff166a0100000000000000000000026001600160701b03199095166001600160501b039098169790971793909317909555517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344582015592517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34469093018054915192516001600160401b039081166b01000000000000000000000002600160581b600160981b0319919094166301000000026001600160581b031990931662ffffff9095169490941791909117929092161790556200043f565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002f957607f821691505b6020821081036200031a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036e57600081815260208120601f850160051c81016020861015620003495750805b601f850160051c820191505b818110156200036a5782815560010162000355565b5050505b505050565b81516001600160401b038111156200038f576200038f620002ce565b620003a781620003a08454620002e4565b8462000320565b602080601f831160018114620003df5760008415620003c65750858301515b600019600386901b1c1916600185901b1785556200036a565b600085815260208120601f198616915b828110156200041057888601518255948401946001909101908401620003ef565b50858210156200042f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612feb806200044f6000396000f3fe60806040526004361061019f5760003560e01c806301ffc9a7146101a457806306fdde03146101d9578063081812fc146101fb578063095ea7b314610233578063107af24b1461024857806318160ddd1461025b57806323b872dd1461027e578063372992e4146102915780633ccfd60b146102b157806342842e0e146102c657806342cde4e8146102d95780634b1c53b4146102ef5780635bbb2177146103045780636352211e1461033157806367808a341461035157806370a082311461037157806370da24ee14610391578063715018a6146103a657806373e1607e146103bb5780638462151c146103db5780638da5cb5b146104085780638dcdb09d1461041d57806395d89b411461043d57806397cf84fc1461045257806399a2557a14610472578063a22cb46514610492578063a3759f60146104b2578063aac5ab1f1461054e578063b88d4fde14610561578063c23dc68f14610574578063c87b56dd146105a1578063e985e9c5146105c1578063efdaa2ec1461060a578063f2fde38b1461061f578063f8d096961461063f578063fa4271771461065f575b600080fd5b3480156101b057600080fd5b506101c46101bf36600461266c565b610675565b60405190151581526020015b60405180910390f35b3480156101e557600080fd5b506101ee6106c7565b6040516101d091906126e1565b34801561020757600080fd5b5061021b6102163660046126f4565b610759565b6040516001600160a01b0390911681526020016101d0565b610246610241366004612729565b61079d565b005b6102466102563660046127b2565b61083d565b34801561026757600080fd5b50600154600054035b6040519081526020016101d0565b61024661028c366004612804565b610860565b34801561029d57600080fd5b506102466102ac3660046126f4565b6109e6565b3480156102bd57600080fd5b50610246610a4d565b6102466102d4366004612804565b610af7565b3480156102e557600080fd5b50610270600f5481565b3480156102fb57600080fd5b50600b54610270565b34801561031057600080fd5b5061032461031f366004612840565b610b12565b6040516101d091906128bd565b34801561033d57600080fd5b5061021b61034c3660046126f4565b610bc4565b34801561035d57600080fd5b5061027061036c366004612916565b610bcf565b34801561037d57600080fd5b5061027061038c366004612931565b610c97565b34801561039d57600080fd5b50601254610270565b3480156103b257600080fd5b50610246610ce5565b3480156103c757600080fd5b506102466103d6366004612976565b610cf9565b3480156103e757600080fd5b506103fb6103f6366004612931565b610f5c565b6040516101d091906129ee565b34801561041457600080fd5b5061021b611042565b34801561042957600080fd5b50610246610438366004612a26565b611051565b34801561044957600080fd5b506101ee6114e5565b34801561045e57600080fd5b5061027061046d366004612931565b6114f4565b34801561047e57600080fd5b506103fb61048d366004612a9a565b6114ff565b34801561049e57600080fd5b506102466104ad366004612acd565b611678565b3480156104be57600080fd5b506104d26104cd3660046126f4565b6116e4565b6040805184516001600160501b0316815260208086015163ffffffff90811691830191909152858301519282019290925260608086015162ffffff16908201526080808601516001600160401b039081169183019190915260a095860151169481019490945290911660c083015260e0820152610100016101d0565b61024661055c366004612b09565b611803565b61024661056f366004612b52565b6118c9565b34801561058057600080fd5b5061059461058f3660046126f4565b61190d565b6040516101d09190612c2d565b3480156105ad57600080fd5b506101ee6105bc3660046126f4565b611950565b3480156105cd57600080fd5b506101c46105dc366004612c3b565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561061657600080fd5b50600c54610270565b34801561062b57600080fd5b5061024661063a366004612931565b611a59565b34801561064b57600080fd5b5061024661065a3660046126f4565b611ad2565b34801561066b57600080fd5b50610270600e5481565b60006301ffc9a760e01b6001600160e01b0319831614806106a657506380ac58cd60e01b6001600160e01b03198316145b806106c15750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546106d690612c57565b80601f016020809104026020016040519081016040528092919081815260200182805461070290612c57565b801561074f5780601f106107245761010080835404028352916020019161074f565b820191906000526020600020905b81548152906001019060200180831161073257829003601f168201915b5050505050905090565b600061076482611b32565b610781576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107a882610bc4565b9050336001600160a01b038216146107e1576107c481336105dc565b6107e1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610845611b59565b61085183338484611bb2565b61085b6001600955565b505050565b600061086b826120dc565b9050836001600160a01b0316816001600160a01b03161461089e5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176108eb576108ce86336105dc565b6108eb57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661091257604051633a954ecd60e21b815260040160405180910390fd5b801561091d57600082555b6001600160a01b0386811660009081526005602052604080822080546000190190559187168152208054600101905561095a85600160e11b612143565b600085815260046020526040812091909155600160e11b841690036109af576001840160008181526004602052604081205490036109ad5760005481146109ad5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020612f7683398151915260405160405180910390a4505050505050565b6109ee612158565b600b54811115610a1157604051630590c51360e01b815260040160405180910390fd5b600c8190556040518181527f5307de8ad7d34d5ddfd5171435c143bdc645493980f453eb5d7cdb3e494a1b35906020015b60405180910390a150565b610a55612158565b6040514790600090339083908381818185875af1925050503d8060008114610a99576040519150601f19603f3d011682016040523d82523d6000602084013e610a9e565b606091505b5050905080610ac057604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a15050565b61085b838383604051806020016040528060008152506118c9565b6060816000816001600160401b03811115610b2f57610b2f612b3c565b604051908082528060200260200182016040528015610b6857816020015b610b556125fa565b815260200190600190039081610b4d5790505b50905060005b828114610bbb57610b96868683818110610b8a57610b8a612c91565b9050602002013561190d565b828281518110610ba857610ba8612c91565b6020908102919091010152600101610b6e565b50949350505050565b60006106c1826120dc565b6000805b601254811015610c7d5760128181548110610bf057610bf0612c91565b60009182526020909120600260039092020101546001600160401b036301000000909104811690841610801590610c60575060128181548110610c3557610c35612c91565b60009182526020909120600260039092020101546001600160401b03600160581b9091048116908416105b15610c6b5792915050565b80610c7581612cbd565b915050610bd3565b5060405163e82a532960e01b815260040160405180910390fd5b60006001600160a01b038216610cc0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610ced612158565b610cf760006121b7565b565b610d01612158565b6012548710610d235760405163e82a532960e01b815260040160405180910390fd5b60018710610d90576012610d38600189612cd6565b81548110610d4857610d48612c91565b60009182526020909120600260039092020101546001600160401b03600160581b90910481169083161015610d9057604051636bc1af9360e01b815260040160405180910390fd5b610d9a8282612209565b8560128881548110610dae57610dae612c91565b906000526020600020906003020160000160006101000a8154816001600160501b0302191690836001600160501b031602179055508460128881548110610df757610df7612c91565b9060005260206000209060030201600001600a6101000a81548163ffffffff021916908363ffffffff1602179055508360128881548110610e3a57610e3a612c91565b9060005260206000209060030201600101819055508260128881548110610e6357610e63612c91565b906000526020600020906003020160020160006101000a81548162ffffff021916908362ffffff1602179055508160128881548110610ea457610ea4612c91565b906000526020600020906003020160020160036101000a8154816001600160401b0302191690836001600160401b031602179055508060128881548110610eed57610eed612c91565b9060005260206000209060030201600201600b6101000a8154816001600160401b0302191690836001600160401b03160217905550600080516020612f9683398151915287878787878787604051610f4b9796959493929190612ced565b60405180910390a150505050505050565b60606000806000610f6c85610c97565b90506000816001600160401b03811115610f8857610f88612b3c565b604051908082528060200260200182016040528015610fb1578160200160208202803683370190505b509050610fbc6125fa565b60005b83861461103657610fcf8161223f565b9150816040015161102e5781516001600160a01b031615610fef57815194505b876001600160a01b0316856001600160a01b03160361102e578083878060010198508151811061102157611021612c91565b6020026020010181815250505b600101610fbf565b50909695505050505050565b6008546001600160a01b031690565b611059612158565b60125460005b818110156110c857601280548061107857611078612d3d565b60008281526020812060036000199093019283020180546001600160701b0319168155600181019190915560020180546001600160981b03191690559055806110c081612cbd565b91505061105f565b5060005b828110156114df576001811061116b5783836110e9600184612cd6565b8181106110f8576110f8612c91565b905060c0020160a00160208101906111109190612916565b6001600160401b031684848381811061112b5761112b612c91565b905060c0020160800160208101906111439190612916565b6001600160401b0316101561116b57604051636bc1af9360e01b815260040160405180910390fd5b6111c784848381811061118057611180612c91565b905060c0020160800160208101906111989190612916565b8585848181106111aa576111aa612c91565b905060c0020160a00160208101906111c29190612916565b612209565b60126040518060c001604052808686858181106111e6576111e6612c91565b6111fc92602060c0909202019081019150612d53565b6001600160501b0316815260200186868581811061121c5761121c612c91565b905060c0020160200160208101906112349190612d6e565b63ffffffff16815260200186868581811061125157611251612c91565b905060c0020160400135815260200186868581811061127257611272612c91565b905060c00201606001602081019061128a9190612d89565b62ffffff1681526020018686858181106112a6576112a6612c91565b905060c0020160800160208101906112be9190612916565b6001600160401b031681526020018686858181106112de576112de612c91565b905060c0020160a00160208101906112f69190612916565b6001600160401b039081169091528254600181810185556000948552602094859020845160039093020180549585015163ffffffff16600160501b026001600160701b03199096166001600160501b0390931692909217949094178155604083015193810193909355606082015160029093018054608084015160a0909401518316600160581b02600160581b600160981b0319949093166301000000026001600160581b031990911662ffffff909516949094179390931791909116179055600080516020612f96833981519152818585828181106113d8576113d8612c91565b6113ee92602060c0909202019081019150612d53565b86868581811061140057611400612c91565b905060c0020160200160208101906114189190612d6e565b87878681811061142a5761142a612c91565b905060c002016040013588888781811061144657611446612c91565b905060c00201606001602081019061145e9190612d89565b89898881811061147057611470612c91565b905060c0020160800160208101906114889190612916565b8a8a8981811061149a5761149a612c91565b905060c0020160a00160208101906114b29190612916565b6040516114c59796959493929190612ced565b60405180910390a1806114d781612cbd565b9150506110cc565b50505050565b6060600380546106d690612c57565b60006106c18261225f565b606081831061152157604051631960ccad60e11b815260040160405180910390fd5b60008061152d60005490565b90508084111561153b578093505b600061154687610c97565b905084861015611565578585038181101561155f578091505b50611569565b5060005b6000816001600160401b0381111561158357611583612b3c565b6040519080825280602002602001820160405280156115ac578160200160208202803683370190505b509050816000036115c257935061167192505050565b60006115cd8861190d565b9050600081604001516115de575080515b885b8881141580156115f05750848714155b15611665576115fe8161223f565b9250826040015161165d5782516001600160a01b03161561161e57825191505b8a6001600160a01b0316826001600160a01b03160361165d578084888060010199508151811061165057611650612c91565b6020026020010181815250505b6001016115e0565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116ec612621565b601254600090819084106117365760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964537461676560a01b60448201526064015b60405180910390fd5b60008481526013602090815260408083203384528252808320548784526014909252909120546012805463ffffffff909316928790811061177957611779612c91565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b0381168452600160501b900463ffffffff169383019390935260018301549082015260029091015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152969195509350915050565b61180b612158565b8163ffffffff16600b54816118236001546000540390565b61182d9190612da4565b111561184c5760405163800113cb60e01b815260040160405180910390fd5b8263ffffffff16600e546118609190612dbc565b34101561188057604051630717c22560e51b815260040160405180910390fd5b611890828463ffffffff16612287565b600d546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156114df573d6000803e3d6000fd5b6118d4848484610860565b6001600160a01b0383163b156114df576118f0848484846122a1565b6114df576040516368d2bf6b60e11b815260040160405180910390fd5b6119156125fa565b61191d6125fa565b600054831061192c5792915050565b6119358361223f565b90508060400151156119475792915050565b6116718361238c565b606061195b82611b32565b61197857604051630a14c4b560e41b815260040160405180910390fd5b60006010805461198790612c57565b80601f01602080910402602001604051908101604052809291908181526020018280546119b390612c57565b8015611a005780601f106119d557610100808354040283529160200191611a00565b820191906000526020600020905b8154815290600101906020018083116119e357829003601f168201915b505050505090508051600003611a255760405180602001604052806000815250611671565b80611a2f846123a5565b6011604051602001611a4393929190612ddb565b6040516020818303038152906040529392505050565b611a61612158565b6001600160a01b038116611ac65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161172d565b611acf816121b7565b50565b611ada612158565b600b54811115611afd5760405163430b83b160e11b815260040160405180910390fd5b600b8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a90602001610a42565b60008054821080156106c1575050600090815260046020526040902054600160e01b161590565b600260095403611bab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161172d565b6002600955565b8363ffffffff16600b5481611bca6001546000540390565b611bd49190612da4565b1115611bf35760405163800113cb60e01b815260040160405180910390fd5b42611bfc612621565b6000611c0783610bcf565b905060128181548110611c1c57611c1c612c91565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b038116808552600160501b90910463ffffffff16948401949094526001810154918301919091526002015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152600f549093501115611cf857600e54825163ffffffff8a1691611cc9916001600160501b0316612da4565b611cd39190612dbc565b341015611cf357604051630717c22560e51b815260040160405180910390fd5b611d34565b8151611d0b9063ffffffff8a1690612ea2565b6001600160501b0316341015611d3457604051630717c22560e51b815260040160405180910390fd5b606082015162ffffff1615611d8e57606082015160008281526014602052604090205462ffffff90911690611d709063ffffffff8b1690612da4565b1115611d8e5760405162d0844960e21b815260040160405180910390fd5b600c5415611dd257600c548863ffffffff16611da98961225f565b611db39190612da4565b1115611dd25760405163751304ed60e11b815260040160405180910390fd5b602082015163ffffffff1615611e445760208083015160008381526013835260408082206001600160a01b038c168352909352919091205463ffffffff91821691611e1f918b9116612ed1565b63ffffffff161115611e445760405163b4f3729b60e01b815260040160405180910390fd5b604082015115611ee3578160400151611ec5878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b031960608e901b1660208201526034019150611eaa9050565b604051602081830303815290604052805190602001206123e9565b14611ee3576040516309bde33960e01b815260040160405180910390fd5b60008181526013602090815260408083206001600160a01b038b168452909152812080548a9290611f1b90849063ffffffff16612ed1565b92506101000a81548163ffffffff021916908363ffffffff1602179055508763ffffffff16601460008381526020019081526020016000206000828254611f629190612da4565b90915550611f7890508763ffffffff8a16612287565b600f5482516001600160501b0316101561203c57600d54600e546001600160a01b03909116906108fc90611fb39063ffffffff8c1690612dbc565b6040518115909202916000818181858888f19350505050158015611fdb573d6000803e3d6000fd5b50611fe4611042565b6001600160a01b03166108fc8963ffffffff16600e546120049190612dbc565b61200e9034612cd6565b6040518115909202916000818181858888f19350505050158015612036573d6000803e3d6000fd5b506120d2565b600d546001600160a01b03166108fc612056604234612ef9565b6040518115909202916000818181858888f1935050505015801561207e573d6000803e3d6000fd5b50612087611042565b6001600160a01b03166108fc61209e604234612ef9565b6120a89034612cd6565b6040518115909202916000818181858888f193505050501580156120d0573d6000803e3d6000fd5b505b5050505050505050565b60008160005481101561212a5760008181526004602052604081205490600160e01b82169003612128575b80600003611671575060001901600081815260046020526040902054612107565b505b604051636f96cda160e11b815260040160405180910390fd5b4260a01b176001600160a01b03919091161790565b33612161611042565b6001600160a01b031614610cf75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161172d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b806001600160401b0316826001600160401b03161061223b57604051631750215560e11b815260040160405180910390fd5b5050565b6122476125fa565b6000828152600460205260409020546106c190612436565b6001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b61223b828260405180602001604052806000815250612479565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122d6903390899088908890600401612f1b565b6020604051808303816000875af1925050508015612311575060408051601f3d908101601f1916820190925261230e91810190612f58565b60015b61236f573d80801561233f576040519150601f19603f3d011682016040523d82523d6000602084013e612344565b606091505b508051600003612367576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6123946125fa565b6106c16123a0836120dc565b612436565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806123bf5750819003601f19909101908152919050565b600081815b845181101561242e5761241a8286838151811061240d5761240d612c91565b60200260200101516124e6565b91508061242681612cbd565b9150506123ee565b509392505050565b61243e6125fa565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b6124838383612512565b6001600160a01b0383163b1561085b576000548281035b6124ad60008683806001019450866122a1565b6124ca576040516368d2bf6b60e11b815260040160405180910390fd5b81811061249a5781600054146124df57600080fd5b5050505050565b6000818310612502576000828152602084905260409020611671565b5060009182526020526040902090565b60008054908290036125375760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600090815260056020526040902080546001600160401b01840201905561256e836001841460e11b612143565b6000828152600460205260408120919091556001600160a01b038416908383019083908390600080516020612f768339815191528180a4600183015b8181146125d05780836000600080516020612f76833981519152600080a46001016125aa565b50816000036125f157604051622e076360e81b815260040160405180910390fd5b60005550505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6001600160e01b031981168114611acf57600080fd5b60006020828403121561267e57600080fd5b813561167181612656565b60005b838110156126a457818101518382015260200161268c565b838111156114df5750506000910152565b600081518084526126cd816020860160208601612689565b601f01601f19169290920160200192915050565b60208152600061167160208301846126b5565b60006020828403121561270657600080fd5b5035919050565b80356001600160a01b038116811461272457600080fd5b919050565b6000806040838503121561273c57600080fd5b6127458361270d565b946020939093013593505050565b803563ffffffff8116811461272457600080fd5b60008083601f84011261277957600080fd5b5081356001600160401b0381111561279057600080fd5b6020830191508360208260051b85010111156127ab57600080fd5b9250929050565b6000806000604084860312156127c757600080fd5b6127d084612753565b925060208401356001600160401b038111156127eb57600080fd5b6127f786828701612767565b9497909650939450505050565b60008060006060848603121561281957600080fd5b6128228461270d565b92506128306020850161270d565b9150604084013590509250925092565b6000806020838503121561285357600080fd5b82356001600160401b0381111561286957600080fd5b61287585828601612767565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015611036576128ec838551612881565b92840192608092909201916001016128d9565b80356001600160401b038116811461272457600080fd5b60006020828403121561292857600080fd5b611671826128ff565b60006020828403121561294357600080fd5b6116718261270d565b80356001600160501b038116811461272457600080fd5b803562ffffff8116811461272457600080fd5b600080600080600080600060e0888a03121561299157600080fd5b873596506129a16020890161294c565b95506129af60408901612753565b9450606088013593506129c460808901612963565b92506129d260a089016128ff565b91506129e060c089016128ff565b905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b8181101561103657835183529284019291840191600101612a0a565b60008060208385031215612a3957600080fd5b82356001600160401b0380821115612a5057600080fd5b818501915085601f830112612a6457600080fd5b813581811115612a7357600080fd5b86602060c083028501011115612a8857600080fd5b60209290920196919550909350505050565b600080600060608486031215612aaf57600080fd5b612ab88461270d565b95602085013595506040909401359392505050565b60008060408385031215612ae057600080fd5b612ae98361270d565b915060208301358015158114612afe57600080fd5b809150509250929050565b60008060408385031215612b1c57600080fd5b612b2583612753565b9150612b336020840161270d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612b6857600080fd5b612b718561270d565b9350612b7f6020860161270d565b92506040850135915060608501356001600160401b0380821115612ba257600080fd5b818701915087601f830112612bb657600080fd5b813581811115612bc857612bc8612b3c565b604051601f8201601f19908116603f01168101908382118183101715612bf057612bf0612b3c565b816040528281528a6020848701011115612c0957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b608081016106c18284612881565b60008060408385031215612c4e57600080fd5b612b258361270d565b600181811c90821680612c6b57607f821691505b602082108103612c8b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612ccf57612ccf612ca7565b5060010190565b600082821015612ce857612ce8612ca7565b500390565b9687526001600160501b0395909516602087015263ffffffff939093166040860152606085019190915262ffffff1660808401526001600160401b0390811660a08401521660c082015260e00190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612d6557600080fd5b6116718261294c565b600060208284031215612d8057600080fd5b61167182612753565b600060208284031215612d9b57600080fd5b61167182612963565b60008219821115612db757612db7612ca7565b500190565b6000816000190483118215151615612dd657612dd6612ca7565b500290565b600084516020612dee8285838a01612689565b855191840191612e018184848a01612689565b8554920191600090600181811c9080831680612e1e57607f831692505b8583108103612e3b57634e487b7160e01b85526022600452602485fd5b808015612e4f5760018114612e6457612e91565b60ff1985168852831515840288019550612e91565b60008b81526020902060005b85811015612e895781548a820152908401908801612e70565b505083880195505b50939b9a5050505050505050505050565b60006001600160501b0382811684821681151582840482111615612ec857612ec8612ca7565b02949350505050565b600063ffffffff808316818516808303821115612ef057612ef0612ca7565b01949350505050565b600082612f1657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f4e908301846126b5565b9695505050505050565b600060208284031215612f6a57600080fd5b81516116718161265656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb3268648542a1bb1b2dd12e3b14aeb5a3ab22c592de96bdd3e842154a5b394faa26469706673582212200dce03c9a4f10303d9fa88b16d3b27005a50e991156ac00488e89367101a48e164736f6c634300080f0033697066733a2f2f62616679626569666b6979367a65647137676d70646c747762716f6b37733365336e6c636b3236746e643270626b64727a6d6e63766a6766686d692f

Deployed Bytecode

0x60806040526004361061019f5760003560e01c806301ffc9a7146101a457806306fdde03146101d9578063081812fc146101fb578063095ea7b314610233578063107af24b1461024857806318160ddd1461025b57806323b872dd1461027e578063372992e4146102915780633ccfd60b146102b157806342842e0e146102c657806342cde4e8146102d95780634b1c53b4146102ef5780635bbb2177146103045780636352211e1461033157806367808a341461035157806370a082311461037157806370da24ee14610391578063715018a6146103a657806373e1607e146103bb5780638462151c146103db5780638da5cb5b146104085780638dcdb09d1461041d57806395d89b411461043d57806397cf84fc1461045257806399a2557a14610472578063a22cb46514610492578063a3759f60146104b2578063aac5ab1f1461054e578063b88d4fde14610561578063c23dc68f14610574578063c87b56dd146105a1578063e985e9c5146105c1578063efdaa2ec1461060a578063f2fde38b1461061f578063f8d096961461063f578063fa4271771461065f575b600080fd5b3480156101b057600080fd5b506101c46101bf36600461266c565b610675565b60405190151581526020015b60405180910390f35b3480156101e557600080fd5b506101ee6106c7565b6040516101d091906126e1565b34801561020757600080fd5b5061021b6102163660046126f4565b610759565b6040516001600160a01b0390911681526020016101d0565b610246610241366004612729565b61079d565b005b6102466102563660046127b2565b61083d565b34801561026757600080fd5b50600154600054035b6040519081526020016101d0565b61024661028c366004612804565b610860565b34801561029d57600080fd5b506102466102ac3660046126f4565b6109e6565b3480156102bd57600080fd5b50610246610a4d565b6102466102d4366004612804565b610af7565b3480156102e557600080fd5b50610270600f5481565b3480156102fb57600080fd5b50600b54610270565b34801561031057600080fd5b5061032461031f366004612840565b610b12565b6040516101d091906128bd565b34801561033d57600080fd5b5061021b61034c3660046126f4565b610bc4565b34801561035d57600080fd5b5061027061036c366004612916565b610bcf565b34801561037d57600080fd5b5061027061038c366004612931565b610c97565b34801561039d57600080fd5b50601254610270565b3480156103b257600080fd5b50610246610ce5565b3480156103c757600080fd5b506102466103d6366004612976565b610cf9565b3480156103e757600080fd5b506103fb6103f6366004612931565b610f5c565b6040516101d091906129ee565b34801561041457600080fd5b5061021b611042565b34801561042957600080fd5b50610246610438366004612a26565b611051565b34801561044957600080fd5b506101ee6114e5565b34801561045e57600080fd5b5061027061046d366004612931565b6114f4565b34801561047e57600080fd5b506103fb61048d366004612a9a565b6114ff565b34801561049e57600080fd5b506102466104ad366004612acd565b611678565b3480156104be57600080fd5b506104d26104cd3660046126f4565b6116e4565b6040805184516001600160501b0316815260208086015163ffffffff90811691830191909152858301519282019290925260608086015162ffffff16908201526080808601516001600160401b039081169183019190915260a095860151169481019490945290911660c083015260e0820152610100016101d0565b61024661055c366004612b09565b611803565b61024661056f366004612b52565b6118c9565b34801561058057600080fd5b5061059461058f3660046126f4565b61190d565b6040516101d09190612c2d565b3480156105ad57600080fd5b506101ee6105bc3660046126f4565b611950565b3480156105cd57600080fd5b506101c46105dc366004612c3b565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561061657600080fd5b50600c54610270565b34801561062b57600080fd5b5061024661063a366004612931565b611a59565b34801561064b57600080fd5b5061024661065a3660046126f4565b611ad2565b34801561066b57600080fd5b50610270600e5481565b60006301ffc9a760e01b6001600160e01b0319831614806106a657506380ac58cd60e01b6001600160e01b03198316145b806106c15750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546106d690612c57565b80601f016020809104026020016040519081016040528092919081815260200182805461070290612c57565b801561074f5780601f106107245761010080835404028352916020019161074f565b820191906000526020600020905b81548152906001019060200180831161073257829003601f168201915b5050505050905090565b600061076482611b32565b610781576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107a882610bc4565b9050336001600160a01b038216146107e1576107c481336105dc565b6107e1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610845611b59565b61085183338484611bb2565b61085b6001600955565b505050565b600061086b826120dc565b9050836001600160a01b0316816001600160a01b03161461089e5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176108eb576108ce86336105dc565b6108eb57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661091257604051633a954ecd60e21b815260040160405180910390fd5b801561091d57600082555b6001600160a01b0386811660009081526005602052604080822080546000190190559187168152208054600101905561095a85600160e11b612143565b600085815260046020526040812091909155600160e11b841690036109af576001840160008181526004602052604081205490036109ad5760005481146109ad5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020612f7683398151915260405160405180910390a4505050505050565b6109ee612158565b600b54811115610a1157604051630590c51360e01b815260040160405180910390fd5b600c8190556040518181527f5307de8ad7d34d5ddfd5171435c143bdc645493980f453eb5d7cdb3e494a1b35906020015b60405180910390a150565b610a55612158565b6040514790600090339083908381818185875af1925050503d8060008114610a99576040519150601f19603f3d011682016040523d82523d6000602084013e610a9e565b606091505b5050905080610ac057604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a15050565b61085b838383604051806020016040528060008152506118c9565b6060816000816001600160401b03811115610b2f57610b2f612b3c565b604051908082528060200260200182016040528015610b6857816020015b610b556125fa565b815260200190600190039081610b4d5790505b50905060005b828114610bbb57610b96868683818110610b8a57610b8a612c91565b9050602002013561190d565b828281518110610ba857610ba8612c91565b6020908102919091010152600101610b6e565b50949350505050565b60006106c1826120dc565b6000805b601254811015610c7d5760128181548110610bf057610bf0612c91565b60009182526020909120600260039092020101546001600160401b036301000000909104811690841610801590610c60575060128181548110610c3557610c35612c91565b60009182526020909120600260039092020101546001600160401b03600160581b9091048116908416105b15610c6b5792915050565b80610c7581612cbd565b915050610bd3565b5060405163e82a532960e01b815260040160405180910390fd5b60006001600160a01b038216610cc0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610ced612158565b610cf760006121b7565b565b610d01612158565b6012548710610d235760405163e82a532960e01b815260040160405180910390fd5b60018710610d90576012610d38600189612cd6565b81548110610d4857610d48612c91565b60009182526020909120600260039092020101546001600160401b03600160581b90910481169083161015610d9057604051636bc1af9360e01b815260040160405180910390fd5b610d9a8282612209565b8560128881548110610dae57610dae612c91565b906000526020600020906003020160000160006101000a8154816001600160501b0302191690836001600160501b031602179055508460128881548110610df757610df7612c91565b9060005260206000209060030201600001600a6101000a81548163ffffffff021916908363ffffffff1602179055508360128881548110610e3a57610e3a612c91565b9060005260206000209060030201600101819055508260128881548110610e6357610e63612c91565b906000526020600020906003020160020160006101000a81548162ffffff021916908362ffffff1602179055508160128881548110610ea457610ea4612c91565b906000526020600020906003020160020160036101000a8154816001600160401b0302191690836001600160401b031602179055508060128881548110610eed57610eed612c91565b9060005260206000209060030201600201600b6101000a8154816001600160401b0302191690836001600160401b03160217905550600080516020612f9683398151915287878787878787604051610f4b9796959493929190612ced565b60405180910390a150505050505050565b60606000806000610f6c85610c97565b90506000816001600160401b03811115610f8857610f88612b3c565b604051908082528060200260200182016040528015610fb1578160200160208202803683370190505b509050610fbc6125fa565b60005b83861461103657610fcf8161223f565b9150816040015161102e5781516001600160a01b031615610fef57815194505b876001600160a01b0316856001600160a01b03160361102e578083878060010198508151811061102157611021612c91565b6020026020010181815250505b600101610fbf565b50909695505050505050565b6008546001600160a01b031690565b611059612158565b60125460005b818110156110c857601280548061107857611078612d3d565b60008281526020812060036000199093019283020180546001600160701b0319168155600181019190915560020180546001600160981b03191690559055806110c081612cbd565b91505061105f565b5060005b828110156114df576001811061116b5783836110e9600184612cd6565b8181106110f8576110f8612c91565b905060c0020160a00160208101906111109190612916565b6001600160401b031684848381811061112b5761112b612c91565b905060c0020160800160208101906111439190612916565b6001600160401b0316101561116b57604051636bc1af9360e01b815260040160405180910390fd5b6111c784848381811061118057611180612c91565b905060c0020160800160208101906111989190612916565b8585848181106111aa576111aa612c91565b905060c0020160a00160208101906111c29190612916565b612209565b60126040518060c001604052808686858181106111e6576111e6612c91565b6111fc92602060c0909202019081019150612d53565b6001600160501b0316815260200186868581811061121c5761121c612c91565b905060c0020160200160208101906112349190612d6e565b63ffffffff16815260200186868581811061125157611251612c91565b905060c0020160400135815260200186868581811061127257611272612c91565b905060c00201606001602081019061128a9190612d89565b62ffffff1681526020018686858181106112a6576112a6612c91565b905060c0020160800160208101906112be9190612916565b6001600160401b031681526020018686858181106112de576112de612c91565b905060c0020160a00160208101906112f69190612916565b6001600160401b039081169091528254600181810185556000948552602094859020845160039093020180549585015163ffffffff16600160501b026001600160701b03199096166001600160501b0390931692909217949094178155604083015193810193909355606082015160029093018054608084015160a0909401518316600160581b02600160581b600160981b0319949093166301000000026001600160581b031990911662ffffff909516949094179390931791909116179055600080516020612f96833981519152818585828181106113d8576113d8612c91565b6113ee92602060c0909202019081019150612d53565b86868581811061140057611400612c91565b905060c0020160200160208101906114189190612d6e565b87878681811061142a5761142a612c91565b905060c002016040013588888781811061144657611446612c91565b905060c00201606001602081019061145e9190612d89565b89898881811061147057611470612c91565b905060c0020160800160208101906114889190612916565b8a8a8981811061149a5761149a612c91565b905060c0020160a00160208101906114b29190612916565b6040516114c59796959493929190612ced565b60405180910390a1806114d781612cbd565b9150506110cc565b50505050565b6060600380546106d690612c57565b60006106c18261225f565b606081831061152157604051631960ccad60e11b815260040160405180910390fd5b60008061152d60005490565b90508084111561153b578093505b600061154687610c97565b905084861015611565578585038181101561155f578091505b50611569565b5060005b6000816001600160401b0381111561158357611583612b3c565b6040519080825280602002602001820160405280156115ac578160200160208202803683370190505b509050816000036115c257935061167192505050565b60006115cd8861190d565b9050600081604001516115de575080515b885b8881141580156115f05750848714155b15611665576115fe8161223f565b9250826040015161165d5782516001600160a01b03161561161e57825191505b8a6001600160a01b0316826001600160a01b03160361165d578084888060010199508151811061165057611650612c91565b6020026020010181815250505b6001016115e0565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116ec612621565b601254600090819084106117365760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964537461676560a01b60448201526064015b60405180910390fd5b60008481526013602090815260408083203384528252808320548784526014909252909120546012805463ffffffff909316928790811061177957611779612c91565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b0381168452600160501b900463ffffffff169383019390935260018301549082015260029091015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152969195509350915050565b61180b612158565b8163ffffffff16600b54816118236001546000540390565b61182d9190612da4565b111561184c5760405163800113cb60e01b815260040160405180910390fd5b8263ffffffff16600e546118609190612dbc565b34101561188057604051630717c22560e51b815260040160405180910390fd5b611890828463ffffffff16612287565b600d546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156114df573d6000803e3d6000fd5b6118d4848484610860565b6001600160a01b0383163b156114df576118f0848484846122a1565b6114df576040516368d2bf6b60e11b815260040160405180910390fd5b6119156125fa565b61191d6125fa565b600054831061192c5792915050565b6119358361223f565b90508060400151156119475792915050565b6116718361238c565b606061195b82611b32565b61197857604051630a14c4b560e41b815260040160405180910390fd5b60006010805461198790612c57565b80601f01602080910402602001604051908101604052809291908181526020018280546119b390612c57565b8015611a005780601f106119d557610100808354040283529160200191611a00565b820191906000526020600020905b8154815290600101906020018083116119e357829003601f168201915b505050505090508051600003611a255760405180602001604052806000815250611671565b80611a2f846123a5565b6011604051602001611a4393929190612ddb565b6040516020818303038152906040529392505050565b611a61612158565b6001600160a01b038116611ac65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161172d565b611acf816121b7565b50565b611ada612158565b600b54811115611afd5760405163430b83b160e11b815260040160405180910390fd5b600b8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a90602001610a42565b60008054821080156106c1575050600090815260046020526040902054600160e01b161590565b600260095403611bab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161172d565b6002600955565b8363ffffffff16600b5481611bca6001546000540390565b611bd49190612da4565b1115611bf35760405163800113cb60e01b815260040160405180910390fd5b42611bfc612621565b6000611c0783610bcf565b905060128181548110611c1c57611c1c612c91565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b038116808552600160501b90910463ffffffff16948401949094526001810154918301919091526002015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152600f549093501115611cf857600e54825163ffffffff8a1691611cc9916001600160501b0316612da4565b611cd39190612dbc565b341015611cf357604051630717c22560e51b815260040160405180910390fd5b611d34565b8151611d0b9063ffffffff8a1690612ea2565b6001600160501b0316341015611d3457604051630717c22560e51b815260040160405180910390fd5b606082015162ffffff1615611d8e57606082015160008281526014602052604090205462ffffff90911690611d709063ffffffff8b1690612da4565b1115611d8e5760405162d0844960e21b815260040160405180910390fd5b600c5415611dd257600c548863ffffffff16611da98961225f565b611db39190612da4565b1115611dd25760405163751304ed60e11b815260040160405180910390fd5b602082015163ffffffff1615611e445760208083015160008381526013835260408082206001600160a01b038c168352909352919091205463ffffffff91821691611e1f918b9116612ed1565b63ffffffff161115611e445760405163b4f3729b60e01b815260040160405180910390fd5b604082015115611ee3578160400151611ec5878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b031960608e901b1660208201526034019150611eaa9050565b604051602081830303815290604052805190602001206123e9565b14611ee3576040516309bde33960e01b815260040160405180910390fd5b60008181526013602090815260408083206001600160a01b038b168452909152812080548a9290611f1b90849063ffffffff16612ed1565b92506101000a81548163ffffffff021916908363ffffffff1602179055508763ffffffff16601460008381526020019081526020016000206000828254611f629190612da4565b90915550611f7890508763ffffffff8a16612287565b600f5482516001600160501b0316101561203c57600d54600e546001600160a01b03909116906108fc90611fb39063ffffffff8c1690612dbc565b6040518115909202916000818181858888f19350505050158015611fdb573d6000803e3d6000fd5b50611fe4611042565b6001600160a01b03166108fc8963ffffffff16600e546120049190612dbc565b61200e9034612cd6565b6040518115909202916000818181858888f19350505050158015612036573d6000803e3d6000fd5b506120d2565b600d546001600160a01b03166108fc612056604234612ef9565b6040518115909202916000818181858888f1935050505015801561207e573d6000803e3d6000fd5b50612087611042565b6001600160a01b03166108fc61209e604234612ef9565b6120a89034612cd6565b6040518115909202916000818181858888f193505050501580156120d0573d6000803e3d6000fd5b505b5050505050505050565b60008160005481101561212a5760008181526004602052604081205490600160e01b82169003612128575b80600003611671575060001901600081815260046020526040902054612107565b505b604051636f96cda160e11b815260040160405180910390fd5b4260a01b176001600160a01b03919091161790565b33612161611042565b6001600160a01b031614610cf75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161172d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b806001600160401b0316826001600160401b03161061223b57604051631750215560e11b815260040160405180910390fd5b5050565b6122476125fa565b6000828152600460205260409020546106c190612436565b6001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b61223b828260405180602001604052806000815250612479565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122d6903390899088908890600401612f1b565b6020604051808303816000875af1925050508015612311575060408051601f3d908101601f1916820190925261230e91810190612f58565b60015b61236f573d80801561233f576040519150601f19603f3d011682016040523d82523d6000602084013e612344565b606091505b508051600003612367576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6123946125fa565b6106c16123a0836120dc565b612436565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806123bf5750819003601f19909101908152919050565b600081815b845181101561242e5761241a8286838151811061240d5761240d612c91565b60200260200101516124e6565b91508061242681612cbd565b9150506123ee565b509392505050565b61243e6125fa565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b6124838383612512565b6001600160a01b0383163b1561085b576000548281035b6124ad60008683806001019450866122a1565b6124ca576040516368d2bf6b60e11b815260040160405180910390fd5b81811061249a5781600054146124df57600080fd5b5050505050565b6000818310612502576000828152602084905260409020611671565b5060009182526020526040902090565b60008054908290036125375760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600090815260056020526040902080546001600160401b01840201905561256e836001841460e11b612143565b6000828152600460205260408120919091556001600160a01b038416908383019083908390600080516020612f768339815191528180a4600183015b8181146125d05780836000600080516020612f76833981519152600080a46001016125aa565b50816000036125f157604051622e076360e81b815260040160405180910390fd5b60005550505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6001600160e01b031981168114611acf57600080fd5b60006020828403121561267e57600080fd5b813561167181612656565b60005b838110156126a457818101518382015260200161268c565b838111156114df5750506000910152565b600081518084526126cd816020860160208601612689565b601f01601f19169290920160200192915050565b60208152600061167160208301846126b5565b60006020828403121561270657600080fd5b5035919050565b80356001600160a01b038116811461272457600080fd5b919050565b6000806040838503121561273c57600080fd5b6127458361270d565b946020939093013593505050565b803563ffffffff8116811461272457600080fd5b60008083601f84011261277957600080fd5b5081356001600160401b0381111561279057600080fd5b6020830191508360208260051b85010111156127ab57600080fd5b9250929050565b6000806000604084860312156127c757600080fd5b6127d084612753565b925060208401356001600160401b038111156127eb57600080fd5b6127f786828701612767565b9497909650939450505050565b60008060006060848603121561281957600080fd5b6128228461270d565b92506128306020850161270d565b9150604084013590509250925092565b6000806020838503121561285357600080fd5b82356001600160401b0381111561286957600080fd5b61287585828601612767565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015611036576128ec838551612881565b92840192608092909201916001016128d9565b80356001600160401b038116811461272457600080fd5b60006020828403121561292857600080fd5b611671826128ff565b60006020828403121561294357600080fd5b6116718261270d565b80356001600160501b038116811461272457600080fd5b803562ffffff8116811461272457600080fd5b600080600080600080600060e0888a03121561299157600080fd5b873596506129a16020890161294c565b95506129af60408901612753565b9450606088013593506129c460808901612963565b92506129d260a089016128ff565b91506129e060c089016128ff565b905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b8181101561103657835183529284019291840191600101612a0a565b60008060208385031215612a3957600080fd5b82356001600160401b0380821115612a5057600080fd5b818501915085601f830112612a6457600080fd5b813581811115612a7357600080fd5b86602060c083028501011115612a8857600080fd5b60209290920196919550909350505050565b600080600060608486031215612aaf57600080fd5b612ab88461270d565b95602085013595506040909401359392505050565b60008060408385031215612ae057600080fd5b612ae98361270d565b915060208301358015158114612afe57600080fd5b809150509250929050565b60008060408385031215612b1c57600080fd5b612b2583612753565b9150612b336020840161270d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612b6857600080fd5b612b718561270d565b9350612b7f6020860161270d565b92506040850135915060608501356001600160401b0380821115612ba257600080fd5b818701915087601f830112612bb657600080fd5b813581811115612bc857612bc8612b3c565b604051601f8201601f19908116603f01168101908382118183101715612bf057612bf0612b3c565b816040528281528a6020848701011115612c0957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b608081016106c18284612881565b60008060408385031215612c4e57600080fd5b612b258361270d565b600181811c90821680612c6b57607f821691505b602082108103612c8b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612ccf57612ccf612ca7565b5060010190565b600082821015612ce857612ce8612ca7565b500390565b9687526001600160501b0395909516602087015263ffffffff939093166040860152606085019190915262ffffff1660808401526001600160401b0390811660a08401521660c082015260e00190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612d6557600080fd5b6116718261294c565b600060208284031215612d8057600080fd5b61167182612753565b600060208284031215612d9b57600080fd5b61167182612963565b60008219821115612db757612db7612ca7565b500190565b6000816000190483118215151615612dd657612dd6612ca7565b500290565b600084516020612dee8285838a01612689565b855191840191612e018184848a01612689565b8554920191600090600181811c9080831680612e1e57607f831692505b8583108103612e3b57634e487b7160e01b85526022600452602485fd5b808015612e4f5760018114612e6457612e91565b60ff1985168852831515840288019550612e91565b60008b81526020902060005b85811015612e895781548a820152908401908801612e70565b505083880195505b50939b9a5050505050505050505050565b60006001600160501b0382811684821681151582840482111615612ec857612ec8612ca7565b02949350505050565b600063ffffffff808316818516808303821115612ef057612ef0612ca7565b01949350505050565b600082612f1657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f4e908301846126b5565b9695505050505050565b600060208284031215612f6a57600080fd5b81516116718161265656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb3268648542a1bb1b2dd12e3b14aeb5a3ab22c592de96bdd3e842154a5b394faa26469706673582212200dce03c9a4f10303d9fa88b16d3b27005a50e991156ac00488e89367101a48e164736f6c634300080f0033

Deployed Bytecode Sourcemap

87220:14354:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20568:675;;;;;;;;;;-1:-1:-1;20568:675:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;20568:675:0;;;;;;;;21542:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28713:234::-;;;;;;;;;;-1:-1:-1;28713:234:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;28713:234:0;1528:203:1;28070:448:0;;;;;;:::i;:::-;;:::i;:::-;;96175:183;;;;;;:::i;:::-;;:::i;16877:347::-;;;;;;;;;;-1:-1:-1;17167:12:0;;16938:7;17151:13;:28;16877:347;;;3373:25:1;;;3361:2;3346:18;16877:347:0;3227:177:1;32736:3069:0;;;;;;:::i;:::-;;:::i;93044:345::-;;;;;;;;;;-1:-1:-1;93044:345:0;;;;;:::i;:::-;;:::i;99554:257::-;;;;;;;;;;;;;:::i;35921:217::-;;;;;;:::i;:::-;;:::i;87827:38::-;;;;;;;;;;;;;;;;92015:125;;;;;;;;;;-1:-1:-1;92110:18:0;;92015:125;;64064:588;;;;;;;;;;-1:-1:-1;64064:588:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23099:160::-;;;;;;;;;;-1:-1:-1;23099:160:0;;;;;:::i;:::-;;:::i;100691:515::-;;;;;;;;;;-1:-1:-1;100691:515:0;;;;;:::i;:::-;;:::i;18193:245::-;;;;;;;;;;-1:-1:-1;18193:245:0;;;;;:::i;:::-;;:::i;91803:120::-;;;;;;;;;;-1:-1:-1;91893:11:0;:18;91803:120;;86176:111;;;;;;;;;;;;;:::i;94527:1422::-;;;;;;;;;;-1:-1:-1;94527:1422:0;;;;;:::i;:::-;;:::i;68340:984::-;;;;;;;;;;-1:-1:-1;68340:984:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;85456:95::-;;;;;;;;;;;;;:::i;90000:1718::-;;;;;;;;;;-1:-1:-1;90000:1718:0;;;;;:::i;:::-;;:::i;21746:112::-;;;;;;;;;;;;;:::i;93500:214::-;;;;;;;;;;-1:-1:-1;93500:214:0;;;;;:::i;:::-;;:::i;65096:2749::-;;;;;;;;;;-1:-1:-1;65096:2749:0;;;;;:::i;:::-;;:::i;29339:246::-;;;;;;;;;;-1:-1:-1;29339:246:0;;;;;:::i;:::-;;:::i;93838:565::-;;;;;;;;;;-1:-1:-1;93838:565:0;;;;;:::i;:::-;;:::i;:::-;;;;9035:13:1;;-1:-1:-1;;;;;9031:38:1;9013:57;;9117:4;9105:17;;;9099:24;9142:10;9190:21;;;9168:20;;;9161:51;;;;9256:17;;;9250:24;9228:20;;;9221:54;;;;9335:4;9323:17;;;9317:24;9343:8;9313:39;9291:20;;;9284:69;9402:4;9390:17;;;9384:24;-1:-1:-1;;;;;9483:23:1;;;9461:20;;;9454:53;;;;9567:4;9555:17;;;9549:24;9545:33;9523:20;;;9516:63;;;;9616:15;;;9610:3;9595:19;;9588:44;9663:3;9648:19;;9641:35;9000:3;8985:19;93838:565:0;8750:932:1;99160:309:0;;;;;;:::i;:::-;;:::i;36804:451::-;;;;;;:::i;:::-;;:::i;63413:468::-;;;;;;;;;;-1:-1:-1;63413:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;99926:653::-;;;;;;;;;;-1:-1:-1;99926:653:0;;;;;:::i;:::-;;:::i;29770:172::-;;;;;;;;;;-1:-1:-1;29770:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;29895:25:0;;;29867:4;29895:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29770:172;92834:125;;;;;;;;;;-1:-1:-1;92929:18:0;;92834:125;;86466:213;;;;;;;;;;-1:-1:-1;86466:213:0;;;;;:::i;:::-;;:::i;92295:389::-;;;;;;;;;;-1:-1:-1;92295:389:0;;;;;:::i;:::-;;:::i;87777:39::-;;;;;;;;;;;;;;;;20568:675;20653:4;-1:-1:-1;;;;;;;;;21001:25:0;;;;:106;;-1:-1:-1;;;;;;;;;;21082:25:0;;;21001:106;:187;;;-1:-1:-1;;;;;;;;;;21163:25:0;;;21001:187;20977:211;20568:675;-1:-1:-1;;20568:675:0:o;21542:108::-;21596:13;21633:5;21626:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21542:108;:::o;28713:234::-;28789:7;28818:16;28826:7;28818;:16::i;:::-;28813:64;;28843:34;;-1:-1:-1;;;28843:34:0;;;;;;;;;;;28813:64;-1:-1:-1;28905:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;28905:30:0;;28713:234::o;28070:448::-;28163:13;28179:16;28187:7;28179;:16::i;:::-;28163:32;-1:-1:-1;54891:10:0;-1:-1:-1;;;;;28220:28:0;;;28216:187;;28272:44;28289:5;54891:10;29770:172;:::i;28272:44::-;28267:136;;28348:35;;-1:-1:-1;;;28348:35:0;;;;;;;;;;;28267:136;28423:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;28423:35:0;-1:-1:-1;;;;;28423:35:0;;;;;;;;;28478:28;;28423:24;;28478:28;;;;;;;28148:370;28070:448;;:::o;96175:183::-;82367:21;:19;:21::i;:::-;96309:37:::1;96323:3;96328:10;96340:5;;96309:13;:37::i;:::-;82419:20:::0;81737:1;82995:7;:22;82800:229;82419:20;96175:183;;;:::o;32736:3069::-;32898:27;32928;32947:7;32928:18;:27::i;:::-;32898:57;;33021:4;-1:-1:-1;;;;;32980:45:0;32996:19;-1:-1:-1;;;;;32980:45:0;;32976:86;;33034:28;;-1:-1:-1;;;33034:28:0;;;;;;;;;;;32976:86;33084:27;31744:24;;;:15;:24;;;;;31988:26;;54891:10;31321:30;;;-1:-1:-1;;;;;30998:28:0;;31299:20;;;31296:56;33282:184;;33379:43;33396:4;54891:10;29770:172;:::i;33379:43::-;33374:92;;33431:35;;-1:-1:-1;;;33431:35:0;;;;;;;;;;;33374:92;-1:-1:-1;;;;;33491:16:0;;33487:52;;33516:23;;-1:-1:-1;;;33516:23:0;;;;;;;;;;;33487:52;33712:15;33709:172;;;33860:1;33839:19;33832:30;33709:172;-1:-1:-1;;;;;34293:24:0;;;;;;;:18;:24;;;;;;34291:26;;-1:-1:-1;;34291:26:0;;;34366:22;;;;;;34364:24;;-1:-1:-1;34364:24:0;;;34716:158;34366:22;-1:-1:-1;;;34716:18:0;:158::i;:::-;34687:26;;;;:17;:26;;;;;:187;;;;-1:-1:-1;;;35006:47:0;;:52;;35002:667;;35115:1;35105:11;;35083:19;35246:30;;;:17;:30;;;;;;:35;;35242:408;;35392:13;;35377:11;:28;35373:254;;35547:30;;;;:17;:30;;;;;:52;;;35373:254;35060:609;35002:667;35728:7;35724:2;-1:-1:-1;;;;;35709:27:0;35718:4;-1:-1:-1;;;;;35709:27:0;-1:-1:-1;;;;;;;;;;;35709:27:0;;;;;;;;;32883:2922;;;32736:3069;;;:::o;93044:345::-;85314:13;:11;:13::i;:::-;93194:18:::1;;93174:17;:38;93170:95;;;93238:27;;-1:-1:-1::0;;;93238:27:0::1;;;;;;;;;;;93170:95;93280:18;:38:::0;;;93338:39:::1;::::0;3373:25:1;;;93338:39:0::1;::::0;3361:2:1;3346:18;93338:39:0::1;;;;;;;;93044:345:::0;:::o;99554:257::-;85314:13;:11;:13::i;:::-;99679:33:::1;::::0;99624:21:::1;::::0;99608:13:::1;::::0;99679:10:::1;::::0;99624:21;;99608:13;99679:33;99608:13;99679:33;99624:21;99679:10;:33:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99660:52;;;99732:7;99727:37;;99748:16;;-1:-1:-1::0;;;99748:16:0::1;;;;;;;;;;;99727:37;99784:15;::::0;3373:25:1;;;99784:15:0::1;::::0;3361:2:1;3346:18;99784:15:0::1;;;;;;;99593:218;;99554:257::o:0;35921:217::-;36087:39;36104:4;36110:2;36114:7;36087:39;;;;;;;;;;;;:16;:39::i;64064:588::-;64228:23;64331:8;64306:22;64331:8;-1:-1:-1;;;;;64402:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;64365:73;;64462:9;64457:133;64478:14;64473:1;:19;64457:133;;64538:32;64558:8;;64567:1;64558:11;;;;;;;:::i;:::-;;;;;;;64538:19;:32::i;:::-;64522:10;64533:1;64522:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;64494:3;;64457:133;;;-1:-1:-1;64615:10:0;64064:588;-1:-1:-1;;;;64064:588:0:o;23099:160::-;23171:7;23218:27;23237:7;23218:18;:27::i;100691:515::-;100828:7;;100861:298;100885:11;:18;100881:22;;100861:298;;;100968:11;100980:1;100968:14;;;;;;;;:::i;:::-;;;;;;;;;:35;:14;;;;;:35;;-1:-1:-1;;;;;100968:35:0;;;;;;100955:48;;;;;;;:118;;;101040:11;101052:1;101040:14;;;;;;;;:::i;:::-;;;;;;;;;:33;:14;;;;;:33;;-1:-1:-1;;;;;;;;101040:33:0;;;;;101028:45;;;;100955:118;100929:215;;;101123:1;100691:515;-1:-1:-1;;100691:515:0:o;100929:215::-;100905:3;;;;:::i;:::-;;;;100861:298;;;;101180:14;;-1:-1:-1;;;101180:14:0;;;;;;;;;;;18193:245;18265:7;-1:-1:-1;;;;;18293:19:0;;18289:60;;18321:28;;-1:-1:-1;;;18321:28:0;;;;;;;;;;;18289:60;-1:-1:-1;;;;;;18371:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;18371:55:0;;18193:245::o;86176:111::-;85314:13;:11;:13::i;:::-;86245:30:::1;86272:1;86245:18;:30::i;:::-;86176:111::o:0;94527:1422::-;85314:13;:11;:13::i;:::-;94844:11:::1;:18:::0;94835:27;::::1;94831:54;;94871:14;;-1:-1:-1::0;;;94871:14:0::1;;;;;;;;;;;94831:54;94913:1;94904:5;:10;94900:257;;95005:11;95017:9;95025:1;95017:5:::0;:9:::1;:::i;:::-;95005:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:41:::1;:22;::::0;;::::1;;:41;::::0;-1:-1:-1;;;;;;;;95005:41:0;;::::1;::::0;::::1;94961:85:::0;;::::1;;94935:207;;;95096:26;;-1:-1:-1::0;;;95096:26:0::1;;;;;;;;;;;94935:207;95171:123;95222:20;95261:18;95171:32;:123::i;:::-;95335:4;95309:11;95321:5;95309:18;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:30;;;;;-1:-1:-1::0;;;;;95309:30:0::1;;;;;-1:-1:-1::0;;;;;95309:30:0::1;;;;;;95387:11;95354;95366:5;95354:18;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;:44;;;;;;;;;;;;;;;;;;95445:10;95413:11;95425:5;95413:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;:42;;;;95506:14;95470:11;95482:5;95470:18;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:50;;;;;;;;;;;;;;;;;;95577:20;95535:11;95547:5;95535:18;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;:62;;;;;-1:-1:-1::0;;;;;95535:62:0::1;;;;;-1:-1:-1::0;;;;;95535:62:0::1;;;;;;95652:18;95612:11;95624:5;95612:18;;;;;;;;:::i;:::-;;;;;;;;;;;:37;;;:58;;;;;-1:-1:-1::0;;;;;95612:58:0::1;;;;;-1:-1:-1::0;;;;;95612:58:0::1;;;;;;-1:-1:-1::0;;;;;;;;;;;95726:5:0::1;95750:4;95773:11;95803:10;95832:14;95865:20;95904:18;95696:241;;;;;;;;;;;;:::i;:::-;;;;;;;;94527:1422:::0;;;;;;;:::o;68340:984::-;68418:16;68480:19;68518:25;68562:22;68587:16;68597:5;68587:9;:16::i;:::-;68562:41;;68622:25;68664:14;-1:-1:-1;;;;;68650:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68650:29:0;;68622:57;;68698:31;;:::i;:::-;68753:9;68748:516;68797:14;68782:11;:29;68748:516;;68853:15;68866:1;68853:12;:15::i;:::-;68841:27;;68895:9;:16;;;68940:8;68891:81;68998:14;;-1:-1:-1;;;;;68998:28:0;;68994:119;;69075:14;;;-1:-1:-1;68994:119:0;69160:5;-1:-1:-1;;;;;69139:26:0;:17;-1:-1:-1;;;;;69139:26:0;;69135:110;;69220:1;69194:8;69203:13;;;;;;69194:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;69135:110;68813:3;;68748:516;;;-1:-1:-1;69289:8:0;;68340:984;-1:-1:-1;;;;;;68340:984:0:o;85456:95::-;85533:6;;-1:-1:-1;;;;;85533:6:0;;85456:95::o;90000:1718::-;85314:13;:11;:13::i;:::-;90112:11:::1;:18:::0;90089:20:::1;90145:95;90169:12;90165:1;:16;90145:95;;;90207:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;90207:17:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;90207:17:0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;;;;;90207:17:0;;;;;90183:3;::::1;::::0;::::1;:::i;:::-;;;;90145:95;;;;90271:9;90266:1441;90286:20:::0;;::::1;90266:1441;;;90341:1;90336;:6;90332:288;;90458:9:::0;;90468:5:::1;90472:1;90468::::0;:5:::1;:::i;:::-;90458:16;;;;;;;:::i;:::-;;;;;;:35;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90397:96:0::1;:9;;90407:1;90397:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90397:96:0::1;;90367:234;;;90551:26;;-1:-1:-1::0;;;90551:26:0::1;;;;;;;;;;;90367:234;90638:161;90693:9;;90703:1;90693:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;90749:9;;90759:1;90749:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;90638:32;:161::i;:::-;90818:11;90857:444;;;;;;;;90904:9;;90914:1;90904:12;;;;;;;:::i;:::-;:17;::::0;::::1;:12;::::0;;::::1;;:17:::0;;::::1;::::0;-1:-1:-1;90904:17:0::1;:::i;:::-;-1:-1:-1::0;;;;;90857:444:0::1;;;;;90961:9;;90971:1;90961:12;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;90857:444;;;;;;91024:9;;91034:1;91024:12;;;;;;;:::i;:::-;;;;;;:23;;;90857:444;;;;91090:9;;91100:1;91090:12;;;;;;;:::i;:::-;;;;;;:27;;;;;;;;;;:::i;:::-;90857:444;;;;;;91166:9;;91176:1;91166:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90857:444:0::1;;;;;91246:9;;91256:1;91246:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90857:444:0;;::::1;::::0;;;90818:502;;::::1;::::0;;::::1;::::0;;-1:-1:-1;90818:502:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;;;::::1;::::0;::::1;;-1:-1:-1::0;;;90818:502:0::1;-1:-1:-1::0;;;;;;90818:502:0;;;-1:-1:-1;;;;;90818:502:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;90818:502:0::1;-1:-1:-1::0;;;;;;;;90818:502:0;;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;90818:502:0;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;;;;;;;91378:1:0;91402:9;;91378:1;91402:12;;::::1;;;;;:::i;:::-;:17;::::0;::::1;:12;::::0;;::::1;;:17:::0;;::::1;::::0;-1:-1:-1;91402:17:0::1;:::i;:::-;91442:9;;91452:1;91442:12;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;91489:9;;91499:1;91489:12;;;;;;;:::i;:::-;;;;;;:23;;;91535:9;;91545:1;91535:12;;;;;;;:::i;:::-;;;;;;:27;;;;;;;;;;:::i;:::-;91585:9;;91595:1;91585:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;91641:9;;91651:1;91641:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;91344:347;;;;;;;;;;;;:::i;:::-;;;;;;;;90308:3:::0;::::1;::::0;::::1;:::i;:::-;;;;90266:1441;;;;90074:1644;90000:1718:::0;;:::o;21746:112::-;21802:13;21839:7;21832:14;;;;;:::i;93500:214::-;93646:7;93686:16;93700:1;93686:13;:16::i;65096:2749::-;65255:16;65330:4;65321:5;:13;65317:45;;65343:19;;-1:-1:-1;;;65343:19:0;;;;;;;;;;;65317:45;65381:19;65419:17;65439:14;16583:7;16614:13;;16528:111;65439:14;65419:34;-1:-1:-1;65714:9:0;65707:4;:16;65703:81;;;65755:9;65748:16;;65703:81;65802:25;65830:16;65840:5;65830:9;:16::i;:::-;65802:44;;66036:4;66028:5;:12;66024:306;;;66087:12;;;66126:31;;;66122:119;;;66206:11;66186:31;;66122:119;66042:218;66024:306;;;-1:-1:-1;66309:1:0;66024:306;66348:25;66390:17;-1:-1:-1;;;;;66376:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66376:32:0;;66348:60;;66431:17;66452:1;66431:22;66427:86;;66485:8;-1:-1:-1;66478:15:0;;-1:-1:-1;;;66478:15:0;66427:86;66669:31;66703:26;66723:5;66703:19;:26::i;:::-;66669:60;;66748:25;67005:9;:16;;;67000:100;;-1:-1:-1;67066:14:0;;67000:100;67135:5;67118:522;67147:4;67142:1;:9;;:45;;;;;67170:17;67155:11;:32;;67142:45;67118:522;;;67229:15;67242:1;67229:12;:15::i;:::-;67217:27;;67271:9;:16;;;67316:8;67267:81;67374:14;;-1:-1:-1;;;;;67374:28:0;;67370:119;;67451:14;;;-1:-1:-1;67370:119:0;67536:5;-1:-1:-1;;;;;67515:26:0;:17;-1:-1:-1;;;;;67515:26:0;;67511:110;;67596:1;67570:8;67579:13;;;;;;67570:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;67511:110;67189:3;;67118:522;;;-1:-1:-1;;;67737:29:0;;;-1:-1:-1;67744:8:0;;-1:-1:-1;;65096:2749:0;;;;;;:::o;29339:246::-;54891:10;29438:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;29438:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;29438:60:0;;;;;;;;;;29518:55;;540:41:1;;;29438:49:0;;54891:10;29518:55;;513:18:1;29518:55:0;;;;;;;29339:246;;:::o;93838:565::-;93977:20;;:::i;:::-;94101:11;:18;94016:6;;;;94092:27;;94088:90;;94140:22;;-1:-1:-1;;;94140:22:0;;14503:2:1;94140:22:0;;;14485:21:1;14542:2;14522:18;;;14515:30;-1:-1:-1;;;14561:18:1;;;14554:42;14613:18;;94140:22:0;;;;;;;;94088:90;94192:19;94214:34;;;:27;:34;;;;;;;;94249:10;94214:46;;;;;;;;94297:25;;;:18;:25;;;;;;;94345:11;:18;;94214:46;;;;;94242:5;;94345:18;;;;;;:::i;:::-;;;;;;;;;;94337:54;;;;;;;;94345:18;;;;;;;;94337:54;;-1:-1:-1;;;;;94337:54:0;;;;-1:-1:-1;;;94337:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;94337:54:0;;;;;;;-1:-1:-1;;;94337:54:0;;;;;;;;;94365:12;;-1:-1:-1;94365:12:0;-1:-1:-1;93838:565:0;-1:-1:-1;;93838:565:0:o;99160:309::-;85314:13;:11;:13::i;:::-;99292:3:::1;88905:142;;88978:18;;88972:3;88956:13;17167:12:::0;;16938:7;17151:13;:28;;16877:347;88956:13:::1;:19;;;;:::i;:::-;:40;88952:67;;;89005:14;;-1:-1:-1::0;;;89005:14:0::1;;;;;;;;;;;88952:67;99347:3:::2;99337:13;;:7;;:13;;;;:::i;:::-;99325:9;:25;99321:54;;;99359:16;;-1:-1:-1::0;;;99359:16:0::2;;;;;;;;;;;99321:54;99390:18;99400:2;99404:3;99390:18;;:9;:18::i;:::-;99431:5;::::0;99423:34:::2;::::0;-1:-1:-1;;;;;99431:5:0;;::::2;::::0;99447:9:::2;99423:34:::0;::::2;;;::::0;99431:5:::2;99423:34:::0;99431:5;99423:34;99447:9;99431:5;99423:34;::::2;;;;;;;;;;;;;::::0;::::2;;;;36804:451:::0;37003:31;37016:4;37022:2;37026:7;37003:12;:31::i;:::-;-1:-1:-1;;;;;37053:14:0;;;:19;37049:195;;37096:56;37127:4;37133:2;37137:7;37146:5;37096:30;:56::i;:::-;37091:153;;37184:40;;-1:-1:-1;;;37184:40:0;;;;;;;;;;;63413:468;63497:21;;:::i;:::-;63535:31;;:::i;:::-;16583:7;16614:13;63614:7;:25;63581:111;;63667:9;63413:468;-1:-1:-1;;63413:468:0:o;63581:111::-;63718:21;63731:7;63718:12;:21::i;:::-;63706:33;;63758:9;:16;;;63754:73;;;63802:9;63413:468;-1:-1:-1;;63413:468:0:o;63754:73::-;63848:21;63861:7;63848:12;:21::i;99926:653::-;100062:13;100106:16;100114:7;100106;:16::i;:::-;100101:59;;100131:29;;-1:-1:-1;;;100131:29:0;;;;;;;;;;;100101:59;100181:21;100205:15;100181:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100265:7;100259:21;100284:1;100259:26;:308;;;;;;;;;;;;;;;;;100389:7;100427:18;100437:7;100427:9;:18::i;:::-;100476:15;100342:176;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;100235:332;99926:653;-1:-1:-1;;;99926:653:0:o;86466:213::-;85314:13;:11;:13::i;:::-;-1:-1:-1;;;;;86559:22:0;::::1;86551:73;;;::::0;-1:-1:-1;;;86551:73:0;;16839:2:1;86551:73:0::1;::::0;::::1;16821:21:1::0;16878:2;16858:18;;;16851:30;16917:34;16897:18;;;16890:62;-1:-1:-1;;;16968:18:1;;;16961:36;17014:19;;86551:73:0::1;16637:402:1::0;86551:73:0::1;86639:28;86658:8;86639:18;:28::i;:::-;86466:213:::0;:::o;92295:389::-;85314:13;:11;:13::i;:::-;92466:18:::1;;92446:17;:38;92442:119;;;92512:33;;-1:-1:-1::0;;;92512:33:0::1;;;;;;;;;;;92442:119;92575:18;:38:::0;;;92633:39:::1;::::0;3373:25:1;;;92633:39:0::1;::::0;3361:2:1;3346:18;92633:39:0::1;3227:177:1::0;30236:302:0;30301:4;30403:13;;30393:7;:23;30346:161;;;;-1:-1:-1;;30458:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;30458:44:0;:49;;30236:302::o;82467:317::-;81785:1;82609:7;;:19;82601:63;;;;-1:-1:-1;;;82601:63:0;;17246:2:1;82601:63:0;;;17228:21:1;17285:2;17265:18;;;17258:30;17324:33;17304:18;;;17297:61;17375:18;;82601:63:0;17044:355:1;82601:63:0;81785:1;82754:7;:18;82467:317::o;96450:2435::-;96592:3;88905:142;;88978:18;;88972:3;88956:13;17167:12;;16938:7;17151:13;:28;;16877:347;88956:13;:19;;;;:::i;:::-;:40;88952:67;;;89005:14;;-1:-1:-1;;;89005:14:0;;;;;;;;;;;88952:67;96643:15:::1;96680:26;;:::i;:::-;96727:19;96749:43;96777:14;96749:27;:43::i;:::-;96727:65;;96821:11;96833;96821:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;96813:32:::1;::::0;;::::1;::::0;::::1;::::0;;96821:24:::1;::::0;;;::::1;::::0;;::::1;96813:32:::0;;-1:-1:-1;;;;;96813:32:0;::::1;::::0;;;-1:-1:-1;;;96813:32:0;;::::1;;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;-1:-1:-1::0;;;;;96813:32:0;;::::1;::::0;;;;-1:-1:-1;;;96813:32:0;;::::1;;::::0;;;;96910:9:::1;::::0;96813:32;;-1:-1:-1;;96894:230:0::1;;;96971:7;::::0;96958:10;;96957:28:::1;::::0;::::1;::::0;96958:20:::1;::::0;-1:-1:-1;;;;;96958:20:0::1;;:::i;:::-;96957:28;;;;:::i;:::-;96945:9;:40;96941:69;;;96994:16;;-1:-1:-1::0;;;96994:16:0::1;;;;;;;;;;;96941:69;96894:230;;;97067:10:::0;;:16:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;97055:28:0::1;:9;:28;97051:57;;;97092:16;;-1:-1:-1::0;;;97092:16:0::1;;;;;;;;;;;97051:57;97197:20;::::0;::::1;::::0;:24:::1;;::::0;97193:180:::1;;97286:20;::::0;::::1;::::0;97246:31:::1;::::0;;;:18:::1;:31;::::0;;;;;:60:::1;::::0;;::::1;::::0;:37:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:60;97242:115;;;97336:21;;-1:-1:-1::0;;;97336:21:0::1;;;;;;;;;;;97242:115;97453:18;::::0;:22;97449:168:::1;;97526:18;;97520:3;97500:23;;:17;97514:2;97500:13;:17::i;:::-;:23;;;;:::i;:::-;:44;97496:105;;;97574:27;;-1:-1:-1::0;;;97574:27:0::1;;;;;;;;;;;97496:105;97736:17;::::0;::::1;::::0;:21:::1;;::::0;97732:232:::1;;97878:17;::::0;;::::1;::::0;97804:40:::1;::::0;;;:27:::1;:40:::0;;;;;;-1:-1:-1;;;;;97804:44:0;::::1;::::0;;;;;;;;;;:91:::1;::::0;;::::1;::::0;:50:::1;::::0;97851:3;;97804:44:::1;:50;:::i;:::-;:91;;;97778:170;;;97922:26;;-1:-1:-1::0;;;97922:26:0::1;;;;;;;;;;;97778:170;98086:16;::::0;::::1;::::0;:21;98082:286:::1;;98295:5;:16;;;98154:137;98205:5;;98154:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;98247:20:0::1;::::0;-1:-1:-1;;;;;;18086:2:1;18057:15;;;18053:45;98247:20:0::1;::::0;::::1;18041:58:1::0;18115:12;;;-1:-1:-1;98247:20:0::1;::::0;-1:-1:-1;17912:221:1;98247:20:0::1;;;;;;;;;;;;;98237:31;;;;;;98154:24;:137::i;:::-;:157;98128:224;;98338:14;;-1:-1:-1::0;;;98338:14:0::1;;;;;;;;;;;98128:224;98388:40;::::0;;;:27:::1;:40;::::0;;;;;;;-1:-1:-1;;;;;98388:44:0;::::1;::::0;;;;;;;:51;;98436:3;;98388:40;:51:::1;::::0;98436:3;;98388:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;98489:3;98454:38;;:18;:31;98473:11;98454:31;;;;;;;;;;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;98507:18:0::1;::::0;-1:-1:-1;98517:2:0;98507:18:::1;::::0;::::1;:9;:18::i;:::-;98562:9;::::0;98549:10;;-1:-1:-1;;;;;98549:22:0::1;;98546:328;;;98601:5;::::0;98617:7:::1;::::0;-1:-1:-1;;;;;98601:5:0;;::::1;::::0;98593:38:::1;::::0;98617:13:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;98593:38;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;98658:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;98650:25:0::1;:54;98699:3;98689:13;;:7;;:13;;;;:::i;:::-;98676:27;::::0;:9:::1;:27;:::i;:::-;98650:54;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;98546:328;;;98753:5;::::0;-1:-1:-1;;;;;98753:5:0::1;98745:39;98769:14;98781:2;98769:9;:14;:::i;:::-;98745:39;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;98811:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;98803:25:0::1;:55;98842:14;98854:2;98842:9;:14;:::i;:::-;98829:28;::::0;:9:::1;:28;:::i;:::-;98803:55;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;98546:328;96597:2288;;;96450:2435:::0;;;;;:::o;24378:1379::-;24445:7;24484;24602:13;;24595:4;:20;24591:1087;;;24644:14;24661:23;;;:17;:23;;;;;;;-1:-1:-1;;;24758:24:0;;:29;;24754:901;;25463:121;25470:6;25480:1;25470:11;25463:121;;-1:-1:-1;;;25545:6:0;25527:25;;;;:17;:25;;;;;;25463:121;;24754:901;24617:1061;24591:1087;25714:31;;-1:-1:-1;;;25714:31:0;;;;;;;;;;;26365:478;26796:11;26771:23;26767:41;26764:52;-1:-1:-1;;;;;26614:28:0;;;;26754:63;;26365:478::o;85649:140::-;54891:10;85717:7;:5;:7::i;:::-;-1:-1:-1;;;;;85717:23:0;;85709:68;;;;-1:-1:-1;;;85709:68:0;;18562:2:1;85709:68:0;;;18544:21:1;;;18581:18;;;18574:30;18640:34;18620:18;;;18613:62;18692:18;;85709:68:0;18360:356:1;86863:207:0;86960:6;;;-1:-1:-1;;;;;86981:17:0;;;-1:-1:-1;;;;;;86981:17:0;;;;;;;87018:40;;86960:6;;;86981:17;86960:6;;87018:40;;86941:16;;87018:40;86926:144;86863:207;:::o;101347:198::-;101492:3;-1:-1:-1;;;;;101483:12:0;:5;-1:-1:-1;;;;;101483:12:0;;101479:54;;101504:29;;-1:-1:-1;;;101504:29:0;;;;;;;;;;;101479:54;101347:198;;:::o;23762:169::-;23830:21;;:::i;:::-;23894:24;;;;:17;:24;;;;;;23875:44;;:18;:44::i;18540:186::-;-1:-1:-1;;;;;18633:25:0;18601:7;18633:25;;;:18;:25;;11878:2;18633:25;;;;;:50;;-1:-1:-1;;;;;18632:82:0;;18540:186::o;48016:120::-;48097:27;48107:2;48111:8;48097:27;;;;;;;;;;;;:9;:27::i;39571:792::-;39779:88;;-1:-1:-1;;;39779:88:0;;39754:4;;-1:-1:-1;;;;;39779:45:0;;;;;:88;;54891:10;;39846:4;;39852:7;;39861:5;;39779:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39779:88:0;;;;;;;;-1:-1:-1;;39779:88:0;;;;;;;;;;;;:::i;:::-;;;39775:577;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40082:6;:13;40099:1;40082:18;40078:259;;40132:40;;-1:-1:-1;;;40132:40:0;;;;;;;;;;;40078:259;40287:6;40281:13;40272:6;40268:2;40264:15;40257:38;39775:577;-1:-1:-1;;;;;;39950:64:0;-1:-1:-1;;;39950:64:0;;-1:-1:-1;39571:792:0;;;;;;:::o;23472:174::-;23542:21;;:::i;:::-;23587:47;23606:27;23625:7;23606:18;:27::i;:::-;23587:18;:47::i;55035:1893::-;55100:17;55558:4;55551;55545:11;55541:22;55658:1;55652:4;55645:15;55741:4;55738:1;55734:12;55727:19;;;55831:1;55826:3;55819:14;55947:3;56206:5;56188:464;56258:1;56253:3;56249:11;56242:18;;56441:2;56435:4;56431:13;56427:2;56423:22;56418:3;56410:36;56543:2;56533:13;;56608:25;56188:464;56608:25;-1:-1:-1;56690:13:0;;;-1:-1:-1;;56813:14:0;;;56883:19;;;56813:14;55035:1893;-1:-1:-1;55035:1893:0:o;71666:320::-;71749:7;71796:4;71749:7;71815:126;71839:5;:12;71835:1;:16;71815:126;;;71892:33;71902:12;71916:5;71922:1;71916:8;;;;;;;;:::i;:::-;;;;;;;71892:9;:33::i;:::-;71877:48;-1:-1:-1;71853:3:0;;;;:::i;:::-;;;;71815:126;;;-1:-1:-1;71962:12:0;71666:320;-1:-1:-1;;;71666:320:0:o;25876:386::-;25942:31;;:::i;:::-;-1:-1:-1;;;;;25990:41:0;;;;-1:-1:-1;;;;;12447:3:0;26080:33;;;26046:68;:24;;;:68;-1:-1:-1;;;26148:24:0;;:29;;26129:16;;;:48;13016:3;26221:28;;;;26192:19;;;:58;25990:9;25876:386::o;47143:769::-;47294:19;47300:2;47304:8;47294:5;:19::i;:::-;-1:-1:-1;;;;;47367:14:0;;;:19;47363:523;;47411:11;47425:13;47477:14;;;47514:249;47549:62;47588:1;47592:2;47596:7;;;;;;47605:5;47549:30;:62::i;:::-;47544:175;;47651:40;;-1:-1:-1;;;47651:40:0;;;;;;;;;;;47544:175;47758:3;47750:5;:11;47514:249;;47853:3;47836:13;;:20;47832:34;;47858:8;;;47832:34;47388:498;;47143:769;;;:::o;79326:157::-;79389:7;79424:1;79420;:5;:51;;79567:13;79673:15;;;79713:4;79706:15;;;79764:4;79748:21;;79420:51;;;-1:-1:-1;79567:13:0;79673:15;;;79713:4;79706:15;79764:4;79748:21;;;79326:157::o;40889:3222::-;40966:20;40989:13;;;41021;;;41017:44;;41043:18;;-1:-1:-1;;;41043:18:0;;;;;;;;;;;41017:44;-1:-1:-1;;;;;41601:22:0;;;;;;:18;:22;;11878:2;41601:22;;:71;;-1:-1:-1;;;;;41627:45:0;;41601:71;;;41977:151;41601:22;-1:-1:-1;27271:15:0;;27245:24;27241:46;41977:18;:151::i;:::-;41943:31;;;;:17;:31;;;;;:185;;;;-1:-1:-1;;;;;42762:25:0;;;42202:23;;;;41961:12;;42762:25;;-1:-1:-1;;;;;;;;;;;41943:31:0;;42860:363;43573:1;43559:12;43555:20;43509:374;43618:3;43609:7;43606:16;43509:374;;43852:7;43842:8;43839:1;-1:-1:-1;;;;;;;;;;;43809:1:0;43806;43801:59;43675:1;43662:15;43509:374;;;43513:85;43924:8;43936:1;43924:13;43920:45;;43946:19;;-1:-1:-1;;;43946:19:0;;;;;;;;;;;43920:45;43990:13;:19;-1:-1:-1;96175:183:0;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335: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:1;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:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1: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:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;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:1:o;2173:163::-;2240:20;;2300:10;2289:22;;2279:33;;2269:61;;2326:1;2323;2316:12;2341:367;2404:8;2414:6;2468:3;2461:4;2453:6;2449:17;2445:27;2435:55;;2486:1;2483;2476:12;2435:55;-1:-1:-1;2509:20:1;;-1:-1:-1;;;;;2541:30:1;;2538:50;;;2584:1;2581;2574:12;2538:50;2621:4;2613:6;2609:17;2597:29;;2681:3;2674:4;2664:6;2661:1;2657:14;2649:6;2645:27;2641:38;2638:47;2635:67;;;2698:1;2695;2688:12;2635:67;2341:367;;;;;:::o;2713:509::-;2807:6;2815;2823;2876:2;2864:9;2855:7;2851:23;2847:32;2844:52;;;2892:1;2889;2882:12;2844:52;2915:28;2933:9;2915:28;:::i;:::-;2905:38;-1:-1:-1;2994:2:1;2979:18;;2966:32;-1:-1:-1;;;;;3010:30:1;;3007:50;;;3053:1;3050;3043:12;3007:50;3092:70;3154:7;3145:6;3134:9;3130:22;3092:70;:::i;:::-;2713:509;;3181:8;;-1:-1:-1;3066:96:1;;-1:-1:-1;;;;2713:509:1:o;3409:328::-;3486:6;3494;3502;3555:2;3543:9;3534:7;3530:23;3526:32;3523:52;;;3571:1;3568;3561:12;3523:52;3594:29;3613:9;3594:29;:::i;:::-;3584:39;;3642:38;3676:2;3665:9;3661:18;3642:38;:::i;:::-;3632:48;;3727:2;3716:9;3712:18;3699:32;3689:42;;3409:328;;;;;:::o;3742:437::-;3828:6;3836;3889:2;3877:9;3868:7;3864:23;3860:32;3857:52;;;3905:1;3902;3895:12;3857:52;3932:23;;-1:-1:-1;;;;;3967:30:1;;3964:50;;;4010:1;4007;4000:12;3964:50;4049:70;4111:7;4102:6;4091:9;4087:22;4049:70;:::i;:::-;4138:8;;4023:96;;-1:-1:-1;3742:437:1;-1:-1:-1;;;;3742:437:1:o;4184:349::-;4268:12;;-1:-1:-1;;;;;4264:38:1;4252:51;;4356:4;4345:16;;;4339:23;-1:-1:-1;;;;;4335:48:1;4319:14;;;4312:72;4372:2;4436:16;;;4430:23;4423:31;4416:39;4400:14;;;4393:63;4509:4;4498:16;;;4492:23;4517:8;4488:38;4472:14;;4465:62;4184:349::o;4538:720::-;4769:2;4821:21;;;4891:13;;4794:18;;;4913:22;;;4740:4;;4769:2;4992:15;;;;4966:2;4951:18;;;4740:4;5035:197;5049:6;5046:1;5043:13;5035:197;;;5098:52;5146:3;5137:6;5131:13;5098:52;:::i;:::-;5207:15;;;;5179:4;5170:14;;;;;5071:1;5064:9;5035:197;;5263:171;5330:20;;-1:-1:-1;;;;;5379:30:1;;5369:41;;5359:69;;5424:1;5421;5414:12;5439:184;5497:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:52;;;5566:1;5563;5556:12;5518:52;5589:28;5607:9;5589:28;:::i;5628:186::-;5687:6;5740:2;5728:9;5719:7;5715:23;5711:32;5708:52;;;5756:1;5753;5746:12;5708:52;5779:29;5798:9;5779:29;:::i;5819:171::-;5886:20;;-1:-1:-1;;;;;5935:30:1;;5925:41;;5915:69;;5980:1;5977;5970:12;5995:161;6062:20;;6122:8;6111:20;;6101:31;;6091:59;;6146:1;6143;6136:12;6161:612;6269:6;6277;6285;6293;6301;6309;6317;6370:3;6358:9;6349:7;6345:23;6341:33;6338:53;;;6387:1;6384;6377:12;6338:53;6423:9;6410:23;6400:33;;6452:37;6485:2;6474:9;6470:18;6452:37;:::i;:::-;6442:47;;6508:37;6541:2;6530:9;6526:18;6508:37;:::i;:::-;6498:47;;6592:2;6581:9;6577:18;6564:32;6554:42;;6615:38;6648:3;6637:9;6633:19;6615:38;:::i;:::-;6605:48;;6672:38;6705:3;6694:9;6690:19;6672:38;:::i;:::-;6662:48;;6729:38;6762:3;6751:9;6747:19;6729:38;:::i;:::-;6719:48;;6161:612;;;;;;;;;;:::o;6778:632::-;6949:2;7001:21;;;7071:13;;6974:18;;;7093:22;;;6920:4;;6949:2;7172:15;;;;7146:2;7131:18;;;6920:4;7215:169;7229:6;7226:1;7223:13;7215:169;;;7290:13;;7278:26;;7359:15;;;;7324:12;;;;7251:1;7244:9;7215:169;;7415:651;7534:6;7542;7595:2;7583:9;7574:7;7570:23;7566:32;7563:52;;;7611:1;7608;7601:12;7563:52;7638:23;;-1:-1:-1;;;;;7710:14:1;;;7707:34;;;7737:1;7734;7727:12;7707:34;7775:6;7764:9;7760:22;7750:32;;7820:7;7813:4;7809:2;7805:13;7801:27;7791:55;;7842:1;7839;7832:12;7791:55;7882:2;7869:16;7908:2;7900:6;7897:14;7894:34;;;7924:1;7921;7914:12;7894:34;7980:7;7975:2;7967:4;7959:6;7955:17;7951:2;7947:26;7943:35;7940:48;7937:68;;;8001:1;7998;7991:12;7937:68;8032:2;8024:11;;;;;8054:6;;-1:-1:-1;7415:651:1;;-1:-1:-1;;;;7415:651:1:o;8071:322::-;8148:6;8156;8164;8217:2;8205:9;8196:7;8192:23;8188:32;8185:52;;;8233:1;8230;8223:12;8185:52;8256:29;8275:9;8256:29;:::i;:::-;8246:39;8332:2;8317:18;;8304:32;;-1:-1:-1;8383:2:1;8368:18;;;8355:32;;8071:322;-1:-1:-1;;;8071:322:1:o;8398:347::-;8463:6;8471;8524:2;8512:9;8503:7;8499:23;8495:32;8492:52;;;8540:1;8537;8530:12;8492:52;8563:29;8582:9;8563:29;:::i;:::-;8553:39;;8642:2;8631:9;8627:18;8614:32;8689:5;8682:13;8675:21;8668:5;8665:32;8655:60;;8711:1;8708;8701:12;8655:60;8734:5;8724:15;;;8398:347;;;;;:::o;9687:258::-;9754:6;9762;9815:2;9803:9;9794:7;9790:23;9786:32;9783:52;;;9831:1;9828;9821:12;9783:52;9854:28;9872:9;9854:28;:::i;:::-;9844:38;;9901;9935:2;9924:9;9920:18;9901:38;:::i;:::-;9891:48;;9687:258;;;;;:::o;9950:127::-;10011:10;10006:3;10002:20;9999:1;9992:31;10042:4;10039:1;10032:15;10066:4;10063:1;10056:15;10082:1138;10177:6;10185;10193;10201;10254:3;10242:9;10233:7;10229:23;10225:33;10222:53;;;10271:1;10268;10261:12;10222:53;10294:29;10313:9;10294:29;:::i;:::-;10284:39;;10342:38;10376:2;10365:9;10361:18;10342:38;:::i;:::-;10332:48;-1:-1:-1;10427:2:1;10412:18;;10399:32;;-1:-1:-1;10482:2:1;10467:18;;10454:32;-1:-1:-1;;;;;10535:14:1;;;10532:34;;;10562:1;10559;10552:12;10532:34;10600:6;10589:9;10585:22;10575:32;;10645:7;10638:4;10634:2;10630:13;10626:27;10616:55;;10667:1;10664;10657:12;10616:55;10703:2;10690:16;10725:2;10721;10718:10;10715:36;;;10731:18;;:::i;:::-;10806:2;10800:9;10774:2;10860:13;;-1:-1:-1;;10856:22:1;;;10880:2;10852:31;10848:40;10836:53;;;10904:18;;;10924:22;;;10901:46;10898:72;;;10950:18;;:::i;:::-;10990:10;10986:2;10979:22;11025:2;11017:6;11010:18;11065:7;11060:2;11055;11051;11047:11;11043:20;11040:33;11037:53;;;11086:1;11083;11076:12;11037:53;11142:2;11137;11133;11129:11;11124:2;11116:6;11112:15;11099:46;11187:1;11182:2;11177;11169:6;11165:15;11161:24;11154:35;11208:6;11198:16;;;;;;;10082:1138;;;;;;;:::o;11225:264::-;11419:3;11404:19;;11432:51;11408:9;11465:6;11432:51;:::i;11494:260::-;11562:6;11570;11623:2;11611:9;11602:7;11598:23;11594:32;11591:52;;;11639:1;11636;11629:12;11591:52;11662:29;11681:9;11662:29;:::i;11759:380::-;11838:1;11834:12;;;;11881;;;11902:61;;11956:4;11948:6;11944:17;11934:27;;11902:61;12009:2;12001:6;11998:14;11978:18;11975:38;11972:161;;12055:10;12050:3;12046:20;12043:1;12036:31;12090:4;12087:1;12080:15;12118:4;12115:1;12108:15;11972:161;;11759:380;;;:::o;12354:127::-;12415:10;12410:3;12406:20;12403:1;12396:31;12446:4;12443:1;12436:15;12470:4;12467:1;12460:15;12486:127;12547:10;12542:3;12538:20;12535:1;12528:31;12578:4;12575:1;12568:15;12602:4;12599:1;12592:15;12618:135;12657:3;12678:17;;;12675:43;;12698:18;;:::i;:::-;-1:-1:-1;12745:1:1;12734:13;;12618:135::o;12758:125::-;12798:4;12826:1;12823;12820:8;12817:34;;;12831:18;;:::i;:::-;-1:-1:-1;12868:9:1;;12758:125::o;12888:709::-;13193:25;;;-1:-1:-1;;;;;13254:31:1;;;;13249:2;13234:18;;13227:59;13334:10;13322:23;;;;13317:2;13302:18;;13295:51;13377:2;13362:18;;13355:34;;;;13438:8;13426:21;13420:3;13405:19;;13398:50;-1:-1:-1;;;;;13522:15:1;;;13516:3;13501:19;;13494:44;13575:15;13569:3;13554:19;;13547:44;13180:3;13165:19;;12888:709::o;13602:127::-;13663:10;13658:3;13654:20;13651:1;13644:31;13694:4;13691:1;13684:15;13718:4;13715:1;13708:15;13734:184;13792:6;13845:2;13833:9;13824:7;13820:23;13816:32;13813:52;;;13861:1;13858;13851:12;13813:52;13884:28;13902:9;13884:28;:::i;13923:184::-;13981:6;14034:2;14022:9;14013:7;14009:23;14005:32;14002:52;;;14050:1;14047;14040:12;14002:52;14073:28;14091:9;14073:28;:::i;14112:184::-;14170:6;14223:2;14211:9;14202:7;14198:23;14194:32;14191:52;;;14239:1;14236;14229:12;14191:52;14262:28;14280:9;14262:28;:::i;14642:128::-;14682:3;14713:1;14709:6;14706:1;14703:13;14700:39;;;14719:18;;:::i;:::-;-1:-1:-1;14755:9:1;;14642:128::o;14775:168::-;14815:7;14881:1;14877;14873:6;14869:14;14866:1;14863:21;14858:1;14851:9;14844:17;14840:45;14837:71;;;14888:18;;:::i;:::-;-1:-1:-1;14928:9:1;;14775:168::o;15074:1558::-;15298:3;15336:6;15330:13;15362:4;15375:51;15419:6;15414:3;15409:2;15401:6;15397:15;15375:51;:::i;:::-;15489:13;;15448:16;;;;15511:55;15489:13;15448:16;15533:15;;;15511:55;:::i;:::-;15655:13;;15588:20;;;15628:1;;15715;15737:18;;;;15790;;;;15817:93;;15895:4;15885:8;15881:19;15869:31;;15817:93;15958:2;15948:8;15945:16;15925:18;15922:40;15919:167;;-1:-1:-1;;;15985:33:1;;16041:4;16038:1;16031:15;16071:4;15992:3;16059:17;15919:167;16102:18;16129:141;;;;16284:1;16279:328;;;;16095:512;;16129:141;-1:-1:-1;;16164:24:1;;16150:39;;16241:16;;16234:24;16220:39;;16209:51;;;-1:-1:-1;16129:141:1;;16279:328;15021:1;15014:14;;;15058:4;15045:18;;16374:1;16388:169;16402:8;16399:1;16396:15;16388:169;;;16484:14;;16469:13;;;16462:37;16527:16;;;;16419:10;;16388:169;;;16392:3;;16588:8;16581:5;16577:20;16570:27;;16095:512;-1:-1:-1;16623:3:1;;15074:1558;-1:-1:-1;;;;;;;;;;;15074:1558:1:o;17404:270::-;17443:7;-1:-1:-1;;;;;17513:10:1;;;17543;;;17576:11;;17569:19;17598:12;;;17590:21;;17565:47;17562:73;;;17615:18;;:::i;:::-;17655:13;;17404:270;-1:-1:-1;;;;17404:270:1:o;17679:228::-;17718:3;17746:10;17783:2;17780:1;17776:10;17813:2;17810:1;17806:10;17844:3;17840:2;17836:12;17831:3;17828:21;17825:47;;;17852:18;;:::i;:::-;17888:13;;17679:228;-1:-1:-1;;;;17679:228:1:o;18138:217::-;18178:1;18204;18194:132;;18248:10;18243:3;18239:20;18236:1;18229:31;18283:4;18280:1;18273:15;18311:4;18308:1;18301:15;18194:132;-1:-1:-1;18340:9:1;;18138:217::o;18721:489::-;-1:-1:-1;;;;;18990:15:1;;;18972:34;;19042:15;;19037:2;19022:18;;19015:43;19089:2;19074:18;;19067:34;;;19137:3;19132:2;19117:18;;19110:31;;;18915:4;;19158:46;;19184:19;;19176:6;19158:46;:::i;:::-;19150:54;18721:489;-1:-1:-1;;;;;;18721:489:1:o;19215:249::-;19284:6;19337:2;19325:9;19316:7;19312:23;19308:32;19305:52;;;19353:1;19350;19343:12;19305:52;19385:9;19379:16;19404:30;19428:5;19404:30;:::i

Swarm Source

ipfs://0dce03c9a4f10303d9fa88b16d3b27005a50e991156ac00488e89367101a48e1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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