ETH Price: $3,709.45 (+3.28%)

Token

ERC-20: SpaceFreaks.gg (FREAKS)
 

Overview

Max Total Supply

429 FREAKS

Holders

78

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 FREAKS
0x474b8ceaad690a8c9ca8840efe48917d642e9e53
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:
SpaceFreaksgg

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-10
*/

// SpaceFreaks.gg
// 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 SpaceFreaksgg 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 = 5;
    uint public _SUPPLY_PER_WALLET = 5;
    uint public _MINT_PRICE = 0.01 * (10**18); 

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

    address public _FEE_RECEIVER = address(0x6FAA2178C9ec2574c1DfF9A18D9b0EBc1Adb5803);

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

    constructor() ERC721A("SpaceFreaks.gg", "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
    {
        uint _PRICE = _MINT_PRICE * quantity;

        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.");
        require(msg.value >= _PRICE, "Ether value does not match desired mint price for the given quantity!");

        payable(_FEE_RECEIVER).transfer(_PRICE);

        if (msg.value > _PRICE) {
            payable(msg.sender).transfer(msg.value - _PRICE);
        }

        _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":"_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

6080604052600b805460ff19169055611388600c556005600d819055600e55662386f26fc10000600f55670de0b6b3a7640000601155601280546001600160a01b031916736faa2178c9ec2574c1dff9a18d9b0ebc1adb58031790553480156200006857600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600e81526020016d5370616365467265616b732e676760901b81525060405180604001604052806006815260200165465245414b5360d01b815250620000e0620000da6200025760201b60201c565b6200025b565b6003620000ee838262000350565b506004620000fd828262000350565b506000600190815560095550506daaeb6d7670e522a718067333cd4e3b156200024f5780156200019d57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200017e57600080fd5b505af115801562000193573d6000803e3d6000fd5b505050506200024f565b6001600160a01b03821615620001ee5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000163565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200023557600080fd5b505af11580156200024a573d6000803e3d6000fd5b505050505b50506200041c565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002d657607f821691505b602082108103620002f757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034b57600081815260208120601f850160051c81016020861015620003265750805b601f850160051c820191505b81811015620003475782815560010162000332565b5050505b505050565b81516001600160401b038111156200036c576200036c620002ab565b62000384816200037d8454620002c1565b84620002fd565b602080601f831160018114620003bc5760008415620003a35750858301515b600019600386901b1c1916600185901b17855562000347565b600085815260208120601f198616915b82811015620003ed57888601518255948401946001909101908401620003cc565b50858210156200040c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612198806200042c6000396000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063c87b56dd116100ab578063dbddb26a1161006f578063dbddb26a146105e2578063e985e9c5146105f7578063efdcd97414610617578063f2fde38b14610637578063f77777471461065757600080fd5b8063c87b56dd14610552578063d44e6d2014610572578063d7d1e57e14610588578063d8fae8c5146105a8578063dab4c827146105c257600080fd5b806395d89b41116100f257806395d89b41146104de578063a22cb465146104f3578063a3ca1f8114610513578063b88d4fde14610529578063c2047ebf1461053c57600080fd5b8063715018a61461046b578063818668d7146104805780638da5cb5b146104a057806391267659146104be57600080fd5b80632b26a6bf116101b1578063479ba2da11610175578063479ba2da146103cb578063502fb3ff146103eb5780636352211e1461040b5780636730cfa01461042b57806370a082311461044b57600080fd5b80632b26a6bf146103425780632b7e66d2146103625780633bdf774c1461038257806342842e0e1461039857806342966c68146103ab57600080fd5b80630d730acc116101f85780630d730acc146102ce57806318160ddd146102e15780631fbe829c1461030457806323b872dd1461031a57806324600fc31461032d57600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611b05565b610677565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746106c9565b6040516102569190611b72565b34801561028d57600080fd5b506102a161029c366004611b85565b61075b565b6040516001600160a01b039091168152602001610256565b6102cc6102c7366004611bba565b61079f565b005b6102cc6102dc366004611b85565b61083f565b3480156102ed57600080fd5b50600254600154035b604051908152602001610256565b34801561031057600080fd5b506102f6600e5481565b6102cc610328366004611be4565b610b68565b34801561033957600080fd5b506102cc610c21565b34801561034e57600080fd5b506102cc61035d366004611b85565b610d13565b34801561036e57600080fd5b506010546102a1906001600160a01b031681565b34801561038e57600080fd5b506102f6600c5481565b6102cc6103a6366004611be4565b610d20565b3480156103b757600080fd5b506102cc6103c6366004611b85565b610dd4565b3480156103d757600080fd5b506102cc6103e6366004611c20565b610de2565b3480156103f757600080fd5b506102cc610406366004611b85565b610e0c565b34801561041757600080fd5b506102a1610426366004611b85565b610f35565b34801561043757600080fd5b506012546102a1906001600160a01b031681565b34801561045757600080fd5b506102f6610466366004611c20565b610f40565b34801561047757600080fd5b506102cc610f8f565b34801561048c57600080fd5b506102cc61049b366004611c49565b610fa3565b3480156104ac57600080fd5b506000546001600160a01b03166102a1565b3480156104ca57600080fd5b506102cc6104d9366004611b85565b610fbe565b3480156104ea57600080fd5b50610274610fcb565b3480156104ff57600080fd5b506102cc61050e366004611c66565b610fda565b34801561051f57600080fd5b506102f6600f5481565b6102cc610537366004611d29565b611046565b34801561054857600080fd5b506102f660115481565b34801561055e57600080fd5b5061027461056d366004611b85565b611101565b34801561057e57600080fd5b506102f6600d5481565b34801561059457600080fd5b506102cc6105a3366004611da5565b611135565b3480156105b457600080fd5b50600b5461024a9060ff1681565b3480156105ce57600080fd5b506102cc6105dd366004611b85565b61114d565b3480156105ee57600080fd5b5061027461115a565b34801561060357600080fd5b5061024a610612366004611dee565b6111e8565b34801561062357600080fd5b506102cc610632366004611c20565b611216565b34801561064357600080fd5b506102cc610652366004611c20565b611240565b34801561066357600080fd5b506102cc610672366004611e21565b6112b6565b60006301ffc9a760e01b6001600160e01b0319831614806106a857506380ac58cd60e01b6001600160e01b03198316145b806106c35750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546106d890611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461070490611e44565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b600061076682611331565b610783576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006107aa82610f35565b9050336001600160a01b038216146107e3576107c681336111e8565b6107e3576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146108935760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036108e55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088a565b6002600955600f546000906108fb908390611e94565b600b5490915060ff166109445760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420737461727465642160781b604482015260640161088a565b600c54826109556002546001540390565b61095f9190611eab565b111561099f5760405162461bcd60e51b815260206004820152600f60248201526e4d696e7420636f6d706c657465642160881b604482015260640161088a565b600d548211156109f15760405162461bcd60e51b815260206004820152601f60248201527f547269656420746f206d696e74206f766572206261746368206c696d69742e00604482015260640161088a565b600e54826109fe33610f40565b610a089190611eab565b1115610a565760405162461bcd60e51b815260206004820181905260248201527f547269656420746f206d696e74206f7665722077616c6c6574206c696d69742e604482015260640161088a565b80341015610ada5760405162461bcd60e51b815260206004820152604560248201527f45746865722076616c756520646f6573206e6f74206d6174636820646573697260448201527f6564206d696e7420707269636520666f722074686520676976656e207175616e606482015264746974792160d81b608482015260a40161088a565b6012546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b14573d6000803e3d6000fd5b5080341115610b5557336108fc610b2b8334611ebe565b6040518115909202916000818181858888f19350505050158015610b53573d6000803e3d6000fd5b505b610b5f3383611359565b50506001600955565b6daaeb6d7670e522a718067333cd4e3b15610c1157604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf29190611ed1565b610c1157604051633b79c77360e21b815233600482015260240161088a565b610c1c838383611373565b505050565b610c29611504565b600260095403610c7b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088a565b6002600955604051600090339047908381818185875af1925050503d8060008114610cc2576040519150601f19603f3d011682016040523d82523d6000602084013e610cc7565b606091505b5050905080610d0b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161088a565b506001600955565b610d1b611504565b600d55565b6daaeb6d7670e522a718067333cd4e3b15610dc957604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa9190611ed1565b610dc957604051633b79c77360e21b815233600482015260240161088a565b610c1c83838361155e565b610ddf816001611579565b50565b610dea611504565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b33610e1682610f35565b6001600160a01b031614610e6c5760405162461bcd60e51b815260206004820181905260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865204e46542e604482015260640161088a565b6010546012546011546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef9190611ed1565b506011546040805183815233602082015280820192909252517f1bf4c2301fe31c472236d04b38da322696352ecd6d828b681dbbfb87f13e68cb9181900360600190a150565b60006106c3826116b2565b60006001600160a01b038216610f69576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b610f97611504565b610fa16000611720565b565b610fab611504565b600b805460ff1916911515919091179055565b610fc6611504565b600e55565b6060600480546106d890611e44565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6daaeb6d7670e522a718067333cd4e3b156110ef57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af11580156110ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d09190611ed1565b6110ef57604051633b79c77360e21b815233600482015260240161088a565b6110fb84848484611770565b50505050565b6060600a61110e836117b4565b60405160200161111f929190611eee565b6040516020818303038152906040529050919050565b61113d611504565b600a6111498282611fbb565b5050565b611155611504565b601155565b600a805461116790611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461119390611e44565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b505050505081565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61121e611504565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b611248611504565b6001600160a01b0381166112ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088a565b610ddf81611720565b6112be611504565b600c54826112cf6002546001540390565b6112d99190611eab565b11156113275760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520667265616b7320696e2073746f636b210000000000000000604482015260640161088a565b6111498183611359565b6000600154821080156106c3575050600090815260056020526040902054600160e01b161590565b6111498282604051806020016040528060008152506118bd565b600061137e826116b2565b9050836001600160a01b0316816001600160a01b0316146113b15760405162a1148160e81b815260040160405180910390fd5b600082815260076020526040902080546113dd8187335b6001600160a01b039081169116811491141790565b611408576113eb86336111e8565b61140857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661142f57604051633a954ecd60e21b815260040160405180910390fd5b801561143a57600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b841690036114cc576001840160008181526005602052604081205490036114ca5760015481146114ca5760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061214383398151915260405160405180910390a45b505050505050565b6000546001600160a01b03163314610fa15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088a565b610c1c83838360405180602001604052806000815250611046565b6000611584836116b2565b9050806000806115a286600090815260076020526040902080549091565b9150915084156115e2576115b78184336113c8565b6115e2576115c583336111e8565b6115e257604051632ce44b5f60e11b815260040160405180910390fd5b80156115ed57600082555b6001600160a01b038316600081815260066020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260056020526040812091909155600160e11b8516900361167b576001860160008181526005602052604081205490036116795760015481146116795760008181526005602052604090208590555b505b60405186906000906001600160a01b03861690600080516020612143833981519152908390a4505060028054600101905550505050565b6000816001548110156117075760008181526005602052604081205490600160e01b82169003611705575b806000036116fe5750600019016000818152600560205260409020546116dd565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61177b848484610b68565b6001600160a01b0383163b156110fb576117978484848461192a565b6110fb576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036117db5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561180557806117ef8161207b565b91506117fe9050600a836120aa565b91506117df565b60008167ffffffffffffffff81111561182057611820611c9d565b6040519080825280601f01601f19166020018201604052801561184a576020820181803683370190505b5090505b84156118b55761185f600183611ebe565b915061186c600a866120be565b611877906030611eab565b60f81b81838151811061188c5761188c6120d2565b60200101906001600160f81b031916908160001a9053506118ae600a866120aa565b945061184e565b949350505050565b6118c78383611a15565b6001600160a01b0383163b15610c1c576001548281035b6118f1600086838060010194508661192a565b61190e576040516368d2bf6b60e11b815260040160405180910390fd5b8181106118de57816001541461192357600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061195f9033908990889088906004016120e8565b6020604051808303816000875af192505050801561199a575060408051601f3d908101601f1916820190925261199791810190612125565b60015b6119f8573d8080156119c8576040519150601f19603f3d011682016040523d82523d6000602084013e6119cd565b606091505b5080516000036119f0576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001546000829003611a3a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b178317905582840190839083906000805160206121438339815191528180a4600183015b818114611ac55780836000600080516020612143833981519152600080a4600101611a9f565b5081600003611ae657604051622e076360e81b815260040160405180910390fd5b60015550505050565b6001600160e01b031981168114610ddf57600080fd5b600060208284031215611b1757600080fd5b81356116fe81611aef565b60005b83811015611b3d578181015183820152602001611b25565b50506000910152565b60008151808452611b5e816020860160208601611b22565b601f01601f19169290920160200192915050565b6020815260006116fe6020830184611b46565b600060208284031215611b9757600080fd5b5035919050565b80356001600160a01b0381168114611bb557600080fd5b919050565b60008060408385031215611bcd57600080fd5b611bd683611b9e565b946020939093013593505050565b600080600060608486031215611bf957600080fd5b611c0284611b9e565b9250611c1060208501611b9e565b9150604084013590509250925092565b600060208284031215611c3257600080fd5b6116fe82611b9e565b8015158114610ddf57600080fd5b600060208284031215611c5b57600080fd5b81356116fe81611c3b565b60008060408385031215611c7957600080fd5b611c8283611b9e565b91506020830135611c9281611c3b565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611cce57611cce611c9d565b604051601f8501601f19908116603f01168101908282118183101715611cf657611cf6611c9d565b81604052809350858152868686011115611d0f57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611d3f57600080fd5b611d4885611b9e565b9350611d5660208601611b9e565b925060408501359150606085013567ffffffffffffffff811115611d7957600080fd5b8501601f81018713611d8a57600080fd5b611d9987823560208401611cb3565b91505092959194509250565b600060208284031215611db757600080fd5b813567ffffffffffffffff811115611dce57600080fd5b8201601f81018413611ddf57600080fd5b6118b584823560208401611cb3565b60008060408385031215611e0157600080fd5b611e0a83611b9e565b9150611e1860208401611b9e565b90509250929050565b60008060408385031215611e3457600080fd5b82359150611e1860208401611b9e565b600181811c90821680611e5857607f821691505b602082108103611e7857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c3576106c3611e7e565b808201808211156106c3576106c3611e7e565b818103818111156106c3576106c3611e7e565b600060208284031215611ee357600080fd5b81516116fe81611c3b565b6000808454611efc81611e44565b60018281168015611f145760018114611f2957611f58565b60ff1984168752821515830287019450611f58565b8860005260208060002060005b85811015611f4f5781548a820152908401908201611f36565b50505082870194505b505050508351611f6c818360208801611b22565b01949350505050565b601f821115610c1c57600081815260208120601f850160051c81016020861015611f9c5750805b601f850160051c820191505b818110156114fc57828155600101611fa8565b815167ffffffffffffffff811115611fd557611fd5611c9d565b611fe981611fe38454611e44565b84611f75565b602080601f83116001811461201e57600084156120065750858301515b600019600386901b1c1916600185901b1785556114fc565b600085815260208120601f198616915b8281101561204d5788860151825594840194600190910190840161202e565b508582101561206b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161208d5761208d611e7e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120b9576120b9612094565b500490565b6000826120cd576120cd612094565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061211b90830184611b46565b9695505050505050565b60006020828403121561213757600080fd5b81516116fe81611aef56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122028b409df4b5e414018fb673171b86a38fde4ed71afb93470fef9ffbff7dd65c964736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102255760003560e01c8063715018a611610123578063c87b56dd116100ab578063dbddb26a1161006f578063dbddb26a146105e2578063e985e9c5146105f7578063efdcd97414610617578063f2fde38b14610637578063f77777471461065757600080fd5b8063c87b56dd14610552578063d44e6d2014610572578063d7d1e57e14610588578063d8fae8c5146105a8578063dab4c827146105c257600080fd5b806395d89b41116100f257806395d89b41146104de578063a22cb465146104f3578063a3ca1f8114610513578063b88d4fde14610529578063c2047ebf1461053c57600080fd5b8063715018a61461046b578063818668d7146104805780638da5cb5b146104a057806391267659146104be57600080fd5b80632b26a6bf116101b1578063479ba2da11610175578063479ba2da146103cb578063502fb3ff146103eb5780636352211e1461040b5780636730cfa01461042b57806370a082311461044b57600080fd5b80632b26a6bf146103425780632b7e66d2146103625780633bdf774c1461038257806342842e0e1461039857806342966c68146103ab57600080fd5b80630d730acc116101f85780630d730acc146102ce57806318160ddd146102e15780631fbe829c1461030457806323b872dd1461031a57806324600fc31461032d57600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611b05565b610677565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746106c9565b6040516102569190611b72565b34801561028d57600080fd5b506102a161029c366004611b85565b61075b565b6040516001600160a01b039091168152602001610256565b6102cc6102c7366004611bba565b61079f565b005b6102cc6102dc366004611b85565b61083f565b3480156102ed57600080fd5b50600254600154035b604051908152602001610256565b34801561031057600080fd5b506102f6600e5481565b6102cc610328366004611be4565b610b68565b34801561033957600080fd5b506102cc610c21565b34801561034e57600080fd5b506102cc61035d366004611b85565b610d13565b34801561036e57600080fd5b506010546102a1906001600160a01b031681565b34801561038e57600080fd5b506102f6600c5481565b6102cc6103a6366004611be4565b610d20565b3480156103b757600080fd5b506102cc6103c6366004611b85565b610dd4565b3480156103d757600080fd5b506102cc6103e6366004611c20565b610de2565b3480156103f757600080fd5b506102cc610406366004611b85565b610e0c565b34801561041757600080fd5b506102a1610426366004611b85565b610f35565b34801561043757600080fd5b506012546102a1906001600160a01b031681565b34801561045757600080fd5b506102f6610466366004611c20565b610f40565b34801561047757600080fd5b506102cc610f8f565b34801561048c57600080fd5b506102cc61049b366004611c49565b610fa3565b3480156104ac57600080fd5b506000546001600160a01b03166102a1565b3480156104ca57600080fd5b506102cc6104d9366004611b85565b610fbe565b3480156104ea57600080fd5b50610274610fcb565b3480156104ff57600080fd5b506102cc61050e366004611c66565b610fda565b34801561051f57600080fd5b506102f6600f5481565b6102cc610537366004611d29565b611046565b34801561054857600080fd5b506102f660115481565b34801561055e57600080fd5b5061027461056d366004611b85565b611101565b34801561057e57600080fd5b506102f6600d5481565b34801561059457600080fd5b506102cc6105a3366004611da5565b611135565b3480156105b457600080fd5b50600b5461024a9060ff1681565b3480156105ce57600080fd5b506102cc6105dd366004611b85565b61114d565b3480156105ee57600080fd5b5061027461115a565b34801561060357600080fd5b5061024a610612366004611dee565b6111e8565b34801561062357600080fd5b506102cc610632366004611c20565b611216565b34801561064357600080fd5b506102cc610652366004611c20565b611240565b34801561066357600080fd5b506102cc610672366004611e21565b6112b6565b60006301ffc9a760e01b6001600160e01b0319831614806106a857506380ac58cd60e01b6001600160e01b03198316145b806106c35750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546106d890611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461070490611e44565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b600061076682611331565b610783576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006107aa82610f35565b9050336001600160a01b038216146107e3576107c681336111e8565b6107e3576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146108935760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036108e55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088a565b6002600955600f546000906108fb908390611e94565b600b5490915060ff166109445760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420737461727465642160781b604482015260640161088a565b600c54826109556002546001540390565b61095f9190611eab565b111561099f5760405162461bcd60e51b815260206004820152600f60248201526e4d696e7420636f6d706c657465642160881b604482015260640161088a565b600d548211156109f15760405162461bcd60e51b815260206004820152601f60248201527f547269656420746f206d696e74206f766572206261746368206c696d69742e00604482015260640161088a565b600e54826109fe33610f40565b610a089190611eab565b1115610a565760405162461bcd60e51b815260206004820181905260248201527f547269656420746f206d696e74206f7665722077616c6c6574206c696d69742e604482015260640161088a565b80341015610ada5760405162461bcd60e51b815260206004820152604560248201527f45746865722076616c756520646f6573206e6f74206d6174636820646573697260448201527f6564206d696e7420707269636520666f722074686520676976656e207175616e606482015264746974792160d81b608482015260a40161088a565b6012546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b14573d6000803e3d6000fd5b5080341115610b5557336108fc610b2b8334611ebe565b6040518115909202916000818181858888f19350505050158015610b53573d6000803e3d6000fd5b505b610b5f3383611359565b50506001600955565b6daaeb6d7670e522a718067333cd4e3b15610c1157604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf29190611ed1565b610c1157604051633b79c77360e21b815233600482015260240161088a565b610c1c838383611373565b505050565b610c29611504565b600260095403610c7b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088a565b6002600955604051600090339047908381818185875af1925050503d8060008114610cc2576040519150601f19603f3d011682016040523d82523d6000602084013e610cc7565b606091505b5050905080610d0b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161088a565b506001600955565b610d1b611504565b600d55565b6daaeb6d7670e522a718067333cd4e3b15610dc957604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa9190611ed1565b610dc957604051633b79c77360e21b815233600482015260240161088a565b610c1c83838361155e565b610ddf816001611579565b50565b610dea611504565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b33610e1682610f35565b6001600160a01b031614610e6c5760405162461bcd60e51b815260206004820181905260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865204e46542e604482015260640161088a565b6010546012546011546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef9190611ed1565b506011546040805183815233602082015280820192909252517f1bf4c2301fe31c472236d04b38da322696352ecd6d828b681dbbfb87f13e68cb9181900360600190a150565b60006106c3826116b2565b60006001600160a01b038216610f69576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b610f97611504565b610fa16000611720565b565b610fab611504565b600b805460ff1916911515919091179055565b610fc6611504565b600e55565b6060600480546106d890611e44565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6daaeb6d7670e522a718067333cd4e3b156110ef57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af11580156110ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d09190611ed1565b6110ef57604051633b79c77360e21b815233600482015260240161088a565b6110fb84848484611770565b50505050565b6060600a61110e836117b4565b60405160200161111f929190611eee565b6040516020818303038152906040529050919050565b61113d611504565b600a6111498282611fbb565b5050565b611155611504565b601155565b600a805461116790611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461119390611e44565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b505050505081565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61121e611504565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b611248611504565b6001600160a01b0381166112ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088a565b610ddf81611720565b6112be611504565b600c54826112cf6002546001540390565b6112d99190611eab565b11156113275760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520667265616b7320696e2073746f636b210000000000000000604482015260640161088a565b6111498183611359565b6000600154821080156106c3575050600090815260056020526040902054600160e01b161590565b6111498282604051806020016040528060008152506118bd565b600061137e826116b2565b9050836001600160a01b0316816001600160a01b0316146113b15760405162a1148160e81b815260040160405180910390fd5b600082815260076020526040902080546113dd8187335b6001600160a01b039081169116811491141790565b611408576113eb86336111e8565b61140857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661142f57604051633a954ecd60e21b815260040160405180910390fd5b801561143a57600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b841690036114cc576001840160008181526005602052604081205490036114ca5760015481146114ca5760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061214383398151915260405160405180910390a45b505050505050565b6000546001600160a01b03163314610fa15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088a565b610c1c83838360405180602001604052806000815250611046565b6000611584836116b2565b9050806000806115a286600090815260076020526040902080549091565b9150915084156115e2576115b78184336113c8565b6115e2576115c583336111e8565b6115e257604051632ce44b5f60e11b815260040160405180910390fd5b80156115ed57600082555b6001600160a01b038316600081815260066020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260056020526040812091909155600160e11b8516900361167b576001860160008181526005602052604081205490036116795760015481146116795760008181526005602052604090208590555b505b60405186906000906001600160a01b03861690600080516020612143833981519152908390a4505060028054600101905550505050565b6000816001548110156117075760008181526005602052604081205490600160e01b82169003611705575b806000036116fe5750600019016000818152600560205260409020546116dd565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61177b848484610b68565b6001600160a01b0383163b156110fb576117978484848461192a565b6110fb576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036117db5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561180557806117ef8161207b565b91506117fe9050600a836120aa565b91506117df565b60008167ffffffffffffffff81111561182057611820611c9d565b6040519080825280601f01601f19166020018201604052801561184a576020820181803683370190505b5090505b84156118b55761185f600183611ebe565b915061186c600a866120be565b611877906030611eab565b60f81b81838151811061188c5761188c6120d2565b60200101906001600160f81b031916908160001a9053506118ae600a866120aa565b945061184e565b949350505050565b6118c78383611a15565b6001600160a01b0383163b15610c1c576001548281035b6118f1600086838060010194508661192a565b61190e576040516368d2bf6b60e11b815260040160405180910390fd5b8181106118de57816001541461192357600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061195f9033908990889088906004016120e8565b6020604051808303816000875af192505050801561199a575060408051601f3d908101601f1916820190925261199791810190612125565b60015b6119f8573d8080156119c8576040519150601f19603f3d011682016040523d82523d6000602084013e6119cd565b606091505b5080516000036119f0576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001546000829003611a3a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b178317905582840190839083906000805160206121438339815191528180a4600183015b818114611ac55780836000600080516020612143833981519152600080a4600101611a9f565b5081600003611ae657604051622e076360e81b815260040160405180910390fd5b60015550505050565b6001600160e01b031981168114610ddf57600080fd5b600060208284031215611b1757600080fd5b81356116fe81611aef565b60005b83811015611b3d578181015183820152602001611b25565b50506000910152565b60008151808452611b5e816020860160208601611b22565b601f01601f19169290920160200192915050565b6020815260006116fe6020830184611b46565b600060208284031215611b9757600080fd5b5035919050565b80356001600160a01b0381168114611bb557600080fd5b919050565b60008060408385031215611bcd57600080fd5b611bd683611b9e565b946020939093013593505050565b600080600060608486031215611bf957600080fd5b611c0284611b9e565b9250611c1060208501611b9e565b9150604084013590509250925092565b600060208284031215611c3257600080fd5b6116fe82611b9e565b8015158114610ddf57600080fd5b600060208284031215611c5b57600080fd5b81356116fe81611c3b565b60008060408385031215611c7957600080fd5b611c8283611b9e565b91506020830135611c9281611c3b565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611cce57611cce611c9d565b604051601f8501601f19908116603f01168101908282118183101715611cf657611cf6611c9d565b81604052809350858152868686011115611d0f57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611d3f57600080fd5b611d4885611b9e565b9350611d5660208601611b9e565b925060408501359150606085013567ffffffffffffffff811115611d7957600080fd5b8501601f81018713611d8a57600080fd5b611d9987823560208401611cb3565b91505092959194509250565b600060208284031215611db757600080fd5b813567ffffffffffffffff811115611dce57600080fd5b8201601f81018413611ddf57600080fd5b6118b584823560208401611cb3565b60008060408385031215611e0157600080fd5b611e0a83611b9e565b9150611e1860208401611b9e565b90509250929050565b60008060408385031215611e3457600080fd5b82359150611e1860208401611b9e565b600181811c90821680611e5857607f821691505b602082108103611e7857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c3576106c3611e7e565b808201808211156106c3576106c3611e7e565b818103818111156106c3576106c3611e7e565b600060208284031215611ee357600080fd5b81516116fe81611c3b565b6000808454611efc81611e44565b60018281168015611f145760018114611f2957611f58565b60ff1984168752821515830287019450611f58565b8860005260208060002060005b85811015611f4f5781548a820152908401908201611f36565b50505082870194505b505050508351611f6c818360208801611b22565b01949350505050565b601f821115610c1c57600081815260208120601f850160051c81016020861015611f9c5750805b601f850160051c820191505b818110156114fc57828155600101611fa8565b815167ffffffffffffffff811115611fd557611fd5611c9d565b611fe981611fe38454611e44565b84611f75565b602080601f83116001811461201e57600084156120065750858301515b600019600386901b1c1916600185901b1785556114fc565b600085815260208120601f198616915b8281101561204d5788860151825594840194600190910190840161202e565b508582101561206b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161208d5761208d611e7e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120b9576120b9612094565b500490565b6000826120cd576120cd612094565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061211b90830184611b46565b9695505050505050565b60006020828403121561213757600080fd5b81516116fe81611aef56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122028b409df4b5e414018fb673171b86a38fde4ed71afb93470fef9ffbff7dd65c964736f6c63430008120033

Deployed Bytecode Sourcemap

36644:4767:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14492:239;;;;;;;;;;-1:-1:-1;14492:239:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;14492:239:0;;;;;;;;14739:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18315:218::-;;;;;;;;;;-1:-1:-1;18315:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;18315:218:0;1533:203:1;17899:408:0;;;;;;:::i;:::-;;:::i;:::-;;38395:821;;;;;;:::i;:::-;;:::i;12857:180::-;;;;;;;;;;-1:-1:-1;12988:12:0;;12972:13;;:28;12857:180;;;2324:25:1;;;2312:2;2297:18;12857:180:0;2178:177:1;36905:34:0;;;;;;;;;;;;;;;;37724:185;;;;;;:::i;:::-;;:::i;39459:191::-;;;;;;;;;;;;;:::i;40043:99::-;;;;;;;;;;-1:-1:-1;40043:99:0;;;;;:::i;:::-;;:::i;36997:24::-;;;;;;;;;;-1:-1:-1;36997:24:0;;;;-1:-1:-1;;;;;36997:24:0;;;36825:35;;;;;;;;;;;;;;;;37917:193;;;;;;:::i;:::-;;:::i;33819:94::-;;;;;;;;;;-1:-1:-1;33819:94:0;;;;;:::i;:::-;;:::i;40814:111::-;;;;;;;;;;-1:-1:-1;40814:111:0;;;;;:::i;:::-;;:::i;40999:407::-;;;;;;;;;;-1:-1:-1;40999:407:0;;;;;:::i;:::-;;:::i;15387:152::-;;;;;;;;;;-1:-1:-1;15387:152:0;;;;;:::i;:::-;;:::i;37079:82::-;;;;;;;;;;-1:-1:-1;37079:82:0;;;;-1:-1:-1;;;;;37079:82:0;;;13322:233;;;;;;;;;;-1:-1:-1;13322:233:0;;;;;:::i;:::-;;:::i;897:103::-;;;;;;;;;;;;;:::i;39283:95::-;;;;;;;;;;-1:-1:-1;39283:95:0;;;;;:::i;:::-;;:::i;662:87::-;;;;;;;;;;-1:-1:-1;708:7:0;735:6;-1:-1:-1;;;;;735:6:0;662:87;;39874:108;;;;;;;;;;-1:-1:-1;39874:108:0;;;;;:::i;:::-;;:::i;14847:104::-;;;;;;;;;;;;;:::i;18541:234::-;;;;;;;;;;-1:-1:-1;18541:234:0;;;;;:::i;:::-;;:::i;36946:41::-;;;;;;;;;;;;;;;;38118:218;;;;;;:::i;:::-;;:::i;37028:42::-;;;;;;;;;;;;;;;;40196:189;;;;;;;;;;-1:-1:-1;40196:189:0;;;;;:::i;:::-;;:::i;36867:31::-;;;;;;;;;;;;;;;;39707:102;;;;;;;;;;-1:-1:-1;39707:102:0;;;;;:::i;:::-;;:::i;36785:33::-;;;;;;;;;;-1:-1:-1;36785:33:0;;;;;;;;40460:90;;;;;;;;;;-1:-1:-1;40460:90:0;;;;;:::i;:::-;;:::i;36754:22::-;;;;;;;;;;;;;:::i;18783:164::-;;;;;;;;;;-1:-1:-1;18783:164:0;;;;;:::i;:::-;;:::i;40631:101::-;;;;;;;;;;-1:-1:-1;40631:101:0;;;;;:::i;:::-;;:::i;1010:201::-;;;;;;;;;;-1:-1:-1;1010:201:0;;;;;:::i;:::-;;:::i;37337:250::-;;;;;;;;;;-1:-1:-1;37337:250:0;;;;;:::i;:::-;;:::i;14492:239::-;14577:4;-1:-1:-1;;;;;;;;;14614:25:0;;;;:67;;-1:-1:-1;;;;;;;;;;14656:25:0;;;14614:67;:109;;;-1:-1:-1;;;;;;;;;;14698:25:0;;;14614:109;14594:129;14492:239;-1:-1:-1;;14492:239:0:o;14739:100::-;14793:13;14826:5;14819:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14739:100;:::o;18315:218::-;18391:7;18416:16;18424:7;18416;:16::i;:::-;18411:64;;18441:34;;-1:-1:-1;;;18441:34:0;;;;;;;;;;;18411:64;-1:-1:-1;18495:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;18495:30:0;;18315:218::o;17899:408::-;17988:13;18004:16;18012:7;18004;:16::i;:::-;17988:32;-1:-1:-1;29386:10:0;-1:-1:-1;;;;;18037:28:0;;;18033:175;;18085:44;18102:5;29386:10;18783:164;:::i;18085:44::-;18080:128;;18157:35;;-1:-1:-1;;;18157:35:0;;;;;;;;;;;18080:128;18220:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;18220:35:0;-1:-1:-1;;;;;18220:35:0;;;;;;;;;18271:28;;18220:24;;18271:28;;;;;;;17977:330;17899:408;;:::o;38395:821::-;37638:9;37651:10;37638:23;37630:66;;;;-1:-1:-1;;;37630:66:0;;6801:2:1;37630:66:0;;;6783:21:1;6840:2;6820:18;;;6813:30;6879:32;6859:18;;;6852:60;6929:18;;37630:66:0;;;;;;;;;1571:1:::1;1721:7;;:19:::0;1713:63:::1;;;::::0;-1:-1:-1;;;1713:63:0;;7160:2:1;1713:63:0::1;::::0;::::1;7142:21:1::0;7199:2;7179:18;;;7172:30;7238:33;7218:18;;;7211:61;7289:18;;1713:63:0::1;6958:355:1::0;1713:63:0::1;1571:1;1789:7;:18:::0;38536:11:::2;::::0;38522::::2;::::0;38536:22:::2;::::0;38550:8;;38536:22:::2;:::i;:::-;38579:13;::::0;38522:36;;-1:-1:-1;38579:13:0::2;;38571:43;;;::::0;-1:-1:-1;;;38571:43:0;;7825:2:1;38571:43:0::2;::::0;::::2;7807:21:1::0;7864:2;7844:18;;;7837:30;-1:-1:-1;;;7883:18:1;;;7876:47;7940:18;;38571:43:0::2;7623:341:1::0;38571:43:0::2;38661:16;;38649:8;38633:13;12988:12:::0;;12972:13;;:28;;12857:180;38633:13:::2;:24;;;;:::i;:::-;:44;;38625:72;;;::::0;-1:-1:-1;;;38625:72:0;;8301:2:1;38625:72:0::2;::::0;::::2;8283:21:1::0;8340:2;8320:18;;;8313:30;-1:-1:-1;;;8359:18:1;;;8352:45;8414:18;;38625:72:0::2;8099:339:1::0;38625:72:0::2;38728:15;;38716:8;:27;;38708:71;;;::::0;-1:-1:-1;;;38708:71:0;;8645:2:1;38708:71:0::2;::::0;::::2;8627:21:1::0;8684:2;8664:18;;;8657:30;8723:33;8703:18;;;8696:61;8774:18;;38708:71:0::2;8443:355:1::0;38708:71:0::2;38834:18;;38822:8;38798:21;38808:10;38798:9;:21::i;:::-;:32;;;;:::i;:::-;:54;;38790:99;;;::::0;-1:-1:-1;;;38790:99:0;;9005:2:1;38790:99:0::2;::::0;::::2;8987:21:1::0;;;9024:18;;;9017:30;9083:34;9063:18;;;9056:62;9135:18;;38790:99:0::2;8803:356:1::0;38790:99:0::2;38921:6;38908:9;:19;;38900:101;;;::::0;-1:-1:-1;;;38900:101:0;;9366:2:1;38900:101:0::2;::::0;::::2;9348:21:1::0;9405:2;9385:18;;;9378:30;9444:34;9424:18;;;9417:62;9515:34;9495:18;;;9488:62;-1:-1:-1;;;9566:19:1;;;9559:36;9612:19;;38900:101:0::2;9164:473:1::0;38900:101:0::2;39022:13;::::0;39014:39:::2;::::0;-1:-1:-1;;;;;39022:13:0;;::::2;::::0;39014:39;::::2;;;::::0;39046:6;;39022:13:::2;39014:39:::0;39022:13;39014:39;39046:6;39022:13;39014:39;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;39082:6;39070:9;:18;39066:99;;;39113:10;39105:48;39134:18;39146:6:::0;39134:9:::2;:18;:::i;:::-;39105:48;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;39066:99;39177:31;39187:10;39199:8;39177:9;:31::i;:::-;-1:-1:-1::0;;1527:1:0::1;1834:7;:22:::0;38395:821::o;37724:185::-;30272:42;31015:43;:47;31011:225;;31084:67;;-1:-1:-1;;;31084:67:0;;31133:4;31084:67;;;9987:34:1;31140:10:0;10037:18:1;;;10030:43;30272:42:0;;31084:40;;9922:18:1;;31084:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31079:146;;31179:30;;-1:-1:-1;;;31179:30:0;;31198:10;31179:30;;;1679:51:1;1652:18;;31179:30:0;1533:203:1;31079:146:0;37864:37:::1;37883:4;37889:2;37893:7;37864:18;:37::i;:::-;37724:185:::0;;;:::o;39459:191::-;621:13;:11;:13::i;:::-;1571:1:::1;1721:7;;:19:::0;1713:63:::1;;;::::0;-1:-1:-1;;;1713:63:0;;7160:2:1;1713:63:0::1;::::0;::::1;7142:21:1::0;7199:2;7179:18;;;7172:30;7238:33;7218:18;;;7211:61;7289:18;;1713:63:0::1;6958:355:1::0;1713:63:0::1;1571:1;1789:7;:18:::0;39546:49:::2;::::0;39528:12:::2;::::0;39546:10:::2;::::0;39569:21:::2;::::0;39528:12;39546:49;39528:12;39546:49;39569:21;39546:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39527:68;;;39614:7;39606:36;;;::::0;-1:-1:-1;;;39606:36:0;;10746:2:1;39606:36:0::2;::::0;::::2;10728:21:1::0;10785:2;10765:18;;;10758:30;-1:-1:-1;;;10804:18:1;;;10797:46;10860:18;;39606:36:0::2;10544:340:1::0;39606:36:0::2;-1:-1:-1::0;1527:1:0::1;1834:7;:22:::0;39459:191::o;40043:99::-;621:13;:11;:13::i;:::-;40112:15:::1;:22:::0;40043:99::o;37917:193::-;30272:42;31015:43;:47;31011:225;;31084:67;;-1:-1:-1;;;31084:67:0;;31133:4;31084:67;;;9987:34:1;31140:10:0;10037:18:1;;;10030:43;30272:42:0;;31084:40;;9922:18:1;;31084:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31079:146;;31179:30;;-1:-1:-1;;;31179:30:0;;31198:10;31179:30;;;1679:51:1;1652:18;;31179:30:0;1533:203:1;31079:146:0;38061:41:::1;38084:4;38090:2;38094:7;38061:22;:41::i;33819:94::-:0;33885:20;33891:7;33900:4;33885:5;:20::i;:::-;33819:94;:::o;40814:111::-;621:13;:11;:13::i;:::-;40884:10:::1;:33:::0;;-1:-1:-1;;;;;;40884:33:0::1;-1:-1:-1::0;;;;;40884:33:0;;;::::1;::::0;;;::::1;::::0;;40814:111::o;40999:407::-;41131:10;41110:17;41118:8;41110:7;:17::i;:::-;-1:-1:-1;;;;;41110:31:0;;41102:76;;;;-1:-1:-1;;;41102:76:0;;11091:2:1;41102:76:0;;;11073:21:1;;;11110:18;;;11103:30;11169:34;11149:18;;;11142:62;11221:18;;41102:76:0;10889:356:1;41102:76:0;41221:10;;41257:13;;41272:12;;41221:64;;-1:-1:-1;;;41221:64:0;;41245:10;41221:64;;;11490:34:1;-1:-1:-1;;;;;41257:13:0;;;11540:18:1;;;11533:43;11592:18;;;11585:34;;;;41221:10:0;;;:23;;11425:18:1;;41221:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41375:12:0;;41303:95;;;11832:25:1;;;41350:10:0;11888:2:1;11873:18;;11866:60;11942:18;;;11935:34;;;;41303:95:0;;;;;;11820:2:1;41303:95:0;;;40999:407;:::o;15387:152::-;15459:7;15502:27;15521:7;15502:18;:27::i;13322:233::-;13394:7;-1:-1:-1;;;;;13418:19:0;;13414:60;;13446:28;;-1:-1:-1;;;13446:28:0;;;;;;;;;;;13414:60;-1:-1:-1;;;;;;13492:25:0;;;;;:18;:25;;;;;;11130:13;13492:55;;13322:233::o;897:103::-;621:13;:11;:13::i;:::-;962:30:::1;989:1;962:18;:30::i;:::-;897:103::o:0;39283:95::-;621:13;:11;:13::i;:::-;39351::::1;:19:::0;;-1:-1:-1;;39351:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39283:95::o;39874:108::-;621:13;:11;:13::i;:::-;39949:18:::1;:25:::0;39874:108::o;14847:104::-;14903:13;14936:7;14929:14;;;;;:::i;18541:234::-;29386:10;18636:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;18636:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;18636:60:0;;;;;;;;;;18712:55;;540:41:1;;;18636:49:0;;29386:10;18712:55;;513:18:1;18712:55:0;;;;;;;18541:234;;:::o;38118:218::-;30272:42;31015:43;:47;31011:225;;31084:67;;-1:-1:-1;;;31084:67:0;;31133:4;31084:67;;;9987:34:1;31140:10:0;10037:18:1;;;10030:43;30272:42:0;;31084:40;;9922:18:1;;31084:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31079:146;;31179:30;;-1:-1:-1;;;31179:30:0;;31198:10;31179:30;;;1679:51:1;1652:18;;31179:30:0;1533:203:1;31079:146:0;38281:47:::1;38304:4;38310:2;38314:7;38323:4;38281:22;:47::i;:::-;38118:218:::0;;;;:::o;40196:189::-;40282:13;40339:8;40349:26;40366:8;40349:16;:26::i;:::-;40322:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40308:69;;40196:189;;;:::o;39707:102::-;621:13;:11;:13::i;:::-;39782:8:::1;:19;39793:8:::0;39782;:19:::1;:::i;:::-;;39707:102:::0;:::o;40460:90::-;621:13;:11;:13::i;:::-;40524:12:::1;:18:::0;40460:90::o;36754:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18783:164::-;-1:-1:-1;;;;;18904:25:0;;;18880:4;18904:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;18783:164::o;40631:101::-;621:13;:11;:13::i;:::-;40696::::1;:28:::0;;-1:-1:-1;;;;;;40696:28:0::1;-1:-1:-1::0;;;;;40696:28:0;;;::::1;::::0;;;::::1;::::0;;40631:101::o;1010:201::-;621:13;:11;:13::i;:::-;-1:-1:-1;;;;;1099:22:0;::::1;1091:73;;;::::0;-1:-1:-1;;;1091:73:0;;15411:2:1;1091:73:0::1;::::0;::::1;15393:21:1::0;15450:2;15430:18;;;15423:30;15489:34;15469:18;;;15462:62;-1:-1:-1;;;15540:18:1;;;15533:36;15586:19;;1091:73:0::1;15209:402:1::0;1091:73:0::1;1175:28;1194:8;1175:18;:28::i;37337:250::-:0;621:13;:11;:13::i;:::-;37469:16:::1;;37457:8;37441:13;12988:12:::0;;12972:13;;:28;;12857:180;37441:13:::1;:24;;;;:::i;:::-;:44;;37419:118;;;::::0;-1:-1:-1;;;37419:118:0;;15818:2:1;37419:118:0::1;::::0;::::1;15800:21:1::0;15857:2;15837:18;;;15830:30;15896:26;15876:18;;;15869:54;15940:18;;37419:118:0::1;15616:348:1::0;37419:118:0::1;37550:29;37560:8;37570;37550:9;:29::i;18955:282::-:0;19020:4;19110:13;;19100:7;:23;19057:153;;;;-1:-1:-1;;19161:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;19161:44:0;:49;;18955:282::o;26480:112::-;26557:27;26567:2;26571:8;26557:27;;;;;;;;;;;;:9;:27::i;20050:1649::-;20192:27;20222;20241:7;20222:18;:27::i;:::-;20192:57;;20307:4;-1:-1:-1;;;;;20266:45:0;20282:19;-1:-1:-1;;;;;20266:45:0;;20262:86;;20320:28;;-1:-1:-1;;;20320:28:0;;;;;;;;;;;20262:86;20362:27;19863:24;;;:15;:24;;;;;19998:26;;20471:68;19998:26;20513:4;29386:10;20519:19;-1:-1:-1;;;;;19510:32:0;;;19453:28;;19571:20;;19593:30;;19568:56;;19245:397;20471:68;20466:180;;20559:43;20576:4;29386:10;18783:164;:::i;20559:43::-;20554:92;;20611:35;;-1:-1:-1;;;20611:35:0;;;;;;;;;;;20554:92;-1:-1:-1;;;;;20663:16:0;;20659:52;;20688:23;;-1:-1:-1;;;20688:23:0;;;;;;;;;;;20659:52;20807:15;20804:85;;;20872:1;20851:19;20844:30;20804:85;-1:-1:-1;;;;;20941:24:0;;;;;;;:18;:24;;;;;;20939:26;;-1:-1:-1;;20939:26:0;;;20982:22;;;;;;;;;20980:24;;-1:-1:-1;20980:24:0;;;17520:11;17495:23;17491:41;17478:63;-1:-1:-1;;;17478:63:0;21021:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;21217:47:0;;:52;;21213:370;;21322:1;21312:11;;21290:19;21348:30;;;:17;:30;;;;;;:35;;21344:224;;21429:13;;21414:11;:28;21410:139;;21473:30;;;;:17;:30;;;;;:52;;;21410:139;21271:312;21213:370;21630:7;21626:2;-1:-1:-1;;;;;21611:27:0;21620:4;-1:-1:-1;;;;;21611:27:0;-1:-1:-1;;;;;;;;;;;21611:27:0;;;;;;;;;21649:42;20181:1518;;;20050:1649;;;:::o;757:132::-;708:7;735:6;-1:-1:-1;;;;;735:6:0;29386:10;821:23;813:68;;;;-1:-1:-1;;;813:68:0;;16171:2:1;813:68:0;;;16153:21:1;;;16190:18;;;16183:30;16249:34;16229:18;;;16222:62;16301:18;;813:68:0;15969:356:1;21707:193:0;21853:39;21870:4;21876:2;21880:7;21853:39;;;;;;;;;;;;:16;:39::i;26697:1651::-;26777:27;26807;26826:7;26807:18;:27::i;:::-;26777:57;-1:-1:-1;26777:57:0;26847:12;;26969:35;26996:7;19752:27;19863:24;;;:15;:24;;;;;19998:26;;19863:24;;19650:392;26969:35;26912:92;;;;27021:13;27017:232;;;27058:68;27083:15;27100:4;29386:10;27106:19;29299:105;27058:68;27053:184;;27150:43;27167:4;29386:10;18783:164;:::i;27150:43::-;27145:92;;27202:35;;-1:-1:-1;;;27202:35:0;;;;;;;;;;;27145:92;27352:15;27349:85;;;27417:1;27396:19;27389:30;27349:85;-1:-1:-1;;;;;27484:24:0;;;;;;:18;:24;;;;;:60;;27512:32;27484:60;;;17520:11;17495:23;17491:41;17478:63;-1:-1:-1;;;17478:63:0;27561:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;27787:47:0;;:52;;27783:370;;27892:1;27882:11;;27860:19;27918:30;;;:17;:30;;;;;;:35;;27914:224;;27999:13;;27984:11;:28;27980:139;;28043:30;;;;:17;:30;;;;;:52;;;27980:139;27841:312;27783:370;28181:35;;28208:7;;28204:1;;-1:-1:-1;;;;;28181:35:0;;;-1:-1:-1;;;;;;;;;;;28181:35:0;28204:1;;28181:35;-1:-1:-1;;28315:12:0;:14;;;;;;-1:-1:-1;;;;26697:1651:0:o;16094:633::-;16161:7;16196;16298:13;;16291:4;:20;16287:373;;;16336:14;16353:23;;;:17;:23;;;;;;;-1:-1:-1;;;16405:24:0;;:29;;16401:240;;16465:113;16472:6;16482:1;16472:11;16465:113;;-1:-1:-1;;;16543:6:0;16525:25;;;;:17;:25;;;;;;16465:113;;;16611:6;16094:633;-1:-1:-1;;;16094:633:0:o;16401:240::-;16313:347;16287:373;16688:31;;-1:-1:-1;;;16688:31:0;;;;;;;;;;;1219:191;1293:16;1312:6;;-1:-1:-1;;;;;1329:17:0;;;-1:-1:-1;;;;;;1329:17:0;;;;;;1362:40;;1312:6;;;;;;;1362:40;;1293:16;1362:40;1282:128;1219:191;:::o;21908:407::-;22083:31;22096:4;22102:2;22106:7;22083:12;:31::i;:::-;-1:-1:-1;;;;;22129:14:0;;;:19;22125:183;;22168:56;22199:4;22205:2;22209:7;22218:5;22168:30;:56::i;:::-;22163:145;;22252:40;;-1:-1:-1;;;22252:40:0;;;;;;;;;;;2036:534;2092:13;2124:5;2133:1;2124:10;2120:53;;-1:-1:-1;;2151:10:0;;;;;;;;;;;;-1:-1:-1;;;2151:10:0;;;;;2036:534::o;2120:53::-;2198:5;2183:12;2239:78;2246:9;;2239:78;;2272:8;;;;:::i;:::-;;-1:-1:-1;2295:10:0;;-1:-1:-1;2303:2:0;2295:10;;:::i;:::-;;;2239:78;;;2327:19;2359:6;2349:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2349:17:0;;2327:39;;2377:154;2384:10;;2377:154;;2411:11;2421:1;2411:11;;:::i;:::-;;-1:-1:-1;2480:10:0;2488:2;2480:5;:10;:::i;:::-;2467:24;;:2;:24;:::i;:::-;2454:39;;2437:6;2444;2437:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2437:56:0;;;;;;;;-1:-1:-1;2508:11:0;2517:2;2508:11;;:::i;:::-;;;2377:154;;;2555:6;2036:534;-1:-1:-1;;;;2036:534:0:o;25783:689::-;25914:19;25920:2;25924:8;25914:5;:19::i;:::-;-1:-1:-1;;;;;25975:14:0;;;:19;25971:483;;26029:13;;26077:14;;;26110:233;26141:62;26180:1;26184:2;26188:7;;;;;;26197:5;26141:30;:62::i;:::-;26136:167;;26239:40;;-1:-1:-1;;;26239:40:0;;;;;;;;;;;26136:167;26338:3;26330:5;:11;26110:233;;26425:3;26408:13;;:20;26404:34;;26430:8;;;26404:34;25996:458;;25783:689;;;:::o;22656:716::-;22840:88;;-1:-1:-1;;;22840:88:0;;22819:4;;-1:-1:-1;;;;;22840:45:0;;;;;:88;;29386:10;;22907:4;;22913:7;;22922:5;;22840:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22840:88:0;;;;;;;;-1:-1:-1;;22840:88:0;;;;;;;;;;;;:::i;:::-;;;22836:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23123:6;:13;23140:1;23123:18;23119:235;;23169:40;;-1:-1:-1;;;23169:40:0;;;;;;;;;;;23119:235;23312:6;23306:13;23297:6;23293:2;23289:15;23282:38;22836:529;-1:-1:-1;;;;;;22999:64:0;-1:-1:-1;;;22999:64:0;;-1:-1:-1;22656:716:0;;;;;;:::o;23380:1436::-;23476:13;;23453:20;23504:13;;;23500:44;;23526:18;;-1:-1:-1;;;23526:18:0;;;;;;;;;;;23500:44;-1:-1:-1;;;;;23658:22:0;;;;;;:18;:22;;;;11201:2;23658:22;;;:71;;23696:32;23684:45;;23658:71;;;23746:31;;;:17;:31;;;;;-1:-1:-1;17857:15:0;;17831:24;17827:46;17520:11;17495:23;17491:41;17488:52;17478:63;;23746:173;;23981:23;;;;23746:31;;23658:22;;-1:-1:-1;;;;;;;;;;;23658:22:0;;24108:209;24397:1;24383:12;24379:20;24337:279;24438:3;24429:7;24426:16;24337:279;;24589:7;24579:8;24576:1;-1:-1:-1;;;;;;;;;;;24546:1:0;24543;24538:59;24491:1;24478:15;24337:279;;;24341:77;24649:8;24661:1;24649:13;24645:45;;24671:19;;-1:-1:-1;;;24671:19:0;;;;;;;;;;;24645:45;24707:13;:19;-1:-1:-1;37724: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;7318:127::-;7379:10;7374:3;7370:20;7367:1;7360:31;7410:4;7407:1;7400:15;7434:4;7431:1;7424:15;7450:168;7523:9;;;7554;;7571:15;;;7565:22;;7551:37;7541:71;;7592:18;;:::i;7969:125::-;8034:9;;;8055:10;;;8052:36;;;8068:18;;:::i;9642:128::-;9709:9;;;9730:11;;;9727:37;;;9744:18;;:::i;10084:245::-;10151:6;10204:2;10192:9;10183:7;10179:23;10175:32;10172:52;;;10220:1;10217;10210:12;10172:52;10252:9;10246:16;10271:28;10293:5;10271:28;:::i;12106:1020::-;12282:3;12311:1;12344:6;12338:13;12374:36;12400:9;12374:36;:::i;:::-;12429:1;12446:18;;;12473:133;;;;12620:1;12615:356;;;;12439:532;;12473:133;-1:-1:-1;;12506:24:1;;12494:37;;12579:14;;12572:22;12560:35;;12551:45;;;-1:-1:-1;12473:133:1;;12615:356;12646:6;12643:1;12636:17;12676:4;12721:2;12718:1;12708:16;12746:1;12760:165;12774:6;12771:1;12768:13;12760:165;;;12852:14;;12839:11;;;12832:35;12895:16;;;;12789:10;;12760:165;;;12764:3;;;12954:6;12949:3;12945:16;12938:23;;12439:532;;;;;13002:6;12996:13;13018:68;13077:8;13072:3;13065:4;13057:6;13053:17;13018:68;:::i;:::-;13102:18;;12106:1020;-1:-1:-1;;;;12106:1020:1:o;13131:545::-;13233:2;13228:3;13225:11;13222:448;;;13269:1;13294:5;13290:2;13283:17;13339:4;13335:2;13325:19;13409:2;13397:10;13393:19;13390:1;13386:27;13380:4;13376:38;13445:4;13433:10;13430:20;13427:47;;;-1:-1:-1;13468:4:1;13427:47;13523:2;13518:3;13514:12;13511:1;13507:20;13501:4;13497:31;13487:41;;13578:82;13596:2;13589:5;13586:13;13578:82;;;13641:17;;;13622:1;13611:13;13578:82;;13852:1352;13978:3;13972:10;14005:18;13997:6;13994:30;13991:56;;;14027:18;;:::i;:::-;14056:97;14146:6;14106:38;14138:4;14132:11;14106:38;:::i;:::-;14100:4;14056:97;:::i;:::-;14208:4;;14272:2;14261:14;;14289:1;14284:663;;;;14991:1;15008:6;15005:89;;;-1:-1:-1;15060:19:1;;;15054:26;15005:89;-1:-1:-1;;13809:1:1;13805:11;;;13801:24;13797:29;13787:40;13833:1;13829:11;;;13784:57;15107:81;;14254:944;;14284:663;12053:1;12046:14;;;12090:4;12077:18;;-1:-1:-1;;14320:20:1;;;14438:236;14452:7;14449:1;14446:14;14438:236;;;14541:19;;;14535:26;14520:42;;14633:27;;;;14601:1;14589:14;;;;14468:19;;14438:236;;;14442:3;14702:6;14693:7;14690:19;14687:201;;;14763:19;;;14757:26;-1:-1:-1;;14846:1:1;14842:14;;;14858:3;14838:24;14834:37;14830:42;14815:58;14800:74;;14687:201;-1:-1:-1;;;;;14934:1:1;14918:14;;;14914:22;14901:36;;-1:-1:-1;13852:1352:1:o;16330:135::-;16369:3;16390:17;;;16387:43;;16410:18;;:::i;:::-;-1:-1:-1;16457:1:1;16446:13;;16330:135::o;16470:127::-;16531:10;16526:3;16522:20;16519:1;16512:31;16562:4;16559:1;16552:15;16586:4;16583:1;16576:15;16602:120;16642:1;16668;16658:35;;16673:18;;:::i;:::-;-1:-1:-1;16707:9:1;;16602:120::o;16727:112::-;16759:1;16785;16775:35;;16790:18;;:::i;:::-;-1:-1:-1;16824:9:1;;16727:112::o;16844:127::-;16905:10;16900:3;16896:20;16893:1;16886:31;16936:4;16933:1;16926:15;16960:4;16957:1;16950:15;16976:489;-1:-1:-1;;;;;17245:15:1;;;17227:34;;17297:15;;17292:2;17277:18;;17270:43;17344:2;17329:18;;17322:34;;;17392:3;17387:2;17372:18;;17365:31;;;17170:4;;17413:46;;17439:19;;17431:6;17413:46;:::i;:::-;17405:54;16976:489;-1:-1:-1;;;;;;16976:489:1:o;17470:249::-;17539:6;17592:2;17580:9;17571:7;17567:23;17563:32;17560:52;;;17608:1;17605;17598:12;17560:52;17640:9;17634:16;17659:30;17683:5;17659:30;:::i

Swarm Source

ipfs://28b409df4b5e414018fb673171b86a38fde4ed71afb93470fef9ffbff7dd65c9
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.