ETH Price: $3,451.53 (+1.55%)

Token

Tekomon (TEKOMON)
 

Overview

Max Total Supply

3,293 TEKOMON

Holders

237

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 TEKOMON
0x271824a5d9edd3a1d2a039f2c3eec50f8d213815
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:
Tekomon

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion
File 1 of 3 : Tekomon.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/*

1st on-chain Pocket Monster Game. @TekoMonERC 
1st scaled ERC20721 collection & game.
1st mover on the ERC20721t standard, learn more at TekoMon.io/about

3,000 total supply
Stealth Launch

Welcome to TekoMon!
$TEKOMON + $wTEKOMON
TekoMon.io 

Your legendary journey awaits.

*/

import {ERC20721T} from "./ERC20721T.sol";

error Paused();
error Restricted();
error IncorrectAmountOfEther();
error TooFewTokensRemaining();
error WalletMaximumReached();
error SaleInactive();

contract Tekomon is ERC20721T {
    uint256 public price = 0.05 ether;
    uint256 public walletCap = 100;
    bool public saleActive = true;
    bool public paused;
    string baseURI =
        "https://nftstorage.link/ipfs/bafkreictkp324gwa2rjht4afojdtdrtrq2fufyuqciigbi7n2xrj5ofiqu/?"; // pre-reveal
    mapping(address => uint8) public admin;

    constructor() ERC20721T("Tekomon", "TEKOMON") {
        admin[msg.sender] = 1;
    }

    // RESTRICTED //

    modifier restricted() {
        if (admin[msg.sender] != 1) revert Restricted();
        _;
    }

    modifier whenNotPaused() {
        if (paused) revert Paused();
        _;
    }

    function setPrice(uint256 _price) external restricted {
        price = _price;
    }

    function setWalletCap(uint256 _walletCap) external restricted {
        walletCap = _walletCap;
    }

    function setSaleActive(bool active) external restricted {
        saleActive = active;
    }

    function setPaused(bool _paused) external restricted {
        paused = _paused;
    }

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

    function setAdmin(address account, bool privileged) external restricted {
        admin[account] = privileged ? 1 : 0;
    }

    function setWrapper(address _contract) external restricted {
        _setWrapper(_contract);
    }

    function reserve(uint256 amount, address recipient) external restricted {
        _safeMint(recipient, amount);
    }

    function withdraw() external restricted {
        payable(msg.sender).transfer(address(this).balance);
    }

    // EXTERNAL //

    function mint(uint256 quantity) external payable whenNotPaused {
        if (!saleActive) revert SaleInactive();
        if (quantity + _numberMinted(msg.sender) > walletCap)
            revert WalletMaximumReached();
        if (_totalMinted() + quantity > _maxSupply())
            revert TooFewTokensRemaining();
        if (msg.value != price * quantity) revert IncorrectAmountOfEther();
        _safeMint(msg.sender, quantity);
    }

    function burn(uint256 tokenId) external whenNotPaused {
        _burn(tokenId, true);
    }

    function exists(uint256 tokenId) external view returns (bool) {
        return _exists(tokenId);
    }

    // INTERNAL //

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

    function _maxSupply() internal pure override returns (uint256) {
        return 3000;
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal override whenNotPaused {
        super._beforeTokenTransfers(from, to, startTokenId, quantity);
    }
}

File 2 of 3 : ERC20721T.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./IERC20721T.sol";

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC20721T is IERC20721T {
    struct TokenApprovalRef {
        address value;
    }

    struct UserApprovalRef {
        mapping(address => uint256) allowance;
        mapping(address => bool) approved;
    }

    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;
    uint256 private constant _BITPOS_AUX = 192;
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;
    uint256 private constant _BITMASK_BURNED = 1 << 224;
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
    uint256 private constant _BITPOS_EXTRA_DATA = 232;
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
    bytes32 private constant _ERC721_TRANSFER_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
    bytes32 private constant _ERC20_TRANSFER_SIGNATURE =
        keccak256(bytes("Transfer(address,address,uint256)"));
    bytes32 private constant _ERC20_APPROVAL_SIGNATURE =
        keccak256(bytes("Approval(address,address,uint256)"));

    address private _wrapper;
    uint256 private _currentIndex;
    uint256 private _burnCounter;
    uint256 public decimals;
    string private _name;
    string private _symbol;
    mapping(uint256 => uint256) private _packedOwnerships;
    mapping(address => uint256) private _packedAddressData;
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
    mapping(address => UserApprovalRef) private _userApprovals;

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

    function _maxSupply() internal view virtual returns (uint256) {
        return 1000;
    }

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

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function wrapper() public view virtual returns (address) {
        return _wrapper;
    }

    function totalSupply() public view virtual returns (uint256) {
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    function _totalMinted() internal view virtual returns (uint256) {
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector);
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256) {
        return _userApprovals[owner].allowance[spender];
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return
            (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) &
            _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return
            (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) &
            _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly {
            auxCasted := aux
        }
        packed =
            (packed & _BITMASK_AUX_COMPLEMENT) |
            (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    function _setWrapper(address w) internal virtual {
        _wrapper = w;
    }

    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    function name() public view virtual returns (string memory) {
        return _name;
    }

    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    function tokenURI(
        uint256 tokenId
    ) public view virtual returns (string memory) {
        if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector);

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

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

    function ownerOf(uint256 tokenId) public view virtual returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(
        uint256 tokenId
    ) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(
        uint256 index
    ) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _ownershipIsInitialized(
        uint256 index
    ) internal view virtual returns (bool) {
        return _packedOwnerships[index] != 0;
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(
        uint256 tokenId
    ) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    if (packed & _BITMASK_BURNED == 0) {
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        _revert(OwnerQueryForNonexistentToken.selector);
    }

    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);
    }

    function _packOwnershipData(
        address owner,
        uint256 flags
    ) private view returns (uint256 result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            result := or(
                owner,
                or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)
            )
        }
    }

    function _nextInitializedFlag(
        uint256 quantity
    ) private pure returns (uint256 result) {
        assembly {
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    function approve(
        address _spender,
        uint256 quantityOrTokenId
    ) external returns (bool) {
        uint256 max = _maxSupply() + 1;
        if (quantityOrTokenId > max && quantityOrTokenId <= max * 2) {
            _approveERC721(_spender, quantityOrTokenId);
        } else {
            _approveERC20(msg.sender, _spender, quantityOrTokenId);
        }
        return true;
    }

    function _approveERC721(address to, uint256 tokenId) internal virtual {
        address owner = ownerOf(tokenId);

        if (_msgSender() != owner)
            if (!isApprovedForAll(owner, _msgSender())) {
                _revert(ApprovalCallerNotOwnerNorApproved.selector);
            }

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

    function _approveERC20(
        address _owner,
        address _spender,
        uint256 _tokens
    ) internal {
        _userApprovals[_owner].allowance[_spender] = _tokens;
        emit ERC20Approval(
            _ERC20_APPROVAL_SIGNATURE,
            _owner,
            _spender,
            _tokens
        );
    }

    function getApproved(
        uint256 tokenId
    ) public view virtual returns (address) {
        if (!_exists(tokenId))
            _revert(ApprovalQueryForNonexistentToken.selector);

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        _userApprovals[_msgSender()].approved[operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(
        address owner,
        address operator
    ) public view virtual returns (bool) {
        return _userApprovals[owner].approved[operator] || _wrapper == operator;
    }

    function tokensOfOwner(
        address owner
    ) public view returns (uint256[] memory) {
        uint256 start = _startTokenId();
        uint256 stop = _nextTokenId();
        uint256[] memory tokenIds;
        if (start != stop) tokenIds = _tokensOfOwnerIn(owner, start, stop);
        return tokenIds;
    }

    function _tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) private view returns (uint256[] memory) {
        unchecked {
            if (start >= stop) _revert(InvalidQueryRange.selector);
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            uint256 stopLimit = _nextTokenId();
            if (stop >= stopLimit) {
                stop = stopLimit;
            }
            uint256[] memory tokenIds;
            uint256 tokenIdsMaxLength = balanceOf(owner);
            bool startLtStop = start < stop;
            assembly {
                tokenIdsMaxLength := mul(tokenIdsMaxLength, startLtStop)
            }
            if (tokenIdsMaxLength != 0) {
                if (stop - start <= tokenIdsMaxLength) {
                    tokenIdsMaxLength = stop - start;
                }
                assembly {
                    tokenIds := mload(0x40)
                    mstore(
                        0x40,
                        add(tokenIds, shl(5, add(tokenIdsMaxLength, 1)))
                    )
                }

                TokenOwnership memory ownership = _explicitOwnershipOf(start);
                address currOwnershipAddr;

                if (!ownership.burned) {
                    currOwnershipAddr = ownership.addr;
                }
                uint256 tokenIdsIdx;
                do {
                    ownership = _ownershipAt(start);
                    assembly {
                        switch mload(add(ownership, 0x40))
                        case 0 {
                            if mload(ownership) {
                                currOwnershipAddr := mload(ownership)
                            }
                            if iszero(shl(96, xor(currOwnershipAddr, owner))) {
                                tokenIdsIdx := add(tokenIdsIdx, 1)
                                mstore(
                                    add(tokenIds, shl(5, tokenIdsIdx)),
                                    start
                                )
                            }
                        }
                        default {
                            currOwnershipAddr := 0
                        }
                        start := add(start, 1)
                    }
                } while (!(start == stop || tokenIdsIdx == tokenIdsMaxLength));
                assembly {
                    mstore(tokenIds, tokenIdsIdx)
                }
            }
            return tokenIds;
        }
    }

    function _explicitOwnershipOf(
        uint256 tokenId
    ) internal view virtual returns (TokenOwnership memory ownership) {
        unchecked {
            if (tokenId >= _startTokenId()) {
                if (tokenId < _nextTokenId()) {
                    // If the `tokenId` is within bounds,
                    // scan backwards for the initialized ownership slot.
                    while (!_ownershipIsInitialized(tokenId)) --tokenId;
                    return _ownershipAt(tokenId);
                }
            }
        }
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex &&
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0;
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) internal view virtual returns (bool result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(
        uint256 tokenId
    )
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    function transfer(
        address to,
        uint256 quantity
    ) public payable virtual returns (bool) {
        _transfer(msg.sender, to, quantity);
        return true;
    }

    function _transfer(address from, address to, uint256 quantity) internal {
        uint256[] memory tokens = tokensOfOwner(from);

        if (tokens.length < quantity) _revert(InsufficientBalance.selector);

        batchTransfer(
            from,
            to,
            tokens.length > quantity
                ? _getLimitedArray(tokens, quantity)
                : tokens
        );
    }

    function transferFrom(
        address from,
        address to,
        uint256 quantityOrTokenId
    ) public payable virtual returns (bool) {
        uint256 max = _maxSupply();
        if (quantityOrTokenId <= max) {
            _transfer(from, to, quantityOrTokenId);
        } else if (quantityOrTokenId <= max * 2) {
            _transferFrom(from, to, quantityOrTokenId);
            emit ERC20Transfer(_ERC20_TRANSFER_SIGNATURE, from, to, 1);
        } else {
            return false;
        }

        return true;
    }

    function _transferFrom(address from, address to, uint256 tokenId) internal {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from)
            _revert(TransferFromIncorrectOwner.selector);

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

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSender()))
            if (!isApprovedForAll(from, _msgSender()))
                if (_userApprovals[from].allowance[msg.sender] < 1)
                    _revert(TransferCallerNotOwnerNorApproved.selector);

        if (to == address(0)) _revert(TransferToZeroAddress.selector);

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {
            --_packedAddressData[from];
            ++_packedAddressData[to];

            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED |
                    _nextExtraData(from, to, prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                if (_packedOwnerships[nextTokenId] == 0) {
                    if (nextTokenId != _currentIndex) {
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        if (_userApprovals[from].allowance[msg.sender] > 0) {
            _userApprovals[from].allowance[msg.sender]--;
        }

        if (from == _wrapper) {
            emit Locked(tokenId);
            emit MetadataUpdate(tokenId);
        } else if (to == _wrapper) {
            emit Unlocked(tokenId);
            emit MetadataUpdate(tokenId);
        }

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

    function batchTransfer(
        address from,
        address to,
        uint256[] memory tokenIds
    ) public {
        emit ERC20Transfer(
            _ERC20_TRANSFER_SIGNATURE,
            from,
            to,
            tokenIds.length
        );
        for (uint256 i; i < tokenIds.length; i++) {
            _transferFrom(from, to, tokenIds[i]);
        }
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual {
        emit ERC20Transfer(_ERC20_TRANSFER_SIGNATURE, from, to, 1);
        _transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                _revert(TransferToNonERC721ReceiverImplementer.selector);
            }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try
            IERC721Receiver(to).onERC721Received(
                _msgSender(),
                from,
                tokenId,
                _data
            )
        returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                _revert(TransferToNonERC721ReceiverImplementer.selector);
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) _revert(MintZeroQuantity.selector);

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

        unchecked {
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) |
                    _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            assembly {
                toMasked := and(to, _BITMASK_ADDRESS)
                log4(
                    0,
                    0,
                    _ERC721_TRANSFER_SIGNATURE,
                    0,
                    toMasked,
                    startTokenId
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    log4(0, 0, _ERC721_TRANSFER_SIGNATURE, 0, toMasked, tokenId)
                }
            }

            emit ERC20Transfer(
                _ERC20_TRANSFER_SIGNATURE,
                address(0),
                to,
                quantity
            );

            if (toMasked == 0) _revert(MintToZeroAddress.selector);

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

    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) _revert(MintToZeroAddress.selector);
        if (quantity == 0) _revert(MintZeroQuantity.selector);
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT)
            _revert(MintERC2309QuantityExceedsLimit.selector);

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

        unchecked {
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 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);
    }

    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.selector
                        );
                    }
                } while (index < end);
                if (_currentIndex != end) revert();
            }
        }
    }

    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, "");
    }

    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    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) {
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSender()))
                if (!isApprovedForAll(from, _msgSender()))
                    _revert(TransferCallerNotOwnerNorApproved.selector);
        }

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

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) |
                    _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                if (_packedOwnerships[nextTokenId] == 0) {
                    if (nextTokenId != _currentIndex) {
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        unchecked {
            _burnCounter++;
        }
    }

    function _getLimitedArray(
        uint256[] memory originalArray,
        uint256 length
    ) internal pure returns (uint256[] memory) {
        if (length > originalArray.length)
            _revert(InvalidArrayOperation.selector);
        uint256[] memory limitedArray = new uint256[](length);
        for (uint256 i = 0; i < length; i++) {
            limitedArray[i] = originalArray[i];
        }
        return limitedArray;
    }

    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector);
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed =
            (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) |
            (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    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;
    }

    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _toString(
        uint256 value
    ) internal pure virtual returns (string memory str) {
        assembly {
            let m := add(mload(0x40), 0xa0)
            mstore(0x40, m)
            str := sub(m, 0x20)
            mstore(str, 0)

            let end := str

            for {
                let temp := value
            } 1 {

            } {
                str := sub(str, 1)
                mstore8(str, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) {
                    break
                }
            }

            let length := sub(end, str)
            str := sub(str, 0x20)
            mstore(str, length)
        }
    }

    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}

contract ERC20721TWrapper is IERC20721TWrapper {
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    IERC20721T public immutable base;

    constructor(
        string memory name_,
        string memory symbol_,
        address _baseContract
    ) {
        _name = name_;
        _symbol = symbol_;
        base = IERC20721T(_baseContract);
    }

    function wrappedTokenPool() public view returns (uint256[] memory) {
        return base.tokensOfOwner(address(this));
    }

    function wrap(uint256 quantity) public payable virtual {
        uint256[] memory tokens = base.tokensOfOwner(msg.sender);
        if (tokens.length < quantity) _revert(InsufficientNFTBalance.selector);
        base.batchTransfer(
            msg.sender,
            address(this),
            _getLimitedArray(tokens, quantity)
        );
        _mint(msg.sender, quantity * 10 ** decimals());
        emit Wrap(msg.sender, quantity);
    }

    function wrap(uint256[] calldata tokenIds) public payable virtual {
        base.batchTransfer(msg.sender, address(this), tokenIds);
        _mint(msg.sender, tokenIds.length * 10 ** decimals());
        emit Wrap(msg.sender, tokenIds.length);
    }

    function unwrap(uint256 quantity) public payable virtual {
        base.transfer(msg.sender, quantity);
        _burn(msg.sender, quantity * 10 ** decimals());
        emit Unwrap(msg.sender, quantity);
    }

    function unwrap(uint256[] calldata tokenIds) public payable virtual {
        base.batchTransfer(address(this), msg.sender, tokenIds);
        _burn(msg.sender, tokenIds.length * 10 ** decimals());
        emit Unwrap(msg.sender, tokenIds.length);
    }

    function name() public view virtual returns (string memory) {
        return _name;
    }

    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    function allowance(
        address owner,
        address spender
    ) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(
        address spender,
        uint256 value
    ) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                _totalSupply -= value;
            }
        } else {
            unchecked {
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    function _approve(
        address owner,
        address spender,
        uint256 value,
        bool emitEvent
    ) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 value
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(
                    spender,
                    currentAllowance,
                    value
                );
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }

    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _getLimitedArray(
        uint256[] memory originalArray,
        uint256 length
    ) internal pure returns (uint256[] memory) {
        if (length > originalArray.length)
            _revert(InvalidArrayOperation.selector);
        uint256[] memory limitedArray = new uint256[](length);
        for (uint256 i = 0; i < length; i++) {
            limitedArray[i] = originalArray[i];
        }
        return limitedArray;
    }

    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}

File 3 of 3 : IERC20721T.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface IERC20721T {
    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
        bool burned;
        uint24 extraData;
    }

    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error BalanceQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerQueryForNonexistentToken();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error URIQueryForNonexistentToken();
    error MintERC2309QuantityExceedsLimit();
    error OwnershipNotInitializedForExtraData();
    error InvalidQueryRange();
    error InsufficientBalance();
    error InvalidArrayOperation();

    event ERC20Transfer(
        bytes32 indexed topic0,
        address indexed from,
        address indexed to,
        uint256 tokens
    ) anonymous;
    event ERC20Approval(
        bytes32 indexed topic0,
        address indexed owner,
        address indexed spender,
        uint256 tokens
    ) anonymous;
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );
    event ConsecutiveTransfer(
        uint256 indexed fromTokenId,
        uint256 toTokenId,
        address indexed from,
        address indexed to
    );
    event Locked(uint256 tokenId);
    event Unlocked(uint256 tokenId);
    event MetadataUpdate(uint256 _tokenId);

    function decimals() external view returns (uint256);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    function ownerOf(uint256 tokenId) external view returns (address);

    function approve(
        address _spender,
        uint256 quantityOrTokenId
    ) external returns (bool);

    function getApproved(uint256 tokenId) external view returns (address);

    function setApprovalForAll(address operator, bool approved) external;

    function isApprovedForAll(
        address owner,
        address operator
    ) external view returns (bool);

    function tokensOfOwner(
        address owner
    ) external view returns (uint256[] memory);

    function transfer(
        address to,
        uint256 quantity
    ) external payable returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 quantityOrTokenId
    ) external payable returns (bool);

    function batchTransfer(
        address from,
        address to,
        uint256[] memory tokenIds
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) external payable;

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC20721TWrapper {
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );
    error ERC20InvalidSender(address sender);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidSpender(address spender);
    error InvalidArrayOperation();
    error InsufficientNFTBalance();

    event Wrap(address account, uint256 quantity);
    event Unwrap(address account, uint256 quantity);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    function base() external view returns (IERC20721T);

    function wrappedTokenPool() external view returns (uint256[] memory);

    function wrap(uint256 quantity) external payable;

    function wrap(uint256[] calldata tokenIds) external payable;

    function unwrap(uint256 quantity) external payable;

    function unwrap(uint256[] calldata tokenIds) external payable;

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

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":"IncorrectAmountOfEther","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidArrayOperation","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"Restricted","type":"error"},{"inputs":[],"name":"SaleInactive","type":"error"},{"inputs":[],"name":"TooFewTokensRemaining","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":"WalletMaximumReached","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":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","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":"tokenId","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admin","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"quantityOrTokenId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reserve","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"privileged","type":"bool"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletCap","type":"uint256"}],"name":"setWalletCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","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":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantityOrTokenId","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"walletCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405266b1a2bc2ec50000600a556064600b556001600c60006101000a81548160ff0219169083151502179055506040518060800160405280605a815260200162004510605a9139600d908162000059919062000418565b503480156200006757600080fd5b506040518060400160405280600781526020017f54656b6f6d6f6e000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f54454b4f4d4f4e000000000000000000000000000000000000000000000000008152508160049081620000e5919062000418565b508060059081620000f7919062000418565b50620001086200016f60201b60201c565b60018190555050506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555062000569565b60006001620001836200019460201b60201c565b6200018f91906200052e565b905090565b6000610bb8905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022057607f821691505b602082108103620002365762000235620001d8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000261565b620002ac868362000261565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002f9620002f3620002ed84620002c4565b620002ce565b620002c4565b9050919050565b6000819050919050565b6200031583620002d8565b6200032d620003248262000300565b8484546200026e565b825550505050565b600090565b6200034462000335565b620003518184846200030a565b505050565b5b8181101562000379576200036d6000826200033a565b60018101905062000357565b5050565b601f821115620003c85762000392816200023c565b6200039d8462000251565b81016020851015620003ad578190505b620003c5620003bc8562000251565b83018262000356565b50505b505050565b600082821c905092915050565b6000620003ed60001984600802620003cd565b1980831691505092915050565b6000620004088383620003da565b9150826002028217905092915050565b62000423826200019e565b67ffffffffffffffff8111156200043f576200043e620001a9565b5b6200044b825462000207565b620004588282856200037d565b600060209050601f8311600181146200049057600084156200047b578287015190505b620004878582620003fa565b865550620004f7565b601f198416620004a0866200023c565b60005b82811015620004ca57848901518255600182019150602085019450602081019050620004a3565b86831015620004ea5784890151620004e6601f891682620003da565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200053b82620002c4565b91506200054883620002c4565b9250828201905080821115620005635762000562620004ff565b5b92915050565b613f9780620005796000396000f3fe60806040526004361061021a5760003560e01c80636352211e11610123578063a035b1fe116100ab578063b88d4fde1161006f578063b88d4fde146107d3578063c2167d93146107ef578063c87b56dd14610818578063dd62ed3e14610855578063e985e9c5146108925761021a565b8063a035b1fe14610708578063a0712d6814610733578063a22cb4651461074f578063a9059cbb14610778578063ac210cc7146107a85761021a565b806370a08231116100f257806370a0823114610611578063841718a61461064e5780638462151c1461067757806391b7f5ed146106b457806395d89b41146106dd5761021a565b80636352211e1461054357806363a846f81461058057806365a64668146105bd57806368428a1b146105e65761021a565b80633593cebc116101a65780634b0bddd2116101755780634b0bddd21461045e5780634f558e791461048757806355f804b3146104c457806358950c22146104ed5780635c975abb146105185761021a565b80633593cebc146103d95780633ccfd60b1461040257806342842e0e1461041957806342966c68146104355761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806316c38b3c1461032a57806318160ddd1461035357806323b872dd1461037e578063313ce567146103ae5761021a565b806301ffc9a71461021f57806303339bcb1461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906130b8565b6108cf565b6040516102539190613100565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906131af565b610961565b005b34801561029157600080fd5b5061029a6109f8565b6040516102a7919061327f565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906132a1565b610a8a565b6040516102e491906132dd565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f91906132f8565b610ae8565b6040516103219190613100565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613364565b610b47565b005b34801561035f57600080fd5b50610368610bed565b60405161037591906133a0565b60405180910390f35b610398600480360381019061039391906133bb565b610c04565b6040516103a59190613100565b60405180910390f35b3480156103ba57600080fd5b506103c3610cc8565b6040516103d091906133a0565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613556565b610cce565b005b34801561040e57600080fd5b50610417610d77565b005b610433600480360381019061042e91906133bb565b610e49565b005b34801561044157600080fd5b5061045c600480360381019061045791906132a1565b610e69565b005b34801561046a57600080fd5b50610485600480360381019061048091906135c5565b610ebe565b005b34801561049357600080fd5b506104ae60048036038101906104a991906132a1565b610fb1565b6040516104bb9190613100565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906136ba565b610fc3565b005b3480156104f957600080fd5b5061050261105f565b60405161050f91906133a0565b60405180910390f35b34801561052457600080fd5b5061052d611065565b60405161053a9190613100565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906132a1565b611078565b60405161057791906132dd565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613703565b61108a565b6040516105b4919061374c565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906132a1565b6110aa565b005b3480156105f257600080fd5b506105fb61113d565b6040516106089190613100565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613703565b611150565b60405161064591906133a0565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190613364565b6111e7565b005b34801561068357600080fd5b5061069e60048036038101906106999190613703565b61128d565b6040516106ab9190613825565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d691906132a1565b6112c9565b005b3480156106e957600080fd5b506106f261135c565b6040516106ff919061327f565b60405180910390f35b34801561071457600080fd5b5061071d6113ee565b60405161072a91906133a0565b60405180910390f35b61074d600480360381019061074891906132a1565b6113f4565b005b34801561075b57600080fd5b50610776600480360381019061077191906135c5565b611576565b005b610792600480360381019061078d91906132f8565b611684565b60405161079f9190613100565b60405180910390f35b3480156107b457600080fd5b506107bd61169b565b6040516107ca91906132dd565b60405180910390f35b6107ed60048036038101906107e891906138e8565b6116c4565b005b3480156107fb57600080fd5b5061081660048036038101906108119190613703565b61177b565b005b34801561082457600080fd5b5061083f600480360381019061083a91906132a1565b611810565b60405161084c919061327f565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061396b565b61188d565b60405161088991906133a0565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061396b565b611917565b6040516108c69190613100565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16146109ea576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f48183611a04565b5050565b606060048054610a07906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054610a33906139da565b8015610a805780601f10610a5557610100808354040283529160200191610a80565b820191906000526020600020905b815481529060010190602001808311610a6357829003601f168201915b5050505050905090565b6000610a9582611a22565b610aaa57610aa963cf4700e460e01b611a81565b5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806001610af5611a8b565b610aff9190613a3a565b90508083118015610b1c5750600281610b189190613a6e565b8311155b15610b3057610b2b8484611a95565b610b3c565b610b3b338585611bb8565b5b600191505092915050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610bd0576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610bf7611ca5565b6002546001540303905090565b600080610c0f611a8b565b9050808311610c2857610c23858585611cc0565b610cbb565b600281610c359190613a6e565b8311610cb057610c46858585611d10565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001206001604051610ca39190613af5565b60405180910390a3610cba565b6000915050610cc1565b5b60019150505b9392505050565b60035481565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001208351604051610d2b91906133a0565b60405180910390a360005b8151811015610d7157610d648484848481518110610d5757610d56613b10565b5b6020026020010151611d10565b8080600101915050610d36565b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610e00576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e46573d6000803e3d6000fd5b50565b610e64838383604051806020016040528060008152506116c4565b505050565b600c60019054906101000a900460ff1615610eb0576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ebb8160016122ff565b50565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610f47576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610f53576000610f56565b60015b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b6000610fbc82611a22565b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161461104c576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d908161105b9190613ce1565b5050565b600b5481565b600c60019054906101000a900460ff1681565b600061108382612596565b9050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611133576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b8190555050565b600c60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361119657611195638f4eb60460e01b611a81565b5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611270576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606000611299611ca5565b905060006112a5612642565b905060608183146112be576112bb85848461264c565b90505b809350505050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611352576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a8190555050565b60606005805461136b906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054611397906139da565b80156113e45780601f106113b9576101008083540402835291602001916113e4565b820191906000526020600020905b8154815290600101906020018083116113c757829003601f168201915b5050505050905090565b600a5481565b600c60019054906101000a900460ff161561143b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c60009054906101000a900460ff16611481576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5461148d33612772565b826114989190613a3a565b11156114d0576040517f1a710ac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114d8611a8b565b816114e16127c9565b6114eb9190613a3a565b1115611523576040517f53ae7e1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a546115319190613a6e565b3414611569576040517feb4033ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115733382611a04565b50565b80600960006115836127dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116336127dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116789190613100565b60405180910390a35050565b6000611691338484611cc0565b6001905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012060016040516117219190613af5565b60405180910390a3611734848484611d10565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117755761175f848484846127e4565b6117745761177363d1a57ed660e01b611a81565b5b5b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611804576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180d81612923565b50565b606061181b82611a22565b6118305761182f63a14c4b5060e01b611a81565b5b600061183a612966565b9050600081510361185a5760405180602001604052806000815250611885565b80611864846129f8565b604051602001611875929190613def565b6040516020818303038152906040525b915050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119fc57508173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b611a1e828260405180602001604052806000815250612a48565b5050565b600081611a2d611ca5565b11158015611a3c575060015482105b8015611a7a575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b8060005260046000fd5b6000610bb8905090565b6000611aa082611078565b90508073ffffffffffffffffffffffffffffffffffffffff16611ac16127dc565b73ffffffffffffffffffffffffffffffffffffffff1614611b0357611aed81611ae86127dc565b611917565b611b0257611b0163cfb3b94260e01b611a81565b5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f20602191398051906020012083604051611c9891906133a0565b60405180910390a3505050565b60006001611cb1611a8b565b611cbb9190613a3a565b905090565b6000611ccb8461128d565b90508181511015611ce757611ce663f4d678b860e01b611a81565b5b611d0a848484845111611cfa5783611d05565b611d048486612ac5565b5b610cce565b50505050565b6000611d1b82612596565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d6157611d6063a114810060e01b611a81565b5b600080611d6d84612b8b565b91509150611d838187611d7e6127dc565b612bb2565b611e3757611d9886611d936127dc565b611917565b611e36576001600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611e3557611e346359c896be60e01b611a81565b5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e7c57611e7b63ea553b3460e01b611a81565b5b611e898686866001612bf6565b8015611e9457600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f6285611f3e888887612c4f565b7c020000000000000000000000000000000000000000000000000000000017612c77565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611fe85760006001850190506000600660008381526020019081526020016000205403611fe6576001548114611fe5578360066000838152602001908152602001600020819055505b5b505b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561210657600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061210090613e13565b91905055505b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036121cc577f032bc66be43dbccb7487781d168eb7bda224628a3b2c3388bdf69b532a3a16118460405161218891906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7846040516121bf91906133a0565b60405180910390a161228f565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361228e577ff27b6ce5b2f5e68ddb2fd95a8a909d4ecf1daaac270935fff052feacb24f18428460405161224e91906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78460405161228591906133a0565b60405180910390a15b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f78686866001612ca2565b505050505050565b600061230a83612596565b9050600081905060008061231d86612b8b565b9150915084156123655761233981846123346127dc565b612bb2565b6123645761234e836123496127dc565b611917565b612363576123626359c896be60e01b611a81565b5b5b5b612373836000886001612bf6565b801561237e57600082555b600160806001901b03600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612426836123e385600088612c4f565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612c77565b600660008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036124ac57600060018701905060006006600083815260200190815260200160002054036124aa5760015481146124a9578460066000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f416021913980519060200120600160405161250a9190613af5565b60405180910390a385600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461257c836000886001612ca2565b600260008154809291906001019190505550505050505050565b600080829050806125a5611ca5565b1161262b5760015481101561262a5760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612628575b6000810361261e5760066000836001900393508381526020019081526020016000205490506125f4565b809250505061263d565b505b5b61263b63df2d9b4260e01b611a81565b505b919050565b6000600154905090565b6060818310612666576126656332c1995a60e01b611a81565b5b61266e611ca5565b8310156126805761267d611ca5565b92505b600061268a612642565b9050808310612697578092505b606060006126a487611150565b9050600085871090508082029150600082146127645781878703116126c95786860391505b60405192506001820160051b830160405260006126e588612ca8565b9050600081604001516126fa57816000015190505b60005b6127068a612cfe565b925060408301516000811461271e5760009250612744565b83511561272a57835192505b8b831860601b612743576001820191508a8260051b8801525b5b5060018a019950888a148061275857508481145b156126fd578086525050505b829450505050509392505050565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006127d3611ca5565b60015403905090565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261280a6127dc565b8786866040518563ffffffff1660e01b815260040161282c9493929190613e91565b6020604051808303816000875af192505050801561286857506040513d601f19601f820116820180604052508101906128659190613ef2565b60015b6128ca573d8060008114612898576040519150601f19603f3d011682016040523d82523d6000602084013e61289d565b606091505b5060008151036128bc576128b763d1a57ed660e01b611a81565b6128c4565b805181602001fd5b5061291a565b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291b565b5b949350505050565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600d8054612975906139da565b80601f01602080910402602001604051908101604052809291908181526020018280546129a1906139da565b80156129ee5780601f106129c3576101008083540402835291602001916129ee565b820191906000526020600020905b8154815290600101906020018083116129d157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612a3357600184039350600a81066030018453600a8104905080612a11575b50828103602084039350808452505050919050565b612a528383612d29565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac05760006001549050600083820390505b612a9360008683806001019450866127e4565b612aa857612aa763d1a57ed660e01b611a81565b5b818110612a80578160015414612abd57600080fd5b50505b505050565b60608251821115612ae157612ae063b3a6a31060e01b611a81565b5b60008267ffffffffffffffff811115612afd57612afc613413565b5b604051908082528060200260200182016040528015612b2b5781602001602082028036833780820191505090505b50905060005b83811015612b8057848181518110612b4c57612b4b613b10565b5b6020026020010151828281518110612b6757612b66613b10565b5b6020026020010181815250508080600101915050612b31565b508091505092915050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600c60019054906101000a900460ff1615612c3d576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4984848484612f08565b50505050565b60008060e883901c905060e8612c66868684612f0e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612cb0612ffd565b612cb8611ca5565b8210612cf857612cc6612642565b821015612cf7575b612cd782612f17565b612ce75781600190039150612cce565b612cf082612cfe565b9050612cf9565b5b5b919050565b612d06612ffd565b612d226006600084815260200190815260200160002054612f37565b9050919050565b6000600154905060008203612d4957612d4863b562e8dd60e01b611a81565b5b612d566000848385612bf6565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612dcd83612dbe6000866000612c4f565b612dc785612fed565b17612c77565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612e6e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e33565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012086604051612ecc91906133a0565b60405180910390a360008203612eed57612eec632e07630060e01b611a81565b5b806001819055505050612f036000848385612ca2565b505050565b50505050565b60009392505050565b600080600660008481526020019081526020016000205414159050919050565b612f3f612ffd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61309581613060565b81146130a057600080fd5b50565b6000813590506130b28161308c565b92915050565b6000602082840312156130ce576130cd613056565b5b60006130dc848285016130a3565b91505092915050565b60008115159050919050565b6130fa816130e5565b82525050565b600060208201905061311560008301846130f1565b92915050565b6000819050919050565b61312e8161311b565b811461313957600080fd5b50565b60008135905061314b81613125565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061317c82613151565b9050919050565b61318c81613171565b811461319757600080fd5b50565b6000813590506131a981613183565b92915050565b600080604083850312156131c6576131c5613056565b5b60006131d48582860161313c565b92505060206131e58582860161319a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561322957808201518184015260208101905061320e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613251826131ef565b61325b81856131fa565b935061326b81856020860161320b565b61327481613235565b840191505092915050565b600060208201905081810360008301526132998184613246565b905092915050565b6000602082840312156132b7576132b6613056565b5b60006132c58482850161313c565b91505092915050565b6132d781613171565b82525050565b60006020820190506132f260008301846132ce565b92915050565b6000806040838503121561330f5761330e613056565b5b600061331d8582860161319a565b925050602061332e8582860161313c565b9150509250929050565b613341816130e5565b811461334c57600080fd5b50565b60008135905061335e81613338565b92915050565b60006020828403121561337a57613379613056565b5b60006133888482850161334f565b91505092915050565b61339a8161311b565b82525050565b60006020820190506133b56000830184613391565b92915050565b6000806000606084860312156133d4576133d3613056565b5b60006133e28682870161319a565b93505060206133f38682870161319a565b92505060406134048682870161313c565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344b82613235565b810181811067ffffffffffffffff8211171561346a57613469613413565b5b80604052505050565b600061347d61304c565b90506134898282613442565b919050565b600067ffffffffffffffff8211156134a9576134a8613413565b5b602082029050602081019050919050565b600080fd5b60006134d26134cd8461348e565b613473565b905080838252602082019050602084028301858111156134f5576134f46134ba565b5b835b8181101561351e578061350a888261313c565b8452602084019350506020810190506134f7565b5050509392505050565b600082601f83011261353d5761353c61340e565b5b813561354d8482602086016134bf565b91505092915050565b60008060006060848603121561356f5761356e613056565b5b600061357d8682870161319a565b935050602061358e8682870161319a565b925050604084013567ffffffffffffffff8111156135af576135ae61305b565b5b6135bb86828701613528565b9150509250925092565b600080604083850312156135dc576135db613056565b5b60006135ea8582860161319a565b92505060206135fb8582860161334f565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561362557613624613413565b5b61362e82613235565b9050602081019050919050565b82818337600083830152505050565b600061365d6136588461360a565b613473565b90508281526020810184848401111561367957613678613605565b5b61368484828561363b565b509392505050565b600082601f8301126136a1576136a061340e565b5b81356136b184826020860161364a565b91505092915050565b6000602082840312156136d0576136cf613056565b5b600082013567ffffffffffffffff8111156136ee576136ed61305b565b5b6136fa8482850161368c565b91505092915050565b60006020828403121561371957613718613056565b5b60006137278482850161319a565b91505092915050565b600060ff82169050919050565b61374681613730565b82525050565b6000602082019050613761600083018461373d565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61379c8161311b565b82525050565b60006137ae8383613793565b60208301905092915050565b6000602082019050919050565b60006137d282613767565b6137dc8185613772565b93506137e783613783565b8060005b838110156138185781516137ff88826137a2565b975061380a836137ba565b9250506001810190506137eb565b5085935050505092915050565b6000602082019050818103600083015261383f81846137c7565b905092915050565b600067ffffffffffffffff82111561386257613861613413565b5b61386b82613235565b9050602081019050919050565b600061388b61388684613847565b613473565b9050828152602081018484840111156138a7576138a6613605565b5b6138b284828561363b565b509392505050565b600082601f8301126138cf576138ce61340e565b5b81356138df848260208601613878565b91505092915050565b6000806000806080858703121561390257613901613056565b5b60006139108782880161319a565b94505060206139218782880161319a565b93505060406139328782880161313c565b925050606085013567ffffffffffffffff8111156139535761395261305b565b5b61395f878288016138ba565b91505092959194509250565b6000806040838503121561398257613981613056565b5b60006139908582860161319a565b92505060206139a18582860161319a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139f257607f821691505b602082108103613a0557613a046139ab565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a458261311b565b9150613a508361311b565b9250828201905080821115613a6857613a67613a0b565b5b92915050565b6000613a798261311b565b9150613a848361311b565b9250828202613a928161311b565b91508282048414831517613aa957613aa8613a0b565b5b5092915050565b6000819050919050565b6000819050919050565b6000613adf613ada613ad584613ab0565b613aba565b61311b565b9050919050565b613aef81613ac4565b82525050565b6000602082019050613b0a6000830184613ae6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ba17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b64565b613bab8683613b64565b95508019841693508086168417925050509392505050565b6000613bde613bd9613bd48461311b565b613aba565b61311b565b9050919050565b6000819050919050565b613bf883613bc3565b613c0c613c0482613be5565b848454613b71565b825550505050565b600090565b613c21613c14565b613c2c818484613bef565b505050565b5b81811015613c5057613c45600082613c19565b600181019050613c32565b5050565b601f821115613c9557613c6681613b3f565b613c6f84613b54565b81016020851015613c7e578190505b613c92613c8a85613b54565b830182613c31565b50505b505050565b600082821c905092915050565b6000613cb860001984600802613c9a565b1980831691505092915050565b6000613cd18383613ca7565b9150826002028217905092915050565b613cea826131ef565b67ffffffffffffffff811115613d0357613d02613413565b5b613d0d82546139da565b613d18828285613c54565b600060209050601f831160018114613d4b5760008415613d39578287015190505b613d438582613cc5565b865550613dab565b601f198416613d5986613b3f565b60005b82811015613d8157848901518255600182019150602085019450602081019050613d5c565b86831015613d9e5784890151613d9a601f891682613ca7565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000613dc9826131ef565b613dd38185613db3565b9350613de381856020860161320b565b80840191505092915050565b6000613dfb8285613dbe565b9150613e078284613dbe565b91508190509392505050565b6000613e1e8261311b565b915060008203613e3157613e30613a0b565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000613e6382613e3c565b613e6d8185613e47565b9350613e7d81856020860161320b565b613e8681613235565b840191505092915050565b6000608082019050613ea660008301876132ce565b613eb360208301866132ce565b613ec06040830185613391565b8181036060830152613ed28184613e58565b905095945050505050565b600081519050613eec8161308c565b92915050565b600060208284031215613f0857613f07613056565b5b6000613f1684828501613edd565b9150509291505056fe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a264697066735822122048e1d0c88e988f79a5ffdbaa436cbde1c278cba9d98fca6c375d93a828bd00ee64736f6c6343000818003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f6261666b72656963746b7033323467776132726a68743461666f6a6474647274727132667566797571636969676269376e3278726a356f666971752f3f

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80636352211e11610123578063a035b1fe116100ab578063b88d4fde1161006f578063b88d4fde146107d3578063c2167d93146107ef578063c87b56dd14610818578063dd62ed3e14610855578063e985e9c5146108925761021a565b8063a035b1fe14610708578063a0712d6814610733578063a22cb4651461074f578063a9059cbb14610778578063ac210cc7146107a85761021a565b806370a08231116100f257806370a0823114610611578063841718a61461064e5780638462151c1461067757806391b7f5ed146106b457806395d89b41146106dd5761021a565b80636352211e1461054357806363a846f81461058057806365a64668146105bd57806368428a1b146105e65761021a565b80633593cebc116101a65780634b0bddd2116101755780634b0bddd21461045e5780634f558e791461048757806355f804b3146104c457806358950c22146104ed5780635c975abb146105185761021a565b80633593cebc146103d95780633ccfd60b1461040257806342842e0e1461041957806342966c68146104355761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806316c38b3c1461032a57806318160ddd1461035357806323b872dd1461037e578063313ce567146103ae5761021a565b806301ffc9a71461021f57806303339bcb1461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906130b8565b6108cf565b6040516102539190613100565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906131af565b610961565b005b34801561029157600080fd5b5061029a6109f8565b6040516102a7919061327f565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906132a1565b610a8a565b6040516102e491906132dd565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f91906132f8565b610ae8565b6040516103219190613100565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613364565b610b47565b005b34801561035f57600080fd5b50610368610bed565b60405161037591906133a0565b60405180910390f35b610398600480360381019061039391906133bb565b610c04565b6040516103a59190613100565b60405180910390f35b3480156103ba57600080fd5b506103c3610cc8565b6040516103d091906133a0565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613556565b610cce565b005b34801561040e57600080fd5b50610417610d77565b005b610433600480360381019061042e91906133bb565b610e49565b005b34801561044157600080fd5b5061045c600480360381019061045791906132a1565b610e69565b005b34801561046a57600080fd5b50610485600480360381019061048091906135c5565b610ebe565b005b34801561049357600080fd5b506104ae60048036038101906104a991906132a1565b610fb1565b6040516104bb9190613100565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906136ba565b610fc3565b005b3480156104f957600080fd5b5061050261105f565b60405161050f91906133a0565b60405180910390f35b34801561052457600080fd5b5061052d611065565b60405161053a9190613100565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906132a1565b611078565b60405161057791906132dd565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613703565b61108a565b6040516105b4919061374c565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906132a1565b6110aa565b005b3480156105f257600080fd5b506105fb61113d565b6040516106089190613100565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613703565b611150565b60405161064591906133a0565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190613364565b6111e7565b005b34801561068357600080fd5b5061069e60048036038101906106999190613703565b61128d565b6040516106ab9190613825565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d691906132a1565b6112c9565b005b3480156106e957600080fd5b506106f261135c565b6040516106ff919061327f565b60405180910390f35b34801561071457600080fd5b5061071d6113ee565b60405161072a91906133a0565b60405180910390f35b61074d600480360381019061074891906132a1565b6113f4565b005b34801561075b57600080fd5b50610776600480360381019061077191906135c5565b611576565b005b610792600480360381019061078d91906132f8565b611684565b60405161079f9190613100565b60405180910390f35b3480156107b457600080fd5b506107bd61169b565b6040516107ca91906132dd565b60405180910390f35b6107ed60048036038101906107e891906138e8565b6116c4565b005b3480156107fb57600080fd5b5061081660048036038101906108119190613703565b61177b565b005b34801561082457600080fd5b5061083f600480360381019061083a91906132a1565b611810565b60405161084c919061327f565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061396b565b61188d565b60405161088991906133a0565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061396b565b611917565b6040516108c69190613100565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16146109ea576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f48183611a04565b5050565b606060048054610a07906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054610a33906139da565b8015610a805780601f10610a5557610100808354040283529160200191610a80565b820191906000526020600020905b815481529060010190602001808311610a6357829003601f168201915b5050505050905090565b6000610a9582611a22565b610aaa57610aa963cf4700e460e01b611a81565b5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806001610af5611a8b565b610aff9190613a3a565b90508083118015610b1c5750600281610b189190613a6e565b8311155b15610b3057610b2b8484611a95565b610b3c565b610b3b338585611bb8565b5b600191505092915050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610bd0576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610bf7611ca5565b6002546001540303905090565b600080610c0f611a8b565b9050808311610c2857610c23858585611cc0565b610cbb565b600281610c359190613a6e565b8311610cb057610c46858585611d10565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001206001604051610ca39190613af5565b60405180910390a3610cba565b6000915050610cc1565b5b60019150505b9392505050565b60035481565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001208351604051610d2b91906133a0565b60405180910390a360005b8151811015610d7157610d648484848481518110610d5757610d56613b10565b5b6020026020010151611d10565b8080600101915050610d36565b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610e00576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e46573d6000803e3d6000fd5b50565b610e64838383604051806020016040528060008152506116c4565b505050565b600c60019054906101000a900460ff1615610eb0576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ebb8160016122ff565b50565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610f47576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610f53576000610f56565b60015b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b6000610fbc82611a22565b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161461104c576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d908161105b9190613ce1565b5050565b600b5481565b600c60019054906101000a900460ff1681565b600061108382612596565b9050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611133576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b8190555050565b600c60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361119657611195638f4eb60460e01b611a81565b5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611270576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606000611299611ca5565b905060006112a5612642565b905060608183146112be576112bb85848461264c565b90505b809350505050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611352576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a8190555050565b60606005805461136b906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054611397906139da565b80156113e45780601f106113b9576101008083540402835291602001916113e4565b820191906000526020600020905b8154815290600101906020018083116113c757829003601f168201915b5050505050905090565b600a5481565b600c60019054906101000a900460ff161561143b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c60009054906101000a900460ff16611481576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5461148d33612772565b826114989190613a3a565b11156114d0576040517f1a710ac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114d8611a8b565b816114e16127c9565b6114eb9190613a3a565b1115611523576040517f53ae7e1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a546115319190613a6e565b3414611569576040517feb4033ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115733382611a04565b50565b80600960006115836127dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116336127dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116789190613100565b60405180910390a35050565b6000611691338484611cc0565b6001905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012060016040516117219190613af5565b60405180910390a3611734848484611d10565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117755761175f848484846127e4565b6117745761177363d1a57ed660e01b611a81565b5b5b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611804576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180d81612923565b50565b606061181b82611a22565b6118305761182f63a14c4b5060e01b611a81565b5b600061183a612966565b9050600081510361185a5760405180602001604052806000815250611885565b80611864846129f8565b604051602001611875929190613def565b6040516020818303038152906040525b915050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119fc57508173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b611a1e828260405180602001604052806000815250612a48565b5050565b600081611a2d611ca5565b11158015611a3c575060015482105b8015611a7a575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b8060005260046000fd5b6000610bb8905090565b6000611aa082611078565b90508073ffffffffffffffffffffffffffffffffffffffff16611ac16127dc565b73ffffffffffffffffffffffffffffffffffffffff1614611b0357611aed81611ae86127dc565b611917565b611b0257611b0163cfb3b94260e01b611a81565b5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f20602191398051906020012083604051611c9891906133a0565b60405180910390a3505050565b60006001611cb1611a8b565b611cbb9190613a3a565b905090565b6000611ccb8461128d565b90508181511015611ce757611ce663f4d678b860e01b611a81565b5b611d0a848484845111611cfa5783611d05565b611d048486612ac5565b5b610cce565b50505050565b6000611d1b82612596565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d6157611d6063a114810060e01b611a81565b5b600080611d6d84612b8b565b91509150611d838187611d7e6127dc565b612bb2565b611e3757611d9886611d936127dc565b611917565b611e36576001600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611e3557611e346359c896be60e01b611a81565b5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e7c57611e7b63ea553b3460e01b611a81565b5b611e898686866001612bf6565b8015611e9457600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f6285611f3e888887612c4f565b7c020000000000000000000000000000000000000000000000000000000017612c77565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611fe85760006001850190506000600660008381526020019081526020016000205403611fe6576001548114611fe5578360066000838152602001908152602001600020819055505b5b505b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561210657600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061210090613e13565b91905055505b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036121cc577f032bc66be43dbccb7487781d168eb7bda224628a3b2c3388bdf69b532a3a16118460405161218891906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7846040516121bf91906133a0565b60405180910390a161228f565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361228e577ff27b6ce5b2f5e68ddb2fd95a8a909d4ecf1daaac270935fff052feacb24f18428460405161224e91906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78460405161228591906133a0565b60405180910390a15b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f78686866001612ca2565b505050505050565b600061230a83612596565b9050600081905060008061231d86612b8b565b9150915084156123655761233981846123346127dc565b612bb2565b6123645761234e836123496127dc565b611917565b612363576123626359c896be60e01b611a81565b5b5b5b612373836000886001612bf6565b801561237e57600082555b600160806001901b03600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612426836123e385600088612c4f565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612c77565b600660008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036124ac57600060018701905060006006600083815260200190815260200160002054036124aa5760015481146124a9578460066000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f416021913980519060200120600160405161250a9190613af5565b60405180910390a385600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461257c836000886001612ca2565b600260008154809291906001019190505550505050505050565b600080829050806125a5611ca5565b1161262b5760015481101561262a5760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612628575b6000810361261e5760066000836001900393508381526020019081526020016000205490506125f4565b809250505061263d565b505b5b61263b63df2d9b4260e01b611a81565b505b919050565b6000600154905090565b6060818310612666576126656332c1995a60e01b611a81565b5b61266e611ca5565b8310156126805761267d611ca5565b92505b600061268a612642565b9050808310612697578092505b606060006126a487611150565b9050600085871090508082029150600082146127645781878703116126c95786860391505b60405192506001820160051b830160405260006126e588612ca8565b9050600081604001516126fa57816000015190505b60005b6127068a612cfe565b925060408301516000811461271e5760009250612744565b83511561272a57835192505b8b831860601b612743576001820191508a8260051b8801525b5b5060018a019950888a148061275857508481145b156126fd578086525050505b829450505050509392505050565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006127d3611ca5565b60015403905090565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261280a6127dc565b8786866040518563ffffffff1660e01b815260040161282c9493929190613e91565b6020604051808303816000875af192505050801561286857506040513d601f19601f820116820180604052508101906128659190613ef2565b60015b6128ca573d8060008114612898576040519150601f19603f3d011682016040523d82523d6000602084013e61289d565b606091505b5060008151036128bc576128b763d1a57ed660e01b611a81565b6128c4565b805181602001fd5b5061291a565b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291b565b5b949350505050565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600d8054612975906139da565b80601f01602080910402602001604051908101604052809291908181526020018280546129a1906139da565b80156129ee5780601f106129c3576101008083540402835291602001916129ee565b820191906000526020600020905b8154815290600101906020018083116129d157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612a3357600184039350600a81066030018453600a8104905080612a11575b50828103602084039350808452505050919050565b612a528383612d29565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac05760006001549050600083820390505b612a9360008683806001019450866127e4565b612aa857612aa763d1a57ed660e01b611a81565b5b818110612a80578160015414612abd57600080fd5b50505b505050565b60608251821115612ae157612ae063b3a6a31060e01b611a81565b5b60008267ffffffffffffffff811115612afd57612afc613413565b5b604051908082528060200260200182016040528015612b2b5781602001602082028036833780820191505090505b50905060005b83811015612b8057848181518110612b4c57612b4b613b10565b5b6020026020010151828281518110612b6757612b66613b10565b5b6020026020010181815250508080600101915050612b31565b508091505092915050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600c60019054906101000a900460ff1615612c3d576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4984848484612f08565b50505050565b60008060e883901c905060e8612c66868684612f0e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612cb0612ffd565b612cb8611ca5565b8210612cf857612cc6612642565b821015612cf7575b612cd782612f17565b612ce75781600190039150612cce565b612cf082612cfe565b9050612cf9565b5b5b919050565b612d06612ffd565b612d226006600084815260200190815260200160002054612f37565b9050919050565b6000600154905060008203612d4957612d4863b562e8dd60e01b611a81565b5b612d566000848385612bf6565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612dcd83612dbe6000866000612c4f565b612dc785612fed565b17612c77565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612e6e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e33565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012086604051612ecc91906133a0565b60405180910390a360008203612eed57612eec632e07630060e01b611a81565b5b806001819055505050612f036000848385612ca2565b505050565b50505050565b60009392505050565b600080600660008481526020019081526020016000205414159050919050565b612f3f612ffd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61309581613060565b81146130a057600080fd5b50565b6000813590506130b28161308c565b92915050565b6000602082840312156130ce576130cd613056565b5b60006130dc848285016130a3565b91505092915050565b60008115159050919050565b6130fa816130e5565b82525050565b600060208201905061311560008301846130f1565b92915050565b6000819050919050565b61312e8161311b565b811461313957600080fd5b50565b60008135905061314b81613125565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061317c82613151565b9050919050565b61318c81613171565b811461319757600080fd5b50565b6000813590506131a981613183565b92915050565b600080604083850312156131c6576131c5613056565b5b60006131d48582860161313c565b92505060206131e58582860161319a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561322957808201518184015260208101905061320e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613251826131ef565b61325b81856131fa565b935061326b81856020860161320b565b61327481613235565b840191505092915050565b600060208201905081810360008301526132998184613246565b905092915050565b6000602082840312156132b7576132b6613056565b5b60006132c58482850161313c565b91505092915050565b6132d781613171565b82525050565b60006020820190506132f260008301846132ce565b92915050565b6000806040838503121561330f5761330e613056565b5b600061331d8582860161319a565b925050602061332e8582860161313c565b9150509250929050565b613341816130e5565b811461334c57600080fd5b50565b60008135905061335e81613338565b92915050565b60006020828403121561337a57613379613056565b5b60006133888482850161334f565b91505092915050565b61339a8161311b565b82525050565b60006020820190506133b56000830184613391565b92915050565b6000806000606084860312156133d4576133d3613056565b5b60006133e28682870161319a565b93505060206133f38682870161319a565b92505060406134048682870161313c565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344b82613235565b810181811067ffffffffffffffff8211171561346a57613469613413565b5b80604052505050565b600061347d61304c565b90506134898282613442565b919050565b600067ffffffffffffffff8211156134a9576134a8613413565b5b602082029050602081019050919050565b600080fd5b60006134d26134cd8461348e565b613473565b905080838252602082019050602084028301858111156134f5576134f46134ba565b5b835b8181101561351e578061350a888261313c565b8452602084019350506020810190506134f7565b5050509392505050565b600082601f83011261353d5761353c61340e565b5b813561354d8482602086016134bf565b91505092915050565b60008060006060848603121561356f5761356e613056565b5b600061357d8682870161319a565b935050602061358e8682870161319a565b925050604084013567ffffffffffffffff8111156135af576135ae61305b565b5b6135bb86828701613528565b9150509250925092565b600080604083850312156135dc576135db613056565b5b60006135ea8582860161319a565b92505060206135fb8582860161334f565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561362557613624613413565b5b61362e82613235565b9050602081019050919050565b82818337600083830152505050565b600061365d6136588461360a565b613473565b90508281526020810184848401111561367957613678613605565b5b61368484828561363b565b509392505050565b600082601f8301126136a1576136a061340e565b5b81356136b184826020860161364a565b91505092915050565b6000602082840312156136d0576136cf613056565b5b600082013567ffffffffffffffff8111156136ee576136ed61305b565b5b6136fa8482850161368c565b91505092915050565b60006020828403121561371957613718613056565b5b60006137278482850161319a565b91505092915050565b600060ff82169050919050565b61374681613730565b82525050565b6000602082019050613761600083018461373d565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61379c8161311b565b82525050565b60006137ae8383613793565b60208301905092915050565b6000602082019050919050565b60006137d282613767565b6137dc8185613772565b93506137e783613783565b8060005b838110156138185781516137ff88826137a2565b975061380a836137ba565b9250506001810190506137eb565b5085935050505092915050565b6000602082019050818103600083015261383f81846137c7565b905092915050565b600067ffffffffffffffff82111561386257613861613413565b5b61386b82613235565b9050602081019050919050565b600061388b61388684613847565b613473565b9050828152602081018484840111156138a7576138a6613605565b5b6138b284828561363b565b509392505050565b600082601f8301126138cf576138ce61340e565b5b81356138df848260208601613878565b91505092915050565b6000806000806080858703121561390257613901613056565b5b60006139108782880161319a565b94505060206139218782880161319a565b93505060406139328782880161313c565b925050606085013567ffffffffffffffff8111156139535761395261305b565b5b61395f878288016138ba565b91505092959194509250565b6000806040838503121561398257613981613056565b5b60006139908582860161319a565b92505060206139a18582860161319a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139f257607f821691505b602082108103613a0557613a046139ab565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a458261311b565b9150613a508361311b565b9250828201905080821115613a6857613a67613a0b565b5b92915050565b6000613a798261311b565b9150613a848361311b565b9250828202613a928161311b565b91508282048414831517613aa957613aa8613a0b565b5b5092915050565b6000819050919050565b6000819050919050565b6000613adf613ada613ad584613ab0565b613aba565b61311b565b9050919050565b613aef81613ac4565b82525050565b6000602082019050613b0a6000830184613ae6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ba17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b64565b613bab8683613b64565b95508019841693508086168417925050509392505050565b6000613bde613bd9613bd48461311b565b613aba565b61311b565b9050919050565b6000819050919050565b613bf883613bc3565b613c0c613c0482613be5565b848454613b71565b825550505050565b600090565b613c21613c14565b613c2c818484613bef565b505050565b5b81811015613c5057613c45600082613c19565b600181019050613c32565b5050565b601f821115613c9557613c6681613b3f565b613c6f84613b54565b81016020851015613c7e578190505b613c92613c8a85613b54565b830182613c31565b50505b505050565b600082821c905092915050565b6000613cb860001984600802613c9a565b1980831691505092915050565b6000613cd18383613ca7565b9150826002028217905092915050565b613cea826131ef565b67ffffffffffffffff811115613d0357613d02613413565b5b613d0d82546139da565b613d18828285613c54565b600060209050601f831160018114613d4b5760008415613d39578287015190505b613d438582613cc5565b865550613dab565b601f198416613d5986613b3f565b60005b82811015613d8157848901518255600182019150602085019450602081019050613d5c565b86831015613d9e5784890151613d9a601f891682613ca7565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000613dc9826131ef565b613dd38185613db3565b9350613de381856020860161320b565b80840191505092915050565b6000613dfb8285613dbe565b9150613e078284613dbe565b91508190509392505050565b6000613e1e8261311b565b915060008203613e3157613e30613a0b565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000613e6382613e3c565b613e6d8185613e47565b9350613e7d81856020860161320b565b613e8681613235565b840191505092915050565b6000608082019050613ea660008301876132ce565b613eb360208301866132ce565b613ec06040830185613391565b8181036060830152613ed28184613e58565b905095945050505050565b600081519050613eec8161308c565b92915050565b600060208284031215613f0857613f07613056565b5b6000613f1684828501613edd565b9150509291505056fe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a264697066735822122048e1d0c88e988f79a5ffdbaa436cbde1c278cba9d98fca6c375d93a828bd00ee64736f6c63430008180033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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