ETH Price: $3,082.94 (-3.15%)

Token

SpaceFreaks (Freaks)
 

Overview

Max Total Supply

5,000 Freaks

Holders

251

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
20 Freaks
0x2591ef4c65820ebb159f3ea434afeaa6a7f6e25d
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:
SpaceFreaksContractUpgraded

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-09
*/

// SPDX-License-Identifier: MIT     
pragma solidity ^0.8.0;
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

pragma solidity ^0.8.0;
abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }


    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}

pragma solidity ^0.8.0;
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    function toString(uint256 value) internal pure returns (string memory) {

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

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

pragma solidity ^0.8.0;
library EnumerableSet {

    struct Set {
        // Storage of set values
        bytes32[] _values;

        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);

            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {

        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                set._values[toDeleteIndex] = lastValue;
                
                set._indexes[lastValue] = valueIndex; 
            }

            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.4;

interface IERC721A {

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

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

    function totalSupply() external view returns (uint256);

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

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

    function balanceOf(address owner) external view returns (uint256 balance);

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

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

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

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

    function approve(address to, uint256 tokenId) external payable;

    function setApprovalForAll(address operator, bool _approved) external;

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

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

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

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

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

    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

pragma solidity ^0.8.4;
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {
    struct TokenApprovalRef {
        address value;
    }

    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 _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    uint256 private _currentIndex;

    uint256 private _burnCounter;

    string private _name;

    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

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

    function totalSupply() public view virtual override 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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    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;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || 
            interfaceId == 0x80ac58cd || 
            interfaceId == 0x5b5e139f; 
    }

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

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

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

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

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

    function ownerOf(uint256 tokenId) public view virtual override 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 _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();
    }

    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 {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

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

    function approve(address to, uint256 tokenId) public payable virtual override {
        address owner = ownerOf(tokenId);

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

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

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure 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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

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

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

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

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    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 ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

        _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, 
                    _TRANSFER_EVENT_SIGNATURE, 
                    0, 
                    toMasked, 
                    startTokenId 
                )

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

                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _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();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _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();
                    }
                } while (index < end);
                // Reentrancy protection.
                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, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _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 Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        unchecked {
            _burnCounter++;
        }
    }

    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        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 _msgSenderERC721A() 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)
        }
    }
}

pragma solidity ^0.8.13;
contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

pragma solidity ^0.8.13;
contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.4;
interface IERC721ABurnable is IERC721A {

    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function decimals() external returns (uint8);

}


pragma solidity ^0.8.16;
contract SpaceFreaksContractUpgraded is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{
    
    string public BASE_URI;

    bool public _MINT_ENABLED = false;
    uint public _COLLECTION_SIZE = 5000; 
    uint public _MAX_BATCH_SIZE = 20;
    uint public _SUPPLY_PER_WALLET = 20;

    IERC20 public _SPACEDUST;
    uint256 public _REMIX_PRICE = 1 * (10**18);

    address public _FEE_RECEIVER;

    event new_remix(
        uint256 token_id,
        address wallet,
        uint256 price
    );

    constructor() ERC721A("SpaceFreaks", "Freaks") {}
    
    function TeamMint(uint256 quantity, address receiver) public onlyOwner {
        require(
            totalSupply() + quantity <= _COLLECTION_SIZE,
            "No more freaks in stock!"
        );
        
        _safeMint(receiver, quantity);
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function transferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override (ERC721A, IERC721A) onlyAllowedOperator {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    /**
    * @dev Mint new SpaceFreaks
    **/
    function mintNft(uint quantity)
        external
        payable
        callerIsUser 
        nonReentrant
    {

        require(_MINT_ENABLED, "Mint not started!");
        require(totalSupply() + quantity <= _COLLECTION_SIZE, "Mint completed!");
        require(quantity <= _MAX_BATCH_SIZE, "Tried to mint over batch limit.");
        require(balanceOf(msg.sender) + quantity <= _SUPPLY_PER_WALLET, "Tried to mint over wallet limit.");

        _safeMint(msg.sender, quantity);
    }

    /**
    * @dev Enable / disable public mint
    **/
    function setPublicMintEnabled(bool val) public onlyOwner {
        _MINT_ENABLED = val;
    }

    /**
    * @dev Withdraw potential stuck funds in contract
    **/
    function withdrawFunds() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    /**
    * @dev Set collection URI
    **/
    function collectionUrI(string memory _baseURI) public onlyOwner {
        BASE_URI = _baseURI;
    }

    /**
    * @dev Change max mint per wallet
    **/
    function changeSupplyPerWallet(uint256 _new) external onlyOwner {
        _SUPPLY_PER_WALLET = _new;
    }

    /**
    * @dev Update mint batch size
    **/
    function setMaxBatchSize(uint256 _new) external onlyOwner {
        _MAX_BATCH_SIZE = _new;
    }

    /**
    * @dev Return tokenURI
    **/
    function tokenURI(uint256 _tokenId) public view override (ERC721A, IERC721A) returns (string memory) {
        return string(abi.encodePacked(BASE_URI, Strings.toString(_tokenId)));
    }

    /**
    * @dev Function to update the cost of remix
    **/
    function setRemixPrice(uint256 val) public onlyOwner {
        _REMIX_PRICE = val;
    }

    /**
    * @dev Function to set the spacedust fee receiver
    **/
    function setFeeReceiver(address val) public onlyOwner {
        _FEE_RECEIVER = address(val);
    }

    /**
    * @dev Function to set the spacedust token address
    **/
    function setSpaceDustAddress(address val) public onlyOwner {
        _SPACEDUST = IERC20(address(val));
    }

    /**
    * @dev Function to start the remix process
    **/
    function remixNft(uint256 token_id) public {
        // Check owner of requested remix token
        require(ownerOf(token_id) == msg.sender, "You're not the owner of the NFT.");
        
        // Check tokens sent
        _SPACEDUST.transferFrom(msg.sender, _FEE_RECEIVER, _REMIX_PRICE);

        emit new_remix(
            token_id,
            msg.sender,
            _REMIX_PRICE
        );
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"token_id","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"new_remix","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"TeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_COLLECTION_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_FEE_RECEIVER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MINT_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_REMIX_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_SPACEDUST","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"changeSupplyPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"collectionUrI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintNft","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token_id","type":"uint256"}],"name":"remixNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"setMaxBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setRemixPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setSpaceDustAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600b805460ff19169055611388600c556014600d819055600e55670de0b6b3a76400006010553480156200003757600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020016a5370616365467265616b7360a81b81525060405180604001604052806006815260200165467265616b7360d01b815250620000ac620000a66200022360201b60201c565b62000227565b6003620000ba83826200031c565b506004620000c982826200031c565b506000600190815560095550506daaeb6d7670e522a718067333cd4e3b156200021b5780156200016957604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200014a57600080fd5b505af11580156200015f573d6000803e3d6000fd5b505050506200021b565b6001600160a01b03821615620001ba5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200012f565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200020157600080fd5b505af115801562000216573d6000803e3d6000fd5b505050505b5050620003e8565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002a257607f821691505b602082108103620002c357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200031757600081815260208120601f850160051c81016020861015620002f25750805b601f850160051c820191505b818110156200031357828155600101620002fe565b5050505b505050565b81516001600160401b0381111562000338576200033862000277565b62000350816200034984546200028d565b84620002c9565b602080601f8311600181146200038857600084156200036f5750858301515b600019600386901b1c1916600185901b17855562000313565b600085815260208120601f198616915b82811015620003b95788860151825594840194600190910190840162000398565b5085821015620003d85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61204480620003f86000396000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063c87b56dd116100ab578063dbddb26a1161006f578063dbddb26a146105c1578063e985e9c5146105d6578063efdcd974146105f6578063f2fde38b14610616578063f77777471461063657600080fd5b8063c87b56dd14610531578063d44e6d2014610551578063d7d1e57e14610567578063d8fae8c514610587578063dab4c827146105a157600080fd5b806391267659116100f257806391267659146104b357806395d89b41146104d3578063a22cb465146104e8578063b88d4fde14610508578063c2047ebf1461051b57600080fd5b806370a0823114610440578063715018a614610460578063818668d7146104755780638da5cb5b1461049557600080fd5b80632b26a6bf116101a657806342966c681161017557806342966c68146103a0578063479ba2da146103c0578063502fb3ff146103e05780636352211e146104005780636730cfa01461042057600080fd5b80632b26a6bf146103375780632b7e66d2146103575780633bdf774c1461037757806342842e0e1461038d57600080fd5b80630d730acc116101ed5780630d730acc146102c357806318160ddd146102d65780631fbe829c146102f957806323b872dd1461030f57806324600fc31461032257600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046119c8565b610656565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106a8565b60405161024b9190611a35565b34801561028257600080fd5b50610296610291366004611a48565b61073a565b6040516001600160a01b03909116815260200161024b565b6102c16102bc366004611a7d565b61077e565b005b6102c16102d1366004611a48565b61081e565b3480156102e257600080fd5b50600254600154035b60405190815260200161024b565b34801561030557600080fd5b506102eb600e5481565b6102c161031d366004611aa7565b610a33565b34801561032e57600080fd5b506102c1610aec565b34801561034357600080fd5b506102c1610352366004611a48565b610bd6565b34801561036357600080fd5b50600f54610296906001600160a01b031681565b34801561038357600080fd5b506102eb600c5481565b6102c161039b366004611aa7565b610be3565b3480156103ac57600080fd5b506102c16103bb366004611a48565b610c97565b3480156103cc57600080fd5b506102c16103db366004611ae3565b610ca5565b3480156103ec57600080fd5b506102c16103fb366004611a48565b610ccf565b34801561040c57600080fd5b5061029661041b366004611a48565b610df8565b34801561042c57600080fd5b50601154610296906001600160a01b031681565b34801561044c57600080fd5b506102eb61045b366004611ae3565b610e03565b34801561046c57600080fd5b506102c1610e52565b34801561048157600080fd5b506102c1610490366004611b0c565b610e66565b3480156104a157600080fd5b506000546001600160a01b0316610296565b3480156104bf57600080fd5b506102c16104ce366004611a48565b610e81565b3480156104df57600080fd5b50610269610e8e565b3480156104f457600080fd5b506102c1610503366004611b29565b610e9d565b6102c1610516366004611bec565b610f09565b34801561052757600080fd5b506102eb60105481565b34801561053d57600080fd5b5061026961054c366004611a48565b610fc4565b34801561055d57600080fd5b506102eb600d5481565b34801561057357600080fd5b506102c1610582366004611c68565b610ff8565b34801561059357600080fd5b50600b5461023f9060ff1681565b3480156105ad57600080fd5b506102c16105bc366004611a48565b611010565b3480156105cd57600080fd5b5061026961101d565b3480156105e257600080fd5b5061023f6105f1366004611cb1565b6110ab565b34801561060257600080fd5b506102c1610611366004611ae3565b6110d9565b34801561062257600080fd5b506102c1610631366004611ae3565b611103565b34801561064257600080fd5b506102c1610651366004611ce4565b611179565b60006301ffc9a760e01b6001600160e01b03198316148061068757506380ac58cd60e01b6001600160e01b03198316145b806106a25750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546106b790611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546106e390611d07565b80156107305780601f1061070557610100808354040283529160200191610730565b820191906000526020600020905b81548152906001019060200180831161071357829003601f168201915b5050505050905090565b6000610745826111f4565b610762576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061078982610df8565b9050336001600160a01b038216146107c2576107a581336110ab565b6107c2576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146108725760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036108c45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610869565b6002600955600b5460ff1661090f5760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420737461727465642160781b6044820152606401610869565b600c54816109206002546001540390565b61092a9190611d57565b111561096a5760405162461bcd60e51b815260206004820152600f60248201526e4d696e7420636f6d706c657465642160881b6044820152606401610869565b600d548111156109bc5760405162461bcd60e51b815260206004820152601f60248201527f547269656420746f206d696e74206f766572206261746368206c696d69742e006044820152606401610869565b600e54816109c933610e03565b6109d39190611d57565b1115610a215760405162461bcd60e51b815260206004820181905260248201527f547269656420746f206d696e74206f7665722077616c6c6574206c696d69742e6044820152606401610869565b610a2b338261121c565b506001600955565b6daaeb6d7670e522a718067333cd4e3b15610adc57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd9190611d6a565b610adc57604051633b79c77360e21b8152336004820152602401610869565b610ae7838383611236565b505050565b610af46113c7565b600260095403610b465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610869565b6002600955604051600090339047908381818185875af1925050503d8060008114610b8d576040519150601f19603f3d011682016040523d82523d6000602084013e610b92565b606091505b5050905080610a2b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610869565b610bde6113c7565b600d55565b6daaeb6d7670e522a718067333cd4e3b15610c8c57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6d9190611d6a565b610c8c57604051633b79c77360e21b8152336004820152602401610869565b610ae7838383611421565b610ca281600161143c565b50565b610cad6113c7565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b33610cd982610df8565b6001600160a01b031614610d2f5760405162461bcd60e51b815260206004820181905260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865204e46542e6044820152606401610869565b600f546011546010546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190611d6a565b506010546040805183815233602082015280820192909252517f1bf4c2301fe31c472236d04b38da322696352ecd6d828b681dbbfb87f13e68cb9181900360600190a150565b60006106a282611575565b60006001600160a01b038216610e2c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b610e5a6113c7565b610e6460006115e3565b565b610e6e6113c7565b600b805460ff1916911515919091179055565b610e896113c7565b600e55565b6060600480546106b790611d07565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6daaeb6d7670e522a718067333cd4e3b15610fb257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f939190611d6a565b610fb257604051633b79c77360e21b8152336004820152602401610869565b610fbe84848484611633565b50505050565b6060600a610fd183611677565b604051602001610fe2929190611d87565b6040516020818303038152906040529050919050565b6110006113c7565b600a61100c8282611e54565b5050565b6110186113c7565b601055565b600a805461102a90611d07565b80601f016020809104026020016040519081016040528092919081815260200182805461105690611d07565b80156110a35780601f10611078576101008083540402835291602001916110a3565b820191906000526020600020905b81548152906001019060200180831161108657829003601f168201915b505050505081565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6110e16113c7565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b61110b6113c7565b6001600160a01b0381166111705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610869565b610ca2816115e3565b6111816113c7565b600c54826111926002546001540390565b61119c9190611d57565b11156111ea5760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520667265616b7320696e2073746f636b2100000000000000006044820152606401610869565b61100c818361121c565b6000600154821080156106a2575050600090815260056020526040902054600160e01b161590565b61100c828260405180602001604052806000815250611780565b600061124182611575565b9050836001600160a01b0316816001600160a01b0316146112745760405162a1148160e81b815260040160405180910390fd5b600082815260076020526040902080546112a08187335b6001600160a01b039081169116811491141790565b6112cb576112ae86336110ab565b6112cb57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166112f257604051633a954ecd60e21b815260040160405180910390fd5b80156112fd57600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b8416900361138f5760018401600081815260056020526040812054900361138d57600154811461138d5760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020611fef83398151915260405160405180910390a45b505050505050565b6000546001600160a01b03163314610e645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610869565b610ae783838360405180602001604052806000815250610f09565b600061144783611575565b90508060008061146586600090815260076020526040902080549091565b9150915084156114a55761147a81843361128b565b6114a55761148883336110ab565b6114a557604051632ce44b5f60e11b815260040160405180910390fd5b80156114b057600082555b6001600160a01b038316600081815260066020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260056020526040812091909155600160e11b8516900361153e5760018601600081815260056020526040812054900361153c57600154811461153c5760008181526005602052604090208590555b505b60405186906000906001600160a01b03861690600080516020611fef833981519152908390a4505060028054600101905550505050565b6000816001548110156115ca5760008181526005602052604081205490600160e01b821690036115c8575b806000036115c15750600019016000818152600560205260409020546115a0565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61163e848484610a33565b6001600160a01b0383163b15610fbe5761165a848484846117ed565b610fbe576040516368d2bf6b60e11b815260040160405180910390fd5b60608160000361169e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116c857806116b281611f14565b91506116c19050600a83611f43565b91506116a2565b60008167ffffffffffffffff8111156116e3576116e3611b60565b6040519080825280601f01601f19166020018201604052801561170d576020820181803683370190505b5090505b841561177857611722600183611f57565b915061172f600a86611f6a565b61173a906030611d57565b60f81b81838151811061174f5761174f611f7e565b60200101906001600160f81b031916908160001a905350611771600a86611f43565b9450611711565b949350505050565b61178a83836118d8565b6001600160a01b0383163b15610ae7576001548281035b6117b460008683806001019450866117ed565b6117d1576040516368d2bf6b60e11b815260040160405180910390fd5b8181106117a15781600154146117e657600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611822903390899088908890600401611f94565b6020604051808303816000875af192505050801561185d575060408051601f3d908101601f1916820190925261185a91810190611fd1565b60015b6118bb573d80801561188b576040519150601f19603f3d011682016040523d82523d6000602084013e611890565b606091505b5080516000036118b3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60015460008290036118fd5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b17831790558284019083908390600080516020611fef8339815191528180a4600183015b8181146119885780836000600080516020611fef833981519152600080a4600101611962565b50816000036119a957604051622e076360e81b815260040160405180910390fd5b60015550505050565b6001600160e01b031981168114610ca257600080fd5b6000602082840312156119da57600080fd5b81356115c1816119b2565b60005b83811015611a005781810151838201526020016119e8565b50506000910152565b60008151808452611a218160208601602086016119e5565b601f01601f19169290920160200192915050565b6020815260006115c16020830184611a09565b600060208284031215611a5a57600080fd5b5035919050565b80356001600160a01b0381168114611a7857600080fd5b919050565b60008060408385031215611a9057600080fd5b611a9983611a61565b946020939093013593505050565b600080600060608486031215611abc57600080fd5b611ac584611a61565b9250611ad360208501611a61565b9150604084013590509250925092565b600060208284031215611af557600080fd5b6115c182611a61565b8015158114610ca257600080fd5b600060208284031215611b1e57600080fd5b81356115c181611afe565b60008060408385031215611b3c57600080fd5b611b4583611a61565b91506020830135611b5581611afe565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611b9157611b91611b60565b604051601f8501601f19908116603f01168101908282118183101715611bb957611bb9611b60565b81604052809350858152868686011115611bd257600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611c0257600080fd5b611c0b85611a61565b9350611c1960208601611a61565b925060408501359150606085013567ffffffffffffffff811115611c3c57600080fd5b8501601f81018713611c4d57600080fd5b611c5c87823560208401611b76565b91505092959194509250565b600060208284031215611c7a57600080fd5b813567ffffffffffffffff811115611c9157600080fd5b8201601f81018413611ca257600080fd5b61177884823560208401611b76565b60008060408385031215611cc457600080fd5b611ccd83611a61565b9150611cdb60208401611a61565b90509250929050565b60008060408385031215611cf757600080fd5b82359150611cdb60208401611a61565b600181811c90821680611d1b57607f821691505b602082108103611d3b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106a2576106a2611d41565b600060208284031215611d7c57600080fd5b81516115c181611afe565b6000808454611d9581611d07565b60018281168015611dad5760018114611dc257611df1565b60ff1984168752821515830287019450611df1565b8860005260208060002060005b85811015611de85781548a820152908401908201611dcf565b50505082870194505b505050508351611e058183602088016119e5565b01949350505050565b601f821115610ae757600081815260208120601f850160051c81016020861015611e355750805b601f850160051c820191505b818110156113bf57828155600101611e41565b815167ffffffffffffffff811115611e6e57611e6e611b60565b611e8281611e7c8454611d07565b84611e0e565b602080601f831160018114611eb75760008415611e9f5750858301515b600019600386901b1c1916600185901b1785556113bf565b600085815260208120601f198616915b82811015611ee657888601518255948401946001909101908401611ec7565b5085821015611f045787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201611f2657611f26611d41565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611f5257611f52611f2d565b500490565b818103818111156106a2576106a2611d41565b600082611f7957611f79611f2d565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fc790830184611a09565b9695505050505050565b600060208284031215611fe357600080fd5b81516115c1816119b256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205be227bbcbbeb329efc1d5309b05582dd6297bd95a239cacd570145c8fb2437464736f6c63430008120033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806370a0823111610123578063c87b56dd116100ab578063dbddb26a1161006f578063dbddb26a146105c1578063e985e9c5146105d6578063efdcd974146105f6578063f2fde38b14610616578063f77777471461063657600080fd5b8063c87b56dd14610531578063d44e6d2014610551578063d7d1e57e14610567578063d8fae8c514610587578063dab4c827146105a157600080fd5b806391267659116100f257806391267659146104b357806395d89b41146104d3578063a22cb465146104e8578063b88d4fde14610508578063c2047ebf1461051b57600080fd5b806370a0823114610440578063715018a614610460578063818668d7146104755780638da5cb5b1461049557600080fd5b80632b26a6bf116101a657806342966c681161017557806342966c68146103a0578063479ba2da146103c0578063502fb3ff146103e05780636352211e146104005780636730cfa01461042057600080fd5b80632b26a6bf146103375780632b7e66d2146103575780633bdf774c1461037757806342842e0e1461038d57600080fd5b80630d730acc116101ed5780630d730acc146102c357806318160ddd146102d65780631fbe829c146102f957806323b872dd1461030f57806324600fc31461032257600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046119c8565b610656565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106a8565b60405161024b9190611a35565b34801561028257600080fd5b50610296610291366004611a48565b61073a565b6040516001600160a01b03909116815260200161024b565b6102c16102bc366004611a7d565b61077e565b005b6102c16102d1366004611a48565b61081e565b3480156102e257600080fd5b50600254600154035b60405190815260200161024b565b34801561030557600080fd5b506102eb600e5481565b6102c161031d366004611aa7565b610a33565b34801561032e57600080fd5b506102c1610aec565b34801561034357600080fd5b506102c1610352366004611a48565b610bd6565b34801561036357600080fd5b50600f54610296906001600160a01b031681565b34801561038357600080fd5b506102eb600c5481565b6102c161039b366004611aa7565b610be3565b3480156103ac57600080fd5b506102c16103bb366004611a48565b610c97565b3480156103cc57600080fd5b506102c16103db366004611ae3565b610ca5565b3480156103ec57600080fd5b506102c16103fb366004611a48565b610ccf565b34801561040c57600080fd5b5061029661041b366004611a48565b610df8565b34801561042c57600080fd5b50601154610296906001600160a01b031681565b34801561044c57600080fd5b506102eb61045b366004611ae3565b610e03565b34801561046c57600080fd5b506102c1610e52565b34801561048157600080fd5b506102c1610490366004611b0c565b610e66565b3480156104a157600080fd5b506000546001600160a01b0316610296565b3480156104bf57600080fd5b506102c16104ce366004611a48565b610e81565b3480156104df57600080fd5b50610269610e8e565b3480156104f457600080fd5b506102c1610503366004611b29565b610e9d565b6102c1610516366004611bec565b610f09565b34801561052757600080fd5b506102eb60105481565b34801561053d57600080fd5b5061026961054c366004611a48565b610fc4565b34801561055d57600080fd5b506102eb600d5481565b34801561057357600080fd5b506102c1610582366004611c68565b610ff8565b34801561059357600080fd5b50600b5461023f9060ff1681565b3480156105ad57600080fd5b506102c16105bc366004611a48565b611010565b3480156105cd57600080fd5b5061026961101d565b3480156105e257600080fd5b5061023f6105f1366004611cb1565b6110ab565b34801561060257600080fd5b506102c1610611366004611ae3565b6110d9565b34801561062257600080fd5b506102c1610631366004611ae3565b611103565b34801561064257600080fd5b506102c1610651366004611ce4565b611179565b60006301ffc9a760e01b6001600160e01b03198316148061068757506380ac58cd60e01b6001600160e01b03198316145b806106a25750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546106b790611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546106e390611d07565b80156107305780601f1061070557610100808354040283529160200191610730565b820191906000526020600020905b81548152906001019060200180831161071357829003601f168201915b5050505050905090565b6000610745826111f4565b610762576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061078982610df8565b9050336001600160a01b038216146107c2576107a581336110ab565b6107c2576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146108725760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036108c45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610869565b6002600955600b5460ff1661090f5760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420737461727465642160781b6044820152606401610869565b600c54816109206002546001540390565b61092a9190611d57565b111561096a5760405162461bcd60e51b815260206004820152600f60248201526e4d696e7420636f6d706c657465642160881b6044820152606401610869565b600d548111156109bc5760405162461bcd60e51b815260206004820152601f60248201527f547269656420746f206d696e74206f766572206261746368206c696d69742e006044820152606401610869565b600e54816109c933610e03565b6109d39190611d57565b1115610a215760405162461bcd60e51b815260206004820181905260248201527f547269656420746f206d696e74206f7665722077616c6c6574206c696d69742e6044820152606401610869565b610a2b338261121c565b506001600955565b6daaeb6d7670e522a718067333cd4e3b15610adc57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd9190611d6a565b610adc57604051633b79c77360e21b8152336004820152602401610869565b610ae7838383611236565b505050565b610af46113c7565b600260095403610b465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610869565b6002600955604051600090339047908381818185875af1925050503d8060008114610b8d576040519150601f19603f3d011682016040523d82523d6000602084013e610b92565b606091505b5050905080610a2b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610869565b610bde6113c7565b600d55565b6daaeb6d7670e522a718067333cd4e3b15610c8c57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6d9190611d6a565b610c8c57604051633b79c77360e21b8152336004820152602401610869565b610ae7838383611421565b610ca281600161143c565b50565b610cad6113c7565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b33610cd982610df8565b6001600160a01b031614610d2f5760405162461bcd60e51b815260206004820181905260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865204e46542e6044820152606401610869565b600f546011546010546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190611d6a565b506010546040805183815233602082015280820192909252517f1bf4c2301fe31c472236d04b38da322696352ecd6d828b681dbbfb87f13e68cb9181900360600190a150565b60006106a282611575565b60006001600160a01b038216610e2c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b610e5a6113c7565b610e6460006115e3565b565b610e6e6113c7565b600b805460ff1916911515919091179055565b610e896113c7565b600e55565b6060600480546106b790611d07565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6daaeb6d7670e522a718067333cd4e3b15610fb257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f939190611d6a565b610fb257604051633b79c77360e21b8152336004820152602401610869565b610fbe84848484611633565b50505050565b6060600a610fd183611677565b604051602001610fe2929190611d87565b6040516020818303038152906040529050919050565b6110006113c7565b600a61100c8282611e54565b5050565b6110186113c7565b601055565b600a805461102a90611d07565b80601f016020809104026020016040519081016040528092919081815260200182805461105690611d07565b80156110a35780601f10611078576101008083540402835291602001916110a3565b820191906000526020600020905b81548152906001019060200180831161108657829003601f168201915b505050505081565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6110e16113c7565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b61110b6113c7565b6001600160a01b0381166111705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610869565b610ca2816115e3565b6111816113c7565b600c54826111926002546001540390565b61119c9190611d57565b11156111ea5760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520667265616b7320696e2073746f636b2100000000000000006044820152606401610869565b61100c818361121c565b6000600154821080156106a2575050600090815260056020526040902054600160e01b161590565b61100c828260405180602001604052806000815250611780565b600061124182611575565b9050836001600160a01b0316816001600160a01b0316146112745760405162a1148160e81b815260040160405180910390fd5b600082815260076020526040902080546112a08187335b6001600160a01b039081169116811491141790565b6112cb576112ae86336110ab565b6112cb57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166112f257604051633a954ecd60e21b815260040160405180910390fd5b80156112fd57600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b8416900361138f5760018401600081815260056020526040812054900361138d57600154811461138d5760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020611fef83398151915260405160405180910390a45b505050505050565b6000546001600160a01b03163314610e645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610869565b610ae783838360405180602001604052806000815250610f09565b600061144783611575565b90508060008061146586600090815260076020526040902080549091565b9150915084156114a55761147a81843361128b565b6114a55761148883336110ab565b6114a557604051632ce44b5f60e11b815260040160405180910390fd5b80156114b057600082555b6001600160a01b038316600081815260066020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260056020526040812091909155600160e11b8516900361153e5760018601600081815260056020526040812054900361153c57600154811461153c5760008181526005602052604090208590555b505b60405186906000906001600160a01b03861690600080516020611fef833981519152908390a4505060028054600101905550505050565b6000816001548110156115ca5760008181526005602052604081205490600160e01b821690036115c8575b806000036115c15750600019016000818152600560205260409020546115a0565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61163e848484610a33565b6001600160a01b0383163b15610fbe5761165a848484846117ed565b610fbe576040516368d2bf6b60e11b815260040160405180910390fd5b60608160000361169e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116c857806116b281611f14565b91506116c19050600a83611f43565b91506116a2565b60008167ffffffffffffffff8111156116e3576116e3611b60565b6040519080825280601f01601f19166020018201604052801561170d576020820181803683370190505b5090505b841561177857611722600183611f57565b915061172f600a86611f6a565b61173a906030611d57565b60f81b81838151811061174f5761174f611f7e565b60200101906001600160f81b031916908160001a905350611771600a86611f43565b9450611711565b949350505050565b61178a83836118d8565b6001600160a01b0383163b15610ae7576001548281035b6117b460008683806001019450866117ed565b6117d1576040516368d2bf6b60e11b815260040160405180910390fd5b8181106117a15781600154146117e657600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611822903390899088908890600401611f94565b6020604051808303816000875af192505050801561185d575060408051601f3d908101601f1916820190925261185a91810190611fd1565b60015b6118bb573d80801561188b576040519150601f19603f3d011682016040523d82523d6000602084013e611890565b606091505b5080516000036118b3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60015460008290036118fd5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b17831790558284019083908390600080516020611fef8339815191528180a4600183015b8181146119885780836000600080516020611fef833981519152600080a4600101611962565b50816000036119a957604051622e076360e81b815260040160405180910390fd5b60015550505050565b6001600160e01b031981168114610ca257600080fd5b6000602082840312156119da57600080fd5b81356115c1816119b2565b60005b83811015611a005781810151838201526020016119e8565b50506000910152565b60008151808452611a218160208601602086016119e5565b601f01601f19169290920160200192915050565b6020815260006115c16020830184611a09565b600060208284031215611a5a57600080fd5b5035919050565b80356001600160a01b0381168114611a7857600080fd5b919050565b60008060408385031215611a9057600080fd5b611a9983611a61565b946020939093013593505050565b600080600060608486031215611abc57600080fd5b611ac584611a61565b9250611ad360208501611a61565b9150604084013590509250925092565b600060208284031215611af557600080fd5b6115c182611a61565b8015158114610ca257600080fd5b600060208284031215611b1e57600080fd5b81356115c181611afe565b60008060408385031215611b3c57600080fd5b611b4583611a61565b91506020830135611b5581611afe565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611b9157611b91611b60565b604051601f8501601f19908116603f01168101908282118183101715611bb957611bb9611b60565b81604052809350858152868686011115611bd257600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611c0257600080fd5b611c0b85611a61565b9350611c1960208601611a61565b925060408501359150606085013567ffffffffffffffff811115611c3c57600080fd5b8501601f81018713611c4d57600080fd5b611c5c87823560208401611b76565b91505092959194509250565b600060208284031215611c7a57600080fd5b813567ffffffffffffffff811115611c9157600080fd5b8201601f81018413611ca257600080fd5b61177884823560208401611b76565b60008060408385031215611cc457600080fd5b611ccd83611a61565b9150611cdb60208401611a61565b90509250929050565b60008060408385031215611cf757600080fd5b82359150611cdb60208401611a61565b600181811c90821680611d1b57607f821691505b602082108103611d3b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106a2576106a2611d41565b600060208284031215611d7c57600080fd5b81516115c181611afe565b6000808454611d9581611d07565b60018281168015611dad5760018114611dc257611df1565b60ff1984168752821515830287019450611df1565b8860005260208060002060005b85811015611de85781548a820152908401908201611dcf565b50505082870194505b505050508351611e058183602088016119e5565b01949350505050565b601f821115610ae757600081815260208120601f850160051c81016020861015611e355750805b601f850160051c820191505b818110156113bf57828155600101611e41565b815167ffffffffffffffff811115611e6e57611e6e611b60565b611e8281611e7c8454611d07565b84611e0e565b602080601f831160018114611eb75760008415611e9f5750858301515b600019600386901b1c1916600185901b1785556113bf565b600085815260208120601f198616915b82811015611ee657888601518255948401946001909101908401611ec7565b5085821015611f045787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201611f2657611f26611d41565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611f5257611f52611f2d565b500490565b818103818111156106a2576106a2611d41565b600082611f7957611f79611f2d565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fc790830184611a09565b9695505050505050565b600060208284031215611fe357600080fd5b81516115c1816119b256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205be227bbcbbeb329efc1d5309b05582dd6297bd95a239cacd570145c8fb2437464736f6c63430008120033

Deployed Bytecode Sourcemap

36694:4381:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14503:242;;;;;;;;;;-1:-1:-1;14503:242:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;14503:242:0;;;;;;;;14753:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18329:218::-;;;;;;;;;;-1:-1:-1;18329:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;18329:218:0;1533:203:1;17913:408:0;;;;;;:::i;:::-;;:::i;:::-;;38372:500;;;;;;:::i;:::-;;:::i;12868:180::-;;;;;;;;;;-1:-1:-1;12999:12:0;;12983:13;;:28;12868:180;;;2324:25:1;;;2312:2;2297:18;12868:180:0;2178:177:1;36975:35:0;;;;;;;;;;;;;;;;37701:185;;;;;;:::i;:::-;;:::i;39115:191::-;;;;;;;;;;;;;:::i;39699:99::-;;;;;;;;;;-1:-1:-1;39699:99:0;;;;;:::i;:::-;;:::i;37019:24::-;;;;;;;;;;-1:-1:-1;37019:24:0;;;;-1:-1:-1;;;;;37019:24:0;;;36893:35;;;;;;;;;;;;;;;;37894:193;;;;;;:::i;:::-;;:::i;33869:94::-;;;;;;;;;;-1:-1:-1;33869:94:0;;;;;:::i;:::-;;:::i;40470:111::-;;;;;;;;;;-1:-1:-1;40470:111:0;;;;;:::i;:::-;;:::i;40655:415::-;;;;;;;;;;-1:-1:-1;40655:415:0;;;;;:::i;:::-;;:::i;15401:152::-;;;;;;;;;;-1:-1:-1;15401:152:0;;;;;:::i;:::-;;:::i;37101:28::-;;;;;;;;;;-1:-1:-1;37101:28:0;;;;-1:-1:-1;;;;;37101:28:0;;;13333:233;;;;;;;;;;-1:-1:-1;13333:233:0;;;;;:::i;:::-;;:::i;883:103::-;;;;;;;;;;;;;:::i;38939:95::-;;;;;;;;;;-1:-1:-1;38939:95:0;;;;;:::i;:::-;;:::i;648:87::-;;;;;;;;;;-1:-1:-1;694:7:0;721:6;-1:-1:-1;;;;;721:6:0;648:87;;39530:108;;;;;;;;;;-1:-1:-1;39530:108:0;;;;;:::i;:::-;;:::i;14861:104::-;;;;;;;;;;;;;:::i;18555:234::-;;;;;;;;;;-1:-1:-1;18555:234:0;;;;;:::i;:::-;;:::i;38095:218::-;;;;;;:::i;:::-;;:::i;37050:42::-;;;;;;;;;;;;;;;;39852:189;;;;;;;;;;-1:-1:-1;39852:189:0;;;;;:::i;:::-;;:::i;36936:32::-;;;;;;;;;;;;;;;;39363:102;;;;;;;;;;-1:-1:-1;39363:102:0;;;;;:::i;:::-;;:::i;36853:33::-;;;;;;;;;;-1:-1:-1;36853:33:0;;;;;;;;40116:90;;;;;;;;;;-1:-1:-1;40116:90:0;;;;;:::i;:::-;;:::i;36822:22::-;;;;;;;;;;;;;:::i;18797:164::-;;;;;;;;;;-1:-1:-1;18797:164:0;;;;;:::i;:::-;;:::i;40287:101::-;;;;;;;;;;-1:-1:-1;40287:101:0;;;;;:::i;:::-;;:::i;996:201::-;;;;;;;;;;-1:-1:-1;996:201:0;;;;;:::i;:::-;;:::i;37306:258::-;;;;;;;;;;-1:-1:-1;37306:258:0;;;;;:::i;:::-;;:::i;14503:242::-;14588:4;-1:-1:-1;;;;;;;;;14625:25:0;;;;:68;;-1:-1:-1;;;;;;;;;;14668:25:0;;;14625:68;:111;;;-1:-1:-1;;;;;;;;;;14711:25:0;;;14625:111;14605:131;14503:242;-1:-1:-1;;14503:242:0:o;14753:100::-;14807:13;14840:5;14833:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14753:100;:::o;18329:218::-;18405:7;18430:16;18438:7;18430;:16::i;:::-;18425:64;;18455:34;;-1:-1:-1;;;18455:34:0;;;;;;;;;;;18425:64;-1:-1:-1;18509:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;18509:30:0;;18329:218::o;17913:408::-;18002:13;18018:16;18026:7;18018;:16::i;:::-;18002:32;-1:-1:-1;29436:10:0;-1:-1:-1;;;;;18051:28:0;;;18047:175;;18099:44;18116:5;29436:10;18797:164;:::i;18099:44::-;18094:128;;18171:35;;-1:-1:-1;;;18171:35:0;;;;;;;;;;;18094:128;18234:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;18234:35:0;-1:-1:-1;;;;;18234:35:0;;;;;;;;;18285:28;;18234:24;;18285:28;;;;;;;17991:330;17913:408;;:::o;38372:500::-;37615:9;37628:10;37615:23;37607:66;;;;-1:-1:-1;;;37607:66:0;;6801:2:1;37607:66:0;;;6783:21:1;6840:2;6820:18;;;6813:30;6879:32;6859:18;;;6852:60;6929:18;;37607:66:0;;;;;;;;;1557:1:::1;1715:7;;:19:::0;1707:63:::1;;;::::0;-1:-1:-1;;;1707:63:0;;7160:2:1;1707:63:0::1;::::0;::::1;7142:21:1::0;7199:2;7179:18;;;7172:30;7238:33;7218:18;;;7211:61;7289:18;;1707:63:0::1;6958:355:1::0;1707:63:0::1;1557:1;1783:7;:18:::0;38510:13:::2;::::0;::::2;;38502:43;;;::::0;-1:-1:-1;;;38502:43:0;;7520:2:1;38502:43:0::2;::::0;::::2;7502:21:1::0;7559:2;7539:18;;;7532:30;-1:-1:-1;;;7578:18:1;;;7571:47;7635:18;;38502:43:0::2;7318:341:1::0;38502:43:0::2;38592:16;;38580:8;38564:13;12999:12:::0;;12983:13;;:28;;12868:180;38564:13:::2;:24;;;;:::i;:::-;:44;;38556:72;;;::::0;-1:-1:-1;;;38556:72:0;;8128:2:1;38556:72:0::2;::::0;::::2;8110:21:1::0;8167:2;8147:18;;;8140:30;-1:-1:-1;;;8186:18:1;;;8179:45;8241:18;;38556:72:0::2;7926:339:1::0;38556:72:0::2;38659:15;;38647:8;:27;;38639:71;;;::::0;-1:-1:-1;;;38639:71:0;;8472:2:1;38639:71:0::2;::::0;::::2;8454:21:1::0;8511:2;8491:18;;;8484:30;8550:33;8530:18;;;8523:61;8601:18;;38639:71:0::2;8270:355:1::0;38639:71:0::2;38765:18;;38753:8;38729:21;38739:10;38729:9;:21::i;:::-;:32;;;;:::i;:::-;:54;;38721:99;;;::::0;-1:-1:-1;;;38721:99:0;;8832:2:1;38721:99:0::2;::::0;::::2;8814:21:1::0;;;8851:18;;;8844:30;8910:34;8890:18;;;8883:62;8962:18;;38721:99:0::2;8630:356:1::0;38721:99:0::2;38833:31;38843:10;38855:8;38833:9;:31::i;:::-;-1:-1:-1::0;1513:1:0::1;1828:7;:22:::0;38372:500::o;37701:185::-;30322:42;31065:43;:47;31061:225;;31134:67;;-1:-1:-1;;;31134:67:0;;31183:4;31134:67;;;9203:34:1;31190:10:0;9253:18:1;;;9246:43;30322:42:0;;31134:40;;9138:18:1;;31134:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31129:146;;31229:30;;-1:-1:-1;;;31229:30:0;;31248:10;31229:30;;;1679:51:1;1652:18;;31229:30:0;1533:203:1;31129:146:0;37841:37:::1;37860:4;37866:2;37870:7;37841:18;:37::i;:::-;37701:185:::0;;;:::o;39115:191::-;607:13;:11;:13::i;:::-;1557:1:::1;1715:7;;:19:::0;1707:63:::1;;;::::0;-1:-1:-1;;;1707:63:0;;7160:2:1;1707:63:0::1;::::0;::::1;7142:21:1::0;7199:2;7179:18;;;7172:30;7238:33;7218:18;;;7211:61;7289:18;;1707:63:0::1;6958:355:1::0;1707:63:0::1;1557:1;1783:7;:18:::0;39202:49:::2;::::0;39184:12:::2;::::0;39202:10:::2;::::0;39225:21:::2;::::0;39184:12;39202:49;39184:12;39202:49;39225:21;39202:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39183:68;;;39270:7;39262:36;;;::::0;-1:-1:-1;;;39262:36:0;;9962:2:1;39262:36:0::2;::::0;::::2;9944:21:1::0;10001:2;9981:18;;;9974:30;-1:-1:-1;;;10020:18:1;;;10013:46;10076:18;;39262:36:0::2;9760:340:1::0;39699:99:0;607:13;:11;:13::i;:::-;39768:15:::1;:22:::0;39699:99::o;37894:193::-;30322:42;31065:43;:47;31061:225;;31134:67;;-1:-1:-1;;;31134:67:0;;31183:4;31134:67;;;9203:34:1;31190:10:0;9253:18:1;;;9246:43;30322:42:0;;31134:40;;9138:18:1;;31134:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31129:146;;31229:30;;-1:-1:-1;;;31229:30:0;;31248:10;31229:30;;;1679:51:1;1652:18;;31229:30:0;1533:203:1;31129:146:0;38038:41:::1;38061:4;38067:2;38071:7;38038:22;:41::i;33869:94::-:0;33935:20;33941:7;33950:4;33935:5;:20::i;:::-;33869:94;:::o;40470:111::-;607:13;:11;:13::i;:::-;40540:10:::1;:33:::0;;-1:-1:-1;;;;;;40540:33:0::1;-1:-1:-1::0;;;;;40540:33:0;;;::::1;::::0;;;::::1;::::0;;40470:111::o;40655:415::-;40787:10;40766:17;40774:8;40766:7;:17::i;:::-;-1:-1:-1;;;;;40766:31:0;;40758:76;;;;-1:-1:-1;;;40758:76:0;;10307:2:1;40758:76:0;;;10289:21:1;;;10326:18;;;10319:30;10385:34;10365:18;;;10358:62;10437:18;;40758:76:0;10105:356:1;40758:76:0;40885:10;;40921:13;;40936:12;;40885:64;;-1:-1:-1;;;40885:64:0;;40909:10;40885:64;;;10706:34:1;-1:-1:-1;;;;;40921:13:0;;;10756:18:1;;;10749:43;10808:18;;;10801:34;;;;40885:10:0;;;:23;;10641:18:1;;40885:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41039:12:0;;40967:95;;;11048:25:1;;;41014:10:0;11104:2:1;11089:18;;11082:60;11158:18;;;11151:34;;;;40967:95:0;;;;;;11036:2:1;40967:95:0;;;40655:415;:::o;15401:152::-;15473:7;15516:27;15535:7;15516:18;:27::i;13333:233::-;13405:7;-1:-1:-1;;;;;13429:19:0;;13425:60;;13457:28;;-1:-1:-1;;;13457:28:0;;;;;;;;;;;13425:60;-1:-1:-1;;;;;;13503:25:0;;;;;:18;:25;;;;;;11141:13;13503:55;;13333:233::o;883:103::-;607:13;:11;:13::i;:::-;948:30:::1;975:1;948:18;:30::i;:::-;883:103::o:0;38939:95::-;607:13;:11;:13::i;:::-;39007::::1;:19:::0;;-1:-1:-1;;39007:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38939:95::o;39530:108::-;607:13;:11;:13::i;:::-;39605:18:::1;:25:::0;39530:108::o;14861:104::-;14917:13;14950:7;14943:14;;;;;:::i;18555:234::-;29436:10;18650:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;18650:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;18650:60:0;;;;;;;;;;18726:55;;540:41:1;;;18650:49:0;;29436:10;18726:55;;513:18:1;18726:55:0;;;;;;;18555:234;;:::o;38095:218::-;30322:42;31065:43;:47;31061:225;;31134:67;;-1:-1:-1;;;31134:67:0;;31183:4;31134:67;;;9203:34:1;31190:10:0;9253:18:1;;;9246:43;30322:42:0;;31134:40;;9138:18:1;;31134:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31129:146;;31229:30;;-1:-1:-1;;;31229:30:0;;31248:10;31229:30;;;1679:51:1;1652:18;;31229:30:0;1533:203:1;31129:146:0;38258:47:::1;38281:4;38287:2;38291:7;38300:4;38258:22;:47::i;:::-;38095:218:::0;;;;:::o;39852:189::-;39938:13;39995:8;40005:26;40022:8;40005:16;:26::i;:::-;39978:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39964:69;;39852:189;;;:::o;39363:102::-;607:13;:11;:13::i;:::-;39438:8:::1;:19;39449:8:::0;39438;:19:::1;:::i;:::-;;39363:102:::0;:::o;40116:90::-;607:13;:11;:13::i;:::-;40180:12:::1;:18:::0;40116:90::o;36822:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18797:164::-;-1:-1:-1;;;;;18918:25:0;;;18894:4;18918:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;18797:164::o;40287:101::-;607:13;:11;:13::i;:::-;40352::::1;:28:::0;;-1:-1:-1;;;;;;40352:28:0::1;-1:-1:-1::0;;;;;40352:28:0;;;::::1;::::0;;;::::1;::::0;;40287:101::o;996:201::-;607:13;:11;:13::i;:::-;-1:-1:-1;;;;;1085:22:0;::::1;1077:73;;;::::0;-1:-1:-1;;;1077:73:0;;14627:2:1;1077:73:0::1;::::0;::::1;14609:21:1::0;14666:2;14646:18;;;14639:30;14705:34;14685:18;;;14678:62;-1:-1:-1;;;14756:18:1;;;14749:36;14802:19;;1077:73:0::1;14425:402:1::0;1077:73:0::1;1161:28;1180:8;1161:18;:28::i;37306:258::-:0;607:13;:11;:13::i;:::-;37438:16:::1;;37426:8;37410:13;12999:12:::0;;12983:13;;:28;;12868:180;37410:13:::1;:24;;;;:::i;:::-;:44;;37388:118;;;::::0;-1:-1:-1;;;37388:118:0;;15034:2:1;37388:118:0::1;::::0;::::1;15016:21:1::0;15073:2;15053:18;;;15046:30;15112:26;15092:18;;;15085:54;15156:18;;37388:118:0::1;14832:348:1::0;37388:118:0::1;37527:29;37537:8;37547;37527:9;:29::i;18969:282::-:0;19034:4;19124:13;;19114:7;:23;19071:153;;;;-1:-1:-1;;19175:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;19175:44:0;:49;;18969:282::o;26502:112::-;26579:27;26589:2;26593:8;26579:27;;;;;;;;;;;;:9;:27::i;20064:1651::-;20206:27;20236;20255:7;20236:18;:27::i;:::-;20206:57;;20321:4;-1:-1:-1;;;;;20280:45:0;20296:19;-1:-1:-1;;;;;20280:45:0;;20276:86;;20334:28;;-1:-1:-1;;;20334:28:0;;;;;;;;;;;20276:86;20376:27;19877:24;;;:15;:24;;;;;20012:26;;20485:68;20012:26;20527:4;29436:10;20533:19;-1:-1:-1;;;;;19524:32:0;;;19467:28;;19585:20;;19607:30;;19582:56;;19259:397;20485:68;20480:180;;20573:43;20590:4;29436:10;18797:164;:::i;20573:43::-;20568:92;;20625:35;;-1:-1:-1;;;20625:35:0;;;;;;;;;;;20568:92;-1:-1:-1;;;;;20677:16:0;;20673:52;;20702:23;;-1:-1:-1;;;20702:23:0;;;;;;;;;;;20673:52;20821:15;20818:85;;;20886:1;20865:19;20858:30;20818:85;-1:-1:-1;;;;;20955:24:0;;;;;;;:18;:24;;;;;;20953:26;;-1:-1:-1;;20953:26:0;;;20997:22;;;;;;;;;20995:24;;-1:-1:-1;20995:24:0;;;17534:11;17509:23;17505:41;17492:63;-1:-1:-1;;;17492:63:0;21037:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;21233:47:0;;:52;;21229:370;;21338:1;21328:11;;21306:19;21364:30;;;:17;:30;;;;;;:35;;21360:224;;21445:13;;21430:11;:28;21426:139;;21489:30;;;;:17;:30;;;;;:52;;;21426:139;21287:312;21229:370;21646:7;21642:2;-1:-1:-1;;;;;21627:27:0;21636:4;-1:-1:-1;;;;;21627:27:0;-1:-1:-1;;;;;;;;;;;21627:27:0;;;;;;;;;21665:42;20195:1520;;;20064:1651;;;:::o;743:132::-;694:7;721:6;-1:-1:-1;;;;;721:6:0;29436:10;807:23;799:68;;;;-1:-1:-1;;;799:68:0;;15387:2:1;799:68:0;;;15369:21:1;;;15406:18;;;15399:30;15465:34;15445:18;;;15438:62;15517:18;;799:68:0;15185:356:1;21723:193:0;21869:39;21886:4;21892:2;21896:7;21869:39;;;;;;;;;;;;:16;:39::i;26719:1679::-;26799:27;26829;26848:7;26829:18;:27::i;:::-;26799:57;-1:-1:-1;26799:57:0;26869:12;;26991:35;27018:7;19766:27;19877:24;;;:15;:24;;;;;20012:26;;19877:24;;19664:392;26991:35;26934:92;;;;27043:13;27039:244;;;27092:68;27117:15;27134:4;29436:10;27140:19;29349:105;27092:68;27087:184;;27184:43;27201:4;29436:10;18797:164;:::i;27184:43::-;27179:92;;27236:35;;-1:-1:-1;;;27236:35:0;;;;;;;;;;;27179:92;27386:15;27383:101;;;27467:1;27446:19;27439:30;27383:101;-1:-1:-1;;;;;27534:24:0;;;;;;:18;:24;;;;;:60;;27562:32;27534:60;;;17534:11;17509:23;17505:41;17492:63;-1:-1:-1;;;17492:63:0;27611:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;27837:47:0;;:52;;27833:370;;27942:1;27932:11;;27910:19;27968:30;;;:17;:30;;;;;;:35;;27964:224;;28049:13;;28034:11;:28;28030:139;;28093:30;;;;:17;:30;;;;;:52;;;28030:139;27891:312;27833:370;28231:35;;28258:7;;28254:1;;-1:-1:-1;;;;;28231:35:0;;;-1:-1:-1;;;;;;;;;;;28231:35:0;28254:1;;28231:35;-1:-1:-1;;28365:12:0;:14;;;;;;-1:-1:-1;;;;26719:1679:0:o;16108:633::-;16175:7;16210;16312:13;;16305:4;:20;16301:373;;;16350:14;16367:23;;;:17;:23;;;;;;;-1:-1:-1;;;16419:24:0;;:29;;16415:240;;16479:113;16486:6;16496:1;16486:11;16479:113;;-1:-1:-1;;;16557:6:0;16539:25;;;;:17;:25;;;;;;16479:113;;;16625:6;16108:633;-1:-1:-1;;;16108:633:0:o;16415:240::-;16327:347;16301:373;16702:31;;-1:-1:-1;;;16702:31:0;;;;;;;;;;;1205:191;1279:16;1298:6;;-1:-1:-1;;;;;1315:17:0;;;-1:-1:-1;;;;;;1315:17:0;;;;;;1348:40;;1298:6;;;;;;;1348:40;;1279:16;1348:40;1268:128;1205:191;:::o;21924:407::-;22099:31;22112:4;22118:2;22122:7;22099:12;:31::i;:::-;-1:-1:-1;;;;;22145:14:0;;;:19;22141:183;;22184:56;22215:4;22221:2;22225:7;22234:5;22184:30;:56::i;:::-;22179:145;;22268:40;;-1:-1:-1;;;22268:40:0;;;;;;;;;;;2030:534;2086:13;2118:5;2127:1;2118:10;2114:53;;-1:-1:-1;;2145:10:0;;;;;;;;;;;;-1:-1:-1;;;2145:10:0;;;;;2030:534::o;2114:53::-;2192:5;2177:12;2233:78;2240:9;;2233:78;;2266:8;;;;:::i;:::-;;-1:-1:-1;2289:10:0;;-1:-1:-1;2297:2:0;2289:10;;:::i;:::-;;;2233:78;;;2321:19;2353:6;2343:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2343:17:0;;2321:39;;2371:154;2378:10;;2371:154;;2405:11;2415:1;2405:11;;:::i;:::-;;-1:-1:-1;2474:10:0;2482:2;2474:5;:10;:::i;:::-;2461:24;;:2;:24;:::i;:::-;2448:39;;2431:6;2438;2431:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2431:56:0;;;;;;;;-1:-1:-1;2502:11:0;2511:2;2502:11;;:::i;:::-;;;2371:154;;;2549:6;2030:534;-1:-1:-1;;;;2030:534:0:o;25805:689::-;25936:19;25942:2;25946:8;25936:5;:19::i;:::-;-1:-1:-1;;;;;25997:14:0;;;:19;25993:483;;26051:13;;26099:14;;;26132:233;26163:62;26202:1;26206:2;26210:7;;;;;;26219:5;26163:30;:62::i;:::-;26158:167;;26261:40;;-1:-1:-1;;;26261:40:0;;;;;;;;;;;26158:167;26360:3;26352:5;:11;26132:233;;26447:3;26430:13;;:20;26426:34;;26452:8;;;26426:34;26018:458;;25805:689;;;:::o;22672:716::-;22856:88;;-1:-1:-1;;;22856:88:0;;22835:4;;-1:-1:-1;;;;;22856:45:0;;;;;:88;;29436:10;;22923:4;;22929:7;;22938:5;;22856:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22856:88:0;;;;;;;;-1:-1:-1;;22856:88:0;;;;;;;;;;;;:::i;:::-;;;22852:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23139:6;:13;23156:1;23139:18;23135:235;;23185:40;;-1:-1:-1;;;23185:40:0;;;;;;;;;;;23135:235;23328:6;23322:13;23313:6;23309:2;23305:15;23298:38;22852:529;-1:-1:-1;;;;;;23015:64:0;-1:-1:-1;;;23015:64:0;;-1:-1:-1;22672:716:0;;;;;;:::o;23396:1442::-;23492:13;;23469:20;23520:13;;;23516:44;;23542:18;;-1:-1:-1;;;23542:18:0;;;;;;;;;;;23516:44;-1:-1:-1;;;;;23674:22:0;;;;;;:18;:22;;;;11212:2;23674:22;;;:71;;23712:32;23700:45;;23674:71;;;23762:31;;;:17;:31;;;;;-1:-1:-1;17871:15:0;;17845:24;17841:46;17534:11;17509:23;17505:41;17502:52;17492:63;;23762:173;;23997:23;;;;23762:31;;23674:22;;-1:-1:-1;;;;;;;;;;;23674:22:0;;24124:215;24419:1;24405:12;24401:20;24359:279;24460:3;24451:7;24448:16;24359:279;;24611:7;24601:8;24598:1;-1:-1:-1;;;;;;;;;;;24568:1:0;24565;24560:59;24513:1;24500:15;24359:279;;;24363:77;24671:8;24683:1;24671:13;24667:45;;24693:19;;-1:-1:-1;;;24693:19:0;;;;;;;;;;;24667:45;24729:13;:19;-1:-1:-1;37701:185:0;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2916:186::-;2975:6;3028:2;3016:9;3007:7;3003:23;2999:32;2996:52;;;3044:1;3041;3034:12;2996:52;3067:29;3086:9;3067:29;:::i;3107:118::-;3193:5;3186:13;3179:21;3172:5;3169:32;3159:60;;3215:1;3212;3205:12;3230:241;3286:6;3339:2;3327:9;3318:7;3314:23;3310:32;3307:52;;;3355:1;3352;3345:12;3307:52;3394:9;3381:23;3413:28;3435:5;3413:28;:::i;3476:315::-;3541:6;3549;3602:2;3590:9;3581:7;3577:23;3573:32;3570:52;;;3618:1;3615;3608:12;3570:52;3641:29;3660:9;3641:29;:::i;:::-;3631:39;;3720:2;3709:9;3705:18;3692:32;3733:28;3755:5;3733:28;:::i;:::-;3780:5;3770:15;;;3476:315;;;;;:::o;3796:127::-;3857:10;3852:3;3848:20;3845:1;3838:31;3888:4;3885:1;3878:15;3912:4;3909:1;3902:15;3928:631;3992:5;4022:18;4063:2;4055:6;4052:14;4049:40;;;4069:18;;:::i;:::-;4144:2;4138:9;4112:2;4198:15;;-1:-1:-1;;4194:24:1;;;4220:2;4190:33;4186:42;4174:55;;;4244:18;;;4264:22;;;4241:46;4238:72;;;4290:18;;:::i;:::-;4330:10;4326:2;4319:22;4359:6;4350:15;;4389:6;4381;4374:22;4429:3;4420:6;4415:3;4411:16;4408:25;4405:45;;;4446:1;4443;4436:12;4405:45;4496:6;4491:3;4484:4;4476:6;4472:17;4459:44;4551:1;4544:4;4535:6;4527;4523:19;4519:30;4512:41;;;;3928:631;;;;;:::o;4564:666::-;4659:6;4667;4675;4683;4736:3;4724:9;4715:7;4711:23;4707:33;4704:53;;;4753:1;4750;4743:12;4704:53;4776:29;4795:9;4776:29;:::i;:::-;4766:39;;4824:38;4858:2;4847:9;4843:18;4824:38;:::i;:::-;4814:48;;4909:2;4898:9;4894:18;4881:32;4871:42;;4964:2;4953:9;4949:18;4936:32;4991:18;4983:6;4980:30;4977:50;;;5023:1;5020;5013:12;4977:50;5046:22;;5099:4;5091:13;;5087:27;-1:-1:-1;5077:55:1;;5128:1;5125;5118:12;5077:55;5151:73;5216:7;5211:2;5198:16;5193:2;5189;5185:11;5151:73;:::i;:::-;5141:83;;;4564:666;;;;;;;:::o;5235:450::-;5304:6;5357:2;5345:9;5336:7;5332:23;5328:32;5325:52;;;5373:1;5370;5363:12;5325:52;5413:9;5400:23;5446:18;5438:6;5435:30;5432:50;;;5478:1;5475;5468:12;5432:50;5501:22;;5554:4;5546:13;;5542:27;-1:-1:-1;5532:55:1;;5583:1;5580;5573:12;5532:55;5606:73;5671:7;5666:2;5653:16;5648:2;5644;5640:11;5606:73;:::i;5690:260::-;5758:6;5766;5819:2;5807:9;5798:7;5794:23;5790:32;5787:52;;;5835:1;5832;5825:12;5787:52;5858:29;5877:9;5858:29;:::i;:::-;5848:39;;5906:38;5940:2;5929:9;5925:18;5906:38;:::i;:::-;5896:48;;5690:260;;;;;:::o;5955:254::-;6023:6;6031;6084:2;6072:9;6063:7;6059:23;6055:32;6052:52;;;6100:1;6097;6090:12;6052:52;6136:9;6123:23;6113:33;;6165:38;6199:2;6188:9;6184:18;6165:38;:::i;6214:380::-;6293:1;6289:12;;;;6336;;;6357:61;;6411:4;6403:6;6399:17;6389:27;;6357:61;6464:2;6456:6;6453:14;6433:18;6430:38;6427:161;;6510:10;6505:3;6501:20;6498:1;6491:31;6545:4;6542:1;6535:15;6573:4;6570:1;6563:15;6427:161;;6214:380;;;:::o;7664:127::-;7725:10;7720:3;7716:20;7713:1;7706:31;7756:4;7753:1;7746:15;7780:4;7777:1;7770:15;7796:125;7861:9;;;7882:10;;;7879:36;;;7895:18;;:::i;9300:245::-;9367:6;9420:2;9408:9;9399:7;9395:23;9391:32;9388:52;;;9436:1;9433;9426:12;9388:52;9468:9;9462:16;9487:28;9509:5;9487:28;:::i;11322:1020::-;11498:3;11527:1;11560:6;11554:13;11590:36;11616:9;11590:36;:::i;:::-;11645:1;11662:18;;;11689:133;;;;11836:1;11831:356;;;;11655:532;;11689:133;-1:-1:-1;;11722:24:1;;11710:37;;11795:14;;11788:22;11776:35;;11767:45;;;-1:-1:-1;11689:133:1;;11831:356;11862:6;11859:1;11852:17;11892:4;11937:2;11934:1;11924:16;11962:1;11976:165;11990:6;11987:1;11984:13;11976:165;;;12068:14;;12055:11;;;12048:35;12111:16;;;;12005:10;;11976:165;;;11980:3;;;12170:6;12165:3;12161:16;12154:23;;11655:532;;;;;12218:6;12212:13;12234:68;12293:8;12288:3;12281:4;12273:6;12269:17;12234:68;:::i;:::-;12318:18;;11322:1020;-1:-1:-1;;;;11322:1020:1:o;12347:545::-;12449:2;12444:3;12441:11;12438:448;;;12485:1;12510:5;12506:2;12499:17;12555:4;12551:2;12541:19;12625:2;12613:10;12609:19;12606:1;12602:27;12596:4;12592:38;12661:4;12649:10;12646:20;12643:47;;;-1:-1:-1;12684:4:1;12643:47;12739:2;12734:3;12730:12;12727:1;12723:20;12717:4;12713:31;12703:41;;12794:82;12812:2;12805:5;12802:13;12794:82;;;12857:17;;;12838:1;12827:13;12794:82;;13068:1352;13194:3;13188:10;13221:18;13213:6;13210:30;13207:56;;;13243:18;;:::i;:::-;13272:97;13362:6;13322:38;13354:4;13348:11;13322:38;:::i;:::-;13316:4;13272:97;:::i;:::-;13424:4;;13488:2;13477:14;;13505:1;13500:663;;;;14207:1;14224:6;14221:89;;;-1:-1:-1;14276:19:1;;;14270:26;14221:89;-1:-1:-1;;13025:1:1;13021:11;;;13017:24;13013:29;13003:40;13049:1;13045:11;;;13000:57;14323:81;;13470:944;;13500:663;11269:1;11262:14;;;11306:4;11293:18;;-1:-1:-1;;13536:20:1;;;13654:236;13668:7;13665:1;13662:14;13654:236;;;13757:19;;;13751:26;13736:42;;13849:27;;;;13817:1;13805:14;;;;13684:19;;13654:236;;;13658:3;13918:6;13909:7;13906:19;13903:201;;;13979:19;;;13973:26;-1:-1:-1;;14062:1:1;14058:14;;;14074:3;14054:24;14050:37;14046:42;14031:58;14016:74;;13903:201;-1:-1:-1;;;;;14150:1:1;14134:14;;;14130:22;14117:36;;-1:-1:-1;13068:1352:1:o;15546:135::-;15585:3;15606:17;;;15603:43;;15626:18;;:::i;:::-;-1:-1:-1;15673:1:1;15662:13;;15546:135::o;15686:127::-;15747:10;15742:3;15738:20;15735:1;15728:31;15778:4;15775:1;15768:15;15802:4;15799:1;15792:15;15818:120;15858:1;15884;15874:35;;15889:18;;:::i;:::-;-1:-1:-1;15923:9:1;;15818:120::o;15943:128::-;16010:9;;;16031:11;;;16028:37;;;16045:18;;:::i;16076:112::-;16108:1;16134;16124:35;;16139:18;;:::i;:::-;-1:-1:-1;16173:9:1;;16076:112::o;16193:127::-;16254:10;16249:3;16245:20;16242:1;16235:31;16285:4;16282:1;16275:15;16309:4;16306:1;16299:15;16325:489;-1:-1:-1;;;;;16594:15:1;;;16576:34;;16646:15;;16641:2;16626:18;;16619:43;16693:2;16678:18;;16671:34;;;16741:3;16736:2;16721:18;;16714:31;;;16519:4;;16762:46;;16788:19;;16780:6;16762:46;:::i;:::-;16754:54;16325:489;-1:-1:-1;;;;;;16325:489:1:o;16819:249::-;16888:6;16941:2;16929:9;16920:7;16916:23;16912:32;16909:52;;;16957:1;16954;16947:12;16909:52;16989:9;16983:16;17008:30;17032:5;17008:30;:::i

Swarm Source

ipfs://5be227bbcbbeb329efc1d5309b05582dd6297bd95a239cacd570145c8fb24374
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.