ETH Price: $3,619.74 (-7.03%)

Token

SpaceX NFT (spaceX NFT)
 

Overview

Max Total Supply

4,170 spaceX NFT

Holders

805

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 spaceX NFT
0x81171741444f468702cb2922430ec8355d2e0a11
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:
SPACEXNFT

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-17
*/

// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

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

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol

// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] +=
                quantity *
                ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] +=
                quantity *
                ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

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

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

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

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

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: contracts/1.sol

pragma solidity >=0.8.6;

contract SPACEXNFT is ERC721A, Ownable {
    uint256 public price = 0 ether;
    uint256 public maxSupply = 4170;
    uint256 public maxTx = 5;

    bool private mintOpen = false;

    string internal baseTokenURI =
        "https://green-active-beaver-186.mypinata.cloud/ipfs/QmT3PCnq1nmsqXtLVySPgxqi2t57KAbdhbpP4LcQV8nrm8/box.gif?";

    constructor() ERC721A("SpaceX NFT", "spaceX NFT") {}

    function toggleMint() external onlyOwner {
        mintOpen = !mintOpen;
    }

    function setPrice(uint256 newPrice) external onlyOwner {
        price = newPrice;
    }

    function setBaseTokenURI(string calldata _uri) external onlyOwner {
        baseTokenURI = _uri;
    }

    function setMaxSupply(uint256 newSupply) external onlyOwner {
        maxSupply = newSupply;
    }

    function setMaxTx(uint256 newMax) external onlyOwner {
        maxTx = newMax;
    }

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

    function buyTo(address to, uint256 qty) external onlyOwner {
        _mintTo(to, qty);
    }

    function buy(uint256 qty) external payable {
        require(mintOpen, "store closed");
        _buy(qty);
    }

    function _buy(uint256 qty) internal {
        require(
            qty <= maxTx && qty > 0,
            "TRANSACTION: qty of mints not alowed"
        );
        //uint free = balanceOf(_msgSender()) == 0 ? 1 : 0;
        // require(msg.value >= price * (qty - free), "PAYMENT: invalid value");
        require(msg.value >= price * qty, "PAYMENT: invalid value");
        _mintTo(_msgSender(), qty);
    }

    function _mintTo(address to, uint256 qty) internal {
        require(
            qty + totalSupply() <= maxSupply,
            "SUPPLY: Value exceeds totalSupply"
        );
        _mint(to, qty);
    }

    function withdraw() external onlyOwner {
        payable(_msgSender()).transfer(address(this).balance);
    }

    function airdrop(address[] calldata _to) external onlyOwner {
        for (uint256 i; i < _to.length; ) {
            _mint(_to[i], 1);

            unchecked {
                i++;
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"buyTo","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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060095561104a600a556005600b556000600c60006101000a81548160ff0219169083151502179055506040518060a00160405280606b815260200162003561606b9139600d908162000059919062000483565b503480156200006757600080fd5b506040518060400160405280600a81526020017f537061636558204e4654000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f737061636558204e4654000000000000000000000000000000000000000000008152508160029081620000e5919062000483565b508060039081620000f7919062000483565b50620001086200013660201b60201c565b600081905550505062000130620001246200013b60201b60201c565b6200014360201b60201c565b6200056a565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028b57607f821691505b602082108103620002a157620002a062000243565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cc565b620003178683620002cc565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003646200035e62000358846200032f565b62000339565b6200032f565b9050919050565b6000819050919050565b620003808362000343565b620003986200038f826200036b565b848454620002d9565b825550505050565b600090565b620003af620003a0565b620003bc81848462000375565b505050565b5b81811015620003e457620003d8600082620003a5565b600181019050620003c2565b5050565b601f8211156200043357620003fd81620002a7565b6200040884620002bc565b8101602085101562000418578190505b620004306200042785620002bc565b830182620003c1565b50505b505050565b600082821c905092915050565b6000620004586000198460080262000438565b1980831691505092915050565b600062000473838362000445565b9150826002028217905092915050565b6200048e8262000209565b67ffffffffffffffff811115620004aa57620004a962000214565b5b620004b6825462000272565b620004c3828285620003e8565b600060209050601f831160018114620004fb5760008415620004e6578287015190505b620004f2858262000465565b86555062000562565b601f1984166200050b86620002a7565b60005b8281101562000535578489015182556001820191506020850194506020810190506200050e565b8683101562000555578489015162000551601f89168262000445565b8355505b6001600288020188555050505b505050505050565b612fe7806200057a6000396000f3fe6080604052600436106101c25760003560e01c8063729ad39e116100f7578063b88d4fde11610095578063d5abeb0111610064578063d5abeb0114610602578063d96a094a1461062d578063e985e9c514610649578063f2fde38b14610686576101c2565b8063b88d4fde1461055c578063bc33718214610585578063c87b56dd146105ae578063d3dd5fe0146105eb576101c2565b806391b7f5ed116100d157806391b7f5ed146104b457806395d89b41146104dd578063a035b1fe14610508578063a22cb46514610533576101c2565b8063729ad39e146104355780637437681e1461045e5780638da5cb5b14610489576101c2565b806330176e13116101645780636352211e1161013e5780636352211e1461037b5780636f8b44b0146103b857806370a08231146103e1578063715018a61461041e576101c2565b806330176e13146103125780633ccfd60b1461033b57806342842e0e14610352576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806309bd4c311461029557806318160ddd146102be57806323b872dd146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e9919061211b565b6106af565b6040516101fb9190612163565b60405180910390f35b34801561021057600080fd5b50610219610741565b604051610226919061220e565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612266565b6107d3565b60405161026391906122d4565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061231b565b61084f565b005b3480156102a157600080fd5b506102bc60048036038101906102b7919061231b565b6109f5565b005b3480156102ca57600080fd5b506102d3610a7f565b6040516102e0919061236a565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612385565b610a96565b005b34801561031e57600080fd5b506103396004803603810190610334919061243d565b610aa6565b005b34801561034757600080fd5b50610350610b38565b005b34801561035e57600080fd5b5061037960048036038101906103749190612385565b610c04565b005b34801561038757600080fd5b506103a2600480360381019061039d9190612266565b610c24565b6040516103af91906122d4565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190612266565b610c36565b005b3480156103ed57600080fd5b506104086004803603810190610403919061248a565b610cbc565b604051610415919061236a565b60405180910390f35b34801561042a57600080fd5b50610433610d74565b005b34801561044157600080fd5b5061045c6004803603810190610457919061250d565b610dfc565b005b34801561046a57600080fd5b50610473610eca565b604051610480919061236a565b60405180910390f35b34801561049557600080fd5b5061049e610ed0565b6040516104ab91906122d4565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190612266565b610efa565b005b3480156104e957600080fd5b506104f2610f80565b6040516104ff919061220e565b60405180910390f35b34801561051457600080fd5b5061051d611012565b60405161052a919061236a565b60405180910390f35b34801561053f57600080fd5b5061055a60048036038101906105559190612586565b611018565b005b34801561056857600080fd5b50610583600480360381019061057e91906126f6565b61118f565b005b34801561059157600080fd5b506105ac60048036038101906105a79190612266565b611202565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190612266565b611288565b6040516105e2919061220e565b60405180910390f35b3480156105f757600080fd5b50610600611326565b005b34801561060e57600080fd5b506106176113ce565b604051610624919061236a565b60405180910390f35b61064760048036038101906106429190612266565b6113d4565b005b34801561065557600080fd5b50610670600480360381019061066b9190612779565b61142f565b60405161067d9190612163565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a8919061248a565b6114c3565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610750906127e8565b80601f016020809104026020016040519081016040528092919081815260200182805461077c906127e8565b80156107c95780601f1061079e576101008083540402835291602001916107c9565b820191906000526020600020905b8154815290600101906020018083116107ac57829003601f168201915b5050505050905090565b60006107de826115ba565b610814576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085a82611619565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108c1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108e06116e5565b73ffffffffffffffffffffffffffffffffffffffff16146109435761090c816109076116e5565b61142f565b610942576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6109fd6116ed565b73ffffffffffffffffffffffffffffffffffffffff16610a1b610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6890612865565b60405180910390fd5b610a7b82826116f5565b5050565b6000610a8961175a565b6001546000540303905090565b610aa183838361175f565b505050565b610aae6116ed565b73ffffffffffffffffffffffffffffffffffffffff16610acc610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1990612865565b60405180910390fd5b8181600d9182610b33929190612a3c565b505050565b610b406116ed565b73ffffffffffffffffffffffffffffffffffffffff16610b5e610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab90612865565b60405180910390fd5b610bbc6116ed565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c01573d6000803e3d6000fd5b50565b610c1f8383836040518060200160405280600081525061118f565b505050565b6000610c2f82611619565b9050919050565b610c3e6116ed565b73ffffffffffffffffffffffffffffffffffffffff16610c5c610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990612865565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d23576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d7c6116ed565b73ffffffffffffffffffffffffffffffffffffffff16610d9a610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790612865565b60405180910390fd5b610dfa6000611b06565b565b610e046116ed565b73ffffffffffffffffffffffffffffffffffffffff16610e22610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f90612865565b60405180910390fd5b60005b82829050811015610ec557610eb8838383818110610e9c57610e9b612b0c565b5b9050602002016020810190610eb1919061248a565b6001611bcc565b8080600101915050610e7b565b505050565b600b5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f026116ed565b73ffffffffffffffffffffffffffffffffffffffff16610f20610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90612865565b60405180910390fd5b8060098190555050565b606060038054610f8f906127e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbb906127e8565b80156110085780601f10610fdd57610100808354040283529160200191611008565b820191906000526020600020905b815481529060010190602001808311610feb57829003601f168201915b5050505050905090565b60095481565b6110206116e5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611084576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110916116e5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661113e6116e5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111839190612163565b60405180910390a35050565b61119a84848461175f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146111fc576111c584848484611d9e565b6111fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61120a6116ed565b73ffffffffffffffffffffffffffffffffffffffff16611228610ed0565b73ffffffffffffffffffffffffffffffffffffffff161461127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590612865565b60405180910390fd5b80600b8190555050565b6060611293826115ba565b6112c9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d3611eee565b905060008151036112f3576040518060200160405280600081525061131e565b806112fd84611f80565b60405160200161130e929190612b77565b6040516020818303038152906040525b915050919050565b61132e6116ed565b73ffffffffffffffffffffffffffffffffffffffff1661134c610ed0565b73ffffffffffffffffffffffffffffffffffffffff16146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139990612865565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b600a5481565b600c60009054906101000a900460ff16611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a90612be7565b60405180910390fd5b61142c81611fda565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114cb6116ed565b73ffffffffffffffffffffffffffffffffffffffff166114e9610ed0565b73ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153690612865565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590612c79565b60405180910390fd5b6115b781611b06565b50565b6000816115c561175a565b111580156115d4575060005482105b8015611612575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061162861175a565b116116ae576000548110156116ad5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036116ab575b600081036116a1576004600083600190039350838152602001908152602001600020549050611677565b80925050506116e0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b600a54611700610a7f565b8261170b9190612cc8565b111561174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390612d6e565b60405180910390fd5b6117568282611bcc565b5050565b600090565b600061176a82611619565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117d1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166117f26116e5565b73ffffffffffffffffffffffffffffffffffffffff16148061182157506118208561181b6116e5565b61142f565b5b80611866575061182f6116e5565b73ffffffffffffffffffffffffffffffffffffffff1661184e846107d3565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061189f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611905576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611912858585600161208f565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611a0f86612095565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611a975760006001840190506000600460008381526020019081526020016000205403611a95576000548114611a94578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aff858585600161209f565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c38576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203611c72576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c7f600084838561208f565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611ce4600184146120a5565b901b60a042901b611cf485612095565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611d1a57816000819055505050611d99600084838561209f565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dc46116e5565b8786866040518563ffffffff1660e01b8152600401611de69493929190612de3565b6020604051808303816000875af1925050508015611e2257506040513d601f19601f82011682018060405250810190611e1f9190612e44565b60015b611e9b573d8060008114611e52576040519150601f19603f3d011682016040523d82523d6000602084013e611e57565b606091505b506000815103611e93576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054611efd906127e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611f29906127e8565b8015611f765780601f10611f4b57610100808354040283529160200191611f76565b820191906000526020600020905b815481529060010190602001808311611f5957829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611fc657600183039250600a81066030018353600a81049050611fa6565b508181036020830392508083525050919050565b600b548111158015611fec5750600081115b61202b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202290612ee3565b60405180910390fd5b806009546120399190612f03565b34101561207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207290612f91565b60405180910390fd5b61208c6120866116ed565b826116f5565b50565b50505050565b6000819050919050565b50505050565b6000819050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120f8816120c3565b811461210357600080fd5b50565b600081359050612115816120ef565b92915050565b600060208284031215612131576121306120b9565b5b600061213f84828501612106565b91505092915050565b60008115159050919050565b61215d81612148565b82525050565b60006020820190506121786000830184612154565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121b857808201518184015260208101905061219d565b60008484015250505050565b6000601f19601f8301169050919050565b60006121e08261217e565b6121ea8185612189565b93506121fa81856020860161219a565b612203816121c4565b840191505092915050565b6000602082019050818103600083015261222881846121d5565b905092915050565b6000819050919050565b61224381612230565b811461224e57600080fd5b50565b6000813590506122608161223a565b92915050565b60006020828403121561227c5761227b6120b9565b5b600061228a84828501612251565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122be82612293565b9050919050565b6122ce816122b3565b82525050565b60006020820190506122e960008301846122c5565b92915050565b6122f8816122b3565b811461230357600080fd5b50565b600081359050612315816122ef565b92915050565b60008060408385031215612332576123316120b9565b5b600061234085828601612306565b925050602061235185828601612251565b9150509250929050565b61236481612230565b82525050565b600060208201905061237f600083018461235b565b92915050565b60008060006060848603121561239e5761239d6120b9565b5b60006123ac86828701612306565b93505060206123bd86828701612306565b92505060406123ce86828701612251565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126123fd576123fc6123d8565b5b8235905067ffffffffffffffff81111561241a576124196123dd565b5b602083019150836001820283011115612436576124356123e2565b5b9250929050565b60008060208385031215612454576124536120b9565b5b600083013567ffffffffffffffff811115612472576124716120be565b5b61247e858286016123e7565b92509250509250929050565b6000602082840312156124a05761249f6120b9565b5b60006124ae84828501612306565b91505092915050565b60008083601f8401126124cd576124cc6123d8565b5b8235905067ffffffffffffffff8111156124ea576124e96123dd565b5b602083019150836020820283011115612506576125056123e2565b5b9250929050565b60008060208385031215612524576125236120b9565b5b600083013567ffffffffffffffff811115612542576125416120be565b5b61254e858286016124b7565b92509250509250929050565b61256381612148565b811461256e57600080fd5b50565b6000813590506125808161255a565b92915050565b6000806040838503121561259d5761259c6120b9565b5b60006125ab85828601612306565b92505060206125bc85828601612571565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612603826121c4565b810181811067ffffffffffffffff82111715612622576126216125cb565b5b80604052505050565b60006126356120af565b905061264182826125fa565b919050565b600067ffffffffffffffff821115612661576126606125cb565b5b61266a826121c4565b9050602081019050919050565b82818337600083830152505050565b600061269961269484612646565b61262b565b9050828152602081018484840111156126b5576126b46125c6565b5b6126c0848285612677565b509392505050565b600082601f8301126126dd576126dc6123d8565b5b81356126ed848260208601612686565b91505092915050565b600080600080608085870312156127105761270f6120b9565b5b600061271e87828801612306565b945050602061272f87828801612306565b935050604061274087828801612251565b925050606085013567ffffffffffffffff811115612761576127606120be565b5b61276d878288016126c8565b91505092959194509250565b600080604083850312156127905761278f6120b9565b5b600061279e85828601612306565b92505060206127af85828601612306565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061280057607f821691505b602082108103612813576128126127b9565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061284f602083612189565b915061285a82612819565b602082019050919050565b6000602082019050818103600083015261287e81612842565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026128f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128b5565b6128fc86836128b5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061293961293461292f84612230565b612914565b612230565b9050919050565b6000819050919050565b6129538361291e565b61296761295f82612940565b8484546128c2565b825550505050565b600090565b61297c61296f565b61298781848461294a565b505050565b5b818110156129ab576129a0600082612974565b60018101905061298d565b5050565b601f8211156129f0576129c181612890565b6129ca846128a5565b810160208510156129d9578190505b6129ed6129e5856128a5565b83018261298c565b50505b505050565b600082821c905092915050565b6000612a13600019846008026129f5565b1980831691505092915050565b6000612a2c8383612a02565b9150826002028217905092915050565b612a468383612885565b67ffffffffffffffff811115612a5f57612a5e6125cb565b5b612a6982546127e8565b612a748282856129af565b6000601f831160018114612aa35760008415612a91578287013590505b612a9b8582612a20565b865550612b03565b601f198416612ab186612890565b60005b82811015612ad957848901358255600182019150602085019450602081019050612ab4565b86831015612af65784890135612af2601f891682612a02565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b6000612b518261217e565b612b5b8185612b3b565b9350612b6b81856020860161219a565b80840191505092915050565b6000612b838285612b46565b9150612b8f8284612b46565b91508190509392505050565b7f73746f726520636c6f7365640000000000000000000000000000000000000000600082015250565b6000612bd1600c83612189565b9150612bdc82612b9b565b602082019050919050565b60006020820190508181036000830152612c0081612bc4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c63602683612189565b9150612c6e82612c07565b604082019050919050565b60006020820190508181036000830152612c9281612c56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cd382612230565b9150612cde83612230565b9250828201905080821115612cf657612cf5612c99565b5b92915050565b7f535550504c593a2056616c7565206578636565647320746f74616c537570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d58602183612189565b9150612d6382612cfc565b604082019050919050565b60006020820190508181036000830152612d8781612d4b565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612db582612d8e565b612dbf8185612d99565b9350612dcf81856020860161219a565b612dd8816121c4565b840191505092915050565b6000608082019050612df860008301876122c5565b612e0560208301866122c5565b612e12604083018561235b565b8181036060830152612e248184612daa565b905095945050505050565b600081519050612e3e816120ef565b92915050565b600060208284031215612e5a57612e596120b9565b5b6000612e6884828501612e2f565b91505092915050565b7f5452414e53414354494f4e3a20717479206f66206d696e7473206e6f7420616c60008201527f6f77656400000000000000000000000000000000000000000000000000000000602082015250565b6000612ecd602483612189565b9150612ed882612e71565b604082019050919050565b60006020820190508181036000830152612efc81612ec0565b9050919050565b6000612f0e82612230565b9150612f1983612230565b9250828202612f2781612230565b91508282048414831517612f3e57612f3d612c99565b5b5092915050565b7f5041594d454e543a20696e76616c69642076616c756500000000000000000000600082015250565b6000612f7b601683612189565b9150612f8682612f45565b602082019050919050565b60006020820190508181036000830152612faa81612f6e565b905091905056fea2646970667358221220ba9358a3333c7fd415cfeaf44bbd7a353b5474ee22e86f970c20e2b63874d5f964736f6c6343000812003368747470733a2f2f677265656e2d6163746976652d6265617665722d3138362e6d7970696e6174612e636c6f75642f697066732f516d543350436e71316e6d737158744c5679535067787169327435374b41626468627050344c635156386e726d382f626f782e6769663f

Deployed Bytecode

0x6080604052600436106101c25760003560e01c8063729ad39e116100f7578063b88d4fde11610095578063d5abeb0111610064578063d5abeb0114610602578063d96a094a1461062d578063e985e9c514610649578063f2fde38b14610686576101c2565b8063b88d4fde1461055c578063bc33718214610585578063c87b56dd146105ae578063d3dd5fe0146105eb576101c2565b806391b7f5ed116100d157806391b7f5ed146104b457806395d89b41146104dd578063a035b1fe14610508578063a22cb46514610533576101c2565b8063729ad39e146104355780637437681e1461045e5780638da5cb5b14610489576101c2565b806330176e13116101645780636352211e1161013e5780636352211e1461037b5780636f8b44b0146103b857806370a08231146103e1578063715018a61461041e576101c2565b806330176e13146103125780633ccfd60b1461033b57806342842e0e14610352576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806309bd4c311461029557806318160ddd146102be57806323b872dd146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e9919061211b565b6106af565b6040516101fb9190612163565b60405180910390f35b34801561021057600080fd5b50610219610741565b604051610226919061220e565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612266565b6107d3565b60405161026391906122d4565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061231b565b61084f565b005b3480156102a157600080fd5b506102bc60048036038101906102b7919061231b565b6109f5565b005b3480156102ca57600080fd5b506102d3610a7f565b6040516102e0919061236a565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612385565b610a96565b005b34801561031e57600080fd5b506103396004803603810190610334919061243d565b610aa6565b005b34801561034757600080fd5b50610350610b38565b005b34801561035e57600080fd5b5061037960048036038101906103749190612385565b610c04565b005b34801561038757600080fd5b506103a2600480360381019061039d9190612266565b610c24565b6040516103af91906122d4565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190612266565b610c36565b005b3480156103ed57600080fd5b506104086004803603810190610403919061248a565b610cbc565b604051610415919061236a565b60405180910390f35b34801561042a57600080fd5b50610433610d74565b005b34801561044157600080fd5b5061045c6004803603810190610457919061250d565b610dfc565b005b34801561046a57600080fd5b50610473610eca565b604051610480919061236a565b60405180910390f35b34801561049557600080fd5b5061049e610ed0565b6040516104ab91906122d4565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190612266565b610efa565b005b3480156104e957600080fd5b506104f2610f80565b6040516104ff919061220e565b60405180910390f35b34801561051457600080fd5b5061051d611012565b60405161052a919061236a565b60405180910390f35b34801561053f57600080fd5b5061055a60048036038101906105559190612586565b611018565b005b34801561056857600080fd5b50610583600480360381019061057e91906126f6565b61118f565b005b34801561059157600080fd5b506105ac60048036038101906105a79190612266565b611202565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190612266565b611288565b6040516105e2919061220e565b60405180910390f35b3480156105f757600080fd5b50610600611326565b005b34801561060e57600080fd5b506106176113ce565b604051610624919061236a565b60405180910390f35b61064760048036038101906106429190612266565b6113d4565b005b34801561065557600080fd5b50610670600480360381019061066b9190612779565b61142f565b60405161067d9190612163565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a8919061248a565b6114c3565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610750906127e8565b80601f016020809104026020016040519081016040528092919081815260200182805461077c906127e8565b80156107c95780601f1061079e576101008083540402835291602001916107c9565b820191906000526020600020905b8154815290600101906020018083116107ac57829003601f168201915b5050505050905090565b60006107de826115ba565b610814576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085a82611619565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108c1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108e06116e5565b73ffffffffffffffffffffffffffffffffffffffff16146109435761090c816109076116e5565b61142f565b610942576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6109fd6116ed565b73ffffffffffffffffffffffffffffffffffffffff16610a1b610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6890612865565b60405180910390fd5b610a7b82826116f5565b5050565b6000610a8961175a565b6001546000540303905090565b610aa183838361175f565b505050565b610aae6116ed565b73ffffffffffffffffffffffffffffffffffffffff16610acc610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1990612865565b60405180910390fd5b8181600d9182610b33929190612a3c565b505050565b610b406116ed565b73ffffffffffffffffffffffffffffffffffffffff16610b5e610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab90612865565b60405180910390fd5b610bbc6116ed565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c01573d6000803e3d6000fd5b50565b610c1f8383836040518060200160405280600081525061118f565b505050565b6000610c2f82611619565b9050919050565b610c3e6116ed565b73ffffffffffffffffffffffffffffffffffffffff16610c5c610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990612865565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d23576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d7c6116ed565b73ffffffffffffffffffffffffffffffffffffffff16610d9a610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790612865565b60405180910390fd5b610dfa6000611b06565b565b610e046116ed565b73ffffffffffffffffffffffffffffffffffffffff16610e22610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f90612865565b60405180910390fd5b60005b82829050811015610ec557610eb8838383818110610e9c57610e9b612b0c565b5b9050602002016020810190610eb1919061248a565b6001611bcc565b8080600101915050610e7b565b505050565b600b5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f026116ed565b73ffffffffffffffffffffffffffffffffffffffff16610f20610ed0565b73ffffffffffffffffffffffffffffffffffffffff1614610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90612865565b60405180910390fd5b8060098190555050565b606060038054610f8f906127e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbb906127e8565b80156110085780601f10610fdd57610100808354040283529160200191611008565b820191906000526020600020905b815481529060010190602001808311610feb57829003601f168201915b5050505050905090565b60095481565b6110206116e5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611084576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110916116e5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661113e6116e5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111839190612163565b60405180910390a35050565b61119a84848461175f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146111fc576111c584848484611d9e565b6111fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61120a6116ed565b73ffffffffffffffffffffffffffffffffffffffff16611228610ed0565b73ffffffffffffffffffffffffffffffffffffffff161461127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590612865565b60405180910390fd5b80600b8190555050565b6060611293826115ba565b6112c9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d3611eee565b905060008151036112f3576040518060200160405280600081525061131e565b806112fd84611f80565b60405160200161130e929190612b77565b6040516020818303038152906040525b915050919050565b61132e6116ed565b73ffffffffffffffffffffffffffffffffffffffff1661134c610ed0565b73ffffffffffffffffffffffffffffffffffffffff16146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139990612865565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b600a5481565b600c60009054906101000a900460ff16611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a90612be7565b60405180910390fd5b61142c81611fda565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114cb6116ed565b73ffffffffffffffffffffffffffffffffffffffff166114e9610ed0565b73ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153690612865565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590612c79565b60405180910390fd5b6115b781611b06565b50565b6000816115c561175a565b111580156115d4575060005482105b8015611612575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061162861175a565b116116ae576000548110156116ad5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036116ab575b600081036116a1576004600083600190039350838152602001908152602001600020549050611677565b80925050506116e0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b600a54611700610a7f565b8261170b9190612cc8565b111561174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390612d6e565b60405180910390fd5b6117568282611bcc565b5050565b600090565b600061176a82611619565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117d1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166117f26116e5565b73ffffffffffffffffffffffffffffffffffffffff16148061182157506118208561181b6116e5565b61142f565b5b80611866575061182f6116e5565b73ffffffffffffffffffffffffffffffffffffffff1661184e846107d3565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061189f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611905576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611912858585600161208f565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611a0f86612095565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611a975760006001840190506000600460008381526020019081526020016000205403611a95576000548114611a94578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aff858585600161209f565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c38576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203611c72576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c7f600084838561208f565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611ce4600184146120a5565b901b60a042901b611cf485612095565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611d1a57816000819055505050611d99600084838561209f565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dc46116e5565b8786866040518563ffffffff1660e01b8152600401611de69493929190612de3565b6020604051808303816000875af1925050508015611e2257506040513d601f19601f82011682018060405250810190611e1f9190612e44565b60015b611e9b573d8060008114611e52576040519150601f19603f3d011682016040523d82523d6000602084013e611e57565b606091505b506000815103611e93576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054611efd906127e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611f29906127e8565b8015611f765780601f10611f4b57610100808354040283529160200191611f76565b820191906000526020600020905b815481529060010190602001808311611f5957829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611fc657600183039250600a81066030018353600a81049050611fa6565b508181036020830392508083525050919050565b600b548111158015611fec5750600081115b61202b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202290612ee3565b60405180910390fd5b806009546120399190612f03565b34101561207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207290612f91565b60405180910390fd5b61208c6120866116ed565b826116f5565b50565b50505050565b6000819050919050565b50505050565b6000819050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120f8816120c3565b811461210357600080fd5b50565b600081359050612115816120ef565b92915050565b600060208284031215612131576121306120b9565b5b600061213f84828501612106565b91505092915050565b60008115159050919050565b61215d81612148565b82525050565b60006020820190506121786000830184612154565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121b857808201518184015260208101905061219d565b60008484015250505050565b6000601f19601f8301169050919050565b60006121e08261217e565b6121ea8185612189565b93506121fa81856020860161219a565b612203816121c4565b840191505092915050565b6000602082019050818103600083015261222881846121d5565b905092915050565b6000819050919050565b61224381612230565b811461224e57600080fd5b50565b6000813590506122608161223a565b92915050565b60006020828403121561227c5761227b6120b9565b5b600061228a84828501612251565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122be82612293565b9050919050565b6122ce816122b3565b82525050565b60006020820190506122e960008301846122c5565b92915050565b6122f8816122b3565b811461230357600080fd5b50565b600081359050612315816122ef565b92915050565b60008060408385031215612332576123316120b9565b5b600061234085828601612306565b925050602061235185828601612251565b9150509250929050565b61236481612230565b82525050565b600060208201905061237f600083018461235b565b92915050565b60008060006060848603121561239e5761239d6120b9565b5b60006123ac86828701612306565b93505060206123bd86828701612306565b92505060406123ce86828701612251565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126123fd576123fc6123d8565b5b8235905067ffffffffffffffff81111561241a576124196123dd565b5b602083019150836001820283011115612436576124356123e2565b5b9250929050565b60008060208385031215612454576124536120b9565b5b600083013567ffffffffffffffff811115612472576124716120be565b5b61247e858286016123e7565b92509250509250929050565b6000602082840312156124a05761249f6120b9565b5b60006124ae84828501612306565b91505092915050565b60008083601f8401126124cd576124cc6123d8565b5b8235905067ffffffffffffffff8111156124ea576124e96123dd565b5b602083019150836020820283011115612506576125056123e2565b5b9250929050565b60008060208385031215612524576125236120b9565b5b600083013567ffffffffffffffff811115612542576125416120be565b5b61254e858286016124b7565b92509250509250929050565b61256381612148565b811461256e57600080fd5b50565b6000813590506125808161255a565b92915050565b6000806040838503121561259d5761259c6120b9565b5b60006125ab85828601612306565b92505060206125bc85828601612571565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612603826121c4565b810181811067ffffffffffffffff82111715612622576126216125cb565b5b80604052505050565b60006126356120af565b905061264182826125fa565b919050565b600067ffffffffffffffff821115612661576126606125cb565b5b61266a826121c4565b9050602081019050919050565b82818337600083830152505050565b600061269961269484612646565b61262b565b9050828152602081018484840111156126b5576126b46125c6565b5b6126c0848285612677565b509392505050565b600082601f8301126126dd576126dc6123d8565b5b81356126ed848260208601612686565b91505092915050565b600080600080608085870312156127105761270f6120b9565b5b600061271e87828801612306565b945050602061272f87828801612306565b935050604061274087828801612251565b925050606085013567ffffffffffffffff811115612761576127606120be565b5b61276d878288016126c8565b91505092959194509250565b600080604083850312156127905761278f6120b9565b5b600061279e85828601612306565b92505060206127af85828601612306565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061280057607f821691505b602082108103612813576128126127b9565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061284f602083612189565b915061285a82612819565b602082019050919050565b6000602082019050818103600083015261287e81612842565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026128f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128b5565b6128fc86836128b5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061293961293461292f84612230565b612914565b612230565b9050919050565b6000819050919050565b6129538361291e565b61296761295f82612940565b8484546128c2565b825550505050565b600090565b61297c61296f565b61298781848461294a565b505050565b5b818110156129ab576129a0600082612974565b60018101905061298d565b5050565b601f8211156129f0576129c181612890565b6129ca846128a5565b810160208510156129d9578190505b6129ed6129e5856128a5565b83018261298c565b50505b505050565b600082821c905092915050565b6000612a13600019846008026129f5565b1980831691505092915050565b6000612a2c8383612a02565b9150826002028217905092915050565b612a468383612885565b67ffffffffffffffff811115612a5f57612a5e6125cb565b5b612a6982546127e8565b612a748282856129af565b6000601f831160018114612aa35760008415612a91578287013590505b612a9b8582612a20565b865550612b03565b601f198416612ab186612890565b60005b82811015612ad957848901358255600182019150602085019450602081019050612ab4565b86831015612af65784890135612af2601f891682612a02565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b6000612b518261217e565b612b5b8185612b3b565b9350612b6b81856020860161219a565b80840191505092915050565b6000612b838285612b46565b9150612b8f8284612b46565b91508190509392505050565b7f73746f726520636c6f7365640000000000000000000000000000000000000000600082015250565b6000612bd1600c83612189565b9150612bdc82612b9b565b602082019050919050565b60006020820190508181036000830152612c0081612bc4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c63602683612189565b9150612c6e82612c07565b604082019050919050565b60006020820190508181036000830152612c9281612c56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cd382612230565b9150612cde83612230565b9250828201905080821115612cf657612cf5612c99565b5b92915050565b7f535550504c593a2056616c7565206578636565647320746f74616c537570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d58602183612189565b9150612d6382612cfc565b604082019050919050565b60006020820190508181036000830152612d8781612d4b565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612db582612d8e565b612dbf8185612d99565b9350612dcf81856020860161219a565b612dd8816121c4565b840191505092915050565b6000608082019050612df860008301876122c5565b612e0560208301866122c5565b612e12604083018561235b565b8181036060830152612e248184612daa565b905095945050505050565b600081519050612e3e816120ef565b92915050565b600060208284031215612e5a57612e596120b9565b5b6000612e6884828501612e2f565b91505092915050565b7f5452414e53414354494f4e3a20717479206f66206d696e7473206e6f7420616c60008201527f6f77656400000000000000000000000000000000000000000000000000000000602082015250565b6000612ecd602483612189565b9150612ed882612e71565b604082019050919050565b60006020820190508181036000830152612efc81612ec0565b9050919050565b6000612f0e82612230565b9150612f1983612230565b9250828202612f2781612230565b91508282048414831517612f3e57612f3d612c99565b5b5092915050565b7f5041594d454e543a20696e76616c69642076616c756500000000000000000000600082015250565b6000612f7b601683612189565b9150612f8682612f45565b602082019050919050565b60006020820190508181036000830152612faa81612f6e565b905091905056fea2646970667358221220ba9358a3333c7fd415cfeaf44bbd7a353b5474ee22e86f970c20e2b63874d5f964736f6c63430008120033

Deployed Bytecode Sourcemap

42897:2229:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13174:665;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18430:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20627:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20087:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43920:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12228:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21636:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43493:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44785:111;;;;;;;;;;;;;:::i;:::-;;21877:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18219:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43605:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13903:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41987:103;;;;;;;;;;;;;:::i;:::-;;44904:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43018:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41336:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43395:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18599:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42943:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20944:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22133:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43713:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18774:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43307:80;;;;;;;;;;;;;:::i;:::-;;42980:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44022:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21355:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42245:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13174:665;13304:4;13624:10;13609:25;;:11;:25;;;;:102;;;;13701:10;13686:25;;:11;:25;;;;13609:102;:179;;;;13778:10;13763:25;;:11;:25;;;;13609:179;13589:199;;13174:665;;;:::o;18430:100::-;18484:13;18517:5;18510:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18430:100;:::o;20627:245::-;20731:7;20761:16;20769:7;20761;:16::i;:::-;20756:64;;20786:34;;;;;;;;;;;;;;20756:64;20840:15;:24;20856:7;20840:24;;;;;;;;;;;;;;;;;;;;;20833:31;;20627:245;;;:::o;20087:474::-;20160:13;20192:27;20211:7;20192:18;:27::i;:::-;20160:61;;20242:5;20236:11;;:2;:11;;;20232:48;;20256:24;;;;;;;;;;;;;;20232:48;20320:5;20297:28;;:19;:17;:19::i;:::-;:28;;;20293:175;;20345:44;20362:5;20369:19;:17;:19::i;:::-;20345:16;:44::i;:::-;20340:128;;20417:35;;;;;;;;;;;;;;20340:128;20293:175;20507:2;20480:15;:24;20496:7;20480:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20545:7;20541:2;20525:28;;20534:5;20525:28;;;;;;;;;;;;20149:412;20087:474;;:::o;43920:94::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43990:16:::1;43998:2;44002:3;43990:7;:16::i;:::-;43920:94:::0;;:::o;12228:315::-;12281:7;12509:15;:13;:15::i;:::-;12494:12;;12478:13;;:28;:46;12471:53;;12228:315;:::o;21636:170::-;21770:28;21780:4;21786:2;21790:7;21770:9;:28::i;:::-;21636:170;;;:::o;43493:104::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43585:4:::1;;43570:12;:19;;;;;;;:::i;:::-;;43493:104:::0;;:::o;44785:111::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44843:12:::1;:10;:12::i;:::-;44835:30;;:53;44866:21;44835:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;44785:111::o:0;21877:185::-;22015:39;22032:4;22038:2;22042:7;22015:39;;;;;;;;;;;;:16;:39::i;:::-;21877:185;;;:::o;18219:144::-;18283:7;18326:27;18345:7;18326:18;:27::i;:::-;18303:52;;18219:144;;;:::o;43605:100::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43688:9:::1;43676;:21;;;;43605:100:::0;:::o;13903:224::-;13967:7;14008:1;13991:19;;:5;:19;;;13987:60;;14019:28;;;;;;;;;;;;;;13987:60;9198:13;14065:18;:25;14084:5;14065:25;;;;;;;;;;;;;;;;:54;14058:61;;13903:224;;;:::o;41987:103::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42052:30:::1;42079:1;42052:18;:30::i;:::-;41987:103::o:0;44904:219::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44980:9:::1;44975:141;44995:3;;:10;;44991:1;:14;44975:141;;;45024:16;45030:3;;45034:1;45030:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;45038:1;45024:5;:16::i;:::-;45086:3;;;;;;;44975:141;;;;44904:219:::0;;:::o;43018:24::-;;;;:::o;41336:87::-;41382:7;41409:6;;;;;;;;;;;41402:13;;41336:87;:::o;43395:90::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43469:8:::1;43461:5;:16;;;;43395:90:::0;:::o;18599:104::-;18655:13;18688:7;18681:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18599:104;:::o;42943:30::-;;;;:::o;20944:340::-;21087:19;:17;:19::i;:::-;21075:31;;:8;:31;;;21071:61;;21115:17;;;;;;;;;;;;;;21071:61;21197:8;21145:18;:39;21164:19;:17;:19::i;:::-;21145:39;;;;;;;;;;;;;;;:49;21185:8;21145:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;21257:8;21221:55;;21236:19;:17;:19::i;:::-;21221:55;;;21267:8;21221:55;;;;;;:::i;:::-;;;;;;;;20944:340;;:::o;22133:396::-;22300:28;22310:4;22316:2;22320:7;22300:9;:28::i;:::-;22361:1;22343:2;:14;;;:19;22339:183;;22382:56;22413:4;22419:2;22423:7;22432:5;22382:30;:56::i;:::-;22377:145;;22466:40;;;;;;;;;;;;;;22377:145;22339:183;22133:396;;;;:::o;43713:86::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43785:6:::1;43777:5;:14;;;;43713:86:::0;:::o;18774:415::-;18892:13;18928:16;18936:7;18928;:16::i;:::-;18923:59;;18953:29;;;;;;;;;;;;;;18923:59;18995:21;19019:10;:8;:10::i;:::-;18995:34;;19085:1;19066:7;19060:21;:26;:121;;;;;;;;;;;;;;;;;19130:7;19139:18;19149:7;19139:9;:18::i;:::-;19113:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19060:121;19040:141;;;18774:415;;;:::o;43307:80::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43371:8:::1;;;;;;;;;;;43370:9;43359:8;;:20;;;;;;;;;;;;;;;;;;43307:80::o:0;42980:31::-;;;;:::o;44022:115::-;44084:8;;;;;;;;;;;44076:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;44120:9;44125:3;44120:4;:9::i;:::-;44022:115;:::o;21355:214::-;21497:4;21526:18;:25;21545:5;21526:25;;;;;;;;;;;;;;;:35;21552:8;21526:35;;;;;;;;;;;;;;;;;;;;;;;;;21519:42;;21355:214;;;;:::o;42245:238::-;41567:12;:10;:12::i;:::-;41556:23;;:7;:5;:7::i;:::-;:23;;;41548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42368:1:::1;42348:22;;:8;:22;;::::0;42326:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;42447:28;42466:8;42447:18;:28::i;:::-;42245:238:::0;:::o;22784:273::-;22841:4;22897:7;22878:15;:13;:15::i;:::-;:26;;:66;;;;;22931:13;;22921:7;:23;22878:66;:152;;;;;23029:1;9968:8;22982:17;:26;23000:7;22982:26;;;;;;;;;;;;:43;:48;22878:152;22858:172;;22784:273;;;:::o;15606:1161::-;15700:7;15725:12;15740:7;15725:22;;15808:4;15789:15;:13;:15::i;:::-;:23;15785:915;;15842:13;;15835:4;:20;15831:869;;;15880:14;15897:17;:23;15915:4;15897:23;;;;;;;;;;;;15880:40;;16013:1;9968:8;15986:6;:23;:28;15982:699;;16505:113;16522:1;16512:6;:11;16505:113;;16565:17;:25;16583:6;;;;;;;16565:25;;;;;;;;;;;;16556:34;;16505:113;;;16651:6;16644:13;;;;;;15982:699;15857:843;15831:869;15785:915;16728:31;;;;;;;;;;;;;;15606:1161;;;;:::o;37152:105::-;37212:7;37239:10;37232:17;;37152:105;:::o;40039:98::-;40092:7;40119:10;40112:17;;40039:98;:::o;44567:210::-;44674:9;;44657:13;:11;:13::i;:::-;44651:3;:19;;;;:::i;:::-;:32;;44629:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;44755:14;44761:2;44765:3;44755:5;:14::i;:::-;44567:210;;:::o;11752:92::-;11808:7;11752:92;:::o;28282:2528::-;28397:27;28427;28446:7;28427:18;:27::i;:::-;28397:57;;28512:4;28471:45;;28487:19;28471:45;;;28467:99;;28538:28;;;;;;;;;;;;;;28467:99;28579:22;28628:4;28605:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;28649:43;28666:4;28672:19;:17;:19::i;:::-;28649:16;:43::i;:::-;28605:87;:147;;;;28733:19;:17;:19::i;:::-;28709:43;;:20;28721:7;28709:11;:20::i;:::-;:43;;;28605:147;28579:174;;28771:17;28766:66;;28797:35;;;;;;;;;;;;;;28766:66;28861:1;28847:16;;:2;:16;;;28843:52;;28872:23;;;;;;;;;;;;;;28843:52;28908:43;28930:4;28936:2;28940:7;28949:1;28908:21;:43::i;:::-;29024:15;:24;29040:7;29024:24;;;;;;;;;;;;29017:31;;;;;;;;;;;29416:18;:24;29435:4;29416:24;;;;;;;;;;;;;;;;29414:26;;;;;;;;;;;;29485:18;:22;29504:2;29485:22;;;;;;;;;;;;;;;;29483:24;;;;;;;;;;;10246:8;9852:3;29866:15;:41;;29824:21;29842:2;29824:17;:21::i;:::-;:84;:128;29778:17;:26;29796:7;29778:26;;;;;;;;;;;:174;;;;30122:1;10246:8;30072:19;:46;:51;30068:626;;30144:19;30176:1;30166:7;:11;30144:33;;30333:1;30299:17;:30;30317:11;30299:30;;;;;;;;;;;;:35;30295:384;;30437:13;;30422:11;:28;30418:242;;30617:19;30584:17;:30;30602:11;30584:30;;;;;;;;;;;:52;;;;30418:242;30295:384;30125:569;30068:626;30741:7;30737:2;30722:27;;30731:4;30722:27;;;;;;;;;;;;30760:42;30781:4;30787:2;30791:7;30800:1;30760:20;:42::i;:::-;28386:2424;;28282:2528;;;:::o;42643:191::-;42717:16;42736:6;;;;;;;;;;;42717:25;;42762:8;42753:6;;:17;;;;;;;;;;;;;;;;;;42817:8;42786:40;;42807:8;42786:40;;;;;;;;;;;;42706:128;42643:191;:::o;26338:1690::-;26403:20;26426:13;;26403:36;;26468:1;26454:16;;:2;:16;;;26450:48;;26479:19;;;;;;;;;;;;;;26450:48;26525:1;26513:8;:13;26509:44;;26535:18;;;;;;;;;;;;;;26509:44;26566:61;26596:1;26600:2;26604:12;26618:8;26566:21;:61::i;:::-;27204:1;9335:2;27175:1;:25;;27174:31;27145:8;:61;27102:18;:22;27121:2;27102:22;;;;;;;;;;;;;;;;:104;;;;;;;;;;;10111:3;27605:29;27632:1;27620:8;:13;27605:14;:29::i;:::-;:56;;9852:3;27542:15;:41;;27500:21;27518:2;27500:17;:21::i;:::-;:84;:162;27449:17;:31;27467:12;27449:31;;;;;;;;;;;:213;;;;27679:20;27702:12;27679:35;;27729:11;27758:8;27743:12;:23;27729:37;;27783:111;27835:14;;;;;;27831:2;27810:40;;27827:1;27810:40;;;;;;;;;;;;27889:3;27874:12;:18;27783:111;;27926:12;27910:13;:28;;;;26879:1071;;27960:60;27989:1;27993:2;27997:12;28011:8;27960:20;:60::i;:::-;26392:1636;26338:1690;;:::o;34506:831::-;34669:4;34728:2;34703:45;;;34767:19;:17;:19::i;:::-;34805:4;34828:7;34854:5;34703:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34686:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35105:1;35088:6;:13;:18;35084:235;;35134:40;;;;;;;;;;;;;;35084:235;35277:6;35271:13;35262:6;35258:2;35254:15;35247:38;34686:644;34974:54;;;34947:81;;;:6;:81;;;;34923:105;;;34506:831;;;;;;:::o;43807:105::-;43859:13;43892:12;43885:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43807:105;:::o;37363:1992::-;37447:17;37871:3;37864:4;37858:11;37854:21;37847:28;;37962:3;37956:4;37949:17;38068:3;38524:5;38654:1;38649:3;38645:11;38638:18;;38791:2;38785:4;38781:13;38777:2;38773:22;38768:3;38760:36;38832:2;38826:4;38822:13;38814:21;;38416:697;38851:4;38416:697;;;39042:1;39037:3;39033:11;39026:18;;39093:2;39087:4;39083:13;39079:2;39075:22;39070:3;39062:36;38946:2;38940:4;38936:13;38928:21;;38416:697;;;38420:430;39152:3;39147;39143:13;39267:2;39262:3;39258:12;39251:19;;39330:6;39325:3;39318:19;37491:1857;;37363:1992;;;:::o;44145:414::-;44221:5;;44214:3;:12;;:23;;;;;44236:1;44230:3;:7;44214:23;44192:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;44484:3;44476:5;;:11;;;;:::i;:::-;44463:9;:24;;44455:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;44525:26;44533:12;:10;:12::i;:::-;44547:3;44525:7;:26::i;:::-;44145:414;:::o;35985:159::-;;;;;:::o;19616:180::-;19707:14;19773:5;19763:15;;19616:180;;;:::o;36803:158::-;;;;;:::o;19883:142::-;19941:14;20002:5;19992:15;;19883:142;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:117;6222:1;6219;6212:12;6250:553;6308:8;6318:6;6368:3;6361:4;6353:6;6349:17;6345:27;6335:122;;6376:79;;:::i;:::-;6335:122;6489:6;6476:20;6466:30;;6519:18;6511:6;6508:30;6505:117;;;6541:79;;:::i;:::-;6505:117;6655:4;6647:6;6643:17;6631:29;;6709:3;6701:4;6693:6;6689:17;6679:8;6675:32;6672:41;6669:128;;;6716:79;;:::i;:::-;6669:128;6250:553;;;;;:::o;6809:529::-;6880:6;6888;6937:2;6925:9;6916:7;6912:23;6908:32;6905:119;;;6943:79;;:::i;:::-;6905:119;7091:1;7080:9;7076:17;7063:31;7121:18;7113:6;7110:30;7107:117;;;7143:79;;:::i;:::-;7107:117;7256:65;7313:7;7304:6;7293:9;7289:22;7256:65;:::i;:::-;7238:83;;;;7034:297;6809:529;;;;;:::o;7344:329::-;7403:6;7452:2;7440:9;7431:7;7427:23;7423:32;7420:119;;;7458:79;;:::i;:::-;7420:119;7578:1;7603:53;7648:7;7639:6;7628:9;7624:22;7603:53;:::i;:::-;7593:63;;7549:117;7344:329;;;;:::o;7696:568::-;7769:8;7779:6;7829:3;7822:4;7814:6;7810:17;7806:27;7796:122;;7837:79;;:::i;:::-;7796:122;7950:6;7937:20;7927:30;;7980:18;7972:6;7969:30;7966:117;;;8002:79;;:::i;:::-;7966:117;8116:4;8108:6;8104:17;8092:29;;8170:3;8162:4;8154:6;8150:17;8140:8;8136:32;8133:41;8130:128;;;8177:79;;:::i;:::-;8130:128;7696:568;;;;;:::o;8270:559::-;8356:6;8364;8413:2;8401:9;8392:7;8388:23;8384:32;8381:119;;;8419:79;;:::i;:::-;8381:119;8567:1;8556:9;8552:17;8539:31;8597:18;8589:6;8586:30;8583:117;;;8619:79;;:::i;:::-;8583:117;8732:80;8804:7;8795:6;8784:9;8780:22;8732:80;:::i;:::-;8714:98;;;;8510:312;8270:559;;;;;:::o;8835:116::-;8905:21;8920:5;8905:21;:::i;:::-;8898:5;8895:32;8885:60;;8941:1;8938;8931:12;8885:60;8835:116;:::o;8957:133::-;9000:5;9038:6;9025:20;9016:29;;9054:30;9078:5;9054:30;:::i;:::-;8957:133;;;;:::o;9096:468::-;9161:6;9169;9218:2;9206:9;9197:7;9193:23;9189:32;9186:119;;;9224:79;;:::i;:::-;9186:119;9344:1;9369:53;9414:7;9405:6;9394:9;9390:22;9369:53;:::i;:::-;9359:63;;9315:117;9471:2;9497:50;9539:7;9530:6;9519:9;9515:22;9497:50;:::i;:::-;9487:60;;9442:115;9096:468;;;;;:::o;9570:117::-;9679:1;9676;9669:12;9693:180;9741:77;9738:1;9731:88;9838:4;9835:1;9828:15;9862:4;9859:1;9852:15;9879:281;9962:27;9984:4;9962:27;:::i;:::-;9954:6;9950:40;10092:6;10080:10;10077:22;10056:18;10044:10;10041:34;10038:62;10035:88;;;10103:18;;:::i;:::-;10035:88;10143:10;10139:2;10132:22;9922:238;9879:281;;:::o;10166:129::-;10200:6;10227:20;;:::i;:::-;10217:30;;10256:33;10284:4;10276:6;10256:33;:::i;:::-;10166:129;;;:::o;10301:307::-;10362:4;10452:18;10444:6;10441:30;10438:56;;;10474:18;;:::i;:::-;10438:56;10512:29;10534:6;10512:29;:::i;:::-;10504:37;;10596:4;10590;10586:15;10578:23;;10301:307;;;:::o;10614:146::-;10711:6;10706:3;10701;10688:30;10752:1;10743:6;10738:3;10734:16;10727:27;10614:146;;;:::o;10766:423::-;10843:5;10868:65;10884:48;10925:6;10884:48;:::i;:::-;10868:65;:::i;:::-;10859:74;;10956:6;10949:5;10942:21;10994:4;10987:5;10983:16;11032:3;11023:6;11018:3;11014:16;11011:25;11008:112;;;11039:79;;:::i;:::-;11008:112;11129:54;11176:6;11171:3;11166;11129:54;:::i;:::-;10849:340;10766:423;;;;;:::o;11208:338::-;11263:5;11312:3;11305:4;11297:6;11293:17;11289:27;11279:122;;11320:79;;:::i;:::-;11279:122;11437:6;11424:20;11462:78;11536:3;11528:6;11521:4;11513:6;11509:17;11462:78;:::i;:::-;11453:87;;11269:277;11208:338;;;;:::o;11552:943::-;11647:6;11655;11663;11671;11720:3;11708:9;11699:7;11695:23;11691:33;11688:120;;;11727:79;;:::i;:::-;11688:120;11847:1;11872:53;11917:7;11908:6;11897:9;11893:22;11872:53;:::i;:::-;11862:63;;11818:117;11974:2;12000:53;12045:7;12036:6;12025:9;12021:22;12000:53;:::i;:::-;11990:63;;11945:118;12102:2;12128:53;12173:7;12164:6;12153:9;12149:22;12128:53;:::i;:::-;12118:63;;12073:118;12258:2;12247:9;12243:18;12230:32;12289:18;12281:6;12278:30;12275:117;;;12311:79;;:::i;:::-;12275:117;12416:62;12470:7;12461:6;12450:9;12446:22;12416:62;:::i;:::-;12406:72;;12201:287;11552:943;;;;;;;:::o;12501:474::-;12569:6;12577;12626:2;12614:9;12605:7;12601:23;12597:32;12594:119;;;12632:79;;:::i;:::-;12594:119;12752:1;12777:53;12822:7;12813:6;12802:9;12798:22;12777:53;:::i;:::-;12767:63;;12723:117;12879:2;12905:53;12950:7;12941:6;12930:9;12926:22;12905:53;:::i;:::-;12895:63;;12850:118;12501:474;;;;;:::o;12981:180::-;13029:77;13026:1;13019:88;13126:4;13123:1;13116:15;13150:4;13147:1;13140:15;13167:320;13211:6;13248:1;13242:4;13238:12;13228:22;;13295:1;13289:4;13285:12;13316:18;13306:81;;13372:4;13364:6;13360:17;13350:27;;13306:81;13434:2;13426:6;13423:14;13403:18;13400:38;13397:84;;13453:18;;:::i;:::-;13397:84;13218:269;13167:320;;;:::o;13493:182::-;13633:34;13629:1;13621:6;13617:14;13610:58;13493:182;:::o;13681:366::-;13823:3;13844:67;13908:2;13903:3;13844:67;:::i;:::-;13837:74;;13920:93;14009:3;13920:93;:::i;:::-;14038:2;14033:3;14029:12;14022:19;;13681:366;;;:::o;14053:419::-;14219:4;14257:2;14246:9;14242:18;14234:26;;14306:9;14300:4;14296:20;14292:1;14281:9;14277:17;14270:47;14334:131;14460:4;14334:131;:::i;:::-;14326:139;;14053:419;;;:::o;14478:97::-;14537:6;14565:3;14555:13;;14478:97;;;;:::o;14581:141::-;14630:4;14653:3;14645:11;;14676:3;14673:1;14666:14;14710:4;14707:1;14697:18;14689:26;;14581:141;;;:::o;14728:93::-;14765:6;14812:2;14807;14800:5;14796:14;14792:23;14782:33;;14728:93;;;:::o;14827:107::-;14871:8;14921:5;14915:4;14911:16;14890:37;;14827:107;;;;:::o;14940:393::-;15009:6;15059:1;15047:10;15043:18;15082:97;15112:66;15101:9;15082:97;:::i;:::-;15200:39;15230:8;15219:9;15200:39;:::i;:::-;15188:51;;15272:4;15268:9;15261:5;15257:21;15248:30;;15321:4;15311:8;15307:19;15300:5;15297:30;15287:40;;15016:317;;14940:393;;;;;:::o;15339:60::-;15367:3;15388:5;15381:12;;15339:60;;;:::o;15405:142::-;15455:9;15488:53;15506:34;15515:24;15533:5;15515:24;:::i;:::-;15506:34;:::i;:::-;15488:53;:::i;:::-;15475:66;;15405:142;;;:::o;15553:75::-;15596:3;15617:5;15610:12;;15553:75;;;:::o;15634:269::-;15744:39;15775:7;15744:39;:::i;:::-;15805:91;15854:41;15878:16;15854:41;:::i;:::-;15846:6;15839:4;15833:11;15805:91;:::i;:::-;15799:4;15792:105;15710:193;15634:269;;;:::o;15909:73::-;15954:3;15909:73;:::o;15988:189::-;16065:32;;:::i;:::-;16106:65;16164:6;16156;16150:4;16106:65;:::i;:::-;16041:136;15988:189;;:::o;16183:186::-;16243:120;16260:3;16253:5;16250:14;16243:120;;;16314:39;16351:1;16344:5;16314:39;:::i;:::-;16287:1;16280:5;16276:13;16267:22;;16243:120;;;16183:186;;:::o;16375:543::-;16476:2;16471:3;16468:11;16465:446;;;16510:38;16542:5;16510:38;:::i;:::-;16594:29;16612:10;16594:29;:::i;:::-;16584:8;16580:44;16777:2;16765:10;16762:18;16759:49;;;16798:8;16783:23;;16759:49;16821:80;16877:22;16895:3;16877:22;:::i;:::-;16867:8;16863:37;16850:11;16821:80;:::i;:::-;16480:431;;16465:446;16375:543;;;:::o;16924:117::-;16978:8;17028:5;17022:4;17018:16;16997:37;;16924:117;;;;:::o;17047:169::-;17091:6;17124:51;17172:1;17168:6;17160:5;17157:1;17153:13;17124:51;:::i;:::-;17120:56;17205:4;17199;17195:15;17185:25;;17098:118;17047:169;;;;:::o;17221:295::-;17297:4;17443:29;17468:3;17462:4;17443:29;:::i;:::-;17435:37;;17505:3;17502:1;17498:11;17492:4;17489:21;17481:29;;17221:295;;;;:::o;17521:1403::-;17645:44;17685:3;17680;17645:44;:::i;:::-;17754:18;17746:6;17743:30;17740:56;;;17776:18;;:::i;:::-;17740:56;17820:38;17852:4;17846:11;17820:38;:::i;:::-;17905:67;17965:6;17957;17951:4;17905:67;:::i;:::-;17999:1;18028:2;18020:6;18017:14;18045:1;18040:632;;;;18716:1;18733:6;18730:84;;;18789:9;18784:3;18780:19;18767:33;18758:42;;18730:84;18840:67;18900:6;18893:5;18840:67;:::i;:::-;18834:4;18827:81;18689:229;18010:908;;18040:632;18092:4;18088:9;18080:6;18076:22;18126:37;18158:4;18126:37;:::i;:::-;18185:1;18199:215;18213:7;18210:1;18207:14;18199:215;;;18299:9;18294:3;18290:19;18277:33;18269:6;18262:49;18350:1;18342:6;18338:14;18328:24;;18397:2;18386:9;18382:18;18369:31;;18236:4;18233:1;18229:12;18224:17;;18199:215;;;18442:6;18433:7;18430:19;18427:186;;;18507:9;18502:3;18498:19;18485:33;18550:48;18592:4;18584:6;18580:17;18569:9;18550:48;:::i;:::-;18542:6;18535:64;18450:163;18427:186;18659:1;18655;18647:6;18643:14;18639:22;18633:4;18626:36;18047:625;;;18010:908;;17620:1304;;;17521:1403;;;:::o;18930:180::-;18978:77;18975:1;18968:88;19075:4;19072:1;19065:15;19099:4;19096:1;19089:15;19116:148;19218:11;19255:3;19240:18;;19116:148;;;;:::o;19270:390::-;19376:3;19404:39;19437:5;19404:39;:::i;:::-;19459:89;19541:6;19536:3;19459:89;:::i;:::-;19452:96;;19557:65;19615:6;19610:3;19603:4;19596:5;19592:16;19557:65;:::i;:::-;19647:6;19642:3;19638:16;19631:23;;19380:280;19270:390;;;;:::o;19666:435::-;19846:3;19868:95;19959:3;19950:6;19868:95;:::i;:::-;19861:102;;19980:95;20071:3;20062:6;19980:95;:::i;:::-;19973:102;;20092:3;20085:10;;19666:435;;;;;:::o;20107:162::-;20247:14;20243:1;20235:6;20231:14;20224:38;20107:162;:::o;20275:366::-;20417:3;20438:67;20502:2;20497:3;20438:67;:::i;:::-;20431:74;;20514:93;20603:3;20514:93;:::i;:::-;20632:2;20627:3;20623:12;20616:19;;20275:366;;;:::o;20647:419::-;20813:4;20851:2;20840:9;20836:18;20828:26;;20900:9;20894:4;20890:20;20886:1;20875:9;20871:17;20864:47;20928:131;21054:4;20928:131;:::i;:::-;20920:139;;20647:419;;;:::o;21072:225::-;21212:34;21208:1;21200:6;21196:14;21189:58;21281:8;21276:2;21268:6;21264:15;21257:33;21072:225;:::o;21303:366::-;21445:3;21466:67;21530:2;21525:3;21466:67;:::i;:::-;21459:74;;21542:93;21631:3;21542:93;:::i;:::-;21660:2;21655:3;21651:12;21644:19;;21303:366;;;:::o;21675:419::-;21841:4;21879:2;21868:9;21864:18;21856:26;;21928:9;21922:4;21918:20;21914:1;21903:9;21899:17;21892:47;21956:131;22082:4;21956:131;:::i;:::-;21948:139;;21675:419;;;:::o;22100:180::-;22148:77;22145:1;22138:88;22245:4;22242:1;22235:15;22269:4;22266:1;22259:15;22286:191;22326:3;22345:20;22363:1;22345:20;:::i;:::-;22340:25;;22379:20;22397:1;22379:20;:::i;:::-;22374:25;;22422:1;22419;22415:9;22408:16;;22443:3;22440:1;22437:10;22434:36;;;22450:18;;:::i;:::-;22434:36;22286:191;;;;:::o;22483:220::-;22623:34;22619:1;22611:6;22607:14;22600:58;22692:3;22687:2;22679:6;22675:15;22668:28;22483:220;:::o;22709:366::-;22851:3;22872:67;22936:2;22931:3;22872:67;:::i;:::-;22865:74;;22948:93;23037:3;22948:93;:::i;:::-;23066:2;23061:3;23057:12;23050:19;;22709:366;;;:::o;23081:419::-;23247:4;23285:2;23274:9;23270:18;23262:26;;23334:9;23328:4;23324:20;23320:1;23309:9;23305:17;23298:47;23362:131;23488:4;23362:131;:::i;:::-;23354:139;;23081:419;;;:::o;23506:98::-;23557:6;23591:5;23585:12;23575:22;;23506:98;;;:::o;23610:168::-;23693:11;23727:6;23722:3;23715:19;23767:4;23762:3;23758:14;23743:29;;23610:168;;;;:::o;23784:373::-;23870:3;23898:38;23930:5;23898:38;:::i;:::-;23952:70;24015:6;24010:3;23952:70;:::i;:::-;23945:77;;24031:65;24089:6;24084:3;24077:4;24070:5;24066:16;24031:65;:::i;:::-;24121:29;24143:6;24121:29;:::i;:::-;24116:3;24112:39;24105:46;;23874:283;23784:373;;;;:::o;24163:640::-;24358:4;24396:3;24385:9;24381:19;24373:27;;24410:71;24478:1;24467:9;24463:17;24454:6;24410:71;:::i;:::-;24491:72;24559:2;24548:9;24544:18;24535:6;24491:72;:::i;:::-;24573;24641:2;24630:9;24626:18;24617:6;24573:72;:::i;:::-;24692:9;24686:4;24682:20;24677:2;24666:9;24662:18;24655:48;24720:76;24791:4;24782:6;24720:76;:::i;:::-;24712:84;;24163:640;;;;;;;:::o;24809:141::-;24865:5;24896:6;24890:13;24881:22;;24912:32;24938:5;24912:32;:::i;:::-;24809:141;;;;:::o;24956:349::-;25025:6;25074:2;25062:9;25053:7;25049:23;25045:32;25042:119;;;25080:79;;:::i;:::-;25042:119;25200:1;25225:63;25280:7;25271:6;25260:9;25256:22;25225:63;:::i;:::-;25215:73;;25171:127;24956:349;;;;:::o;25311:223::-;25451:34;25447:1;25439:6;25435:14;25428:58;25520:6;25515:2;25507:6;25503:15;25496:31;25311:223;:::o;25540:366::-;25682:3;25703:67;25767:2;25762:3;25703:67;:::i;:::-;25696:74;;25779:93;25868:3;25779:93;:::i;:::-;25897:2;25892:3;25888:12;25881:19;;25540:366;;;:::o;25912:419::-;26078:4;26116:2;26105:9;26101:18;26093:26;;26165:9;26159:4;26155:20;26151:1;26140:9;26136:17;26129:47;26193:131;26319:4;26193:131;:::i;:::-;26185:139;;25912:419;;;:::o;26337:410::-;26377:7;26400:20;26418:1;26400:20;:::i;:::-;26395:25;;26434:20;26452:1;26434:20;:::i;:::-;26429:25;;26489:1;26486;26482:9;26511:30;26529:11;26511:30;:::i;:::-;26500:41;;26690:1;26681:7;26677:15;26674:1;26671:22;26651:1;26644:9;26624:83;26601:139;;26720:18;;:::i;:::-;26601:139;26385:362;26337:410;;;;:::o;26753:172::-;26893:24;26889:1;26881:6;26877:14;26870:48;26753:172;:::o;26931:366::-;27073:3;27094:67;27158:2;27153:3;27094:67;:::i;:::-;27087:74;;27170:93;27259:3;27170:93;:::i;:::-;27288:2;27283:3;27279:12;27272:19;;26931:366;;;:::o;27303:419::-;27469:4;27507:2;27496:9;27492:18;27484:26;;27556:9;27550:4;27546:20;27542:1;27531:9;27527:17;27520:47;27584:131;27710:4;27584:131;:::i;:::-;27576:139;;27303:419;;;:::o

Swarm Source

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