ETH Price: $2,684.88 (-2.25%)

Token

FacelessTotz (FTZ)
 

Overview

Max Total Supply

134 FTZ

Holders

35

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FTZ
0x5047a016ca9a346a8a6a86f9ea9c231c5094f084
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:
FacelessTotz

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-14
*/

// Sources flattened with hardhat v2.6.3 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface 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);
}

// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

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

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

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

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

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

    /**
     * @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 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);

    /**
     * @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;
}

// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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 @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File @openzeppelin/contracts/utils/[email protected]

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/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File @openzeppelin/contracts/utils/introspection/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @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)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

    /**
     * @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 See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), 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 {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _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 {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165, ERC721)
        returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File @openzeppelin/contracts/access/[email protected]

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() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File @openzeppelin/contracts/security/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File contracts/totz.sol

pragma solidity ^0.8.0;

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract FacelessTotz is ERC721Enumerable, Ownable, ReentrancyGuard {
    using Strings for uint256;

    uint256 public maxSupply = 888;
    uint256 public nextID = 14; // 13 already on opensea TODO double check
    uint256 public _member_price = 20000000000000000; // 0.02 eth
    uint256 public _holder_price = 15000000000000000; // 0.015 eth
    uint256 public _price = 25000000000000000; // 0.025 eth
    uint256 public maxBuy = 10;

    mapping(address => uint256) public member_quota;
    mapping(address => uint256) public holder_quota;
    mapping(address => uint256) public whitelist_quota;

    bool public whitelistSell = false;
    bool public memberSell = true;
    bool public holderSell = true;
    bool public sell = false;

    string public baseURI = "";
    string private _contractURI =
        "https://storageapi.fleek.co/yoyoismee-team-bucket/faceless-totz/totz";

    constructor() ERC721("FacelessTotz", "FTZ") {
        // HOLDER
        holder_quota[0x53eA5F4A77F5A063612D2e34B247AD14e1858DE6] = 3;
        holder_quota[0x5047a016Ca9A346a8a6A86F9ea9c231C5094F084] = 2;
        holder_quota[0x9C50b5eb0CBC4EfEFab20554200Da775720173f9] = 10;
        holder_quota[0xB910ccE85837a5f2CA90dB8fCeFA051E1727C752] = 3;
        holder_quota[0xdda24F18Eb2E35123200b9eaA668Cdf87DE58388] = 3;
        holder_quota[0x7FCd58B46f76a7B9aADc27CD0A607D5702bc182A] = 6;
        holder_quota[0xf5994ADAB26b15418e5b14A09C0A230E0F68F467] = 10;
        holder_quota[0x05b98944A834dC2Ec348a5dA101556cA2ab01A69] = 2;
        holder_quota[0xA905ae0D0Db1dA939A541862386400de63c71926] = 10;
        holder_quota[0x380CFcD0b98Cc56aA57A7eB9D90996A98360A494] = 3;
        holder_quota[0xd8e36Cd26A35B8Fe0443560Ad957BcC729Ade10c] = 6;
        holder_quota[0x9578A7Ae6952B0cdCd0E8186ca3139B77C5aA5b1] = 3;
        holder_quota[0x468D073a86466A254EcA4D408BbA15d9cd42Ad91] = 2;
        holder_quota[0x870bb39d8040a86B1FB55cfA9f640909DaC441Fe] = 3;
        holder_quota[0xaE244b7bAEF1fbd69a9303F2095aF13A930304F9] = 3;
        holder_quota[0x60Ee29796DbeaC110a92D2C4c4ca2A2CDaC35B3a] = 10;
        holder_quota[0x34b37e529e5A6be09703D061231EfF90D09D5679] = 2;
        holder_quota[0x71E0Da67B053d536DC247C89C8206a33b3BACcd6] = 10;
        holder_quota[0x5ba58Ac2b59Cc04b6960D1090665BE32B9906b63] = 3;
        holder_quota[0x7f7a100DC0Fb1A59378b3B8B34Ac44Fab511Dd5A] = 3;
        holder_quota[0xE628E7EB5807f73a555A41867aF235351d603e2f] = 1;
        holder_quota[0x1a12e4A2AfD46569d3166A6600fC57a8Bf9eD423] = 10;
        holder_quota[0x945FC81C9edc66609F54cD19Cdb4500713F8a825] = 10;
        holder_quota[0x276ae69309b0CFde2CBdB9151b1ED8ABEF1501BB] = 10;
        holder_quota[0xee10426CbF833Ce01D0bB7c0b05C5E9E4bE01bB1] = 2;
        holder_quota[0xFdc3E8eDd74A90fe971EF7d56a0C66c870b10F5D] = 6;
        holder_quota[0x2a8f1940ff9EdB8a6be937F171Cc12e1E2eAb264] = 1;
        holder_quota[0x2a753194B84B2Fb7E01ee8b3Cd9b0fd4e7c49B5c] = 2;
        holder_quota[0x431f89c9890920661B2658cc4d9d9724A947A0a8] = 3;
        holder_quota[0x468D073a86466A254EcA4D408BbA15d9cd42Ad91] = 2;
        holder_quota[0x2Fb14f818A03566b41EF9C670488d5c708547d2e] = 10;
        holder_quota[0x59C5EF981ddF319e7Dae5328B4f54E8D1EA1d430] = 10;
        holder_quota[0x30790ccD8d366552484a27BD0f42E9c980D1C3E9] = 10;
        holder_quota[0x3d272E560ADD9e0dF198daE4069510C660D35434] = 10;
        holder_quota[0x86057854D8cF621a0384606FCf454e579e48E808] = 10;

        // Member
        member_quota[0xBe8017fF522bdF8AC822789D6DAA4f517791F85E] = 3;
        member_quota[0x00f903a27295c1BB22Cf685b9452e3183d07e5FC] = 6;
        member_quota[0x222550475087294a7f5ba4F87A06e7cd1103363d] = 3;
        member_quota[0xb11F427AB9B65b475EE786cE36Ed3b36634b8670] = 3;
        member_quota[0xD80775766186eF44c73422fDF97D92701C27f70E] = 6;
        member_quota[0x7A70536c4D695B1Ec9DF972e91461E834bfB00e8] = 6;
        member_quota[0xc3A6E2b72EE8478A85593Bfe86fCd612855BeAe2] = 2;
        member_quota[0xe001891949372e1AA33C50c7EA19568bE32ecDE7] = 6;
        member_quota[0x92a923B1407701117A9A94e3e137f1Bd4cB3c663] = 3;
        member_quota[0xB6fe1d4bE26159715803Ec9929244D8B2c1cFE9C] = 6;
    }

    function setWhitelist(address[] memory wallets, uint256 quota)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < wallets.length; i++) {
            whitelist_quota[wallets[i]] = quota;
        }
    }

    function setMember(address[] memory wallets, uint256 quota)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < wallets.length; i++) {
            member_quota[wallets[i]] = quota;
        }
    }

    function setHolder(address[] memory wallets, uint256 quota)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < wallets.length; i++) {
            holder_quota[wallets[i]] = quota;
        }
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        _price = newPrice;
    }

    function setSell(bool _sell) public onlyOwner {
        sell = _sell;
    }

    function buy(uint256 amount) public payable nonReentrant {
        require(sell, "not selling");
        require(amount <= maxBuy, "at most 10 totz at a time");
        require(nextID + amount - 1 <= maxSupply, "out of totz");
        require(msg.value >= _price * amount, "invalid eth");

        for (uint256 i = 1; i <= amount; i++) {
            _safeMint(msg.sender, nextID);
            nextID += 1;
        }
    }

    function setHolderSell(bool _holderSell) public onlyOwner {
        holderSell = _holderSell;
    }

    function holderBuy(uint256 amount) public payable nonReentrant {
        require(holderSell, "not selling");
        require(amount <= maxBuy, "at most 10 totz at a time");
        require(nextID + amount - 1 <= maxSupply, "out of totz");
        require(msg.value >= _holder_price * amount, "invalid eth");
        require(holder_quota[msg.sender] >= amount, "no quota");
        holder_quota[msg.sender] -= amount;

        for (uint256 i = 1; i <= amount; i++) {
            _safeMint(msg.sender, nextID);
            nextID += 1;
        }
    }

    function setMemberSell(bool _memberSell) public onlyOwner {
        memberSell = _memberSell;
    }

    function memberBuy(uint256 amount) public payable nonReentrant {
        require(memberSell, "not selling");
        require(amount <= maxBuy, "at most 10 totz at a time");
        require(nextID + amount - 1 <= maxSupply, "out of totz");
        require(msg.value >= _member_price * amount, "invalid eth");
        require(member_quota[msg.sender] >= amount, "no quota");
        member_quota[msg.sender] -= amount;

        for (uint256 i = 1; i <= amount; i++) {
            _safeMint(msg.sender, nextID);
            nextID += 1;
        }
    }

    function setWhitelistSell(bool _whitelistSell) public onlyOwner {
        whitelistSell = _whitelistSell;
    }

    function whitelistBuy(uint256 amount) public payable nonReentrant {
        require(whitelistSell, "not selling");
        require(amount <= maxBuy, "at most 10 totz at a time");
        require(nextID + amount - 1 <= maxSupply, "out of totz");
        require(msg.value >= _price * amount, "invalid eth");
        require(whitelist_quota[msg.sender] >= amount, "no quota");
        whitelist_quota[msg.sender] -= amount;
        for (uint256 i = 1; i <= amount; i++) {
            _safeMint(msg.sender, nextID);
            nextID += 1;
        }
    }

    function withdraw() public nonReentrant {
        // 10% to promoter
        payable(0x1f562c3259b5266a1a934a4d20d22b7135D3600d).transfer(
            address(this).balance / 10
        );
        // the rest to owner
        payable(0x68FF5cB5F3D1bB0E162978449Cd410E04BF752d7).transfer(
            address(this).balance
        );
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // opensea mainnet
        ProxyRegistry proxyRegistry = ProxyRegistry(
            0xa5409ec958C83C3f309868babACA7c86DCB077c1
        );

        // Whitelist OpenSea proxy contract for easy trading.
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }

    function setContractURI(string memory newContractURI) external onlyOwner {
        _contractURI = newContractURI;
    }

    // for OPENSEA
    function contractURI() external view returns (string memory) {
        return _contractURI;
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(tokenId), "nonexistent token");
        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":[],"name":"_holder_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_member_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"holderBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"holderSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holder_quota","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"memberBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"memberSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"member_quota","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":"nextID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":[],"name":"sell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"quota","type":"uint256"}],"name":"setHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_holderSell","type":"bool"}],"name":"setHolderSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"quota","type":"uint256"}],"name":"setMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_memberSell","type":"bool"}],"name":"setMemberSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sell","type":"bool"}],"name":"setSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"quota","type":"uint256"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_whitelistSell","type":"bool"}],"name":"setWhitelistSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist_quota","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610378600c55600e600d81905566470de4df820000905566354a6ba7a18000600f556658d15e17628000601055600a6011556015805463ffffffff19166201010017905560a06040819052600060808190526200005f91601691620007d1565b50604051806080016040528060448152602001620036616044913980516200009091601791602090910190620007d1565b503480156200009e57600080fd5b50604080518082018252600c81526b2330b1b2b632b9b9aa37ba3d60a11b602080830191825283518085019094526003845262232a2d60e91b908401528151919291620000ee91600091620007d1565b50805162000104906001906020840190620007d1565b505050620001216200011b6200077b60201b60201c565b6200077f565b6001600b81905560037f90c77ff11977ff6826b9304a8ff36752ee6344aa040b043837673c7e887158ef81905560027f5c60394ac043b34b9d205ef9d93db3aef231de1a47dd1124b87dc808536bc2b9819055600a7f8cb8d91267ebeb047e5e5d4578d976295076098e9d7bdeb9ef1930ef2f249b218190557fa1f2b6936ef7cba9c6e5b342633843264c7a22690fc3bc5d69003788f5d2317a8390557fdc9be576d774688500271060fba0435483ba11a0c03c7a7d89ba8f8332da09de83905560067f640b89502068dc3d4cea96028b033670e4b57946dbdbff7a60d6f6eb9fe5e9308190557fbe64287c3c74c1a167ec416f6730f7c13de27d87f1c96fc2da90e298272aedc08290557f3a507a06c0e6ebe72938704265fd404f7d31a46ad724bd7d182781a0c49f86d58390557fc0b70fe0a17f219ecc23b297f91ce5d68717e8b4f720f5f079bf324d8b05065d8290557f12a7bae0a9eb10def912fd374e7afd519ab554f31e869ad28c2a600a097f5f8e8490557f643b59082cc25980cd40c320d716c3f71525c606f9ee181179939064ed3414d78190557f78f4995ffd6556b80ea93c4f37354d478062280608472ab592ec2a60a56940568490557f21a67cfa0dc8e2386a7735e99ebb38c22ef4d9cbe3c4b865de622a2f81c5c7478390557f63055580b8f9748c3ec103919ca74eaace88db865b6c2e365a836c95e9d09a808490557f994a118284dc519cc6a085cc6c7f316bcd28226d6badd06e94d5dec4bd962a788490557f8ef1c7bb34572dac389794ccff0a1db3b220a4ebd852d5328cee9b76da41ce258290557efd98b4456be682eb160166c0eb5cbcc9138e738701920f231f2c0a090176738390557f55355186137178f977b8005de8463a930da01b69e8fb15f3d630f6d41f4d27f58290557f55d445f28b91ac8d34cd3199d8077e974d3d2d7fb3e4a214ff98028f227f85028490557f22cc5b4a652a6133c8d47701883669345a8dbd30c8248570fbb9d3ffcd67dbaa8490557fc4bcc553985b789b8dd729dc8c1f94fb3bd8aad19469940dbceab7e8f3d0cf178590557f0ecb3863c872f75a805c057f1c85246595171c59a1407068d8d55befc961d7f58290557f4b1db15128f3129dc2afbb53e5fa9d34e735e9857c2f09477bbc1dced2da38a58290557f0cd6729792fa20c60727d3d1d4c9600d09cef5401c98eb3a83e91df89d45c8728290557f85286734ff6aea117b2600cc2fc34bf3469d77ac2ba648aadd2a4064e57973538390557f3aa6f149807bc77103cf3caa01ccb7c39cba6458086aa708a855ca74ab0e0ffe8190557f512f1ae15990adcc3428e82406a7312a9c71a9bc47709308357310555619587d949094557f04f87303d33094baafe74209d53fe8b2b684aa8b49cf2f9d039cbd8fd53eeec68290557f26d29ab63e09b357c3c2b2893471490b56dcde69e0b04f40008b48bccd4897aa8390557fedfee60ab3bdd45deab41cf4a0d839148e82a6887d2a22d89fd6ef45d7a334878190557f153d8ab265a9cd8e4d26d830de7ac038b8619393f2fe141bd93057b430f66bfb8190557f08a1428a3568ef2b3f61de47edcadaa9055611048d6c15f5f986ebcd476dd2548190557f120b916529a579e4c601dc045cb65fda56fd31cb718f6fe7791a50b71e8dca478190557f7a031adb35cf3ffee37e6cedb8a8c88c5c0132a46e80925607d79ecc5a372fb35560126020527f7648a60ecc9f3fcc33ebdde2c62ebaad1fe1b54fa784bf3de4a57257f5cd85dd8290557ffb9f176bec240eb0a55ff4b0ccb903fafbc671459d6a6223c6fe03a6e113bb398390557fb87c4ac1723b024c498f9ae4fbcc08392472781a7fbaa760788cfe2af97d79178290557f1ec1d32210f14e0fba9b6bab8e21681eca117a8455e5971c83d300a29012232b8290557f3968758130e43b58a1c709ae11c5683598c58510446b858d9fc18d6d22911e4f8390557f2a6ac67cb695e87b278eea4d74c1ccf4c7859899cbc56ef2a24b300a1fb576c68390557f42c50339d93426ef1a189558f5f073d4a5a6bee5fcaa1dcbf67a1c68f5621626557f95c1450899d7874cad3b964ecefd80179e4be973d4357d17baddb0a02427784a8290557fa77577925c79dea55147a827b700501685e196f1bc019fb35c9475369fe0239a5573b6fe1d4be26159715803ec9929244d8b2c1cfe9c6000527f7183e57130319eefb23faf067f964fbb41d930c241c67770238a682bf8cae30055620008b4565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620007df9062000877565b90600052602060002090601f0160209004810192826200080357600085556200084e565b82601f106200081e57805160ff19168380011785556200084e565b828001600101855582156200084e579182015b828111156200084e57825182559160200191906001019062000831565b506200085c92915062000860565b5090565b5b808211156200085c576000815560010162000861565b600181811c908216806200088c57607f821691505b60208210811415620008ae57634e487b7160e01b600052602260045260246000fd5b50919050565b612d9d80620008c46000396000f3fe6080604052600436106102ae5760003560e01c80636670e6cc116101755780639ca4b2e9116100dc578063d5abeb0111610095578063e8a3d4851161006f578063e8a3d48514610806578063e985e9c51461081b578063f2fde38b1461083b578063f4526f3e1461085b57600080fd5b8063d5abeb01146107bd578063d96a094a146107d3578063d98cf7c2146107e657600080fd5b80639ca4b2e9146106f0578063a22cb46514610710578063a46102cd14610730578063b076a53a1461075d578063b88d4fde1461077d578063c87b56dd1461079d57600080fd5b80638d814a8c1161012e5780638d814a8c146106475780638da5cb5b146106675780638e24bd041461068557806391b7f5ed1461069b578063938e3d7b146106bb57806395d89b41146106db57600080fd5b80636670e6cc1461059a5780636c0360eb146105ba57806370a08231146105cf57806370db69d6146105ef578063715018a61461060557806374cfa89e1461061a57600080fd5b80632ac7a2b31161021957806345710074116101d257806345710074146104df5780634f6ccce7146105005780635008e9811461052057806355f804b31461054057806361dd62fc146105605780636352211e1461057a57600080fd5b80632ac7a2b3146104375780632f745c591461044a5780633ccfd60b1461046a57806340021d111461047f57806342842e0e1461049257806344ada75d146104b257600080fd5b806318160ddd1161026b57806318160ddd146103965780631e96917d146103b557806320e945e2146103cb578063235b6ea1146103e157806323b872dd146103f75780632aac9ee01461041757600080fd5b806301ffc9a7146102b357806306fdde03146102e8578063070e74881461030a578063081812fc1461031f578063095ea7b3146103575780630c58b2fa14610377575b600080fd5b3480156102bf57600080fd5b506102d36102ce3660046127d6565b61087b565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd6108a6565b6040516102df91906129bb565b61031d610318366004612876565b610938565b005b34801561032b57600080fd5b5061033f61033a366004612876565b610ab8565b6040516001600160a01b0390911681526020016102df565b34801561036357600080fd5b5061031d6103723660046126d0565b610b4d565b34801561038357600080fd5b506015546102d390610100900460ff1681565b3480156103a257600080fd5b506008545b6040519081526020016102df565b3480156103c157600080fd5b506103a7600d5481565b3480156103d757600080fd5b506103a7600f5481565b3480156103ed57600080fd5b506103a760105481565b34801561040357600080fd5b5061031d6104123660046125da565b610c63565b34801561042357600080fd5b5061031d6104323660046127bb565b610c94565b61031d610445366004612876565b610cd1565b34801561045657600080fd5b506103a76104653660046126d0565b610e3a565b34801561047657600080fd5b5061031d610ed0565b61031d61048d366004612876565b610f8c565b34801561049e57600080fd5b5061031d6104ad3660046125da565b6110fb565b3480156104be57600080fd5b506103a76104cd36600461257d565b60146020526000908152604090205481565b3480156104eb57600080fd5b506015546102d3906301000000900460ff1681565b34801561050c57600080fd5b506103a761051b366004612876565b611116565b34801561052c57600080fd5b5061031d61053b3660046127bb565b6111a9565b34801561054c57600080fd5b5061031d61055b36600461282d565b6111ef565b34801561056c57600080fd5b506015546102d39060ff1681565b34801561058657600080fd5b5061033f610595366004612876565b611230565b3480156105a657600080fd5b5061031d6105b53660046127bb565b6112a7565b3480156105c657600080fd5b506102fd6112eb565b3480156105db57600080fd5b506103a76105ea36600461257d565b611379565b3480156105fb57600080fd5b506103a760115481565b34801561061157600080fd5b5061031d611400565b34801561062657600080fd5b506103a761063536600461257d565b60136020526000908152604090205481565b34801561065357600080fd5b5061031d6106623660046126fc565b611436565b34801561067357600080fd5b50600a546001600160a01b031661033f565b34801561069157600080fd5b506103a7600e5481565b3480156106a757600080fd5b5061031d6106b6366004612876565b6114c2565b3480156106c757600080fd5b5061031d6106d636600461282d565b6114f1565b3480156106e757600080fd5b506102fd61152e565b3480156106fc57600080fd5b506015546102d39062010000900460ff1681565b34801561071c57600080fd5b5061031d61072b36600461269b565b61153d565b34801561073c57600080fd5b506103a761074b36600461257d565b60126020526000908152604090205481565b34801561076957600080fd5b5061031d6107783660046127bb565b611602565b34801561078957600080fd5b5061031d61079836600461261b565b61164a565b3480156107a957600080fd5b506102fd6107b8366004612876565b611682565b3480156107c957600080fd5b506103a7600c5481565b61031d6107e1366004612876565b61170f565b3480156107f257600080fd5b5061031d6108013660046126fc565b61182b565b34801561081257600080fd5b506102fd6118b7565b34801561082757600080fd5b506102d36108363660046125a1565b6118c6565b34801561084757600080fd5b5061031d61085636600461257d565b6119a5565b34801561086757600080fd5b5061031d6108763660046126fc565b611a40565b60006001600160e01b0319821663780e9d6360e01b14806108a057506108a082611acc565b92915050565b6060600080546108b590612c64565b80601f01602080910402602001604051908101604052809291908181526020018280546108e190612c64565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b5050505050905090565b6002600b5414156109645760405162461bcd60e51b815260040161095b90612b6e565b60405180910390fd5b6002600b55601554610100900460ff166109905760405162461bcd60e51b815260040161095b90612a79565b6011548111156109b25760405162461bcd60e51b815260040161095b90612a20565b600c54600182600d546109c59190612bd6565b6109cf9190612c21565b11156109ed5760405162461bcd60e51b815260040161095b90612b24565b80600e546109fb9190612c02565b341015610a1a5760405162461bcd60e51b815260040161095b90612b49565b33600090815260126020526040902054811115610a495760405162461bcd60e51b815260040161095b90612a57565b3360009081526012602052604081208054839290610a68908490612c21565b90915550600190505b818111610aaf57610a8433600d54611b1c565b6001600d6000828254610a979190612bd6565b90915550819050610aa781612c9f565b915050610a71565b50506001600b55565b6000818152600260205260408120546001600160a01b0316610b315760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161095b565b506000908152600460205260409020546001600160a01b031690565b6000610b5882611230565b9050806001600160a01b0316836001600160a01b03161415610bc65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161095b565b336001600160a01b0382161480610be25750610be281336118c6565b610c545760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161095b565b610c5e8383611b36565b505050565b610c6d3382611ba4565b610c895760405162461bcd60e51b815260040161095b90612ad3565b610c5e838383611c73565b600a546001600160a01b03163314610cbe5760405162461bcd60e51b815260040161095b90612a9e565b6015805460ff1916911515919091179055565b6002600b541415610cf45760405162461bcd60e51b815260040161095b90612b6e565b6002600b5560155460ff16610d1b5760405162461bcd60e51b815260040161095b90612a79565b601154811115610d3d5760405162461bcd60e51b815260040161095b90612a20565b600c54600182600d54610d509190612bd6565b610d5a9190612c21565b1115610d785760405162461bcd60e51b815260040161095b90612b24565b80601054610d869190612c02565b341015610da55760405162461bcd60e51b815260040161095b90612b49565b33600090815260146020526040902054811115610dd45760405162461bcd60e51b815260040161095b90612a57565b3360009081526014602052604081208054839290610df3908490612c21565b90915550600190505b818111610aaf57610e0f33600d54611b1c565b6001600d6000828254610e229190612bd6565b90915550819050610e3281612c9f565b915050610dfc565b6000610e4583611379565b8210610ea75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161095b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600b541415610ef35760405162461bcd60e51b815260040161095b90612b6e565b6002600b55731f562c3259b5266a1a934a4d20d22b7135d3600d6108fc610f1b600a47612bee565b6040518115909202916000818181858888f19350505050158015610f43573d6000803e3d6000fd5b506040517368ff5cb5f3d1bb0e162978449cd410e04bf752d7904780156108fc02916000818181858888f19350505050158015610f84573d6000803e3d6000fd5b506001600b55565b6002600b541415610faf5760405162461bcd60e51b815260040161095b90612b6e565b6002600b5560155462010000900460ff16610fdc5760405162461bcd60e51b815260040161095b90612a79565b601154811115610ffe5760405162461bcd60e51b815260040161095b90612a20565b600c54600182600d546110119190612bd6565b61101b9190612c21565b11156110395760405162461bcd60e51b815260040161095b90612b24565b80600f546110479190612c02565b3410156110665760405162461bcd60e51b815260040161095b90612b49565b336000908152601360205260409020548111156110955760405162461bcd60e51b815260040161095b90612a57565b33600090815260136020526040812080548392906110b4908490612c21565b90915550600190505b818111610aaf576110d033600d54611b1c565b6001600d60008282546110e39190612bd6565b909155508190506110f381612c9f565b9150506110bd565b610c5e8383836040518060200160405280600081525061164a565b600061112160085490565b82106111845760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161095b565b6008828154811061119757611197612d10565b90600052602060002001549050919050565b600a546001600160a01b031633146111d35760405162461bcd60e51b815260040161095b90612a9e565b60158054911515620100000262ff000019909216919091179055565b600a546001600160a01b031633146112195760405162461bcd60e51b815260040161095b90612a9e565b805161122c906016906020840190612477565b5050565b6000818152600260205260408120546001600160a01b0316806108a05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161095b565b600a546001600160a01b031633146112d15760405162461bcd60e51b815260040161095b90612a9e565b601580549115156101000261ff0019909216919091179055565b601680546112f890612c64565b80601f016020809104026020016040519081016040528092919081815260200182805461132490612c64565b80156113715780601f1061134657610100808354040283529160200191611371565b820191906000526020600020905b81548152906001019060200180831161135457829003601f168201915b505050505081565b60006001600160a01b0382166113e45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161095b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461142a5760405162461bcd60e51b815260040161095b90612a9e565b6114346000611e1e565b565b600a546001600160a01b031633146114605760405162461bcd60e51b815260040161095b90612a9e565b60005b8251811015610c5e57816014600085848151811061148357611483612d10565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806114ba90612c9f565b915050611463565b600a546001600160a01b031633146114ec5760405162461bcd60e51b815260040161095b90612a9e565b601055565b600a546001600160a01b0316331461151b5760405162461bcd60e51b815260040161095b90612a9e565b805161122c906017906020840190612477565b6060600180546108b590612c64565b6001600160a01b0382163314156115965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161095b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461162c5760405162461bcd60e51b815260040161095b90612a9e565b6015805491151563010000000263ff00000019909216919091179055565b6116543383611ba4565b6116705760405162461bcd60e51b815260040161095b90612ad3565b61167c84848484611e70565b50505050565b6000818152600260205260409020546060906001600160a01b03166116dd5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b604482015260640161095b565b60166116e883611ea3565b6040516020016116f99291906128d7565b6040516020818303038152906040529050919050565b6002600b5414156117325760405162461bcd60e51b815260040161095b90612b6e565b6002600b556015546301000000900460ff166117605760405162461bcd60e51b815260040161095b90612a79565b6011548111156117825760405162461bcd60e51b815260040161095b90612a20565b600c54600182600d546117959190612bd6565b61179f9190612c21565b11156117bd5760405162461bcd60e51b815260040161095b90612b24565b806010546117cb9190612c02565b3410156117ea5760405162461bcd60e51b815260040161095b90612b49565b60015b818111610aaf5761180033600d54611b1c565b6001600d60008282546118139190612bd6565b9091555081905061182381612c9f565b9150506117ed565b600a546001600160a01b031633146118555760405162461bcd60e51b815260040161095b90612a9e565b60005b8251811015610c5e57816012600085848151811061187857611878612d10565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806118af90612c9f565b915050611858565b6060601780546108b590612c64565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b15801561192257600080fd5b505afa158015611936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195a9190612810565b6001600160a01b031614156119735760019150506108a0565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b600a546001600160a01b031633146119cf5760405162461bcd60e51b815260040161095b90612a9e565b6001600160a01b038116611a345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161095b565b611a3d81611e1e565b50565b600a546001600160a01b03163314611a6a5760405162461bcd60e51b815260040161095b90612a9e565b60005b8251811015610c5e578160136000858481518110611a8d57611a8d612d10565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080611ac490612c9f565b915050611a6d565b60006001600160e01b031982166380ac58cd60e01b1480611afd57506001600160e01b03198216635b5e139f60e01b145b806108a057506301ffc9a760e01b6001600160e01b03198316146108a0565b61122c828260405180602001604052806000815250611fa1565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b6b82611230565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c1d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161095b565b6000611c2883611230565b9050806001600160a01b0316846001600160a01b03161480611c635750836001600160a01b0316611c5884610ab8565b6001600160a01b0316145b8061199d575061199d81856118c6565b826001600160a01b0316611c8682611230565b6001600160a01b031614611cee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161095b565b6001600160a01b038216611d505760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161095b565b611d5b838383611fd4565b611d66600082611b36565b6001600160a01b0383166000908152600360205260408120805460019290611d8f908490612c21565b90915550506001600160a01b0382166000908152600360205260408120805460019290611dbd908490612bd6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e7b848484611c73565b611e878484848461208c565b61167c5760405162461bcd60e51b815260040161095b906129ce565b606081611ec75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef15780611edb81612c9f565b9150611eea9050600a83612bee565b9150611ecb565b60008167ffffffffffffffff811115611f0c57611f0c612d26565b6040519080825280601f01601f191660200182016040528015611f36576020820181803683370190505b5090505b841561199d57611f4b600183612c21565b9150611f58600a86612cba565b611f63906030612bd6565b60f81b818381518110611f7857611f78612d10565b60200101906001600160f81b031916908160001a905350611f9a600a86612bee565b9450611f3a565b611fab8383612199565b611fb8600084848461208c565b610c5e5760405162461bcd60e51b815260040161095b906129ce565b6001600160a01b03831661202f5761202a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612052565b816001600160a01b0316836001600160a01b0316146120525761205283826122e7565b6001600160a01b03821661206957610c5e81612384565b826001600160a01b0316826001600160a01b031614610c5e57610c5e8282612433565b60006001600160a01b0384163b1561218e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120d090339089908890889060040161297e565b602060405180830381600087803b1580156120ea57600080fd5b505af192505050801561211a575060408051601f3d908101601f19168201909252612117918101906127f3565b60015b612174573d808015612148576040519150601f19603f3d011682016040523d82523d6000602084013e61214d565b606091505b50805161216c5760405162461bcd60e51b815260040161095b906129ce565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061199d565b506001949350505050565b6001600160a01b0382166121ef5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161095b565b6000818152600260205260409020546001600160a01b0316156122545760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161095b565b61226060008383611fd4565b6001600160a01b0382166000908152600360205260408120805460019290612289908490612bd6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016122f484611379565b6122fe9190612c21565b600083815260076020526040902054909150808214612351576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061239690600190612c21565b600083815260096020526040812054600880549394509092849081106123be576123be612d10565b9060005260206000200154905080600883815481106123df576123df612d10565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061241757612417612cfa565b6001900381819060005260206000200160009055905550505050565b600061243e83611379565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461248390612c64565b90600052602060002090601f0160209004810192826124a557600085556124eb565b82601f106124be57805160ff19168380011785556124eb565b828001600101855582156124eb579182015b828111156124eb5782518255916020019190600101906124d0565b506124f79291506124fb565b5090565b5b808211156124f757600081556001016124fc565b600067ffffffffffffffff83111561252a5761252a612d26565b61253d601f8401601f1916602001612ba5565b905082815283838301111561255157600080fd5b828260208301376000602084830101529392505050565b8035801515811461257857600080fd5b919050565b60006020828403121561258f57600080fd5b813561259a81612d3c565b9392505050565b600080604083850312156125b457600080fd5b82356125bf81612d3c565b915060208301356125cf81612d3c565b809150509250929050565b6000806000606084860312156125ef57600080fd5b83356125fa81612d3c565b9250602084013561260a81612d3c565b929592945050506040919091013590565b6000806000806080858703121561263157600080fd5b843561263c81612d3c565b9350602085013561264c81612d3c565b925060408501359150606085013567ffffffffffffffff81111561266f57600080fd5b8501601f8101871361268057600080fd5b61268f87823560208401612510565b91505092959194509250565b600080604083850312156126ae57600080fd5b82356126b981612d3c565b91506126c760208401612568565b90509250929050565b600080604083850312156126e357600080fd5b82356126ee81612d3c565b946020939093013593505050565b6000806040838503121561270f57600080fd5b823567ffffffffffffffff8082111561272757600080fd5b818501915085601f83011261273b57600080fd5b813560208282111561274f5761274f612d26565b8160051b9250612760818401612ba5565b8281528181019085830185870184018b101561277b57600080fd5b600096505b848710156127aa578035955061279586612d3c565b85835260019690960195918301918301612780565b509997909101359750505050505050565b6000602082840312156127cd57600080fd5b61259a82612568565b6000602082840312156127e857600080fd5b813561259a81612d51565b60006020828403121561280557600080fd5b815161259a81612d51565b60006020828403121561282257600080fd5b815161259a81612d3c565b60006020828403121561283f57600080fd5b813567ffffffffffffffff81111561285657600080fd5b8201601f8101841361286757600080fd5b61199d84823560208401612510565b60006020828403121561288857600080fd5b5035919050565b600081518084526128a7816020860160208601612c38565b601f01601f19169290920160200192915050565b600081516128cd818560208601612c38565b9290920192915050565b600080845481600182811c9150808316806128f357607f831692505b602080841082141561291357634e487b7160e01b86526022600452602486fd5b818015612927576001811461293857612965565b60ff19861689528489019650612965565b60008b81526020902060005b8681101561295d5781548b820152908501908301612944565b505084890196505b50505050505061297581856128bb565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129b19083018461288f565b9695505050505050565b60208152600061259a602083018461288f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f6174206d6f737420313020746f747a20617420612074696d6500000000000000604082015260600190565b6020808252600890820152676e6f2071756f746160c01b604082015260600190565b6020808252600b908201526a6e6f742073656c6c696e6760a81b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a37baba1037b3103a37ba3d60a91b604082015260600190565b6020808252600b908201526a0d2dcecc2d8d2c840cae8d60ab1b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612bce57612bce612d26565b604052919050565b60008219821115612be957612be9612cce565b500190565b600082612bfd57612bfd612ce4565b500490565b6000816000190483118215151615612c1c57612c1c612cce565b500290565b600082821015612c3357612c33612cce565b500390565b60005b83811015612c53578181015183820152602001612c3b565b8381111561167c5750506000910152565b600181811c90821680612c7857607f821691505b60208210811415612c9957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612cb357612cb3612cce565b5060010190565b600082612cc957612cc9612ce4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a3d57600080fd5b6001600160e01b031981168114611a3d57600080fdfea2646970667358221220e311843dbff18399cdf66370d30327eda8dd2652a0f04d29175e6d74a0eb26ec64736f6c6343000807003368747470733a2f2f73746f726167656170692e666c65656b2e636f2f796f796f69736d65652d7465616d2d6275636b65742f666163656c6573732d746f747a2f746f747a

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80636670e6cc116101755780639ca4b2e9116100dc578063d5abeb0111610095578063e8a3d4851161006f578063e8a3d48514610806578063e985e9c51461081b578063f2fde38b1461083b578063f4526f3e1461085b57600080fd5b8063d5abeb01146107bd578063d96a094a146107d3578063d98cf7c2146107e657600080fd5b80639ca4b2e9146106f0578063a22cb46514610710578063a46102cd14610730578063b076a53a1461075d578063b88d4fde1461077d578063c87b56dd1461079d57600080fd5b80638d814a8c1161012e5780638d814a8c146106475780638da5cb5b146106675780638e24bd041461068557806391b7f5ed1461069b578063938e3d7b146106bb57806395d89b41146106db57600080fd5b80636670e6cc1461059a5780636c0360eb146105ba57806370a08231146105cf57806370db69d6146105ef578063715018a61461060557806374cfa89e1461061a57600080fd5b80632ac7a2b31161021957806345710074116101d257806345710074146104df5780634f6ccce7146105005780635008e9811461052057806355f804b31461054057806361dd62fc146105605780636352211e1461057a57600080fd5b80632ac7a2b3146104375780632f745c591461044a5780633ccfd60b1461046a57806340021d111461047f57806342842e0e1461049257806344ada75d146104b257600080fd5b806318160ddd1161026b57806318160ddd146103965780631e96917d146103b557806320e945e2146103cb578063235b6ea1146103e157806323b872dd146103f75780632aac9ee01461041757600080fd5b806301ffc9a7146102b357806306fdde03146102e8578063070e74881461030a578063081812fc1461031f578063095ea7b3146103575780630c58b2fa14610377575b600080fd5b3480156102bf57600080fd5b506102d36102ce3660046127d6565b61087b565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd6108a6565b6040516102df91906129bb565b61031d610318366004612876565b610938565b005b34801561032b57600080fd5b5061033f61033a366004612876565b610ab8565b6040516001600160a01b0390911681526020016102df565b34801561036357600080fd5b5061031d6103723660046126d0565b610b4d565b34801561038357600080fd5b506015546102d390610100900460ff1681565b3480156103a257600080fd5b506008545b6040519081526020016102df565b3480156103c157600080fd5b506103a7600d5481565b3480156103d757600080fd5b506103a7600f5481565b3480156103ed57600080fd5b506103a760105481565b34801561040357600080fd5b5061031d6104123660046125da565b610c63565b34801561042357600080fd5b5061031d6104323660046127bb565b610c94565b61031d610445366004612876565b610cd1565b34801561045657600080fd5b506103a76104653660046126d0565b610e3a565b34801561047657600080fd5b5061031d610ed0565b61031d61048d366004612876565b610f8c565b34801561049e57600080fd5b5061031d6104ad3660046125da565b6110fb565b3480156104be57600080fd5b506103a76104cd36600461257d565b60146020526000908152604090205481565b3480156104eb57600080fd5b506015546102d3906301000000900460ff1681565b34801561050c57600080fd5b506103a761051b366004612876565b611116565b34801561052c57600080fd5b5061031d61053b3660046127bb565b6111a9565b34801561054c57600080fd5b5061031d61055b36600461282d565b6111ef565b34801561056c57600080fd5b506015546102d39060ff1681565b34801561058657600080fd5b5061033f610595366004612876565b611230565b3480156105a657600080fd5b5061031d6105b53660046127bb565b6112a7565b3480156105c657600080fd5b506102fd6112eb565b3480156105db57600080fd5b506103a76105ea36600461257d565b611379565b3480156105fb57600080fd5b506103a760115481565b34801561061157600080fd5b5061031d611400565b34801561062657600080fd5b506103a761063536600461257d565b60136020526000908152604090205481565b34801561065357600080fd5b5061031d6106623660046126fc565b611436565b34801561067357600080fd5b50600a546001600160a01b031661033f565b34801561069157600080fd5b506103a7600e5481565b3480156106a757600080fd5b5061031d6106b6366004612876565b6114c2565b3480156106c757600080fd5b5061031d6106d636600461282d565b6114f1565b3480156106e757600080fd5b506102fd61152e565b3480156106fc57600080fd5b506015546102d39062010000900460ff1681565b34801561071c57600080fd5b5061031d61072b36600461269b565b61153d565b34801561073c57600080fd5b506103a761074b36600461257d565b60126020526000908152604090205481565b34801561076957600080fd5b5061031d6107783660046127bb565b611602565b34801561078957600080fd5b5061031d61079836600461261b565b61164a565b3480156107a957600080fd5b506102fd6107b8366004612876565b611682565b3480156107c957600080fd5b506103a7600c5481565b61031d6107e1366004612876565b61170f565b3480156107f257600080fd5b5061031d6108013660046126fc565b61182b565b34801561081257600080fd5b506102fd6118b7565b34801561082757600080fd5b506102d36108363660046125a1565b6118c6565b34801561084757600080fd5b5061031d61085636600461257d565b6119a5565b34801561086757600080fd5b5061031d6108763660046126fc565b611a40565b60006001600160e01b0319821663780e9d6360e01b14806108a057506108a082611acc565b92915050565b6060600080546108b590612c64565b80601f01602080910402602001604051908101604052809291908181526020018280546108e190612c64565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b5050505050905090565b6002600b5414156109645760405162461bcd60e51b815260040161095b90612b6e565b60405180910390fd5b6002600b55601554610100900460ff166109905760405162461bcd60e51b815260040161095b90612a79565b6011548111156109b25760405162461bcd60e51b815260040161095b90612a20565b600c54600182600d546109c59190612bd6565b6109cf9190612c21565b11156109ed5760405162461bcd60e51b815260040161095b90612b24565b80600e546109fb9190612c02565b341015610a1a5760405162461bcd60e51b815260040161095b90612b49565b33600090815260126020526040902054811115610a495760405162461bcd60e51b815260040161095b90612a57565b3360009081526012602052604081208054839290610a68908490612c21565b90915550600190505b818111610aaf57610a8433600d54611b1c565b6001600d6000828254610a979190612bd6565b90915550819050610aa781612c9f565b915050610a71565b50506001600b55565b6000818152600260205260408120546001600160a01b0316610b315760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161095b565b506000908152600460205260409020546001600160a01b031690565b6000610b5882611230565b9050806001600160a01b0316836001600160a01b03161415610bc65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161095b565b336001600160a01b0382161480610be25750610be281336118c6565b610c545760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161095b565b610c5e8383611b36565b505050565b610c6d3382611ba4565b610c895760405162461bcd60e51b815260040161095b90612ad3565b610c5e838383611c73565b600a546001600160a01b03163314610cbe5760405162461bcd60e51b815260040161095b90612a9e565b6015805460ff1916911515919091179055565b6002600b541415610cf45760405162461bcd60e51b815260040161095b90612b6e565b6002600b5560155460ff16610d1b5760405162461bcd60e51b815260040161095b90612a79565b601154811115610d3d5760405162461bcd60e51b815260040161095b90612a20565b600c54600182600d54610d509190612bd6565b610d5a9190612c21565b1115610d785760405162461bcd60e51b815260040161095b90612b24565b80601054610d869190612c02565b341015610da55760405162461bcd60e51b815260040161095b90612b49565b33600090815260146020526040902054811115610dd45760405162461bcd60e51b815260040161095b90612a57565b3360009081526014602052604081208054839290610df3908490612c21565b90915550600190505b818111610aaf57610e0f33600d54611b1c565b6001600d6000828254610e229190612bd6565b90915550819050610e3281612c9f565b915050610dfc565b6000610e4583611379565b8210610ea75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161095b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600b541415610ef35760405162461bcd60e51b815260040161095b90612b6e565b6002600b55731f562c3259b5266a1a934a4d20d22b7135d3600d6108fc610f1b600a47612bee565b6040518115909202916000818181858888f19350505050158015610f43573d6000803e3d6000fd5b506040517368ff5cb5f3d1bb0e162978449cd410e04bf752d7904780156108fc02916000818181858888f19350505050158015610f84573d6000803e3d6000fd5b506001600b55565b6002600b541415610faf5760405162461bcd60e51b815260040161095b90612b6e565b6002600b5560155462010000900460ff16610fdc5760405162461bcd60e51b815260040161095b90612a79565b601154811115610ffe5760405162461bcd60e51b815260040161095b90612a20565b600c54600182600d546110119190612bd6565b61101b9190612c21565b11156110395760405162461bcd60e51b815260040161095b90612b24565b80600f546110479190612c02565b3410156110665760405162461bcd60e51b815260040161095b90612b49565b336000908152601360205260409020548111156110955760405162461bcd60e51b815260040161095b90612a57565b33600090815260136020526040812080548392906110b4908490612c21565b90915550600190505b818111610aaf576110d033600d54611b1c565b6001600d60008282546110e39190612bd6565b909155508190506110f381612c9f565b9150506110bd565b610c5e8383836040518060200160405280600081525061164a565b600061112160085490565b82106111845760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161095b565b6008828154811061119757611197612d10565b90600052602060002001549050919050565b600a546001600160a01b031633146111d35760405162461bcd60e51b815260040161095b90612a9e565b60158054911515620100000262ff000019909216919091179055565b600a546001600160a01b031633146112195760405162461bcd60e51b815260040161095b90612a9e565b805161122c906016906020840190612477565b5050565b6000818152600260205260408120546001600160a01b0316806108a05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161095b565b600a546001600160a01b031633146112d15760405162461bcd60e51b815260040161095b90612a9e565b601580549115156101000261ff0019909216919091179055565b601680546112f890612c64565b80601f016020809104026020016040519081016040528092919081815260200182805461132490612c64565b80156113715780601f1061134657610100808354040283529160200191611371565b820191906000526020600020905b81548152906001019060200180831161135457829003601f168201915b505050505081565b60006001600160a01b0382166113e45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161095b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461142a5760405162461bcd60e51b815260040161095b90612a9e565b6114346000611e1e565b565b600a546001600160a01b031633146114605760405162461bcd60e51b815260040161095b90612a9e565b60005b8251811015610c5e57816014600085848151811061148357611483612d10565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806114ba90612c9f565b915050611463565b600a546001600160a01b031633146114ec5760405162461bcd60e51b815260040161095b90612a9e565b601055565b600a546001600160a01b0316331461151b5760405162461bcd60e51b815260040161095b90612a9e565b805161122c906017906020840190612477565b6060600180546108b590612c64565b6001600160a01b0382163314156115965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161095b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461162c5760405162461bcd60e51b815260040161095b90612a9e565b6015805491151563010000000263ff00000019909216919091179055565b6116543383611ba4565b6116705760405162461bcd60e51b815260040161095b90612ad3565b61167c84848484611e70565b50505050565b6000818152600260205260409020546060906001600160a01b03166116dd5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b604482015260640161095b565b60166116e883611ea3565b6040516020016116f99291906128d7565b6040516020818303038152906040529050919050565b6002600b5414156117325760405162461bcd60e51b815260040161095b90612b6e565b6002600b556015546301000000900460ff166117605760405162461bcd60e51b815260040161095b90612a79565b6011548111156117825760405162461bcd60e51b815260040161095b90612a20565b600c54600182600d546117959190612bd6565b61179f9190612c21565b11156117bd5760405162461bcd60e51b815260040161095b90612b24565b806010546117cb9190612c02565b3410156117ea5760405162461bcd60e51b815260040161095b90612b49565b60015b818111610aaf5761180033600d54611b1c565b6001600d60008282546118139190612bd6565b9091555081905061182381612c9f565b9150506117ed565b600a546001600160a01b031633146118555760405162461bcd60e51b815260040161095b90612a9e565b60005b8251811015610c5e57816012600085848151811061187857611878612d10565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806118af90612c9f565b915050611858565b6060601780546108b590612c64565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b15801561192257600080fd5b505afa158015611936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195a9190612810565b6001600160a01b031614156119735760019150506108a0565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b600a546001600160a01b031633146119cf5760405162461bcd60e51b815260040161095b90612a9e565b6001600160a01b038116611a345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161095b565b611a3d81611e1e565b50565b600a546001600160a01b03163314611a6a5760405162461bcd60e51b815260040161095b90612a9e565b60005b8251811015610c5e578160136000858481518110611a8d57611a8d612d10565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080611ac490612c9f565b915050611a6d565b60006001600160e01b031982166380ac58cd60e01b1480611afd57506001600160e01b03198216635b5e139f60e01b145b806108a057506301ffc9a760e01b6001600160e01b03198316146108a0565b61122c828260405180602001604052806000815250611fa1565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b6b82611230565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c1d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161095b565b6000611c2883611230565b9050806001600160a01b0316846001600160a01b03161480611c635750836001600160a01b0316611c5884610ab8565b6001600160a01b0316145b8061199d575061199d81856118c6565b826001600160a01b0316611c8682611230565b6001600160a01b031614611cee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161095b565b6001600160a01b038216611d505760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161095b565b611d5b838383611fd4565b611d66600082611b36565b6001600160a01b0383166000908152600360205260408120805460019290611d8f908490612c21565b90915550506001600160a01b0382166000908152600360205260408120805460019290611dbd908490612bd6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e7b848484611c73565b611e878484848461208c565b61167c5760405162461bcd60e51b815260040161095b906129ce565b606081611ec75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef15780611edb81612c9f565b9150611eea9050600a83612bee565b9150611ecb565b60008167ffffffffffffffff811115611f0c57611f0c612d26565b6040519080825280601f01601f191660200182016040528015611f36576020820181803683370190505b5090505b841561199d57611f4b600183612c21565b9150611f58600a86612cba565b611f63906030612bd6565b60f81b818381518110611f7857611f78612d10565b60200101906001600160f81b031916908160001a905350611f9a600a86612bee565b9450611f3a565b611fab8383612199565b611fb8600084848461208c565b610c5e5760405162461bcd60e51b815260040161095b906129ce565b6001600160a01b03831661202f5761202a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612052565b816001600160a01b0316836001600160a01b0316146120525761205283826122e7565b6001600160a01b03821661206957610c5e81612384565b826001600160a01b0316826001600160a01b031614610c5e57610c5e8282612433565b60006001600160a01b0384163b1561218e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120d090339089908890889060040161297e565b602060405180830381600087803b1580156120ea57600080fd5b505af192505050801561211a575060408051601f3d908101601f19168201909252612117918101906127f3565b60015b612174573d808015612148576040519150601f19603f3d011682016040523d82523d6000602084013e61214d565b606091505b50805161216c5760405162461bcd60e51b815260040161095b906129ce565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061199d565b506001949350505050565b6001600160a01b0382166121ef5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161095b565b6000818152600260205260409020546001600160a01b0316156122545760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161095b565b61226060008383611fd4565b6001600160a01b0382166000908152600360205260408120805460019290612289908490612bd6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016122f484611379565b6122fe9190612c21565b600083815260076020526040902054909150808214612351576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061239690600190612c21565b600083815260096020526040812054600880549394509092849081106123be576123be612d10565b9060005260206000200154905080600883815481106123df576123df612d10565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061241757612417612cfa565b6001900381819060005260206000200160009055905550505050565b600061243e83611379565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461248390612c64565b90600052602060002090601f0160209004810192826124a557600085556124eb565b82601f106124be57805160ff19168380011785556124eb565b828001600101855582156124eb579182015b828111156124eb5782518255916020019190600101906124d0565b506124f79291506124fb565b5090565b5b808211156124f757600081556001016124fc565b600067ffffffffffffffff83111561252a5761252a612d26565b61253d601f8401601f1916602001612ba5565b905082815283838301111561255157600080fd5b828260208301376000602084830101529392505050565b8035801515811461257857600080fd5b919050565b60006020828403121561258f57600080fd5b813561259a81612d3c565b9392505050565b600080604083850312156125b457600080fd5b82356125bf81612d3c565b915060208301356125cf81612d3c565b809150509250929050565b6000806000606084860312156125ef57600080fd5b83356125fa81612d3c565b9250602084013561260a81612d3c565b929592945050506040919091013590565b6000806000806080858703121561263157600080fd5b843561263c81612d3c565b9350602085013561264c81612d3c565b925060408501359150606085013567ffffffffffffffff81111561266f57600080fd5b8501601f8101871361268057600080fd5b61268f87823560208401612510565b91505092959194509250565b600080604083850312156126ae57600080fd5b82356126b981612d3c565b91506126c760208401612568565b90509250929050565b600080604083850312156126e357600080fd5b82356126ee81612d3c565b946020939093013593505050565b6000806040838503121561270f57600080fd5b823567ffffffffffffffff8082111561272757600080fd5b818501915085601f83011261273b57600080fd5b813560208282111561274f5761274f612d26565b8160051b9250612760818401612ba5565b8281528181019085830185870184018b101561277b57600080fd5b600096505b848710156127aa578035955061279586612d3c565b85835260019690960195918301918301612780565b509997909101359750505050505050565b6000602082840312156127cd57600080fd5b61259a82612568565b6000602082840312156127e857600080fd5b813561259a81612d51565b60006020828403121561280557600080fd5b815161259a81612d51565b60006020828403121561282257600080fd5b815161259a81612d3c565b60006020828403121561283f57600080fd5b813567ffffffffffffffff81111561285657600080fd5b8201601f8101841361286757600080fd5b61199d84823560208401612510565b60006020828403121561288857600080fd5b5035919050565b600081518084526128a7816020860160208601612c38565b601f01601f19169290920160200192915050565b600081516128cd818560208601612c38565b9290920192915050565b600080845481600182811c9150808316806128f357607f831692505b602080841082141561291357634e487b7160e01b86526022600452602486fd5b818015612927576001811461293857612965565b60ff19861689528489019650612965565b60008b81526020902060005b8681101561295d5781548b820152908501908301612944565b505084890196505b50505050505061297581856128bb565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129b19083018461288f565b9695505050505050565b60208152600061259a602083018461288f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f6174206d6f737420313020746f747a20617420612074696d6500000000000000604082015260600190565b6020808252600890820152676e6f2071756f746160c01b604082015260600190565b6020808252600b908201526a6e6f742073656c6c696e6760a81b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a37baba1037b3103a37ba3d60a91b604082015260600190565b6020808252600b908201526a0d2dcecc2d8d2c840cae8d60ab1b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612bce57612bce612d26565b604052919050565b60008219821115612be957612be9612cce565b500190565b600082612bfd57612bfd612ce4565b500490565b6000816000190483118215151615612c1c57612c1c612cce565b500290565b600082821015612c3357612c33612cce565b500390565b60005b83811015612c53578181015183820152602001612c3b565b8381111561167c5750506000910152565b600181811c90821680612c7857607f821691505b60208210811415612c9957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612cb357612cb3612cce565b5060010190565b600082612cc957612cc9612ce4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a3d57600080fd5b6001600160e01b031981168114611a3d57600080fdfea2646970667358221220e311843dbff18399cdf66370d30327eda8dd2652a0f04d29175e6d74a0eb26ec64736f6c63430008070033

Deployed Bytecode Sourcemap

48108:9332:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36476:300;;;;;;;;;;-1:-1:-1;36476:300:0;;;;;:::i;:::-;;:::i;:::-;;;8353:14:1;;8346:22;8328:41;;8316:2;8301:18;36476:300:0;;;;;;;;22616:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54436:561::-;;;;;;:::i;:::-;;:::i;:::-;;24309:308;;;;;;;;;;-1:-1:-1;24309:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7651:32:1;;;7633:51;;7621:2;7606:18;24309:308:0;7487:203:1;23832:411:0;;;;;;;;;;-1:-1:-1;23832:411:0;;;;;:::i;:::-;;:::i;48768:29::-;;;;;;;;;;-1:-1:-1;48768:29:0;;;;;;;;;;;37279:113;;;;;;;;;;-1:-1:-1;37367:10:0;:17;37279:113;;;17957:25:1;;;17945:2;17930:18;37279:113:0;17811:177:1;48254:26:0;;;;;;;;;;;;;;;;48397:48;;;;;;;;;;;;;;;;48465:41;;;;;;;;;;;;;;;;25368:376;;;;;;;;;;-1:-1:-1;25368:376:0;;;;;:::i;:::-;;:::i;55005:113::-;;;;;;;;;;-1:-1:-1;55005:113:0;;;;;:::i;:::-;;:::i;55126:564::-;;;;;;:::i;:::-;;:::i;36860:343::-;;;;;;;;;;-1:-1:-1;36860:343:0;;;;;:::i;:::-;;:::i;55698:347::-;;;;;;;;;;;;;:::i;53758:561::-;;;;;;:::i;:::-;;:::i;25815:185::-;;;;;;;;;;-1:-1:-1;25815:185:0;;;;;:::i;:::-;;:::i;48669:50::-;;;;;;;;;;-1:-1:-1;48669:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;48840:24;;;;;;;;;;-1:-1:-1;48840:24:0;;;;;;;;;;;37469:320;;;;;;;;;;-1:-1:-1;37469:320:0;;;;;:::i;:::-;;:::i;53649:101::-;;;;;;;;;;-1:-1:-1;53649:101:0;;;;;:::i;:::-;;:::i;56960:104::-;;;;;;;;;;-1:-1:-1;56960:104:0;;;;;:::i;:::-;;:::i;48728:33::-;;;;;;;;;;-1:-1:-1;48728:33:0;;;;;;;;22223:326;;;;;;;;;;-1:-1:-1;22223:326:0;;;;;:::i;:::-;;:::i;54327:101::-;;;;;;;;;;-1:-1:-1;54327:101:0;;;;;:::i;:::-;;:::i;48873:26::-;;;;;;;;;;;;;:::i;21866:295::-;;;;;;;;;;-1:-1:-1;21866:295:0;;;;;:::i;:::-;;:::i;48526:26::-;;;;;;;;;;;;;;;;44562:94;;;;;;;;;;;;;:::i;48615:47::-;;;;;;;;;;-1:-1:-1;48615:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;52332:228;;;;;;;;;;-1:-1:-1;52332:228:0;;;;;:::i;:::-;;:::i;43911:87::-;;;;;;;;;;-1:-1:-1;43984:6:0;;-1:-1:-1;;;;;43984:6:0;43911:87;;48330:48;;;;;;;;;;;;;;;;53028:89;;;;;;;;;;-1:-1:-1;53028:89:0;;;;;:::i;:::-;;:::i;56704:121::-;;;;;;;;;;-1:-1:-1;56704:121:0;;;;;:::i;:::-;;:::i;22785:104::-;;;;;;;;;;;;;:::i;48804:29::-;;;;;;;;;;-1:-1:-1;48804:29:0;;;;;;;;;;;24689:327;;;;;;;;;;-1:-1:-1;24689:327:0;;;;;:::i;:::-;;:::i;48561:47::-;;;;;;;;;;-1:-1:-1;48561:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;53125:77;;;;;;;;;;-1:-1:-1;53125:77:0;;;;;:::i;:::-;;:::i;26071:365::-;;;;;;;;;;-1:-1:-1;26071:365:0;;;;;:::i;:::-;;:::i;57180:257::-;;;;;;;;;;-1:-1:-1;57180:257:0;;;;;:::i;:::-;;:::i;48217:30::-;;;;;;;;;;;;;;;;53210:431;;;;;;:::i;:::-;;:::i;52568:222::-;;;;;;;;;;-1:-1:-1;52568:222:0;;;;;:::i;:::-;;:::i;56853:99::-;;;;;;;;;;;;;:::i;56177:519::-;;;;;;;;;;-1:-1:-1;56177:519:0;;;;;:::i;:::-;;:::i;44811:229::-;;;;;;;;;;-1:-1:-1;44811:229:0;;;;;:::i;:::-;;:::i;52798:222::-;;;;;;;;;;-1:-1:-1;52798:222:0;;;;;:::i;:::-;;:::i;36476:300::-;36623:4;-1:-1:-1;;;;;;36665:50:0;;-1:-1:-1;;;36665:50:0;;:103;;;36732:36;36756:11;36732:23;:36::i;:::-;36645:123;36476:300;-1:-1:-1;;36476:300:0:o;22616:100::-;22670:13;22703:5;22696:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22616:100;:::o;54436:561::-;46977:1;47573:7;;:19;;47565:63;;;;-1:-1:-1;;;47565:63:0;;;;;;;:::i;:::-;;;;;;;;;46977:1;47706:7;:18;54518:10:::1;::::0;::::1;::::0;::::1;;;54510:34;;;;-1:-1:-1::0;;;54510:34:0::1;;;;;;;:::i;:::-;54573:6;;54563;:16;;54555:54;;;;-1:-1:-1::0;;;54555:54:0::1;;;;;;;:::i;:::-;54651:9;;54646:1;54637:6;54628;;:15;;;;:::i;:::-;:19;;;;:::i;:::-;:32;;54620:56;;;;-1:-1:-1::0;;;54620:56:0::1;;;;;;;:::i;:::-;54724:6;54708:13;;:22;;;;:::i;:::-;54695:9;:35;;54687:59;;;;-1:-1:-1::0;;;54687:59:0::1;;;;;;;:::i;:::-;54778:10;54765:24;::::0;;;:12:::1;:24;::::0;;;;;:34;-1:-1:-1;54765:34:0::1;54757:55;;;;-1:-1:-1::0;;;54757:55:0::1;;;;;;;:::i;:::-;54836:10;54823:24;::::0;;;:12:::1;:24;::::0;;;;:34;;54851:6;;54823:24;:34:::1;::::0;54851:6;;54823:34:::1;:::i;:::-;::::0;;;-1:-1:-1;54887:1:0::1;::::0;-1:-1:-1;54870:120:0::1;54895:6;54890:1;:11;54870:120;;54923:29;54933:10;54945:6;;54923:9;:29::i;:::-;54977:1;54967:6;;:11;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;54903:3:0;;-1:-1:-1;54903:3:0::1;::::0;::::1;:::i;:::-;;;;54870:120;;;-1:-1:-1::0;;46933:1:0;47885:7;:22;54436:561::o;24309:308::-;24430:7;28072:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28072:16:0;24455:110;;;;-1:-1:-1;;;24455:110:0;;14210:2:1;24455:110:0;;;14192:21:1;14249:2;14229:18;;;14222:30;14288:34;14268:18;;;14261:62;-1:-1:-1;;;14339:18:1;;;14332:42;14391:19;;24455:110:0;14008:408:1;24455:110:0;-1:-1:-1;24585:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24585:24:0;;24309:308::o;23832:411::-;23913:13;23929:23;23944:7;23929:14;:23::i;:::-;23913:39;;23977:5;-1:-1:-1;;;;;23971:11:0;:2;-1:-1:-1;;;;;23971:11:0;;;23963:57;;;;-1:-1:-1;;;23963:57:0;;15740:2:1;23963:57:0;;;15722:21:1;15779:2;15759:18;;;15752:30;15818:34;15798:18;;;15791:62;-1:-1:-1;;;15869:18:1;;;15862:31;15910:19;;23963:57:0;15538:397:1;23963:57:0;16877:10;-1:-1:-1;;;;;24055:21:0;;;;:62;;-1:-1:-1;24080:37:0;24097:5;16877:10;56177:519;:::i;24080:37::-;24033:168;;;;-1:-1:-1;;;24033:168:0;;12603:2:1;24033:168:0;;;12585:21:1;12642:2;12622:18;;;12615:30;12681:34;12661:18;;;12654:62;12752:26;12732:18;;;12725:54;12796:19;;24033:168:0;12401:420:1;24033:168:0;24214:21;24223:2;24227:7;24214:8;:21::i;:::-;23902:341;23832:411;;:::o;25368:376::-;25577:41;16877:10;25610:7;25577:18;:41::i;:::-;25555:140;;;;-1:-1:-1;;;25555:140:0;;;;;;;:::i;:::-;25708:28;25718:4;25724:2;25728:7;25708:9;:28::i;55005:113::-;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;55080:13:::1;:30:::0;;-1:-1:-1;;55080:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55005:113::o;55126:564::-;46977:1;47573:7;;:19;;47565:63;;;;-1:-1:-1;;;47565:63:0;;;;;;;:::i;:::-;46977:1;47706:7;:18;55211:13:::1;::::0;::::1;;55203:37;;;;-1:-1:-1::0;;;55203:37:0::1;;;;;;;:::i;:::-;55269:6;;55259;:16;;55251:54;;;;-1:-1:-1::0;;;55251:54:0::1;;;;;;;:::i;:::-;55347:9;;55342:1;55333:6;55324;;:15;;;;:::i;:::-;:19;;;;:::i;:::-;:32;;55316:56;;;;-1:-1:-1::0;;;55316:56:0::1;;;;;;;:::i;:::-;55413:6;55404;;:15;;;;:::i;:::-;55391:9;:28;;55383:52;;;;-1:-1:-1::0;;;55383:52:0::1;;;;;;;:::i;:::-;55470:10;55454:27;::::0;;;:15:::1;:27;::::0;;;;;:37;-1:-1:-1;55454:37:0::1;55446:58;;;;-1:-1:-1::0;;;55446:58:0::1;;;;;;;:::i;:::-;55531:10;55515:27;::::0;;;:15:::1;:27;::::0;;;;:37;;55546:6;;55515:27;:37:::1;::::0;55546:6;;55515:37:::1;:::i;:::-;::::0;;;-1:-1:-1;55580:1:0::1;::::0;-1:-1:-1;55563:120:0::1;55588:6;55583:1;:11;55563:120;;55616:29;55626:10;55638:6;;55616:9;:29::i;:::-;55670:1;55660:6;;:11;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;55596:3:0;;-1:-1:-1;55596:3:0::1;::::0;::::1;:::i;:::-;;;;55563:120;;36860:343:::0;37002:7;37057:23;37074:5;37057:16;:23::i;:::-;37049:5;:31;37027:124;;;;-1:-1:-1;;;37027:124:0;;8806:2:1;37027:124:0;;;8788:21:1;8845:2;8825:18;;;8818:30;8884:34;8864:18;;;8857:62;-1:-1:-1;;;8935:18:1;;;8928:41;8986:19;;37027:124:0;8604:407:1;37027:124:0;-1:-1:-1;;;;;;37169:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36860:343::o;55698:347::-;46977:1;47573:7;;:19;;47565:63;;;;-1:-1:-1;;;47565:63:0;;;;;;;:::i;:::-;46977:1;47706:7;:18;55785:42:::1;55777:112;55852:26;55876:2;55852:21;:26;:::i;:::-;55777:112;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;55930:107:0::1;::::0;55938:42:::1;::::0;56005:21:::1;55930:107:::0;::::1;;;::::0;::::1;::::0;;;56005:21;55938:42;55930:107;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;46933:1:0;47885:7;:22;55698:347::o;53758:561::-;46977:1;47573:7;;:19;;47565:63;;;;-1:-1:-1;;;47565:63:0;;;;;;;:::i;:::-;46977:1;47706:7;:18;53840:10:::1;::::0;;;::::1;;;53832:34;;;;-1:-1:-1::0;;;53832:34:0::1;;;;;;;:::i;:::-;53895:6;;53885;:16;;53877:54;;;;-1:-1:-1::0;;;53877:54:0::1;;;;;;;:::i;:::-;53973:9;;53968:1;53959:6;53950;;:15;;;;:::i;:::-;:19;;;;:::i;:::-;:32;;53942:56;;;;-1:-1:-1::0;;;53942:56:0::1;;;;;;;:::i;:::-;54046:6;54030:13;;:22;;;;:::i;:::-;54017:9;:35;;54009:59;;;;-1:-1:-1::0;;;54009:59:0::1;;;;;;;:::i;:::-;54100:10;54087:24;::::0;;;:12:::1;:24;::::0;;;;;:34;-1:-1:-1;54087:34:0::1;54079:55;;;;-1:-1:-1::0;;;54079:55:0::1;;;;;;;:::i;:::-;54158:10;54145:24;::::0;;;:12:::1;:24;::::0;;;;:34;;54173:6;;54145:24;:34:::1;::::0;54173:6;;54145:34:::1;:::i;:::-;::::0;;;-1:-1:-1;54209:1:0::1;::::0;-1:-1:-1;54192:120:0::1;54217:6;54212:1;:11;54192:120;;54245:29;54255:10;54267:6;;54245:9;:29::i;:::-;54299:1;54289:6;;:11;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;54225:3:0;;-1:-1:-1;54225:3:0::1;::::0;::::1;:::i;:::-;;;;54192:120;;25815:185:::0;25953:39;25970:4;25976:2;25980:7;25953:39;;;;;;;;;;;;:16;:39::i;37469:320::-;37589:7;37644:30;37367:10;:17;;37279:113;37644:30;37636:5;:38;37614:132;;;;-1:-1:-1;;;37614:132:0;;16900:2:1;37614:132:0;;;16882:21:1;16939:2;16919:18;;;16912:30;16978:34;16958:18;;;16951:62;-1:-1:-1;;;17029:18:1;;;17022:42;17081:19;;37614:132:0;16698:408:1;37614:132:0;37764:10;37775:5;37764:17;;;;;;;;:::i;:::-;;;;;;;;;37757:24;;37469:320;;;:::o;53649:101::-;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;53718:10:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;53718:24:0;;::::1;::::0;;;::::1;::::0;;53649:101::o;56960:104::-;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;57036:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;56960:104:::0;:::o;22223:326::-;22340:7;22381:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22381:16:0;22430:19;22408:110;;;;-1:-1:-1;;;22408:110:0;;13439:2:1;22408:110:0;;;13421:21:1;13478:2;13458:18;;;13451:30;13517:34;13497:18;;;13490:62;-1:-1:-1;;;13568:18:1;;;13561:39;13617:19;;22408:110:0;13237:405:1;54327:101:0;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;54396:10:::1;:24:::0;;;::::1;;;;-1:-1:-1::0;;54396:24:0;;::::1;::::0;;;::::1;::::0;;54327:101::o;48873:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21866:295::-;21983:7;-1:-1:-1;;;;;22030:19:0;;22008:111;;;;-1:-1:-1;;;22008:111:0;;13028:2:1;22008:111:0;;;13010:21:1;13067:2;13047:18;;;13040:30;13106:34;13086:18;;;13079:62;-1:-1:-1;;;13157:18:1;;;13150:40;13207:19;;22008:111:0;12826:406:1;22008:111:0;-1:-1:-1;;;;;;22137:16:0;;;;;:9;:16;;;;;;;21866:295::o;44562:94::-;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;44627:21:::1;44645:1;44627:9;:21::i;:::-;44562:94::o:0;52332:228::-;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;52451:9:::1;52446:107;52470:7;:14;52466:1;:18;52446:107;;;52536:5;52506:15;:27;52522:7;52530:1;52522:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;52506:27:0::1;-1:-1:-1::0;;;;;52506:27:0::1;;;;;;;;;;;;:35;;;;52486:3;;;;;:::i;:::-;;;;52446:107;;53028:89:::0;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;53092:6:::1;:17:::0;53028:89::o;56704:121::-;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;56788:29;;::::1;::::0;:12:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;22785:104::-:0;22841:13;22874:7;22867:14;;;;;:::i;24689:327::-;-1:-1:-1;;;;;24824:24:0;;16877:10;24824:24;;24816:62;;;;-1:-1:-1;;;24816:62:0;;11496:2:1;24816:62:0;;;11478:21:1;11535:2;11515:18;;;11508:30;11574:27;11554:18;;;11547:55;11619:18;;24816:62:0;11294:349:1;24816:62:0;16877:10;24891:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24891:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24891:53:0;;;;;;;;;;24960:48;;8328:41:1;;;24891:42:0;;16877:10;24960:48;;8301:18:1;24960:48:0;;;;;;;24689:327;;:::o;53125:77::-;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;53182:4:::1;:12:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;53182:12:0;;::::1;::::0;;;::::1;::::0;;53125:77::o;26071:365::-;26260:41;16877:10;26293:7;26260:18;:41::i;:::-;26238:140;;;;-1:-1:-1;;;26238:140:0;;;;;;;:::i;:::-;26389:39;26403:4;26409:2;26413:7;26422:5;26389:13;:39::i;:::-;26071:365;;;;:::o;57180:257::-;28048:4;28072:16;;;:7;:16;;;;;;57281:13;;-1:-1:-1;;;;;28072:16:0;57312:46;;;;-1:-1:-1;;;57312:46:0;;14623:2:1;57312:46:0;;;14605:21:1;14662:2;14642:18;;;14635:30;-1:-1:-1;;;14681:18:1;;;14674:47;14738:18;;57312:46:0;14421:341:1;57312:46:0;57400:7;57409:18;:7;:16;:18::i;:::-;57383:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57369:60;;57180:257;;;:::o;53210:431::-;46977:1;47573:7;;:19;;47565:63;;;;-1:-1:-1;;;47565:63:0;;;;;;;:::i;:::-;46977:1;47706:7;:18;53286:4:::1;::::0;;;::::1;;;53278:28;;;;-1:-1:-1::0;;;53278:28:0::1;;;;;;;:::i;:::-;53335:6;;53325;:16;;53317:54;;;;-1:-1:-1::0;;;53317:54:0::1;;;;;;;:::i;:::-;53413:9;;53408:1;53399:6;53390;;:15;;;;:::i;:::-;:19;;;;:::i;:::-;:32;;53382:56;;;;-1:-1:-1::0;;;53382:56:0::1;;;;;;;:::i;:::-;53479:6;53470;;:15;;;;:::i;:::-;53457:9;:28;;53449:52;;;;-1:-1:-1::0;;;53449:52:0::1;;;;;;;:::i;:::-;53531:1;53514:120;53539:6;53534:1;:11;53514:120;;53567:29;53577:10;53589:6;;53567:9;:29::i;:::-;53621:1;53611:6;;:11;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;53547:3:0;;-1:-1:-1;53547:3:0::1;::::0;::::1;:::i;:::-;;;;53514:120;;52568:222:::0;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;52684:9:::1;52679:104;52703:7;:14;52699:1;:18;52679:104;;;52766:5;52739:12;:24;52752:7;52760:1;52752:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;52739:24:0::1;-1:-1:-1::0;;;;;52739:24:0::1;;;;;;;;;;;;:32;;;;52719:3;;;;;:::i;:::-;;;;52679:104;;56853:99:::0;56899:13;56932:12;56925:19;;;;;:::i;56177:519::-;56551:28;;-1:-1:-1;;;56551:28:0;;-1:-1:-1;;;;;7651:32:1;;;56551:28:0;;;7633:51:1;56302:4:0;;56410:42;;56543:49;;;56410:42;;56551:21;;7606:18:1;;56551:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56543:49:0;;56539:93;;;56616:4;56609:11;;;;;56539:93;-1:-1:-1;;;;;25258:25:0;;;25229:4;25258:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;56649:39;56642:46;56177:519;-1:-1:-1;;;;56177:519:0:o;44811:229::-;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44914:22:0;::::1;44892:110;;;::::0;-1:-1:-1;;;44892:110:0;;9637:2:1;44892:110:0::1;::::0;::::1;9619:21:1::0;9676:2;9656:18;;;9649:30;9715:34;9695:18;;;9688:62;-1:-1:-1;;;9766:18:1;;;9759:36;9812:19;;44892:110:0::1;9435:402:1::0;44892:110:0::1;45013:19;45023:8;45013:9;:19::i;:::-;44811:229:::0;:::o;52798:222::-;43984:6;;-1:-1:-1;;;;;43984:6:0;16877:10;44131:23;44123:68;;;;-1:-1:-1;;;44123:68:0;;;;;;;:::i;:::-;52914:9:::1;52909:104;52933:7;:14;52929:1;:18;52909:104;;;52996:5;52969:12;:24;52982:7;52990:1;52982:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;52969:24:0::1;-1:-1:-1::0;;;;;52969:24:0::1;;;;;;;;;;;;:32;;;;52949:3;;;;;:::i;:::-;;;;52909:104;;21447:355:::0;21594:4;-1:-1:-1;;;;;;21636:40:0;;-1:-1:-1;;;21636:40:0;;:105;;-1:-1:-1;;;;;;;21693:48:0;;-1:-1:-1;;;21693:48:0;21636:105;:158;;;-1:-1:-1;;;;;;;;;;20072:40:0;;;21758:36;19913:207;29071:110;29147:26;29157:2;29161:7;29147:26;;;;;;;;;;;;:9;:26::i;32106:174::-;32181:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32181:29:0;-1:-1:-1;;;;;32181:29:0;;;;;;;;:24;;32235:23;32181:24;32235:14;:23::i;:::-;-1:-1:-1;;;;;32226:46:0;;;;;;;;;;;32106:174;;:::o;28277:452::-;28406:4;28072:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28072:16:0;28428:110;;;;-1:-1:-1;;;28428:110:0;;11850:2:1;28428:110:0;;;11832:21:1;11889:2;11869:18;;;11862:30;11928:34;11908:18;;;11901:62;-1:-1:-1;;;11979:18:1;;;11972:42;12031:19;;28428:110:0;11648:408:1;28428:110:0;28549:13;28565:23;28580:7;28565:14;:23::i;:::-;28549:39;;28618:5;-1:-1:-1;;;;;28607:16:0;:7;-1:-1:-1;;;;;28607:16:0;;:64;;;;28664:7;-1:-1:-1;;;;;28640:31:0;:20;28652:7;28640:11;:20::i;:::-;-1:-1:-1;;;;;28640:31:0;;28607:64;:113;;;;28688:32;28705:5;28712:7;28688:16;:32::i;31373:615::-;31546:4;-1:-1:-1;;;;;31519:31:0;:23;31534:7;31519:14;:23::i;:::-;-1:-1:-1;;;;;31519:31:0;;31497:122;;;;-1:-1:-1;;;31497:122:0;;15330:2:1;31497:122:0;;;15312:21:1;15369:2;15349:18;;;15342:30;15408:34;15388:18;;;15381:62;-1:-1:-1;;;15459:18:1;;;15452:39;15508:19;;31497:122:0;15128:405:1;31497:122:0;-1:-1:-1;;;;;31638:16:0;;31630:65;;;;-1:-1:-1;;;31630:65:0;;11091:2:1;31630:65:0;;;11073:21:1;11130:2;11110:18;;;11103:30;11169:34;11149:18;;;11142:62;-1:-1:-1;;;11220:18:1;;;11213:34;11264:19;;31630:65:0;10889:400:1;31630:65:0;31708:39;31729:4;31735:2;31739:7;31708:20;:39::i;:::-;31812:29;31829:1;31833:7;31812:8;:29::i;:::-;-1:-1:-1;;;;;31854:15:0;;;;;;:9;:15;;;;;:20;;31873:1;;31854:15;:20;;31873:1;;31854:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31885:13:0;;;;;;:9;:13;;;;;:18;;31902:1;;31885:13;:18;;31902:1;;31885:18;:::i;:::-;;;;-1:-1:-1;;31914:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31914:21:0;-1:-1:-1;;;;;31914:21:0;;;;;;;;;31953:27;;31914:16;;31953:27;;;;;;;31373:615;;;:::o;45048:173::-;45123:6;;;-1:-1:-1;;;;;45140:17:0;;;-1:-1:-1;;;;;;45140:17:0;;;;;;;45173:40;;45123:6;;;45140:17;45123:6;;45173:40;;45104:16;;45173:40;45093:128;45048:173;:::o;27318:352::-;27475:28;27485:4;27491:2;27495:7;27475:9;:28::i;:::-;27536:48;27559:4;27565:2;27569:7;27578:5;27536:22;:48::i;:::-;27514:148;;;;-1:-1:-1;;;27514:148:0;;;;;;;:::i;17324:723::-;17380:13;17601:10;17597:53;;-1:-1:-1;;17628:10:0;;;;;;;;;;;;-1:-1:-1;;;17628:10:0;;;;;17324:723::o;17597:53::-;17675:5;17660:12;17716:78;17723:9;;17716:78;;17749:8;;;;:::i;:::-;;-1:-1:-1;17772:10:0;;-1:-1:-1;17780:2:0;17772:10;;:::i;:::-;;;17716:78;;;17804:19;17836:6;17826:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17826:17:0;;17804:39;;17854:154;17861:10;;17854:154;;17888:11;17898:1;17888:11;;:::i;:::-;;-1:-1:-1;17957:10:0;17965:2;17957:5;:10;:::i;:::-;17944:24;;:2;:24;:::i;:::-;17931:39;;17914:6;17921;17914:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17914:56:0;;;;;;;;-1:-1:-1;17985:11:0;17994:2;17985:11;;:::i;:::-;;;17854:154;;29408:321;29538:18;29544:2;29548:7;29538:5;:18::i;:::-;29589:54;29620:1;29624:2;29628:7;29637:5;29589:22;:54::i;:::-;29567:154;;;;-1:-1:-1;;;29567:154:0;;;;;;;:::i;38402:589::-;-1:-1:-1;;;;;38608:18:0;;38604:187;;38643:40;38675:7;39818:10;:17;;39791:24;;;;:15;:24;;;;;:44;;;39846:24;;;;;;;;;;;;39714:164;38643:40;38604:187;;;38713:2;-1:-1:-1;;;;;38705:10:0;:4;-1:-1:-1;;;;;38705:10:0;;38701:90;;38732:47;38765:4;38771:7;38732:32;:47::i;:::-;-1:-1:-1;;;;;38805:16:0;;38801:183;;38838:45;38875:7;38838:36;:45::i;38801:183::-;38911:4;-1:-1:-1;;;;;38905:10:0;:2;-1:-1:-1;;;;;38905:10:0;;38901:83;;38932:40;38960:2;38964:7;38932:27;:40::i;32845:980::-;33000:4;-1:-1:-1;;;;;33021:13:0;;8695:20;8743:8;33017:801;;33074:175;;-1:-1:-1;;;33074:175:0;;-1:-1:-1;;;;;33074:36:0;;;;;:175;;16877:10;;33168:4;;33195:7;;33225:5;;33074:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33074:175:0;;;;;;;;-1:-1:-1;;33074:175:0;;;;;;;;;;;;:::i;:::-;;;33053:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33432:13:0;;33428:320;;33475:108;;-1:-1:-1;;;33475:108:0;;;;;;;:::i;33428:320::-;33698:6;33692:13;33683:6;33679:2;33675:15;33668:38;33053:710;-1:-1:-1;;;;;;33313:51:0;-1:-1:-1;;;33313:51:0;;-1:-1:-1;33306:58:0;;33017:801;-1:-1:-1;33802:4:0;32845:980;;;;;;:::o;30065:382::-;-1:-1:-1;;;;;30145:16:0;;30137:61;;;;-1:-1:-1;;;30137:61:0;;13849:2:1;30137:61:0;;;13831:21:1;;;13868:18;;;13861:30;13927:34;13907:18;;;13900:62;13979:18;;30137:61:0;13647:356:1;30137:61:0;28048:4;28072:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28072:16:0;:30;30209:58;;;;-1:-1:-1;;;30209:58:0;;10398:2:1;30209:58:0;;;10380:21:1;10437:2;10417:18;;;10410:30;10476;10456:18;;;10449:58;10524:18;;30209:58:0;10196:352:1;30209:58:0;30280:45;30309:1;30313:2;30317:7;30280:20;:45::i;:::-;-1:-1:-1;;;;;30338:13:0;;;;;;:9;:13;;;;;:18;;30355:1;;30338:13;:18;;30355:1;;30338:18;:::i;:::-;;;;-1:-1:-1;;30367:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30367:21:0;-1:-1:-1;;;;;30367:21:0;;;;;;;;30406:33;;30367:16;;;30406:33;;30367:16;;30406:33;30065:382;;:::o;40505:1002::-;40785:22;40835:1;40810:22;40827:4;40810:16;:22::i;:::-;:26;;;;:::i;:::-;40847:18;40868:26;;;:17;:26;;;;;;40785:51;;-1:-1:-1;41001:28:0;;;40997:328;;-1:-1:-1;;;;;41068:18:0;;41046:19;41068:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41119:30;;;;;;:44;;;41236:30;;:17;:30;;;;;:43;;;40997:328;-1:-1:-1;41421:26:0;;;;:17;:26;;;;;;;;41414:33;;;-1:-1:-1;;;;;41465:18:0;;;;;:12;:18;;;;;:34;;;;;;;41458:41;40505:1002::o;41802:1079::-;42080:10;:17;42055:22;;42080:21;;42100:1;;42080:21;:::i;:::-;42112:18;42133:24;;;:15;:24;;;;;;42506:10;:26;;42055:46;;-1:-1:-1;42133:24:0;;42055:46;;42506:26;;;;;;:::i;:::-;;;;;;;;;42484:48;;42570:11;42545:10;42556;42545:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42650:28;;;:15;:28;;;;;;;:41;;;42822:24;;;;;42815:31;42857:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41873:1008;;;41802:1079;:::o;39292:221::-;39377:14;39394:20;39411:2;39394:16;:20::i;:::-;-1:-1:-1;;;;;39425:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39470:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39292:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:160::-;490:20;;546:13;;539:21;529:32;;519:60;;575:1;572;565:12;519:60;425:160;;;:::o;590:247::-;649:6;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;:::-;826:5;590:247;-1:-1:-1;;;590:247:1:o;842:388::-;910:6;918;971:2;959:9;950:7;946:23;942:32;939:52;;;987:1;984;977:12;939:52;1026:9;1013:23;1045:31;1070:5;1045:31;:::i;:::-;1095:5;-1:-1:-1;1152:2:1;1137:18;;1124:32;1165:33;1124:32;1165:33;:::i;:::-;1217:7;1207:17;;;842:388;;;;;:::o;1235:456::-;1312:6;1320;1328;1381:2;1369:9;1360:7;1356:23;1352:32;1349:52;;;1397:1;1394;1387:12;1349:52;1436:9;1423:23;1455:31;1480:5;1455:31;:::i;:::-;1505:5;-1:-1:-1;1562:2:1;1547:18;;1534:32;1575:33;1534:32;1575:33;:::i;:::-;1235:456;;1627:7;;-1:-1:-1;;;1681:2:1;1666:18;;;;1653:32;;1235:456::o;1696:794::-;1791:6;1799;1807;1815;1868:3;1856:9;1847:7;1843:23;1839:33;1836:53;;;1885:1;1882;1875:12;1836:53;1924:9;1911:23;1943:31;1968:5;1943:31;:::i;:::-;1993:5;-1:-1:-1;2050:2:1;2035:18;;2022:32;2063:33;2022:32;2063:33;:::i;:::-;2115:7;-1:-1:-1;2169:2:1;2154:18;;2141:32;;-1:-1:-1;2224:2:1;2209:18;;2196:32;2251:18;2240:30;;2237:50;;;2283:1;2280;2273:12;2237:50;2306:22;;2359:4;2351:13;;2347:27;-1:-1:-1;2337:55:1;;2388:1;2385;2378:12;2337:55;2411:73;2476:7;2471:2;2458:16;2453:2;2449;2445:11;2411:73;:::i;:::-;2401:83;;;1696:794;;;;;;;:::o;2495:315::-;2560:6;2568;2621:2;2609:9;2600:7;2596:23;2592:32;2589:52;;;2637:1;2634;2627:12;2589:52;2676:9;2663:23;2695:31;2720:5;2695:31;:::i;:::-;2745:5;-1:-1:-1;2769:35:1;2800:2;2785:18;;2769:35;:::i;:::-;2759:45;;2495:315;;;;;:::o;2815:::-;2883:6;2891;2944:2;2932:9;2923:7;2919:23;2915:32;2912:52;;;2960:1;2957;2950:12;2912:52;2999:9;2986:23;3018:31;3043:5;3018:31;:::i;:::-;3068:5;3120:2;3105:18;;;;3092:32;;-1:-1:-1;;;2815:315:1:o;3135:1102::-;3228:6;3236;3289:2;3277:9;3268:7;3264:23;3260:32;3257:52;;;3305:1;3302;3295:12;3257:52;3345:9;3332:23;3374:18;3415:2;3407:6;3404:14;3401:34;;;3431:1;3428;3421:12;3401:34;3469:6;3458:9;3454:22;3444:32;;3514:7;3507:4;3503:2;3499:13;3495:27;3485:55;;3536:1;3533;3526:12;3485:55;3572:2;3559:16;3594:4;3617:2;3613;3610:10;3607:36;;;3623:18;;:::i;:::-;3669:2;3666:1;3662:10;3652:20;;3692:28;3716:2;3712;3708:11;3692:28;:::i;:::-;3754:15;;;3785:12;;;;3817:11;;;3847;;;3843:20;;3840:33;-1:-1:-1;3837:53:1;;;3886:1;3883;3876:12;3837:53;3908:1;3899:10;;3918:238;3932:2;3929:1;3926:9;3918:238;;;4003:3;3990:17;3977:30;;4020:31;4045:5;4020:31;:::i;:::-;4064:18;;;3950:1;3943:9;;;;;4102:12;;;;4134;;3918:238;;;-1:-1:-1;4175:5:1;4212:18;;;;4199:32;;-1:-1:-1;;;;;;;3135:1102:1:o;4242:180::-;4298:6;4351:2;4339:9;4330:7;4326:23;4322:32;4319:52;;;4367:1;4364;4357:12;4319:52;4390:26;4406:9;4390:26;:::i;4427:245::-;4485:6;4538:2;4526:9;4517:7;4513:23;4509:32;4506:52;;;4554:1;4551;4544:12;4506:52;4593:9;4580:23;4612:30;4636:5;4612:30;:::i;4677:249::-;4746:6;4799:2;4787:9;4778:7;4774:23;4770:32;4767:52;;;4815:1;4812;4805:12;4767:52;4847:9;4841:16;4866:30;4890:5;4866:30;:::i;4931:280::-;5030:6;5083:2;5071:9;5062:7;5058:23;5054:32;5051:52;;;5099:1;5096;5089:12;5051:52;5131:9;5125:16;5150:31;5175:5;5150:31;:::i;5216:450::-;5285:6;5338:2;5326:9;5317:7;5313:23;5309:32;5306:52;;;5354:1;5351;5344:12;5306:52;5394:9;5381:23;5427:18;5419:6;5416:30;5413:50;;;5459:1;5456;5449:12;5413:50;5482:22;;5535:4;5527:13;;5523:27;-1:-1:-1;5513:55:1;;5564:1;5561;5554:12;5513:55;5587:73;5652:7;5647:2;5634:16;5629:2;5625;5621:11;5587:73;:::i;5671:180::-;5730:6;5783:2;5771:9;5762:7;5758:23;5754:32;5751:52;;;5799:1;5796;5789:12;5751:52;-1:-1:-1;5822:23:1;;5671:180;-1:-1:-1;5671:180:1:o;5856:257::-;5897:3;5935:5;5929:12;5962:6;5957:3;5950:19;5978:63;6034:6;6027:4;6022:3;6018:14;6011:4;6004:5;6000:16;5978:63;:::i;:::-;6095:2;6074:15;-1:-1:-1;;6070:29:1;6061:39;;;;6102:4;6057:50;;5856:257;-1:-1:-1;;5856:257:1:o;6118:185::-;6160:3;6198:5;6192:12;6213:52;6258:6;6253:3;6246:4;6239:5;6235:16;6213:52;:::i;:::-;6281:16;;;;;6118:185;-1:-1:-1;;6118:185:1:o;6308:1174::-;6484:3;6513:1;6546:6;6540:13;6576:3;6598:1;6626:9;6622:2;6618:18;6608:28;;6686:2;6675:9;6671:18;6708;6698:61;;6752:4;6744:6;6740:17;6730:27;;6698:61;6778:2;6826;6818:6;6815:14;6795:18;6792:38;6789:165;;;-1:-1:-1;;;6853:33:1;;6909:4;6906:1;6899:15;6939:4;6860:3;6927:17;6789:165;6970:18;6997:104;;;;7115:1;7110:320;;;;6963:467;;6997:104;-1:-1:-1;;7030:24:1;;7018:37;;7075:16;;;;-1:-1:-1;6997:104:1;;7110:320;18346:1;18339:14;;;18383:4;18370:18;;7205:1;7219:165;7233:6;7230:1;7227:13;7219:165;;;7311:14;;7298:11;;;7291:35;7354:16;;;;7248:10;;7219:165;;;7223:3;;7413:6;7408:3;7404:16;7397:23;;6963:467;;;;;;;7446:30;7472:3;7464:6;7446:30;:::i;:::-;7439:37;6308:1174;-1:-1:-1;;;;;6308:1174:1:o;7695:488::-;-1:-1:-1;;;;;7964:15:1;;;7946:34;;8016:15;;8011:2;7996:18;;7989:43;8063:2;8048:18;;8041:34;;;8111:3;8106:2;8091:18;;8084:31;;;7889:4;;8132:45;;8157:19;;8149:6;8132:45;:::i;:::-;8124:53;7695:488;-1:-1:-1;;;;;;7695:488:1:o;8380:219::-;8529:2;8518:9;8511:21;8492:4;8549:44;8589:2;8578:9;8574:18;8566:6;8549:44;:::i;9016:414::-;9218:2;9200:21;;;9257:2;9237:18;;;9230:30;9296:34;9291:2;9276:18;;9269:62;-1:-1:-1;;;9362:2:1;9347:18;;9340:48;9420:3;9405:19;;9016:414::o;9842:349::-;10044:2;10026:21;;;10083:2;10063:18;;;10056:30;10122:27;10117:2;10102:18;;10095:55;10182:2;10167:18;;9842:349::o;10553:331::-;10755:2;10737:21;;;10794:1;10774:18;;;10767:29;-1:-1:-1;;;10827:2:1;10812:18;;10805:38;10875:2;10860:18;;10553:331::o;12061:335::-;12263:2;12245:21;;;12302:2;12282:18;;;12275:30;-1:-1:-1;;;12336:2:1;12321:18;;12314:41;12387:2;12372:18;;12061:335::o;14767:356::-;14969:2;14951:21;;;14988:18;;;14981:30;15047:34;15042:2;15027:18;;15020:62;15114:2;15099:18;;14767:356::o;15940:413::-;16142:2;16124:21;;;16181:2;16161:18;;;16154:30;16220:34;16215:2;16200:18;;16193:62;-1:-1:-1;;;16286:2:1;16271:18;;16264:47;16343:3;16328:19;;15940:413::o;16358:335::-;16560:2;16542:21;;;16599:2;16579:18;;;16572:30;-1:-1:-1;;;16633:2:1;16618:18;;16611:41;16684:2;16669:18;;16358:335::o;17111:::-;17313:2;17295:21;;;17352:2;17332:18;;;17325:30;-1:-1:-1;;;17386:2:1;17371:18;;17364:41;17437:2;17422:18;;17111:335::o;17451:355::-;17653:2;17635:21;;;17692:2;17672:18;;;17665:30;17731:33;17726:2;17711:18;;17704:61;17797:2;17782:18;;17451:355::o;17993:275::-;18064:2;18058:9;18129:2;18110:13;;-1:-1:-1;;18106:27:1;18094:40;;18164:18;18149:34;;18185:22;;;18146:62;18143:88;;;18211:18;;:::i;:::-;18247:2;18240:22;17993:275;;-1:-1:-1;17993:275:1:o;18399:128::-;18439:3;18470:1;18466:6;18463:1;18460:13;18457:39;;;18476:18;;:::i;:::-;-1:-1:-1;18512:9:1;;18399:128::o;18532:120::-;18572:1;18598;18588:35;;18603:18;;:::i;:::-;-1:-1:-1;18637:9:1;;18532:120::o;18657:168::-;18697:7;18763:1;18759;18755:6;18751:14;18748:1;18745:21;18740:1;18733:9;18726:17;18722:45;18719:71;;;18770:18;;:::i;:::-;-1:-1:-1;18810:9:1;;18657:168::o;18830:125::-;18870:4;18898:1;18895;18892:8;18889:34;;;18903:18;;:::i;:::-;-1:-1:-1;18940:9:1;;18830:125::o;18960:258::-;19032:1;19042:113;19056:6;19053:1;19050:13;19042:113;;;19132:11;;;19126:18;19113:11;;;19106:39;19078:2;19071:10;19042:113;;;19173:6;19170:1;19167:13;19164:48;;;-1:-1:-1;;19208:1:1;19190:16;;19183:27;18960:258::o;19223:380::-;19302:1;19298:12;;;;19345;;;19366:61;;19420:4;19412:6;19408:17;19398:27;;19366:61;19473:2;19465:6;19462:14;19442:18;19439:38;19436:161;;;19519:10;19514:3;19510:20;19507:1;19500:31;19554:4;19551:1;19544:15;19582:4;19579:1;19572:15;19436:161;;19223:380;;;:::o;19608:135::-;19647:3;-1:-1:-1;;19668:17:1;;19665:43;;;19688:18;;:::i;:::-;-1:-1:-1;19735:1:1;19724:13;;19608:135::o;19748:112::-;19780:1;19806;19796:35;;19811:18;;:::i;:::-;-1:-1:-1;19845:9:1;;19748:112::o;19865:127::-;19926:10;19921:3;19917:20;19914:1;19907:31;19957:4;19954:1;19947:15;19981:4;19978:1;19971:15;19997:127;20058:10;20053:3;20049:20;20046:1;20039:31;20089:4;20086:1;20079:15;20113:4;20110:1;20103:15;20129:127;20190:10;20185:3;20181:20;20178:1;20171:31;20221:4;20218:1;20211:15;20245:4;20242:1;20235:15;20261:127;20322:10;20317:3;20313:20;20310:1;20303:31;20353:4;20350:1;20343:15;20377:4;20374:1;20367:15;20393:127;20454:10;20449:3;20445:20;20442:1;20435:31;20485:4;20482:1;20475:15;20509:4;20506:1;20499:15;20525:131;-1:-1:-1;;;;;20600:31:1;;20590:42;;20580:70;;20646:1;20643;20636:12;20661:131;-1:-1:-1;;;;;;20735:32:1;;20725:43;;20715:71;;20782:1;20779;20772:12

Swarm Source

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