ETH Price: $3,384.72 (-1.54%)
Gas: 2 Gwei

Token

 

Overview

Max Total Supply

0

Holders

219

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mjbrwn.eth
0xfdc3e8edd74a90fe971ef7d56a0c66c870b10f5d
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:
EtholvantsBoosterSyringe

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-26
*/

// SPDX-License-Identifier: MIT


// File: @openzeppelin/[email protected]/utils/Address.sol



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/[email protected]/utils/introspection/IERC165.sol



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/[email protected]/utils/introspection/ERC165.sol



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/[email protected]/token/ERC1155/IERC1155Receiver.sol



pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/[email protected]/token/ERC1155/IERC1155.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/[email protected]/token/ERC1155/extensions/IERC1155MetadataURI.sol



pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/[email protected]/utils/Context.sol



pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/[email protected]/token/ERC1155/ERC1155.sol



pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][account] = accountBalance - amount;
            }
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/[email protected]/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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: syringe.sol



// MTI4

pragma solidity ^0.8.0;




interface IEtholvants {
	function tokenToGrowthBoost(uint tokenId) external view returns (uint);
	function tokenToStakeTime(uint tokenId) external view returns (uint);
	function injectBooster(uint tokenId, uint boostAmount) external;
	function getRealOwner(uint tokenId) external view returns (address);
	function getNumCells(uint tokenId) external view returns (uint);
}

contract EtholvantsBoosterSyringe is ERC1155, Ownable {
	address private etholvantsAddr = 0x1fFF1e9e963f07AC4486503E5a35e71f4e9Fb9FD;
	IEtholvants private ethols = IEtholvants(etholvantsAddr);
	uint public MINT_END_TS = 1654042069;
	bool public mintPaused = false;
	uint public MIN_CELLS = 1440;
	uint public MIN_STAKED_TIME = 24 * 24 * 3600;
	uint public totalMinted = 0;
	uint public totalBurned = 0;

    mapping(uint256 => bool) public injected;
    mapping(uint256 => bool) public minted;

    constructor() ERC1155("") {}

	function isEligibleToInject(uint etholId) public view returns (bool) {
		if(injected[etholId] || ethols.tokenToStakeTime(etholId) != 0) {
			return false;
		}
		if(ethols.tokenToGrowthBoost(etholId) == 6) {
			return false;
		}
		return true;
	}

	function setURI(string memory newuri) external onlyOwner {
        _setURI(newuri);
    }

	function setEtholsAddr(address addr) external onlyOwner {
        etholvantsAddr = addr;
		ethols = IEtholvants(etholvantsAddr);
    }

    function togglePause() external onlyOwner {
        mintPaused = !mintPaused;
    }

	function isEligibleToMint(uint etholId) public view returns (bool) {
		if(block.timestamp > MINT_END_TS || minted[etholId] || mintPaused) {
			return false;
		}
		uint staked_ts = ethols.tokenToStakeTime(etholId);
		if(staked_ts == 0 || block.timestamp < staked_ts + MIN_STAKED_TIME) {
			return false;
		}
		if(ethols.getNumCells(etholId) < MIN_CELLS) {
			return false;
		}
		return true;
	}

	function getData(uint etholId) public view returns (bool, bool, bool, bool) {
		return (injected[etholId], minted[etholId], isEligibleToInject(etholId), isEligibleToMint(etholId));
	}

	function getStats() public view returns (uint, uint) {
		return (totalMinted, totalBurned);
	}

	function mintBatch(uint256[] memory etholIds) public {
        for (uint256 i = 0; i < etholIds.length; i++) {
			uint etholId = etholIds[i];
			require(isEligibleToMint(etholId), "not eligible");
			require(ethols.getRealOwner(etholId) == msg.sender, "permission denied");
			minted[etholId] = true;
		}
		_mint(msg.sender, 0, etholIds.length, "");
		totalMinted += etholIds.length;
	}

	function inject(uint etholId) external {
		require(ethols.getRealOwner(etholId) == msg.sender, "permission denied");
		require(isEligibleToInject(etholId), "not eligible");
		require(balanceOf(msg.sender, 0) > 0, "you should have a syringe");
		ethols.injectBooster(etholId, 2);
		injected[etholId] = true;
		_burn(msg.sender, 0, 1);
		totalBurned += 1;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"MINT_END_TS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_CELLS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_STAKED_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"etholId","type":"uint256"}],"name":"getData","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"etholId","type":"uint256"}],"name":"inject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"injected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"etholId","type":"uint256"}],"name":"isEligibleToInject","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"etholId","type":"uint256"}],"name":"isEligibleToMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"etholIds","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setEtholsAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","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":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405260048054731fff1e9e963f07ac4486503e5a35e71f4e9fb9fd6001600160a01b03199182168117909255600580549091169091179055636296add56006556007805460ff191690556105a0600855621fa4006009556000600a819055600b553480156200007057600080fd5b506040805160208101909152600081526200008b816200009d565b506200009733620000b6565b620001eb565b8051620000b290600290602084019062000108565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011690620001ae565b90600052602060002090601f0160209004810192826200013a576000855562000185565b82601f106200015557805160ff191683800117855562000185565b8280016001018555821562000185579182015b828111156200018557825182559160200191906001019062000168565b506200019392915062000197565b5090565b5b8082111562000193576000815560010162000198565b600181811c90821680620001c357607f821691505b60208210811415620001e557634e487b7160e01b600052602260045260246000fd5b50919050565b61234780620001fb6000396000f3fe608060405234801561001057600080fd5b50600436106101c35760003560e01c80638da5cb5b116100f9578063c59d484711610097578063e985e9c511610071578063e985e9c5146103db578063f242432a14610417578063f2fde38b1461042a578063ffb2b55a1461043d57600080fd5b8063c59d4847146103ae578063cdda140a146103c9578063d89135cd146103d257600080fd5b8063a05be1f9116100d3578063a05be1f914610367578063a22cb4651461038a578063a2309ff81461039d578063c4ae3168146103a657600080fd5b80638da5cb5b1461033057806397c5f0521461034b5780639d2318681461035457600080fd5b80632eb2c2d611610166578063715018a611610140578063715018a6146102e557806371fddcb4146102ed5780637dc0bf3f146103005780637e4831d31461032357600080fd5b80632eb2c2d6146102a95780634ded4d6e146102bc5780634e1273f4146102c557600080fd5b806302fe5305116101a257806302fe53051461024e578063087604f6146102635780630e89341c146102765780631820433f1461029657600080fd5b8062fdd58e146101c85780630178fe3f146101ee57806301ffc9a71461022b575b600080fd5b6101db6101d6366004611a2b565b610450565b6040519081526020015b60405180910390f35b6102016101fc366004611a57565b6104e7565b604080519415158552921515602085015290151591830191909152151560608201526080016101e5565b61023e610239366004611a86565b61052f565b60405190151581526020016101e5565b61026161025c366004611b4b565b610581565b005b61023e610271366004611a57565b6105b7565b610289610284366004611a57565b6106ef565b6040516101e59190611be9565b6102616102a4366004611a57565b610783565b6102616102b7366004611cb1565b61098f565b6101db60095481565b6102d86102d3366004611d5f565b610a26565b6040516101e59190611e67565b610261610b50565b61023e6102fb366004611a57565b610b86565b61023e61030e366004611a57565b600d6020526000908152604090205460ff1681565b60075461023e9060ff1681565b6003546040516001600160a01b0390911681526020016101e5565b6101db60085481565b610261610362366004611e7a565b610cfc565b61023e610375366004611a57565b600c6020526000908152604090205460ff1681565b610261610398366004611e97565b610d52565b6101db600a5481565b610261610e29565b600a54600b54604080519283526020830191909152016101e5565b6101db60065481565b6101db600b5481565b61023e6103e9366004611ed5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b610261610425366004611f03565b610e67565b610261610438366004611e7a565b610eee565b61026161044b366004611f6c565b610f86565b60006001600160a01b0383166104c15760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b6000818152600c6020908152604080832054600d90925282205482918291829160ff9081169116610517876105b7565b61052088610b86565b93509350935093509193509193565b60006001600160e01b03198216636cdb3d1360e11b148061056057506001600160e01b031982166303a24d0760e21b145b8061057b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b031633146105ab5760405162461bcd60e51b81526004016104b890611fa1565b6105b481611116565b50565b6000818152600c602052604081205460ff168061064e5750600554604051634c2d9ffd60e01b8152600481018490526001600160a01b0390911690634c2d9ffd9060240160206040518083038186803b15801561061357600080fd5b505afa158015610627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064b9190611fd6565b15155b1561065b57506000919050565b600554604051632fe4a8a160e11b8152600481018490526001600160a01b0390911690635fc951429060240160206040518083038186803b15801561069f57600080fd5b505afa1580156106b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d79190611fd6565b600614156106e757506000919050565b506001919050565b6060600280546106fe90611fef565b80601f016020809104026020016040519081016040528092919081815260200182805461072a90611fef565b80156107775780601f1061074c57610100808354040283529160200191610777565b820191906000526020600020905b81548152906001019060200180831161075a57829003601f168201915b50505050509050919050565b6005546040516329005d1360e11b81526004810183905233916001600160a01b031690635200ba269060240160206040518083038186803b1580156107c757600080fd5b505afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff919061202a565b6001600160a01b0316146108495760405162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b60448201526064016104b8565b610852816105b7565b61088d5760405162461bcd60e51b815260206004820152600c60248201526b6e6f7420656c696769626c6560a01b60448201526064016104b8565b600061089a336000610450565b116108e75760405162461bcd60e51b815260206004820152601960248201527f796f752073686f756c642068617665206120737972696e67650000000000000060448201526064016104b8565b60055460405163b4787cf760e01b815260048101839052600260248201526001600160a01b039091169063b4787cf790604401600060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b5050506000828152600c60205260408120805460ff19166001908117909155610974925033919061112d565b6001600b6000828254610987919061205d565b909155505050565b6001600160a01b0385163314806109ab57506109ab85336103e9565b610a125760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016104b8565b610a1f85858585856112a7565b5050505050565b60608151835114610a8b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016104b8565b6000835167ffffffffffffffff811115610aa757610aa7611aaa565b604051908082528060200260200182016040528015610ad0578160200160208202803683370190505b50905060005b8451811015610b4857610b1b858281518110610af457610af4612075565b6020026020010151858381518110610b0e57610b0e612075565b6020026020010151610450565b828281518110610b2d57610b2d612075565b6020908102919091010152610b418161208b565b9050610ad6565b509392505050565b6003546001600160a01b03163314610b7a5760405162461bcd60e51b81526004016104b890611fa1565b610b846000611484565b565b6000600654421180610ba657506000828152600d602052604090205460ff165b80610bb3575060075460ff165b15610bc057506000919050565b600554604051634c2d9ffd60e01b8152600481018490526000916001600160a01b031690634c2d9ffd9060240160206040518083038186803b158015610c0557600080fd5b505afa158015610c19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3d9190611fd6565b9050801580610c575750600954610c54908261205d565b42105b15610c655750600092915050565b600854600554604051631b2c3e2960e31b8152600481018690526001600160a01b039091169063d961f1489060240160206040518083038186803b158015610cac57600080fd5b505afa158015610cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce49190611fd6565b1015610cf35750600092915050565b50600192915050565b6003546001600160a01b03163314610d265760405162461bcd60e51b81526004016104b890611fa1565b600480546001600160a01b039092166001600160a01b0319928316811790915560058054909216179055565b336001600160a01b0383161415610dbd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016104b8565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b03163314610e535760405162461bcd60e51b81526004016104b890611fa1565b6007805460ff19811660ff90911615179055565b6001600160a01b038516331480610e835750610e8385336103e9565b610ee15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016104b8565b610a1f85858585856114d6565b6003546001600160a01b03163314610f185760405162461bcd60e51b81526004016104b890611fa1565b6001600160a01b038116610f7d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104b8565b6105b481611484565b60005b81518110156110e5576000828281518110610fa657610fa6612075565b60200260200101519050610fb981610b86565b610ff45760405162461bcd60e51b815260206004820152600c60248201526b6e6f7420656c696769626c6560a01b60448201526064016104b8565b6005546040516329005d1360e11b81526004810183905233916001600160a01b031690635200ba269060240160206040518083038186803b15801561103857600080fd5b505afa15801561104c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611070919061202a565b6001600160a01b0316146110ba5760405162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b60448201526064016104b8565b6000908152600d60205260409020805460ff19166001179055806110dd8161208b565b915050610f89565b506111033360008351604051806020016040528060008152506115fc565b8051600a6000828254610987919061205d565b805161112990600290602084019061197d565b5050565b6001600160a01b03831661118f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016104b8565b336111bf818560006111a0876116fd565b6111a9876116fd565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b03881684529091529020548281101561123c5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016104b8565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b81518351146113095760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016104b8565b6001600160a01b03841661132f5760405162461bcd60e51b81526004016104b8906120a6565b3360005b845181101561141657600085828151811061135057611350612075565b60200260200101519050600085838151811061136e5761136e612075565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156113be5760405162461bcd60e51b81526004016104b8906120eb565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906113fb90849061205d565b925050819055505050508061140f9061208b565b9050611333565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611466929190612135565b60405180910390a461147c818787878787611748565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166114fc5760405162461bcd60e51b81526004016104b8906120a6565b3361151581878761150c886116fd565b610a1f886116fd565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156115565760405162461bcd60e51b81526004016104b8906120eb565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061159390849061205d565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115f38288888888886118b3565b50505050505050565b6001600160a01b03841661165c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016104b8565b3361166d8160008761150c886116fd565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061169d90849061205d565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a1f816000878787876118b3565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061173757611737612075565b602090810291909101015292915050565b6001600160a01b0384163b1561147c5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061178c9089908990889088908890600401612163565b602060405180830381600087803b1580156117a657600080fd5b505af19250505080156117d6575060408051601f3d908101601f191682019092526117d3918101906121c1565b60015b611883576117e26121de565b806308c379a0141561181c57506117f76121fa565b80611802575061181e565b8060405162461bcd60e51b81526004016104b89190611be9565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016104b8565b6001600160e01b0319811663bc197c8160e01b146115f35760405162461bcd60e51b81526004016104b890612284565b6001600160a01b0384163b1561147c5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906118f790899089908890889088906004016122cc565b602060405180830381600087803b15801561191157600080fd5b505af1925050508015611941575060408051601f3d908101601f1916820190925261193e918101906121c1565b60015b61194d576117e26121de565b6001600160e01b0319811663f23a6e6160e01b146115f35760405162461bcd60e51b81526004016104b890612284565b82805461198990611fef565b90600052602060002090601f0160209004810192826119ab57600085556119f1565b82601f106119c457805160ff19168380011785556119f1565b828001600101855582156119f1579182015b828111156119f15782518255916020019190600101906119d6565b506119fd929150611a01565b5090565b5b808211156119fd5760008155600101611a02565b6001600160a01b03811681146105b457600080fd5b60008060408385031215611a3e57600080fd5b8235611a4981611a16565b946020939093013593505050565b600060208284031215611a6957600080fd5b5035919050565b6001600160e01b0319811681146105b457600080fd5b600060208284031215611a9857600080fd5b8135611aa381611a70565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611ae657611ae6611aaa565b6040525050565b600067ffffffffffffffff831115611b0757611b07611aaa565b604051611b1e601f8501601f191660200182611ac0565b809150838152848484011115611b3357600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611b5d57600080fd5b813567ffffffffffffffff811115611b7457600080fd5b8201601f81018413611b8557600080fd5b611b9484823560208401611aed565b949350505050565b6000815180845260005b81811015611bc257602081850181015186830182015201611ba6565b81811115611bd4576000602083870101525b50601f01601f19169290920160200192915050565b602081526000611aa36020830184611b9c565b600067ffffffffffffffff821115611c1657611c16611aaa565b5060051b60200190565b600082601f830112611c3157600080fd5b81356020611c3e82611bfc565b604051611c4b8282611ac0565b83815260059390931b8501820192828101915086841115611c6b57600080fd5b8286015b84811015611c865780358352918301918301611c6f565b509695505050505050565b600082601f830112611ca257600080fd5b611aa383833560208501611aed565b600080600080600060a08688031215611cc957600080fd5b8535611cd481611a16565b94506020860135611ce481611a16565b9350604086013567ffffffffffffffff80821115611d0157600080fd5b611d0d89838a01611c20565b94506060880135915080821115611d2357600080fd5b611d2f89838a01611c20565b93506080880135915080821115611d4557600080fd5b50611d5288828901611c91565b9150509295509295909350565b60008060408385031215611d7257600080fd5b823567ffffffffffffffff80821115611d8a57600080fd5b818501915085601f830112611d9e57600080fd5b81356020611dab82611bfc565b604051611db88282611ac0565b83815260059390931b8501820192828101915089841115611dd857600080fd5b948201945b83861015611dff578535611df081611a16565b82529482019490820190611ddd565b96505086013592505080821115611e1557600080fd5b50611e2285828601611c20565b9150509250929050565b600081518084526020808501945080840160005b83811015611e5c57815187529582019590820190600101611e40565b509495945050505050565b602081526000611aa36020830184611e2c565b600060208284031215611e8c57600080fd5b8135611aa381611a16565b60008060408385031215611eaa57600080fd5b8235611eb581611a16565b915060208301358015158114611eca57600080fd5b809150509250929050565b60008060408385031215611ee857600080fd5b8235611ef381611a16565b91506020830135611eca81611a16565b600080600080600060a08688031215611f1b57600080fd5b8535611f2681611a16565b94506020860135611f3681611a16565b93506040860135925060608601359150608086013567ffffffffffffffff811115611f6057600080fd5b611d5288828901611c91565b600060208284031215611f7e57600080fd5b813567ffffffffffffffff811115611f9557600080fd5b611b9484828501611c20565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611fe857600080fd5b5051919050565b600181811c9082168061200357607f821691505b6020821081141561202457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561203c57600080fd5b8151611aa381611a16565b634e487b7160e01b600052601160045260246000fd5b6000821982111561207057612070612047565b500190565b634e487b7160e01b600052603260045260246000fd5b600060001982141561209f5761209f612047565b5060010190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006121486040830185611e2c565b828103602084015261215a8185611e2c565b95945050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061218f90830186611e2c565b82810360608401526121a18186611e2c565b905082810360808401526121b58185611b9c565b98975050505050505050565b6000602082840312156121d357600080fd5b8151611aa381611a70565b600060033d11156121f75760046000803e5060005160e01c5b90565b600060443d10156122085790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561223857505050505090565b82850191508151818111156122505750505050505090565b843d870101602082850101111561226a5750505050505090565b61227960208286010187611ac0565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061230690830184611b9c565b97965050505050505056fea2646970667358221220ccb1dc44cd4d446fad5ba9537249a444505631ee31c2ec1cff4d2432f625132064736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c35760003560e01c80638da5cb5b116100f9578063c59d484711610097578063e985e9c511610071578063e985e9c5146103db578063f242432a14610417578063f2fde38b1461042a578063ffb2b55a1461043d57600080fd5b8063c59d4847146103ae578063cdda140a146103c9578063d89135cd146103d257600080fd5b8063a05be1f9116100d3578063a05be1f914610367578063a22cb4651461038a578063a2309ff81461039d578063c4ae3168146103a657600080fd5b80638da5cb5b1461033057806397c5f0521461034b5780639d2318681461035457600080fd5b80632eb2c2d611610166578063715018a611610140578063715018a6146102e557806371fddcb4146102ed5780637dc0bf3f146103005780637e4831d31461032357600080fd5b80632eb2c2d6146102a95780634ded4d6e146102bc5780634e1273f4146102c557600080fd5b806302fe5305116101a257806302fe53051461024e578063087604f6146102635780630e89341c146102765780631820433f1461029657600080fd5b8062fdd58e146101c85780630178fe3f146101ee57806301ffc9a71461022b575b600080fd5b6101db6101d6366004611a2b565b610450565b6040519081526020015b60405180910390f35b6102016101fc366004611a57565b6104e7565b604080519415158552921515602085015290151591830191909152151560608201526080016101e5565b61023e610239366004611a86565b61052f565b60405190151581526020016101e5565b61026161025c366004611b4b565b610581565b005b61023e610271366004611a57565b6105b7565b610289610284366004611a57565b6106ef565b6040516101e59190611be9565b6102616102a4366004611a57565b610783565b6102616102b7366004611cb1565b61098f565b6101db60095481565b6102d86102d3366004611d5f565b610a26565b6040516101e59190611e67565b610261610b50565b61023e6102fb366004611a57565b610b86565b61023e61030e366004611a57565b600d6020526000908152604090205460ff1681565b60075461023e9060ff1681565b6003546040516001600160a01b0390911681526020016101e5565b6101db60085481565b610261610362366004611e7a565b610cfc565b61023e610375366004611a57565b600c6020526000908152604090205460ff1681565b610261610398366004611e97565b610d52565b6101db600a5481565b610261610e29565b600a54600b54604080519283526020830191909152016101e5565b6101db60065481565b6101db600b5481565b61023e6103e9366004611ed5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b610261610425366004611f03565b610e67565b610261610438366004611e7a565b610eee565b61026161044b366004611f6c565b610f86565b60006001600160a01b0383166104c15760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b6000818152600c6020908152604080832054600d90925282205482918291829160ff9081169116610517876105b7565b61052088610b86565b93509350935093509193509193565b60006001600160e01b03198216636cdb3d1360e11b148061056057506001600160e01b031982166303a24d0760e21b145b8061057b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b031633146105ab5760405162461bcd60e51b81526004016104b890611fa1565b6105b481611116565b50565b6000818152600c602052604081205460ff168061064e5750600554604051634c2d9ffd60e01b8152600481018490526001600160a01b0390911690634c2d9ffd9060240160206040518083038186803b15801561061357600080fd5b505afa158015610627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064b9190611fd6565b15155b1561065b57506000919050565b600554604051632fe4a8a160e11b8152600481018490526001600160a01b0390911690635fc951429060240160206040518083038186803b15801561069f57600080fd5b505afa1580156106b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d79190611fd6565b600614156106e757506000919050565b506001919050565b6060600280546106fe90611fef565b80601f016020809104026020016040519081016040528092919081815260200182805461072a90611fef565b80156107775780601f1061074c57610100808354040283529160200191610777565b820191906000526020600020905b81548152906001019060200180831161075a57829003601f168201915b50505050509050919050565b6005546040516329005d1360e11b81526004810183905233916001600160a01b031690635200ba269060240160206040518083038186803b1580156107c757600080fd5b505afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff919061202a565b6001600160a01b0316146108495760405162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b60448201526064016104b8565b610852816105b7565b61088d5760405162461bcd60e51b815260206004820152600c60248201526b6e6f7420656c696769626c6560a01b60448201526064016104b8565b600061089a336000610450565b116108e75760405162461bcd60e51b815260206004820152601960248201527f796f752073686f756c642068617665206120737972696e67650000000000000060448201526064016104b8565b60055460405163b4787cf760e01b815260048101839052600260248201526001600160a01b039091169063b4787cf790604401600060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b5050506000828152600c60205260408120805460ff19166001908117909155610974925033919061112d565b6001600b6000828254610987919061205d565b909155505050565b6001600160a01b0385163314806109ab57506109ab85336103e9565b610a125760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016104b8565b610a1f85858585856112a7565b5050505050565b60608151835114610a8b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016104b8565b6000835167ffffffffffffffff811115610aa757610aa7611aaa565b604051908082528060200260200182016040528015610ad0578160200160208202803683370190505b50905060005b8451811015610b4857610b1b858281518110610af457610af4612075565b6020026020010151858381518110610b0e57610b0e612075565b6020026020010151610450565b828281518110610b2d57610b2d612075565b6020908102919091010152610b418161208b565b9050610ad6565b509392505050565b6003546001600160a01b03163314610b7a5760405162461bcd60e51b81526004016104b890611fa1565b610b846000611484565b565b6000600654421180610ba657506000828152600d602052604090205460ff165b80610bb3575060075460ff165b15610bc057506000919050565b600554604051634c2d9ffd60e01b8152600481018490526000916001600160a01b031690634c2d9ffd9060240160206040518083038186803b158015610c0557600080fd5b505afa158015610c19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3d9190611fd6565b9050801580610c575750600954610c54908261205d565b42105b15610c655750600092915050565b600854600554604051631b2c3e2960e31b8152600481018690526001600160a01b039091169063d961f1489060240160206040518083038186803b158015610cac57600080fd5b505afa158015610cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce49190611fd6565b1015610cf35750600092915050565b50600192915050565b6003546001600160a01b03163314610d265760405162461bcd60e51b81526004016104b890611fa1565b600480546001600160a01b039092166001600160a01b0319928316811790915560058054909216179055565b336001600160a01b0383161415610dbd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016104b8565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b03163314610e535760405162461bcd60e51b81526004016104b890611fa1565b6007805460ff19811660ff90911615179055565b6001600160a01b038516331480610e835750610e8385336103e9565b610ee15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016104b8565b610a1f85858585856114d6565b6003546001600160a01b03163314610f185760405162461bcd60e51b81526004016104b890611fa1565b6001600160a01b038116610f7d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104b8565b6105b481611484565b60005b81518110156110e5576000828281518110610fa657610fa6612075565b60200260200101519050610fb981610b86565b610ff45760405162461bcd60e51b815260206004820152600c60248201526b6e6f7420656c696769626c6560a01b60448201526064016104b8565b6005546040516329005d1360e11b81526004810183905233916001600160a01b031690635200ba269060240160206040518083038186803b15801561103857600080fd5b505afa15801561104c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611070919061202a565b6001600160a01b0316146110ba5760405162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b60448201526064016104b8565b6000908152600d60205260409020805460ff19166001179055806110dd8161208b565b915050610f89565b506111033360008351604051806020016040528060008152506115fc565b8051600a6000828254610987919061205d565b805161112990600290602084019061197d565b5050565b6001600160a01b03831661118f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016104b8565b336111bf818560006111a0876116fd565b6111a9876116fd565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b03881684529091529020548281101561123c5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016104b8565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b81518351146113095760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016104b8565b6001600160a01b03841661132f5760405162461bcd60e51b81526004016104b8906120a6565b3360005b845181101561141657600085828151811061135057611350612075565b60200260200101519050600085838151811061136e5761136e612075565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156113be5760405162461bcd60e51b81526004016104b8906120eb565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906113fb90849061205d565b925050819055505050508061140f9061208b565b9050611333565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611466929190612135565b60405180910390a461147c818787878787611748565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166114fc5760405162461bcd60e51b81526004016104b8906120a6565b3361151581878761150c886116fd565b610a1f886116fd565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156115565760405162461bcd60e51b81526004016104b8906120eb565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061159390849061205d565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115f38288888888886118b3565b50505050505050565b6001600160a01b03841661165c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016104b8565b3361166d8160008761150c886116fd565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061169d90849061205d565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a1f816000878787876118b3565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061173757611737612075565b602090810291909101015292915050565b6001600160a01b0384163b1561147c5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061178c9089908990889088908890600401612163565b602060405180830381600087803b1580156117a657600080fd5b505af19250505080156117d6575060408051601f3d908101601f191682019092526117d3918101906121c1565b60015b611883576117e26121de565b806308c379a0141561181c57506117f76121fa565b80611802575061181e565b8060405162461bcd60e51b81526004016104b89190611be9565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016104b8565b6001600160e01b0319811663bc197c8160e01b146115f35760405162461bcd60e51b81526004016104b890612284565b6001600160a01b0384163b1561147c5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906118f790899089908890889088906004016122cc565b602060405180830381600087803b15801561191157600080fd5b505af1925050508015611941575060408051601f3d908101601f1916820190925261193e918101906121c1565b60015b61194d576117e26121de565b6001600160e01b0319811663f23a6e6160e01b146115f35760405162461bcd60e51b81526004016104b890612284565b82805461198990611fef565b90600052602060002090601f0160209004810192826119ab57600085556119f1565b82601f106119c457805160ff19168380011785556119f1565b828001600101855582156119f1579182015b828111156119f15782518255916020019190600101906119d6565b506119fd929150611a01565b5090565b5b808211156119fd5760008155600101611a02565b6001600160a01b03811681146105b457600080fd5b60008060408385031215611a3e57600080fd5b8235611a4981611a16565b946020939093013593505050565b600060208284031215611a6957600080fd5b5035919050565b6001600160e01b0319811681146105b457600080fd5b600060208284031215611a9857600080fd5b8135611aa381611a70565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611ae657611ae6611aaa565b6040525050565b600067ffffffffffffffff831115611b0757611b07611aaa565b604051611b1e601f8501601f191660200182611ac0565b809150838152848484011115611b3357600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611b5d57600080fd5b813567ffffffffffffffff811115611b7457600080fd5b8201601f81018413611b8557600080fd5b611b9484823560208401611aed565b949350505050565b6000815180845260005b81811015611bc257602081850181015186830182015201611ba6565b81811115611bd4576000602083870101525b50601f01601f19169290920160200192915050565b602081526000611aa36020830184611b9c565b600067ffffffffffffffff821115611c1657611c16611aaa565b5060051b60200190565b600082601f830112611c3157600080fd5b81356020611c3e82611bfc565b604051611c4b8282611ac0565b83815260059390931b8501820192828101915086841115611c6b57600080fd5b8286015b84811015611c865780358352918301918301611c6f565b509695505050505050565b600082601f830112611ca257600080fd5b611aa383833560208501611aed565b600080600080600060a08688031215611cc957600080fd5b8535611cd481611a16565b94506020860135611ce481611a16565b9350604086013567ffffffffffffffff80821115611d0157600080fd5b611d0d89838a01611c20565b94506060880135915080821115611d2357600080fd5b611d2f89838a01611c20565b93506080880135915080821115611d4557600080fd5b50611d5288828901611c91565b9150509295509295909350565b60008060408385031215611d7257600080fd5b823567ffffffffffffffff80821115611d8a57600080fd5b818501915085601f830112611d9e57600080fd5b81356020611dab82611bfc565b604051611db88282611ac0565b83815260059390931b8501820192828101915089841115611dd857600080fd5b948201945b83861015611dff578535611df081611a16565b82529482019490820190611ddd565b96505086013592505080821115611e1557600080fd5b50611e2285828601611c20565b9150509250929050565b600081518084526020808501945080840160005b83811015611e5c57815187529582019590820190600101611e40565b509495945050505050565b602081526000611aa36020830184611e2c565b600060208284031215611e8c57600080fd5b8135611aa381611a16565b60008060408385031215611eaa57600080fd5b8235611eb581611a16565b915060208301358015158114611eca57600080fd5b809150509250929050565b60008060408385031215611ee857600080fd5b8235611ef381611a16565b91506020830135611eca81611a16565b600080600080600060a08688031215611f1b57600080fd5b8535611f2681611a16565b94506020860135611f3681611a16565b93506040860135925060608601359150608086013567ffffffffffffffff811115611f6057600080fd5b611d5288828901611c91565b600060208284031215611f7e57600080fd5b813567ffffffffffffffff811115611f9557600080fd5b611b9484828501611c20565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611fe857600080fd5b5051919050565b600181811c9082168061200357607f821691505b6020821081141561202457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561203c57600080fd5b8151611aa381611a16565b634e487b7160e01b600052601160045260246000fd5b6000821982111561207057612070612047565b500190565b634e487b7160e01b600052603260045260246000fd5b600060001982141561209f5761209f612047565b5060010190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006121486040830185611e2c565b828103602084015261215a8185611e2c565b95945050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061218f90830186611e2c565b82810360608401526121a18186611e2c565b905082810360808401526121b58185611b9c565b98975050505050505050565b6000602082840312156121d357600080fd5b8151611aa381611a70565b600060033d11156121f75760046000803e5060005160e01c5b90565b600060443d10156122085790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561223857505050505090565b82850191508151818111156122505750505050505090565b843d870101602082850101111561226a5750505050505090565b61227960208286010187611ac0565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061230690830184611b9c565b97965050505050505056fea2646970667358221220ccb1dc44cd4d446fad5ba9537249a444505631ee31c2ec1cff4d2432f625132064736f6c63430008090033

Deployed Bytecode Sourcemap

36040:2602:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20009:231;;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;20009:231:0;;;;;;;;37584:185;;;;;;:::i;:::-;;:::i;:::-;;;;1069:14:1;;1062:22;1044:41;;1128:14;;1121:22;1116:2;1101:18;;1094:50;1187:14;;1180:22;1160:18;;;1153:50;;;;1246:14;1239:22;1234:2;1219:18;;1212:50;1031:3;1016:19;37584:185:0;837:431:1;19032:310:0;;;;;;:::i;:::-;;:::i;:::-;;;1824:14:1;;1817:22;1799:41;;1787:2;1772:18;19032:310:0;1659:187:1;36843:91:0;;;;;;:::i;:::-;;:::i;:::-;;36585:253;;;;;;:::i;:::-;;:::i;19753:105::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38275:364::-;;;;;;:::i;:::-;;:::i;22104:442::-;;;;;;:::i;:::-;;:::i;36343:44::-;;;;;;20406:524;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34958:94::-;;;:::i;37174:405::-;;;;;;:::i;:::-;;:::i;36505:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36277:30;;;;;;;;;34307:87;34380:6;;34307:87;;-1:-1:-1;;;;;34380:6:0;;;8222:51:1;;8210:2;8195:18;34307:87:0;8076:203:1;36311:28:0;;;;;;36939:137;;;;;;:::i;:::-;;:::i;36458:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21003:311;;;;;;:::i;:::-;;:::i;36391:27::-;;;;;;37084:85;;;:::i;37774:96::-;37840:11;;37853;;37774:96;;;9131:25:1;;;9187:2;9172:18;;9165:34;;;;9104:18;37774:96:0;8957:248:1;36237:36:0;;;;;;36422:27;;;;;;21386:168;;;;;;:::i;:::-;-1:-1:-1;;;;;21509:27:0;;;21485:4;21509:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;21386:168;21626:401;;;;;;:::i;:::-;;:::i;35207:192::-;;;;;;:::i;:::-;;:::i;37875:395::-;;;;;;:::i;:::-;;:::i;20009:231::-;20095:7;-1:-1:-1;;;;;20123:21:0;;20115:77;;;;-1:-1:-1;;;20115:77:0;;10897:2:1;20115:77:0;;;10879:21:1;10936:2;10916:18;;;10909:30;10975:34;10955:18;;;10948:62;-1:-1:-1;;;11026:18:1;;;11019:41;11077:19;;20115:77:0;;;;;;;;;-1:-1:-1;20210:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;20210:22:0;;;;;;;;;;;;20009:231::o;37584:185::-;37636:4;37673:17;;;:8;:17;;;;;;;;;37692:6;:15;;;;;;37636:4;;;;;;37673:17;;;;;37692:15;37709:27;37682:7;37709:18;:27::i;:::-;37738:25;37755:7;37738:16;:25::i;:::-;37665:99;;;;;;;;37584:185;;;;;:::o;19032:310::-;19134:4;-1:-1:-1;;;;;;19171:41:0;;-1:-1:-1;;;19171:41:0;;:110;;-1:-1:-1;;;;;;;19229:52:0;;-1:-1:-1;;;19229:52:0;19171:110;:163;;;-1:-1:-1;;;;;;;;;;9908:40:0;;;19298:36;19151:183;19032:310;-1:-1:-1;;19032:310:0:o;36843:91::-;34380:6;;-1:-1:-1;;;;;34380:6:0;17877:10;34527:23;34519:68;;;;-1:-1:-1;;;34519:68:0;;;;;;;:::i;:::-;36911:15:::1;36919:6;36911:7;:15::i;:::-;36843:91:::0;:::o;36585:253::-;36648:4;36662:17;;;:8;:17;;;;;;;;;:58;;-1:-1:-1;36683:6:0;;:32;;-1:-1:-1;;;36683:32:0;;;;;616:25:1;;;-1:-1:-1;;;;;36683:6:0;;;;:23;;589:18:1;;36683:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;36662:58;36659:87;;;-1:-1:-1;36735:5:0;;36585:253;-1:-1:-1;36585:253:0:o;36659:87::-;36753:6;;:34;;-1:-1:-1;;;36753:34:0;;;;;616:25:1;;;-1:-1:-1;;;;;36753:6:0;;;;:25;;589:18:1;;36753:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36791:1;36753:39;36750:68;;;-1:-1:-1;36807:5:0;;36585:253;-1:-1:-1;36585:253:0:o;36750:68::-;-1:-1:-1;36829:4:0;;36585:253;-1:-1:-1;36585:253:0:o;19753:105::-;19813:13;19846:4;19839:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19753:105;;;:::o;38275:364::-;38327:6;;:28;;-1:-1:-1;;;38327:28:0;;;;;616:25:1;;;38359:10:0;;-1:-1:-1;;;;;38327:6:0;;:19;;589:18:1;;38327:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38327:42:0;;38319:72;;;;-1:-1:-1;;;38319:72:0;;12500:2:1;38319:72:0;;;12482:21:1;12539:2;12519:18;;;12512:30;-1:-1:-1;;;12558:18:1;;;12551:47;12615:18;;38319:72:0;12298:341:1;38319:72:0;38404:27;38423:7;38404:18;:27::i;:::-;38396:52;;;;-1:-1:-1;;;38396:52:0;;12846:2:1;38396:52:0;;;12828:21:1;12885:2;12865:18;;;12858:30;-1:-1:-1;;;12904:18:1;;;12897:42;12956:18;;38396:52:0;12644:336:1;38396:52:0;38488:1;38461:24;38471:10;38483:1;38461:9;:24::i;:::-;:28;38453:66;;;;-1:-1:-1;;;38453:66:0;;13187:2:1;38453:66:0;;;13169:21:1;13226:2;13206:18;;;13199:30;13265:27;13245:18;;;13238:55;13310:18;;38453:66:0;12985:349:1;38453:66:0;38524:6;;:32;;-1:-1:-1;;;38524:32:0;;;;;9131:25:1;;;38554:1:0;9172:18:1;;;9165:34;-1:-1:-1;;;;;38524:6:0;;;;:20;;9104:18:1;;38524:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38561:17:0;;;;:8;:17;;;;;:24;;-1:-1:-1;;38561:24:0;38581:4;38561:24;;;;;;38590:23;;-1:-1:-1;38596:10:0;;38561:17;38590:5;:23::i;:::-;38633:1;38618:11;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;;38275:364:0:o;22104:442::-;-1:-1:-1;;;;;22337:20:0;;17877:10;22337:20;;:60;;-1:-1:-1;22361:36:0;22378:4;17877:10;21386:168;:::i;22361:36::-;22315:160;;;;-1:-1:-1;;;22315:160:0;;14067:2:1;22315:160:0;;;14049:21:1;14106:2;14086:18;;;14079:30;14145:34;14125:18;;;14118:62;-1:-1:-1;;;14196:18:1;;;14189:48;14254:19;;22315:160:0;13865:414:1;22315:160:0;22486:52;22509:4;22515:2;22519:3;22524:7;22533:4;22486:22;:52::i;:::-;22104:442;;;;;:::o;20406:524::-;20562:16;20623:3;:10;20604:8;:15;:29;20596:83;;;;-1:-1:-1;;;20596:83:0;;14486:2:1;20596:83:0;;;14468:21:1;14525:2;14505:18;;;14498:30;14564:34;14544:18;;;14537:62;-1:-1:-1;;;14615:18:1;;;14608:39;14664:19;;20596:83:0;14284:405:1;20596:83:0;20692:30;20739:8;:15;20725:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20725:30:0;;20692:63;;20773:9;20768:122;20792:8;:15;20788:1;:19;20768:122;;;20848:30;20858:8;20867:1;20858:11;;;;;;;;:::i;:::-;;;;;;;20871:3;20875:1;20871:6;;;;;;;;:::i;:::-;;;;;;;20848:9;:30::i;:::-;20829:13;20843:1;20829:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;20809:3;;;:::i;:::-;;;20768:122;;;-1:-1:-1;20909:13:0;20406:524;-1:-1:-1;;;20406:524:0:o;34958:94::-;34380:6;;-1:-1:-1;;;;;34380:6:0;17877:10;34527:23;34519:68;;;;-1:-1:-1;;;34519:68:0;;;;;;;:::i;:::-;35023:21:::1;35041:1;35023:9;:21::i;:::-;34958:94::o:0;37174:405::-;37235:4;37267:11;;37249:15;:29;:48;;;-1:-1:-1;37282:15:0;;;;:6;:15;;;;;;;;37249:48;:62;;;-1:-1:-1;37301:10:0;;;;37249:62;37246:91;;;-1:-1:-1;37326:5:0;;37174:405;-1:-1:-1;37174:405:0:o;37246:91::-;37358:6;;:32;;-1:-1:-1;;;37358:32:0;;;;;616:25:1;;;37341:14:0;;-1:-1:-1;;;;;37358:6:0;;:23;;589:18:1;;37358:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37341:49;-1:-1:-1;37398:14:0;;;:63;;-1:-1:-1;37446:15:0;;37434:27;;:9;:27;:::i;:::-;37416:15;:45;37398:63;37395:92;;;-1:-1:-1;37476:5:0;;37174:405;-1:-1:-1;;37174:405:0:o;37395:92::-;37524:9;;37494:6;;:27;;-1:-1:-1;;;37494:27:0;;;;;616:25:1;;;-1:-1:-1;;;;;37494:6:0;;;;:18;;589::1;;37494:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;37491:68;;;-1:-1:-1;37548:5:0;;37174:405;-1:-1:-1;;37174:405:0:o;37491:68::-;-1:-1:-1;37570:4:0;;37174:405;-1:-1:-1;;37174:405:0:o;36939:137::-;34380:6;;-1:-1:-1;;;;;34380:6:0;17877:10;34527:23;34519:68;;;;-1:-1:-1;;;34519:68:0;;;;;;;:::i;:::-;37006:14:::1;:21:::0;;-1:-1:-1;;;;;37006:21:0;;::::1;-1:-1:-1::0;;;;;;37006:21:0;;::::1;::::0;::::1;::::0;;;37032:6:::1;:36:::0;;;;::::1;;::::0;;36939:137::o;21003:311::-;17877:10;-1:-1:-1;;;;;21106:24:0;;;;21098:78;;;;-1:-1:-1;;;21098:78:0;;15168:2:1;21098:78:0;;;15150:21:1;15207:2;15187:18;;;15180:30;15246:34;15226:18;;;15219:62;-1:-1:-1;;;15297:18:1;;;15290:39;15346:19;;21098:78:0;14966:405:1;21098:78:0;17877:10;21189:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;21189:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;21189:53:0;;;;;;;;;;21258:48;;1799:41:1;;;21189:42:0;;17877:10;21258:48;;1772:18:1;21258:48:0;;;;;;;21003:311;;:::o;37084:85::-;34380:6;;-1:-1:-1;;;;;34380:6:0;17877:10;34527:23;34519:68;;;;-1:-1:-1;;;34519:68:0;;;;;;;:::i;:::-;37151:10:::1;::::0;;-1:-1:-1;;37137:24:0;::::1;37151:10;::::0;;::::1;37150:11;37137:24;::::0;;37084:85::o;21626:401::-;-1:-1:-1;;;;;21834:20:0;;17877:10;21834:20;;:60;;-1:-1:-1;21858:36:0;21875:4;17877:10;21386:168;:::i;21858:36::-;21812:151;;;;-1:-1:-1;;;21812:151:0;;15578:2:1;21812:151:0;;;15560:21:1;15617:2;15597:18;;;15590:30;15656:34;15636:18;;;15629:62;-1:-1:-1;;;15707:18:1;;;15700:39;15756:19;;21812:151:0;15376:405:1;21812:151:0;21974:45;21992:4;21998:2;22002;22006:6;22014:4;21974:17;:45::i;35207:192::-;34380:6;;-1:-1:-1;;;;;34380:6:0;17877:10;34527:23;34519:68;;;;-1:-1:-1;;;34519:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35296:22:0;::::1;35288:73;;;::::0;-1:-1:-1;;;35288:73:0;;15988:2:1;35288:73:0::1;::::0;::::1;15970:21:1::0;16027:2;16007:18;;;16000:30;16066:34;16046:18;;;16039:62;-1:-1:-1;;;16117:18:1;;;16110:36;16163:19;;35288:73:0::1;15786:402:1::0;35288:73:0::1;35372:19;35382:8;35372:9;:19::i;37875:395::-:0;37944:9;37939:246;37963:8;:15;37959:1;:19;37939:246;;;37991:12;38006:8;38015:1;38006:11;;;;;;;;:::i;:::-;;;;;;;37991:26;;38031:25;38048:7;38031:16;:25::i;:::-;38023:50;;;;-1:-1:-1;;;38023:50:0;;12846:2:1;38023:50:0;;;12828:21:1;12885:2;12865:18;;;12858:30;-1:-1:-1;;;12904:18:1;;;12897:42;12956:18;;38023:50:0;12644:336:1;38023:50:0;38087:6;;:28;;-1:-1:-1;;;38087:28:0;;;;;616:25:1;;;38119:10:0;;-1:-1:-1;;;;;38087:6:0;;:19;;589:18:1;;38087:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38087:42:0;;38079:72;;;;-1:-1:-1;;;38079:72:0;;12500:2:1;38079:72:0;;;12482:21:1;12539:2;12519:18;;;12512:30;-1:-1:-1;;;12558:18:1;;;12551:47;12615:18;;38079:72:0;12298:341:1;38079:72:0;38157:15;;;;:6;:15;;;;;:22;;-1:-1:-1;;38157:22:0;38175:4;38157:22;;;37980:3;;;;:::i;:::-;;;;37939:246;;;;38189:41;38195:10;38207:1;38210:8;:15;38189:41;;;;;;;;;;;;:5;:41::i;:::-;38250:8;:15;38235:11;;:30;;;;;;;:::i;26106:88::-;26173:13;;;;:4;;:13;;;;;:::i;:::-;;26106:88;:::o;28544:675::-;-1:-1:-1;;;;;28674:21:0;;28666:69;;;;-1:-1:-1;;;28666:69:0;;16395:2:1;28666:69:0;;;16377:21:1;16434:2;16414:18;;;16407:30;16473:34;16453:18;;;16446:62;-1:-1:-1;;;16524:18:1;;;16517:33;16567:19;;28666:69:0;16193:399:1;28666:69:0;17877:10;28792:105;17877:10;28823:7;28748:16;28844:21;28862:2;28844:17;:21::i;:::-;28867:25;28885:6;28867:17;:25::i;:::-;-1:-1:-1;;28792:105:0;;;;;;;;;-1:-1:-1;28792:105:0;;-1:-1:-1;;;24188:1074:0;28792:105;28910:22;28935:13;;;;;;;;;;;-1:-1:-1;;;;;28935:22:0;;;;;;;;;;28976:24;;;;28968:73;;;;-1:-1:-1;;;28968:73:0;;16799:2:1;28968:73:0;;;16781:21:1;16838:2;16818:18;;;16811:30;16877:34;16857:18;;;16850:62;-1:-1:-1;;;16928:18:1;;;16921:34;16972:19;;28968:73:0;16597:400:1;28968:73:0;29077:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29077:22:0;;;;;;;;;;;;29102:23;;;29077:48;;29154:57;;9131:25:1;;;9172:18;;;9165:34;;;29077:22:0;;29154:57;;;;;;9104:18:1;29154:57:0;;;;;;;28655:564;;28544:675;;;:::o;24188:1074::-;24415:7;:14;24401:3;:10;:28;24393:81;;;;-1:-1:-1;;;24393:81:0;;17204:2:1;24393:81:0;;;17186:21:1;17243:2;17223:18;;;17216:30;17282:34;17262:18;;;17255:62;-1:-1:-1;;;17333:18:1;;;17326:38;17381:19;;24393:81:0;17002:404:1;24393:81:0;-1:-1:-1;;;;;24493:16:0;;24485:66;;;;-1:-1:-1;;;24485:66:0;;;;;;;:::i;:::-;17877:10;24564:16;24681:421;24705:3;:10;24701:1;:14;24681:421;;;24737:10;24750:3;24754:1;24750:6;;;;;;;;:::i;:::-;;;;;;;24737:19;;24771:14;24788:7;24796:1;24788:10;;;;;;;;:::i;:::-;;;;;;;;;;;;24815:19;24837:13;;;;;;;;;;-1:-1:-1;;;;;24837:19:0;;;;;;;;;;;;24788:10;;-1:-1:-1;24879:21:0;;;;24871:76;;;;-1:-1:-1;;;24871:76:0;;;;;;;:::i;:::-;24991:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24991:19:0;;;;;;;;;;25013:20;;;24991:42;;25063:17;;;;;;;:27;;25013:20;;24991:9;25063:27;;25013:20;;25063:27;:::i;:::-;;;;;;;;24722:380;;;24717:3;;;;:::i;:::-;;;24681:421;;;;25149:2;-1:-1:-1;;;;;25119:47:0;25143:4;-1:-1:-1;;;;;25119:47:0;25133:8;-1:-1:-1;;;;;25119:47:0;;25153:3;25158:7;25119:47;;;;;;;:::i;:::-;;;;;;;;25179:75;25215:8;25225:4;25231:2;25235:3;25240:7;25249:4;25179:35;:75::i;:::-;24382:880;24188:1074;;;;;:::o;35407:173::-;35482:6;;;-1:-1:-1;;;;;35499:17:0;;;-1:-1:-1;;;;;;35499:17:0;;;;;;;35532:40;;35482:6;;;35499:17;35482:6;;35532:40;;35463:16;;35532:40;35452:128;35407:173;:::o;23010:820::-;-1:-1:-1;;;;;23198:16:0;;23190:66;;;;-1:-1:-1;;;23190:66:0;;;;;;;:::i;:::-;17877:10;23313:96;17877:10;23344:4;23350:2;23354:21;23372:2;23354:17;:21::i;:::-;23377:25;23395:6;23377:17;:25::i;23313:96::-;23422:19;23444:13;;;;;;;;;;;-1:-1:-1;;;;;23444:19:0;;;;;;;;;;23482:21;;;;23474:76;;;;-1:-1:-1;;;23474:76:0;;;;;;;:::i;:::-;23586:9;:13;;;;;;;;;;;-1:-1:-1;;;;;23586:19:0;;;;;;;;;;23608:20;;;23586:42;;23650:17;;;;;;;:27;;23608:20;;23586:9;23650:27;;23608:20;;23650:27;:::i;:::-;;;;-1:-1:-1;;23695:46:0;;;9131:25:1;;;9187:2;9172:18;;9165:34;;;-1:-1:-1;;;;;23695:46:0;;;;;;;;;;;;;;9104:18:1;23695:46:0;;;;;;;23754:68;23785:8;23795:4;23801:2;23805;23809:6;23817:4;23754:30;:68::i;:::-;23179:651;;23010:820;;;;;:::o;26595:599::-;-1:-1:-1;;;;;26753:21:0;;26745:67;;;;-1:-1:-1;;;26745:67:0;;18900:2:1;26745:67:0;;;18882:21:1;18939:2;18919:18;;;18912:30;18978:34;18958:18;;;18951:62;-1:-1:-1;;;19029:18:1;;;19022:31;19070:19;;26745:67:0;18698:397:1;26745:67:0;17877:10;26869:107;17877:10;26825:16;26912:7;26921:21;26939:2;26921:17;:21::i;26869:107::-;26989:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26989:22:0;;;;;;;;;:32;;27015:6;;26989:9;:32;;27015:6;;26989:32;:::i;:::-;;;;-1:-1:-1;;27037:57:0;;;9131:25:1;;;9187:2;9172:18;;9165:34;;;-1:-1:-1;;;;;27037:57:0;;;;27070:1;;27037:57;;;;;;9104:18:1;27037:57:0;;;;;;;27107:79;27138:8;27156:1;27160:7;27169:2;27173:6;27181:4;27107:30;:79::i;33098:198::-;33218:16;;;33232:1;33218:16;;;;;;;;;33164;;33193:22;;33218:16;;;;;;;;;;;;-1:-1:-1;33218:16:0;33193:41;;33256:7;33245:5;33251:1;33245:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;33283:5;33098:198;-1:-1:-1;;33098:198:0:o;32277:813::-;-1:-1:-1;;;;;32517:13:0;;1132:20;1180:8;32513:570;;32553:79;;-1:-1:-1;;;32553:79:0;;-1:-1:-1;;;;;32553:43:0;;;;;:79;;32597:8;;32607:4;;32613:3;;32618:7;;32627:4;;32553:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32553:79:0;;;;;;;;-1:-1:-1;;32553:79:0;;;;;;;;;;;;:::i;:::-;;;32549:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32945:6;32938:14;;-1:-1:-1;;;32938:14:0;;;;;;;;:::i;32549:523::-;;;32994:62;;-1:-1:-1;;;32994:62:0;;21248:2:1;32994:62:0;;;21230:21:1;21287:2;21267:18;;;21260:30;21326:34;21306:18;;;21299:62;-1:-1:-1;;;21377:18:1;;;21370:50;21437:19;;32994:62:0;21046:416:1;32549:523:0;-1:-1:-1;;;;;;32714:60:0;;-1:-1:-1;;;32714:60:0;32710:159;;32799:50;;-1:-1:-1;;;32799:50:0;;;;;;;:::i;31525:744::-;-1:-1:-1;;;;;31740:13:0;;1132:20;1180:8;31736:526;;31776:72;;-1:-1:-1;;;31776:72:0;;-1:-1:-1;;;;;31776:38:0;;;;;:72;;31815:8;;31825:4;;31831:2;;31835:6;;31843:4;;31776:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31776:72:0;;;;;;;;-1:-1:-1;;31776:72:0;;;;;;;;;;;;:::i;:::-;;;31772:479;;;;:::i;:::-;-1:-1:-1;;;;;;31898:55:0;;-1:-1:-1;;;31898:55:0;31894:154;;31978:50;;-1:-1:-1;;;31978:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;652:180::-;711:6;764:2;752:9;743:7;739:23;735:32;732:52;;;780:1;777;770:12;732:52;-1:-1:-1;803:23:1;;652:180;-1:-1:-1;652:180:1:o;1273:131::-;-1:-1:-1;;;;;;1347:32:1;;1337:43;;1327:71;;1394:1;1391;1384:12;1409:245;1467:6;1520:2;1508:9;1499:7;1495:23;1491:32;1488:52;;;1536:1;1533;1526:12;1488:52;1575:9;1562:23;1594:30;1618:5;1594:30;:::i;:::-;1643:5;1409:245;-1:-1:-1;;;1409:245:1:o;1851:127::-;1912:10;1907:3;1903:20;1900:1;1893:31;1943:4;1940:1;1933:15;1967:4;1964:1;1957:15;1983:249;2093:2;2074:13;;-1:-1:-1;;2070:27:1;2058:40;;2128:18;2113:34;;2149:22;;;2110:62;2107:88;;;2175:18;;:::i;:::-;2211:2;2204:22;-1:-1:-1;;1983:249:1:o;2237:469::-;2302:5;2336:18;2328:6;2325:30;2322:56;;;2358:18;;:::i;:::-;2407:2;2401:9;2419:69;2476:2;2455:15;;-1:-1:-1;;2451:29:1;2482:4;2447:40;2401:9;2419:69;:::i;:::-;2506:6;2497:15;;2536:6;2528;2521:22;2576:3;2567:6;2562:3;2558:16;2555:25;2552:45;;;2593:1;2590;2583:12;2552:45;2643:6;2638:3;2631:4;2623:6;2619:17;2606:44;2698:1;2691:4;2682:6;2674;2670:19;2666:30;2659:41;;2237:469;;;;;:::o;2711:451::-;2780:6;2833:2;2821:9;2812:7;2808:23;2804:32;2801:52;;;2849:1;2846;2839:12;2801:52;2889:9;2876:23;2922:18;2914:6;2911:30;2908:50;;;2954:1;2951;2944:12;2908:50;2977:22;;3030:4;3022:13;;3018:27;-1:-1:-1;3008:55:1;;3059:1;3056;3049:12;3008:55;3082:74;3148:7;3143:2;3130:16;3125:2;3121;3117:11;3082:74;:::i;:::-;3072:84;2711:451;-1:-1:-1;;;;2711:451:1:o;3167:472::-;3209:3;3247:5;3241:12;3274:6;3269:3;3262:19;3299:1;3309:162;3323:6;3320:1;3317:13;3309:162;;;3385:4;3441:13;;;3437:22;;3431:29;3413:11;;;3409:20;;3402:59;3338:12;3309:162;;;3489:6;3486:1;3483:13;3480:87;;;3555:1;3548:4;3539:6;3534:3;3530:16;3526:27;3519:38;3480:87;-1:-1:-1;3621:2:1;3600:15;-1:-1:-1;;3596:29:1;3587:39;;;;3628:4;3583:50;;3167:472;-1:-1:-1;;3167:472:1:o;3644:220::-;3793:2;3782:9;3775:21;3756:4;3813:45;3854:2;3843:9;3839:18;3831:6;3813:45;:::i;3869:183::-;3929:4;3962:18;3954:6;3951:30;3948:56;;;3984:18;;:::i;:::-;-1:-1:-1;4029:1:1;4025:14;4041:4;4021:25;;3869:183::o;4057:724::-;4111:5;4164:3;4157:4;4149:6;4145:17;4141:27;4131:55;;4182:1;4179;4172:12;4131:55;4218:6;4205:20;4244:4;4267:43;4307:2;4267:43;:::i;:::-;4339:2;4333:9;4351:31;4379:2;4371:6;4351:31;:::i;:::-;4417:18;;;4509:1;4505:10;;;;4493:23;;4489:32;;;4451:15;;;;-1:-1:-1;4533:15:1;;;4530:35;;;4561:1;4558;4551:12;4530:35;4597:2;4589:6;4585:15;4609:142;4625:6;4620:3;4617:15;4609:142;;;4691:17;;4679:30;;4729:12;;;;4642;;4609:142;;;-1:-1:-1;4769:6:1;4057:724;-1:-1:-1;;;;;;4057:724:1:o;4786:221::-;4828:5;4881:3;4874:4;4866:6;4862:17;4858:27;4848:55;;4899:1;4896;4889:12;4848:55;4921:80;4997:3;4988:6;4975:20;4968:4;4960:6;4956:17;4921:80;:::i;5012:1071::-;5166:6;5174;5182;5190;5198;5251:3;5239:9;5230:7;5226:23;5222:33;5219:53;;;5268:1;5265;5258:12;5219:53;5307:9;5294:23;5326:31;5351:5;5326:31;:::i;:::-;5376:5;-1:-1:-1;5433:2:1;5418:18;;5405:32;5446:33;5405:32;5446:33;:::i;:::-;5498:7;-1:-1:-1;5556:2:1;5541:18;;5528:32;5579:18;5609:14;;;5606:34;;;5636:1;5633;5626:12;5606:34;5659:61;5712:7;5703:6;5692:9;5688:22;5659:61;:::i;:::-;5649:71;;5773:2;5762:9;5758:18;5745:32;5729:48;;5802:2;5792:8;5789:16;5786:36;;;5818:1;5815;5808:12;5786:36;5841:63;5896:7;5885:8;5874:9;5870:24;5841:63;:::i;:::-;5831:73;;5957:3;5946:9;5942:19;5929:33;5913:49;;5987:2;5977:8;5974:16;5971:36;;;6003:1;6000;5993:12;5971:36;;6026:51;6069:7;6058:8;6047:9;6043:24;6026:51;:::i;:::-;6016:61;;;5012:1071;;;;;;;;:::o;6088:1277::-;6206:6;6214;6267:2;6255:9;6246:7;6242:23;6238:32;6235:52;;;6283:1;6280;6273:12;6235:52;6323:9;6310:23;6352:18;6393:2;6385:6;6382:14;6379:34;;;6409:1;6406;6399:12;6379:34;6447:6;6436:9;6432:22;6422:32;;6492:7;6485:4;6481:2;6477:13;6473:27;6463:55;;6514:1;6511;6504:12;6463:55;6550:2;6537:16;6572:4;6595:43;6635:2;6595:43;:::i;:::-;6667:2;6661:9;6679:31;6707:2;6699:6;6679:31;:::i;:::-;6745:18;;;6833:1;6829:10;;;;6821:19;;6817:28;;;6779:15;;;;-1:-1:-1;6857:19:1;;;6854:39;;;6889:1;6886;6879:12;6854:39;6913:11;;;;6933:217;6949:6;6944:3;6941:15;6933:217;;;7029:3;7016:17;7046:31;7071:5;7046:31;:::i;:::-;7090:18;;6966:12;;;;7128;;;;6933:217;;;7169:6;-1:-1:-1;;7213:18:1;;7200:32;;-1:-1:-1;;7244:16:1;;;7241:36;;;7273:1;7270;7263:12;7241:36;;7296:63;7351:7;7340:8;7329:9;7325:24;7296:63;:::i;:::-;7286:73;;;6088:1277;;;;;:::o;7370:435::-;7423:3;7461:5;7455:12;7488:6;7483:3;7476:19;7514:4;7543:2;7538:3;7534:12;7527:19;;7580:2;7573:5;7569:14;7601:1;7611:169;7625:6;7622:1;7619:13;7611:169;;;7686:13;;7674:26;;7720:12;;;;7755:15;;;;7647:1;7640:9;7611:169;;;-1:-1:-1;7796:3:1;;7370:435;-1:-1:-1;;;;;7370:435:1:o;7810:261::-;7989:2;7978:9;7971:21;7952:4;8009:56;8061:2;8050:9;8046:18;8038:6;8009:56;:::i;8284:247::-;8343:6;8396:2;8384:9;8375:7;8371:23;8367:32;8364:52;;;8412:1;8409;8402:12;8364:52;8451:9;8438:23;8470:31;8495:5;8470:31;:::i;8536:416::-;8601:6;8609;8662:2;8650:9;8641:7;8637:23;8633:32;8630:52;;;8678:1;8675;8668:12;8630:52;8717:9;8704:23;8736:31;8761:5;8736:31;:::i;:::-;8786:5;-1:-1:-1;8843:2:1;8828:18;;8815:32;8885:15;;8878:23;8866:36;;8856:64;;8916:1;8913;8906:12;8856:64;8939:7;8929:17;;;8536:416;;;;;:::o;9210:388::-;9278:6;9286;9339:2;9327:9;9318:7;9314:23;9310:32;9307:52;;;9355:1;9352;9345:12;9307:52;9394:9;9381:23;9413:31;9438:5;9413:31;:::i;:::-;9463:5;-1:-1:-1;9520:2:1;9505:18;;9492:32;9533:33;9492:32;9533:33;:::i;9603:734::-;9707:6;9715;9723;9731;9739;9792:3;9780:9;9771:7;9767:23;9763:33;9760:53;;;9809:1;9806;9799:12;9760:53;9848:9;9835:23;9867:31;9892:5;9867:31;:::i;:::-;9917:5;-1:-1:-1;9974:2:1;9959:18;;9946:32;9987:33;9946:32;9987:33;:::i;:::-;10039:7;-1:-1:-1;10093:2:1;10078:18;;10065:32;;-1:-1:-1;10144:2:1;10129:18;;10116:32;;-1:-1:-1;10199:3:1;10184:19;;10171:33;10227:18;10216:30;;10213:50;;;10259:1;10256;10249:12;10213:50;10282:49;10323:7;10314:6;10303:9;10299:22;10282:49;:::i;10342:348::-;10426:6;10479:2;10467:9;10458:7;10454:23;10450:32;10447:52;;;10495:1;10492;10485:12;10447:52;10535:9;10522:23;10568:18;10560:6;10557:30;10554:50;;;10600:1;10597;10590:12;10554:50;10623:61;10676:7;10667:6;10656:9;10652:22;10623:61;:::i;11107:356::-;11309:2;11291:21;;;11328:18;;;11321:30;11387:34;11382:2;11367:18;;11360:62;11454:2;11439:18;;11107:356::o;11468:184::-;11538:6;11591:2;11579:9;11570:7;11566:23;11562:32;11559:52;;;11607:1;11604;11597:12;11559:52;-1:-1:-1;11630:16:1;;11468:184;-1:-1:-1;11468:184:1:o;11657:380::-;11736:1;11732:12;;;;11779;;;11800:61;;11854:4;11846:6;11842:17;11832:27;;11800:61;11907:2;11899:6;11896:14;11876:18;11873:38;11870:161;;;11953:10;11948:3;11944:20;11941:1;11934:31;11988:4;11985:1;11978:15;12016:4;12013:1;12006:15;11870:161;;11657:380;;;:::o;12042:251::-;12112:6;12165:2;12153:9;12144:7;12140:23;12136:32;12133:52;;;12181:1;12178;12171:12;12133:52;12213:9;12207:16;12232:31;12257:5;12232:31;:::i;13600:127::-;13661:10;13656:3;13652:20;13649:1;13642:31;13692:4;13689:1;13682:15;13716:4;13713:1;13706:15;13732:128;13772:3;13803:1;13799:6;13796:1;13793:13;13790:39;;;13809:18;;:::i;:::-;-1:-1:-1;13845:9:1;;13732:128::o;14694:127::-;14755:10;14750:3;14746:20;14743:1;14736:31;14786:4;14783:1;14776:15;14810:4;14807:1;14800:15;14826:135;14865:3;-1:-1:-1;;14886:17:1;;14883:43;;;14906:18;;:::i;:::-;-1:-1:-1;14953:1:1;14942:13;;14826:135::o;17411:401::-;17613:2;17595:21;;;17652:2;17632:18;;;17625:30;17691:34;17686:2;17671:18;;17664:62;-1:-1:-1;;;17757:2:1;17742:18;;17735:35;17802:3;17787:19;;17411:401::o;17817:406::-;18019:2;18001:21;;;18058:2;18038:18;;;18031:30;18097:34;18092:2;18077:18;;18070:62;-1:-1:-1;;;18163:2:1;18148:18;;18141:40;18213:3;18198:19;;17817:406::o;18228:465::-;18485:2;18474:9;18467:21;18448:4;18511:56;18563:2;18552:9;18548:18;18540:6;18511:56;:::i;:::-;18615:9;18607:6;18603:22;18598:2;18587:9;18583:18;18576:50;18643:44;18680:6;18672;18643:44;:::i;:::-;18635:52;18228:465;-1:-1:-1;;;;;18228:465:1:o;19100:827::-;-1:-1:-1;;;;;19497:15:1;;;19479:34;;19549:15;;19544:2;19529:18;;19522:43;19459:3;19596:2;19581:18;;19574:31;;;19422:4;;19628:57;;19665:19;;19657:6;19628:57;:::i;:::-;19733:9;19725:6;19721:22;19716:2;19705:9;19701:18;19694:50;19767:44;19804:6;19796;19767:44;:::i;:::-;19753:58;;19860:9;19852:6;19848:22;19842:3;19831:9;19827:19;19820:51;19888:33;19914:6;19906;19888:33;:::i;:::-;19880:41;19100:827;-1:-1:-1;;;;;;;;19100:827:1:o;19932:249::-;20001:6;20054:2;20042:9;20033:7;20029:23;20025:32;20022:52;;;20070:1;20067;20060:12;20022:52;20102:9;20096:16;20121:30;20145:5;20121:30;:::i;20186:179::-;20221:3;20263:1;20245:16;20242:23;20239:120;;;20309:1;20306;20303;20288:23;-1:-1:-1;20346:1:1;20340:8;20335:3;20331:18;20239:120;20186:179;:::o;20370:671::-;20409:3;20451:4;20433:16;20430:26;20427:39;;;20370:671;:::o;20427:39::-;20493:2;20487:9;-1:-1:-1;;20558:16:1;20554:25;;20551:1;20487:9;20530:50;20609:4;20603:11;20633:16;20668:18;20739:2;20732:4;20724:6;20720:17;20717:25;20712:2;20704:6;20701:14;20698:45;20695:58;;;20746:5;;;;;20370:671;:::o;20695:58::-;20783:6;20777:4;20773:17;20762:28;;20819:3;20813:10;20846:2;20838:6;20835:14;20832:27;;;20852:5;;;;;;20370:671;:::o;20832:27::-;20936:2;20917:16;20911:4;20907:27;20903:36;20896:4;20887:6;20882:3;20878:16;20874:27;20871:69;20868:82;;;20943:5;;;;;;20370:671;:::o;20868:82::-;20959:57;21010:4;21001:6;20993;20989:19;20985:30;20979:4;20959:57;:::i;:::-;-1:-1:-1;21032:3:1;;20370:671;-1:-1:-1;;;;;20370:671:1:o;21467:404::-;21669:2;21651:21;;;21708:2;21688:18;;;21681:30;21747:34;21742:2;21727:18;;21720:62;-1:-1:-1;;;21813:2:1;21798:18;;21791:38;21861:3;21846:19;;21467:404::o;21876:561::-;-1:-1:-1;;;;;22173:15:1;;;22155:34;;22225:15;;22220:2;22205:18;;22198:43;22272:2;22257:18;;22250:34;;;22315:2;22300:18;;22293:34;;;22135:3;22358;22343:19;;22336:32;;;22098:4;;22385:46;;22411:19;;22403:6;22385:46;:::i;:::-;22377:54;21876:561;-1:-1:-1;;;;;;;21876:561:1:o

Swarm Source

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