ETH Price: $3,603.14 (-3.23%)

Token

VSP IRL Experiences (VSPIRL)
 

Overview

Max Total Supply

300 VSPIRL

Holders

183

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x6018c495ae3776081ce130dd0a49c3020bc6336c
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:
VSPRaffleCollection

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-05
*/

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}

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

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

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

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

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


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


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



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


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


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



/**
 * @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(to).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(to).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;
    }
}

contract VSPRaffleCollection is ERC1155, Ownable {
    using Strings for uint256;

    string public name = "VSP IRL Experiences";
    string public symbol = "VSPIRL";
    
    mapping(uint256 => string) private baseURIs;

    mapping(uint256 => uint256) public claimExpirationDates;
    
    mapping(address => bool) admins;

    event SetBaseURI(uint256 indexed tokenId, string _baseURI);

    constructor() ERC1155("") {
        toggleAdmin(_msgSender());
    }

    /**
     * @dev Throws if called by any account not set to true in the admin mapping.
     */
    modifier onlyAdmin() {
        require(admins[_msgSender()] == true, "Not an owner");
        _;
    }

    function toggleAdmin(address _adminEntry) public onlyOwner 
    {
        admins[_adminEntry] = !admins[_adminEntry];
    }

    function updateClaimEndDate(uint256 index, uint256 newEndDate) external onlyOwner
    {
        claimExpirationDates[index] = newEndDate;
    }

    function airdropWinners(address[] calldata owners, uint256 id, uint256 claimEndDate) external onlyAdmin
    {
        require(id % 2 == 1, "id value is not odd");
        if(claimEndDate > 0)
        {
            require(claimExpirationDates[id] == 0, "Claim end date already set");
            require(claimEndDate > block.timestamp, "Expiration must be in the future");
            claimExpirationDates[id] = claimEndDate;
        }
        else
        {
            require(claimExpirationDates[id] > 0, "Must set claim end date");
        }

        for(uint256 i = 0; i < owners.length; i++)
        {
            _mint(owners[i], id, 1, "");
        }
    }

    function setRaffleURI(uint256 tokenId, string memory baseURI) external onlyAdmin
    {
        require(tokenId % 2 == 1, "tokenId value must be an odd integer");
        baseURIs[tokenId] = baseURI;

        emit SetBaseURI(tokenId, baseURI);
    }

    function claimPrize(uint256 typeId) external
    {
        require(typeId % 2 == 1, "Not an odd typeId");
        require(block.timestamp < claimExpirationDates[typeId], "Claim period has ended");

        //Burn claimable token
        _burn(_msgSender(), typeId, 1);

        //Mint proof of claim token
        _mint(_msgSender(), typeId + 1, 1, "");

    }

    function uri(uint256 typeId) public view override returns (string memory)
    {
            require(typeId > 0, "First tokenId = 1");

            uint256 baseVal;
            bool claimed;

            //claimed/unclaimed check
            if(typeId % 2 == 1)
            {
                baseVal = typeId;
            }
            else
            {
                baseVal = typeId - 1;
                claimed = true;
            }

            require(bytes(baseURIs[baseVal]).length > 0, "URI not set");

            //URI for a claimed NFT will be "baseURI/2"
            if(claimed)
            {
                return string(abi.encodePacked(baseURIs[baseVal], "/2"));
            }
            else
            {
                //If the claim period has ended return "baseURI/1" otherwise return "baseURI/0"
                if(block.timestamp > claimExpirationDates[baseVal])
                {
                    return string(abi.encodePacked(baseURIs[baseVal], "/1"));
                }
                else
                {
                    return string(abi.encodePacked(baseURIs[baseVal], "/0"));
                }
            }             
    }
}

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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_baseURI","type":"string"}],"name":"SetBaseURI","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":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"claimEndDate","type":"uint256"}],"name":"airdropWinners","outputs":[],"stateMutability":"nonpayable","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":"","type":"uint256"}],"name":"claimExpirationDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"claimPrize","outputs":[],"stateMutability":"nonpayable","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"baseURI","type":"string"}],"name":"setRaffleURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adminEntry","type":"address"}],"name":"toggleAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"newEndDate","type":"uint256"}],"name":"updateClaimEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60c0604052601360808190527f5653502049524c20457870657269656e6365730000000000000000000000000060a0908152620000409160049190620001a9565b50604080518082019091526006808252651594d412549360d21b60209092019182526200007091600591620001a9565b503480156200007e57600080fd5b506040805160208101909152600081526200009981620000b6565b50620000a533620000cf565b620000b03362000121565b6200028c565b8051620000cb906002906020840190620001a9565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6003546001600160a01b03163314620001805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b6001600160a01b03166000908152600860205260409020805460ff19811660ff90911615179055565b828054620001b7906200024f565b90600052602060002090601f016020900481019282620001db576000855562000226565b82601f10620001f657805160ff191683800117855562000226565b8280016001018555821562000226579182015b828111156200022657825182559160200191906001019062000209565b506200023492915062000238565b5090565b5b8082111562000234576000815560010162000239565b600181811c908216806200026457607f821691505b602082108114156200028657634e487b7160e01b600052602260045260246000fd5b50919050565b6121e1806200029c6000396000f3fe608060405234801561001057600080fd5b50600436106101205760003560e01c806395d89b41116100ad578063d709815411610071578063d709815414610255578063e985e9c514610268578063ebd9fe90146102a4578063f242432a146102c4578063f2fde38b146102d757600080fd5b806395d89b4114610201578063a22cb46514610209578063a2cb764b1461021c578063c8b6277c1461022f578063d3b861411461024257600080fd5b80632994619d116100f45780632994619d146101965780632eb2c2d6146101ab5780634e1273f4146101be578063715018a6146101de5780638da5cb5b146101e657600080fd5b8062fdd58e1461012557806301ffc9a71461014b57806306fdde031461016e5780630e89341c14610183575b600080fd5b6101386101333660046119f3565b6102ea565b6040519081526020015b60405180910390f35b61015e610159366004611b70565b610381565b6040519015158152602001610142565b6101766103d3565b6040516101429190611e96565b610176610191366004611baa565b610461565b6101a96101a4366004611a1d565b6105be565b005b6101a96101b93660046118a8565b6107e9565b6101d16101cc366004611a9f565b610879565b6040516101429190611e55565b6101a96109a3565b6003546040516001600160a01b039091168152602001610142565b6101766109d9565b6101a96102173660046119b7565b6109e6565b6101a961022a366004611c14565b610abd565b6101a961023d366004611bc3565b610af9565b6101a961025036600461185a565b610c0e565b6101a9610263366004611baa565b610c61565b61015e610276366004611875565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101386102b2366004611baa565b60076020526000908152604090205481565b6101a96102d2366004611952565b610d3a565b6101a96102e536600461185a565b610dc1565b60006001600160a01b03831661035b5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806103b257506001600160e01b031982166303a24d0760e21b145b806103cd57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600480546103e090612008565b80601f016020809104026020016040519081016040528092919081815260200182805461040c90612008565b80156104595780601f1061042e57610100808354040283529160200191610459565b820191906000526020600020905b81548152906001019060200180831161043c57829003601f168201915b505050505081565b6060600082116104a75760405162461bcd60e51b8152602060048201526011602482015270466972737420746f6b656e4964203d203160781b6044820152606401610352565b6000806104b560028561208b565b600114156104c5578391506104d7565b6104d0600185611ff1565b9150600190505b600082815260066020526040812080546104f090612008565b90501161052d5760405162461bcd60e51b815260206004820152600b60248201526a155492481b9bdd081cd95d60aa1b6044820152606401610352565b801561056a576000828152600660209081526040918290209151610552929101611d76565b60405160208183030381529060405292505050919050565b60008281526007602052604090205442111561059f576000828152600660209081526040918290209151610552929101611d58565b6000828152600660209081526040918290209151610552929101611d94565b3360009081526008602052604090205460ff1615156001146106115760405162461bcd60e51b815260206004820152600c60248201526b2737ba1030b71037bbb732b960a11b6044820152606401610352565b61061c60028361208b565b6001146106615760405162461bcd60e51b81526020600482015260136024820152721a59081d985b1d59481a5cc81b9bdd081bd919606a1b6044820152606401610352565b801561072857600082815260076020526040902054156106c35760405162461bcd60e51b815260206004820152601a60248201527f436c61696d20656e64206461746520616c7265616479207365740000000000006044820152606401610352565b4281116107125760405162461bcd60e51b815260206004820181905260248201527f45787069726174696f6e206d75737420626520696e20746865206675747572656044820152606401610352565b6000828152600760205260409020819055610783565b6000828152600760205260409020546107835760405162461bcd60e51b815260206004820152601760248201527f4d7573742073657420636c61696d20656e6420646174650000000000000000006044820152606401610352565b60005b838110156107e2576107d08585838181106107a3576107a36120c3565b90506020020160208101906107b8919061185a565b84600160405180602001604052806000815250610e59565b806107da81612070565b915050610786565b5050505050565b6001600160a01b03851633148061080557506108058533610276565b61086c5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610352565b6107e28585858585610f63565b606081518351146108de5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610352565b6000835167ffffffffffffffff8111156108fa576108fa6120d9565b604051908082528060200260200182016040528015610923578160200160208202803683370190505b50905060005b845181101561099b5761096e858281518110610947576109476120c3565b6020026020010151858381518110610961576109616120c3565b60200260200101516102ea565b828281518110610980576109806120c3565b602090810291909101015261099481612070565b9050610929565b509392505050565b6003546001600160a01b031633146109cd5760405162461bcd60e51b815260040161035290611f80565b6109d76000611140565b565b600580546103e090612008565b336001600160a01b0383161415610a515760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610352565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b03163314610ae75760405162461bcd60e51b815260040161035290611f80565b60009182526007602052604090912055565b3360009081526008602052604090205460ff161515600114610b4c5760405162461bcd60e51b815260206004820152600c60248201526b2737ba1030b71037bbb732b960a11b6044820152606401610352565b610b5760028361208b565b600114610bb25760405162461bcd60e51b8152602060048201526024808201527f746f6b656e49642076616c7565206d75737420626520616e206f646420696e7460448201526332b3b2b960e11b6064820152608401610352565b60008281526006602090815260409091208251610bd1928401906116a9565b50817f327fc603e4675be2a2c12fddd2aee2a21c8d94885b452a63e97bc8558fd1482d82604051610c029190611e96565b60405180910390a25050565b6003546001600160a01b03163314610c385760405162461bcd60e51b815260040161035290611f80565b6001600160a01b03166000908152600860205260409020805460ff19811660ff90911615179055565b610c6c60028261208b565b600114610caf5760405162461bcd60e51b8152602060048201526011602482015270139bdd08185b881bd919081d1e5c195259607a1b6044820152606401610352565b6000818152600760205260409020544210610d055760405162461bcd60e51b815260206004820152601660248201527510db185a5b481c195c9a5bd9081a185cc8195b99195960521b6044820152606401610352565b610d1133826001611192565b610d3733610d20836001611fd9565b600160405180602001604052806000815250610e59565b50565b6001600160a01b038516331480610d565750610d568533610276565b610db45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610352565b6107e2858585858561130c565b6003546001600160a01b03163314610deb5760405162461bcd60e51b815260040161035290611f80565b6001600160a01b038116610e505760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610352565b610d3781611140565b6001600160a01b038416610eb95760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610352565b33610ed381600087610eca88611429565b6107e288611429565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610f03908490611fd9565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46107e281600087878787611474565b8151835114610fc55760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610352565b6001600160a01b038416610feb5760405162461bcd60e51b815260040161035290611ef1565b3360005b84518110156110d257600085828151811061100c5761100c6120c3565b60200260200101519050600085838151811061102a5761102a6120c3565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561107a5760405162461bcd60e51b815260040161035290611f36565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110b7908490611fd9565b92505081905550505050806110cb90612070565b9050610fef565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611122929190611e68565b60405180910390a46111388187878787876115df565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166111f45760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610352565b336112248185600061120587611429565b61120e87611429565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156112a15760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610352565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0384166113325760405162461bcd60e51b815260040161035290611ef1565b33611342818787610eca88611429565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156113835760405162461bcd60e51b815260040161035290611f36565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906113c0908490611fd9565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611420828888888888611474565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611463576114636120c3565b602090810291909101015292915050565b6001600160a01b0384163b156111385760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906114b89089908990889088908890600401611e10565b602060405180830381600087803b1580156114d257600080fd5b505af1925050508015611502575060408051601f3d908101601f191682019092526114ff91810190611b8d565b60015b6115af5761150e6120ef565b806308c379a01415611548575061152361210b565b8061152e575061154a565b8060405162461bcd60e51b81526004016103529190611e96565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610352565b6001600160e01b0319811663f23a6e6160e01b146114205760405162461bcd60e51b815260040161035290611ea9565b6001600160a01b0384163b156111385760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906116239089908990889088908890600401611db2565b602060405180830381600087803b15801561163d57600080fd5b505af192505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b8d565b60015b6116795761150e6120ef565b6001600160e01b0319811663bc197c8160e01b146114205760405162461bcd60e51b815260040161035290611ea9565b8280546116b590612008565b90600052602060002090601f0160209004810192826116d7576000855561171d565b82601f106116f057805160ff191683800117855561171d565b8280016001018555821561171d579182015b8281111561171d578251825591602001919060010190611702565b5061172992915061172d565b5090565b5b80821115611729576000815560010161172e565b600067ffffffffffffffff83111561175c5761175c6120d9565b604051611773601f8501601f191660200182612043565b80915083815284848401111561178857600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146117b757600080fd5b919050565b600082601f8301126117cd57600080fd5b813560206117da82611fb5565b6040516117e78282612043565b8381528281019150858301600585901b8701840188101561180757600080fd5b60005b858110156118265781358452928401929084019060010161180a565b5090979650505050505050565b600082601f83011261184457600080fd5b61185383833560208501611742565b9392505050565b60006020828403121561186c57600080fd5b611853826117a0565b6000806040838503121561188857600080fd5b611891836117a0565b915061189f602084016117a0565b90509250929050565b600080600080600060a086880312156118c057600080fd5b6118c9866117a0565b94506118d7602087016117a0565b9350604086013567ffffffffffffffff808211156118f457600080fd5b61190089838a016117bc565b9450606088013591508082111561191657600080fd5b61192289838a016117bc565b9350608088013591508082111561193857600080fd5b5061194588828901611833565b9150509295509295909350565b600080600080600060a0868803121561196a57600080fd5b611973866117a0565b9450611981602087016117a0565b93506040860135925060608601359150608086013567ffffffffffffffff8111156119ab57600080fd5b61194588828901611833565b600080604083850312156119ca57600080fd5b6119d3836117a0565b9150602083013580151581146119e857600080fd5b809150509250929050565b60008060408385031215611a0657600080fd5b611a0f836117a0565b946020939093013593505050565b60008060008060608587031215611a3357600080fd5b843567ffffffffffffffff80821115611a4b57600080fd5b818701915087601f830112611a5f57600080fd5b813581811115611a6e57600080fd5b8860208260051b8501011115611a8357600080fd5b6020928301999098509187013596604001359550909350505050565b60008060408385031215611ab257600080fd5b823567ffffffffffffffff80821115611aca57600080fd5b818501915085601f830112611ade57600080fd5b81356020611aeb82611fb5565b604051611af88282612043565b8381528281019150858301600585901b870184018b1015611b1857600080fd5b600096505b84871015611b4257611b2e816117a0565b835260019690960195918301918301611b1d565b5096505086013592505080821115611b5957600080fd5b50611b66858286016117bc565b9150509250929050565b600060208284031215611b8257600080fd5b813561185381612195565b600060208284031215611b9f57600080fd5b815161185381612195565b600060208284031215611bbc57600080fd5b5035919050565b60008060408385031215611bd657600080fd5b82359150602083013567ffffffffffffffff811115611bf457600080fd5b8301601f81018513611c0557600080fd5b611b6685823560208401611742565b60008060408385031215611c2757600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015611c6657815187529582019590820190600101611c4a565b509495945050505050565b6000815180845260005b81811015611c9757602081850181015186830182015201611c7b565b81811115611ca9576000602083870101525b50601f01601f19169290920160200192915050565b8054600090600181811c9080831680611cd857607f831692505b6020808410821415611cfa57634e487b7160e01b600052602260045260246000fd5b818015611d0e5760018114611d1f57611d4c565b60ff19861689528489019650611d4c565b60008881526020902060005b86811015611d445781548b820152908501908301611d2b565b505084890196505b50505050505092915050565b6000611d648284611cbe565b612f3160f01b81526002019392505050565b6000611d828284611cbe565b61179960f11b81526002019392505050565b6000611da08284611cbe565b6102f360f41b81526002019392505050565b6001600160a01b0386811682528516602082015260a060408201819052600090611dde90830186611c36565b8281036060840152611df08186611c36565b90508281036080840152611e048185611c71565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e4a90830184611c71565b979650505050505050565b6020815260006118536020830184611c36565b604081526000611e7b6040830185611c36565b8281036020840152611e8d8185611c36565b95945050505050565b6020815260006118536020830184611c71565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115611fcf57611fcf6120d9565b5060051b60200190565b60008219821115611fec57611fec6120ad565b500190565b600082821015612003576120036120ad565b500390565b600181811c9082168061201c57607f821691505b6020821081141561203d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612069576120696120d9565b6040525050565b6000600019821415612084576120846120ad565b5060010190565b6000826120a857634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156121085760046000803e5060005160e01c5b90565b600060443d10156121195790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561214957505050505090565b82850191508151818111156121615750505050505090565b843d870101602082850101111561217b5750505050505090565b61218a60208286010187612043565b509095945050505050565b6001600160e01b031981168114610d3757600080fdfea2646970667358221220aa011cad49a724489aae12aeb1bb66b1692686eb6ec57cace9a43de2f8dc438064736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101205760003560e01c806395d89b41116100ad578063d709815411610071578063d709815414610255578063e985e9c514610268578063ebd9fe90146102a4578063f242432a146102c4578063f2fde38b146102d757600080fd5b806395d89b4114610201578063a22cb46514610209578063a2cb764b1461021c578063c8b6277c1461022f578063d3b861411461024257600080fd5b80632994619d116100f45780632994619d146101965780632eb2c2d6146101ab5780634e1273f4146101be578063715018a6146101de5780638da5cb5b146101e657600080fd5b8062fdd58e1461012557806301ffc9a71461014b57806306fdde031461016e5780630e89341c14610183575b600080fd5b6101386101333660046119f3565b6102ea565b6040519081526020015b60405180910390f35b61015e610159366004611b70565b610381565b6040519015158152602001610142565b6101766103d3565b6040516101429190611e96565b610176610191366004611baa565b610461565b6101a96101a4366004611a1d565b6105be565b005b6101a96101b93660046118a8565b6107e9565b6101d16101cc366004611a9f565b610879565b6040516101429190611e55565b6101a96109a3565b6003546040516001600160a01b039091168152602001610142565b6101766109d9565b6101a96102173660046119b7565b6109e6565b6101a961022a366004611c14565b610abd565b6101a961023d366004611bc3565b610af9565b6101a961025036600461185a565b610c0e565b6101a9610263366004611baa565b610c61565b61015e610276366004611875565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101386102b2366004611baa565b60076020526000908152604090205481565b6101a96102d2366004611952565b610d3a565b6101a96102e536600461185a565b610dc1565b60006001600160a01b03831661035b5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806103b257506001600160e01b031982166303a24d0760e21b145b806103cd57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600480546103e090612008565b80601f016020809104026020016040519081016040528092919081815260200182805461040c90612008565b80156104595780601f1061042e57610100808354040283529160200191610459565b820191906000526020600020905b81548152906001019060200180831161043c57829003601f168201915b505050505081565b6060600082116104a75760405162461bcd60e51b8152602060048201526011602482015270466972737420746f6b656e4964203d203160781b6044820152606401610352565b6000806104b560028561208b565b600114156104c5578391506104d7565b6104d0600185611ff1565b9150600190505b600082815260066020526040812080546104f090612008565b90501161052d5760405162461bcd60e51b815260206004820152600b60248201526a155492481b9bdd081cd95d60aa1b6044820152606401610352565b801561056a576000828152600660209081526040918290209151610552929101611d76565b60405160208183030381529060405292505050919050565b60008281526007602052604090205442111561059f576000828152600660209081526040918290209151610552929101611d58565b6000828152600660209081526040918290209151610552929101611d94565b3360009081526008602052604090205460ff1615156001146106115760405162461bcd60e51b815260206004820152600c60248201526b2737ba1030b71037bbb732b960a11b6044820152606401610352565b61061c60028361208b565b6001146106615760405162461bcd60e51b81526020600482015260136024820152721a59081d985b1d59481a5cc81b9bdd081bd919606a1b6044820152606401610352565b801561072857600082815260076020526040902054156106c35760405162461bcd60e51b815260206004820152601a60248201527f436c61696d20656e64206461746520616c7265616479207365740000000000006044820152606401610352565b4281116107125760405162461bcd60e51b815260206004820181905260248201527f45787069726174696f6e206d75737420626520696e20746865206675747572656044820152606401610352565b6000828152600760205260409020819055610783565b6000828152600760205260409020546107835760405162461bcd60e51b815260206004820152601760248201527f4d7573742073657420636c61696d20656e6420646174650000000000000000006044820152606401610352565b60005b838110156107e2576107d08585838181106107a3576107a36120c3565b90506020020160208101906107b8919061185a565b84600160405180602001604052806000815250610e59565b806107da81612070565b915050610786565b5050505050565b6001600160a01b03851633148061080557506108058533610276565b61086c5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610352565b6107e28585858585610f63565b606081518351146108de5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610352565b6000835167ffffffffffffffff8111156108fa576108fa6120d9565b604051908082528060200260200182016040528015610923578160200160208202803683370190505b50905060005b845181101561099b5761096e858281518110610947576109476120c3565b6020026020010151858381518110610961576109616120c3565b60200260200101516102ea565b828281518110610980576109806120c3565b602090810291909101015261099481612070565b9050610929565b509392505050565b6003546001600160a01b031633146109cd5760405162461bcd60e51b815260040161035290611f80565b6109d76000611140565b565b600580546103e090612008565b336001600160a01b0383161415610a515760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610352565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b03163314610ae75760405162461bcd60e51b815260040161035290611f80565b60009182526007602052604090912055565b3360009081526008602052604090205460ff161515600114610b4c5760405162461bcd60e51b815260206004820152600c60248201526b2737ba1030b71037bbb732b960a11b6044820152606401610352565b610b5760028361208b565b600114610bb25760405162461bcd60e51b8152602060048201526024808201527f746f6b656e49642076616c7565206d75737420626520616e206f646420696e7460448201526332b3b2b960e11b6064820152608401610352565b60008281526006602090815260409091208251610bd1928401906116a9565b50817f327fc603e4675be2a2c12fddd2aee2a21c8d94885b452a63e97bc8558fd1482d82604051610c029190611e96565b60405180910390a25050565b6003546001600160a01b03163314610c385760405162461bcd60e51b815260040161035290611f80565b6001600160a01b03166000908152600860205260409020805460ff19811660ff90911615179055565b610c6c60028261208b565b600114610caf5760405162461bcd60e51b8152602060048201526011602482015270139bdd08185b881bd919081d1e5c195259607a1b6044820152606401610352565b6000818152600760205260409020544210610d055760405162461bcd60e51b815260206004820152601660248201527510db185a5b481c195c9a5bd9081a185cc8195b99195960521b6044820152606401610352565b610d1133826001611192565b610d3733610d20836001611fd9565b600160405180602001604052806000815250610e59565b50565b6001600160a01b038516331480610d565750610d568533610276565b610db45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610352565b6107e2858585858561130c565b6003546001600160a01b03163314610deb5760405162461bcd60e51b815260040161035290611f80565b6001600160a01b038116610e505760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610352565b610d3781611140565b6001600160a01b038416610eb95760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610352565b33610ed381600087610eca88611429565b6107e288611429565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610f03908490611fd9565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46107e281600087878787611474565b8151835114610fc55760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610352565b6001600160a01b038416610feb5760405162461bcd60e51b815260040161035290611ef1565b3360005b84518110156110d257600085828151811061100c5761100c6120c3565b60200260200101519050600085838151811061102a5761102a6120c3565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561107a5760405162461bcd60e51b815260040161035290611f36565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110b7908490611fd9565b92505081905550505050806110cb90612070565b9050610fef565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611122929190611e68565b60405180910390a46111388187878787876115df565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166111f45760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610352565b336112248185600061120587611429565b61120e87611429565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156112a15760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610352565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0384166113325760405162461bcd60e51b815260040161035290611ef1565b33611342818787610eca88611429565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156113835760405162461bcd60e51b815260040161035290611f36565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906113c0908490611fd9565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611420828888888888611474565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611463576114636120c3565b602090810291909101015292915050565b6001600160a01b0384163b156111385760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906114b89089908990889088908890600401611e10565b602060405180830381600087803b1580156114d257600080fd5b505af1925050508015611502575060408051601f3d908101601f191682019092526114ff91810190611b8d565b60015b6115af5761150e6120ef565b806308c379a01415611548575061152361210b565b8061152e575061154a565b8060405162461bcd60e51b81526004016103529190611e96565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610352565b6001600160e01b0319811663f23a6e6160e01b146114205760405162461bcd60e51b815260040161035290611ea9565b6001600160a01b0384163b156111385760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906116239089908990889088908890600401611db2565b602060405180830381600087803b15801561163d57600080fd5b505af192505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b8d565b60015b6116795761150e6120ef565b6001600160e01b0319811663bc197c8160e01b146114205760405162461bcd60e51b815260040161035290611ea9565b8280546116b590612008565b90600052602060002090601f0160209004810192826116d7576000855561171d565b82601f106116f057805160ff191683800117855561171d565b8280016001018555821561171d579182015b8281111561171d578251825591602001919060010190611702565b5061172992915061172d565b5090565b5b80821115611729576000815560010161172e565b600067ffffffffffffffff83111561175c5761175c6120d9565b604051611773601f8501601f191660200182612043565b80915083815284848401111561178857600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146117b757600080fd5b919050565b600082601f8301126117cd57600080fd5b813560206117da82611fb5565b6040516117e78282612043565b8381528281019150858301600585901b8701840188101561180757600080fd5b60005b858110156118265781358452928401929084019060010161180a565b5090979650505050505050565b600082601f83011261184457600080fd5b61185383833560208501611742565b9392505050565b60006020828403121561186c57600080fd5b611853826117a0565b6000806040838503121561188857600080fd5b611891836117a0565b915061189f602084016117a0565b90509250929050565b600080600080600060a086880312156118c057600080fd5b6118c9866117a0565b94506118d7602087016117a0565b9350604086013567ffffffffffffffff808211156118f457600080fd5b61190089838a016117bc565b9450606088013591508082111561191657600080fd5b61192289838a016117bc565b9350608088013591508082111561193857600080fd5b5061194588828901611833565b9150509295509295909350565b600080600080600060a0868803121561196a57600080fd5b611973866117a0565b9450611981602087016117a0565b93506040860135925060608601359150608086013567ffffffffffffffff8111156119ab57600080fd5b61194588828901611833565b600080604083850312156119ca57600080fd5b6119d3836117a0565b9150602083013580151581146119e857600080fd5b809150509250929050565b60008060408385031215611a0657600080fd5b611a0f836117a0565b946020939093013593505050565b60008060008060608587031215611a3357600080fd5b843567ffffffffffffffff80821115611a4b57600080fd5b818701915087601f830112611a5f57600080fd5b813581811115611a6e57600080fd5b8860208260051b8501011115611a8357600080fd5b6020928301999098509187013596604001359550909350505050565b60008060408385031215611ab257600080fd5b823567ffffffffffffffff80821115611aca57600080fd5b818501915085601f830112611ade57600080fd5b81356020611aeb82611fb5565b604051611af88282612043565b8381528281019150858301600585901b870184018b1015611b1857600080fd5b600096505b84871015611b4257611b2e816117a0565b835260019690960195918301918301611b1d565b5096505086013592505080821115611b5957600080fd5b50611b66858286016117bc565b9150509250929050565b600060208284031215611b8257600080fd5b813561185381612195565b600060208284031215611b9f57600080fd5b815161185381612195565b600060208284031215611bbc57600080fd5b5035919050565b60008060408385031215611bd657600080fd5b82359150602083013567ffffffffffffffff811115611bf457600080fd5b8301601f81018513611c0557600080fd5b611b6685823560208401611742565b60008060408385031215611c2757600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015611c6657815187529582019590820190600101611c4a565b509495945050505050565b6000815180845260005b81811015611c9757602081850181015186830182015201611c7b565b81811115611ca9576000602083870101525b50601f01601f19169290920160200192915050565b8054600090600181811c9080831680611cd857607f831692505b6020808410821415611cfa57634e487b7160e01b600052602260045260246000fd5b818015611d0e5760018114611d1f57611d4c565b60ff19861689528489019650611d4c565b60008881526020902060005b86811015611d445781548b820152908501908301611d2b565b505084890196505b50505050505092915050565b6000611d648284611cbe565b612f3160f01b81526002019392505050565b6000611d828284611cbe565b61179960f11b81526002019392505050565b6000611da08284611cbe565b6102f360f41b81526002019392505050565b6001600160a01b0386811682528516602082015260a060408201819052600090611dde90830186611c36565b8281036060840152611df08186611c36565b90508281036080840152611e048185611c71565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e4a90830184611c71565b979650505050505050565b6020815260006118536020830184611c36565b604081526000611e7b6040830185611c36565b8281036020840152611e8d8185611c36565b95945050505050565b6020815260006118536020830184611c71565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115611fcf57611fcf6120d9565b5060051b60200190565b60008219821115611fec57611fec6120ad565b500190565b600082821015612003576120036120ad565b500390565b600181811c9082168061201c57607f821691505b6020821081141561203d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612069576120696120d9565b6040525050565b6000600019821415612084576120846120ad565b5060010190565b6000826120a857634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156121085760046000803e5060005160e01c5b90565b600060443d10156121195790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561214957505050505090565b82850191508151818111156121615750505050505090565b843d870101602082850101111561217b5750505050505090565b61218a60208286010187612043565b509095945050505050565b6001600160e01b031981168114610d3757600080fdfea2646970667358221220aa011cad49a724489aae12aeb1bb66b1692686eb6ec57cace9a43de2f8dc438064736f6c63430008060033

Deployed Bytecode Sourcemap

36434:3533:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23132:231;;;;;;:::i;:::-;;:::i;:::-;;;23215:25:1;;;23203:2;23188:18;23132:231:0;;;;;;;;22155:310;;;;;;:::i;:::-;;:::i;:::-;;;13177:14:1;;13170:22;13152:41;;13140:2;13125:18;22155:310:0;13107:92:1;36524:42:0;;;:::i;:::-;;;;;;;:::i;38756:1208::-;;;;;;:::i;:::-;;:::i;37424:683::-;;;;;;:::i;:::-;;:::i;:::-;;25227:442;;;;;;:::i;:::-;;:::i;23529:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2341:94::-;;;:::i;1690:87::-;1763:6;;1690:87;;-1:-1:-1;;;;;1763:6:0;;;10818:51:1;;10806:2;10791:18;1690:87:0;10773:102:1;36573:31:0;;;:::i;24126:311::-;;;;;;:::i;:::-;;:::i;37270:146::-;;;;;;:::i;:::-;;:::i;38115:254::-;;;;;;:::i;:::-;;:::i;37136:126::-;;;;;;:::i;:::-;;:::i;38377:371::-;;;;;;:::i;:::-;;:::i;24509:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24632:27:0;;;24608:4;24632:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;24509:168;36669:55;;;;;;:::i;:::-;;;;;;;;;;;;;;24749:401;;;;;;:::i;:::-;;:::i;2590:192::-;;;;;;:::i;:::-;;:::i;23132:231::-;23218:7;-1:-1:-1;;;;;23246:21:0;;23238:77;;;;-1:-1:-1;;;23238:77:0;;15500:2:1;23238:77:0;;;15482:21:1;15539:2;15519:18;;;15512:30;15578:34;15558:18;;;15551:62;-1:-1:-1;;;15629:18:1;;;15622:41;15680:19;;23238:77:0;;;;;;;;;-1:-1:-1;23333:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;23333:22:0;;;;;;;;;;;;23132:231::o;22155:310::-;22257:4;-1:-1:-1;;;;;;22294:41:0;;-1:-1:-1;;;22294:41:0;;:110;;-1:-1:-1;;;;;;;22352:52:0;;-1:-1:-1;;;22352:52:0;22294:110;:163;;;-1:-1:-1;;;;;;;;;;14311:40:0;;;22421:36;22274:183;22155:310;-1:-1:-1;;22155:310:0:o;36524:42::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38756:1208::-;38815:13;38867:1;38858:6;:10;38850:40;;;;-1:-1:-1;;;38850:40:0;;16724:2:1;38850:40:0;;;16706:21:1;16763:2;16743:18;;;16736:30;-1:-1:-1;;;16782:18:1;;;16775:47;16839:18;;38850:40:0;16696:167:1;38850:40:0;38907:15;;39008:10;39017:1;39008:6;:10;:::i;:::-;39022:1;39008:15;39005:204;;;39067:6;39057:16;;39005:204;;;39150:10;39159:1;39150:6;:10;:::i;:::-;39140:20;;39189:4;39179:14;;39005:204;39267:1;39239:17;;;:8;:17;;;;;39233:31;;;;;:::i;:::-;;;:35;39225:59;;;;-1:-1:-1;;;39225:59:0;;15160:2:1;39225:59:0;;;15142:21:1;15199:2;15179:18;;;15172:30;-1:-1:-1;;;15218:18:1;;;15211:41;15269:18;;39225:59:0;15132:161:1;39225:59:0;39361:7;39358:586;;;39433:17;;;;:8;:17;;;;;;;;;39416:41;;;;39433:17;39416:41;;:::i;:::-;;;;;;;;;;;;;39402:56;;;;38756:1208;;;:::o;39358:586::-;39643:29;;;;:20;:29;;;;;;39625:15;:47;39622:307;;;39745:17;;;;:8;:17;;;;;;;;;39728:41;;;;39745:17;39728:41;;:::i;39622:307::-;39884:17;;;;:8;:17;;;;;;;;;39867:41;;;;39884:17;39867:41;;:::i;37424:683::-;646:10;37063:20;;;;:6;:20;;;;;;;;:28;;:20;:28;37055:53;;;;-1:-1:-1;;;37055:53:0;;17070:2:1;37055:53:0;;;17052:21:1;17109:2;17089:18;;;17082:30;-1:-1:-1;;;17128:18:1;;;17121:42;17180:18;;37055:53:0;17042:162:1;37055:53:0;37552:6:::1;37557:1;37552:2:::0;:6:::1;:::i;:::-;37562:1;37552:11;37544:43;;;::::0;-1:-1:-1;;;37544:43:0;;14460:2:1;37544:43:0::1;::::0;::::1;14442:21:1::0;14499:2;14479:18;;;14472:30;-1:-1:-1;;;14518:18:1;;;14511:49;14577:18;;37544:43:0::1;14432:169:1::0;37544:43:0::1;37601:16:::0;;37598:384:::1;;37651:24;::::0;;;:20:::1;:24;::::0;;;;;:29;37643:68:::1;;;::::0;-1:-1:-1;;;37643:68:0;;21398:2:1;37643:68:0::1;::::0;::::1;21380:21:1::0;21437:2;21417:18;;;21410:30;21476:28;21456:18;;;21449:56;21522:18;;37643:68:0::1;21370:176:1::0;37643:68:0::1;37749:15;37734:12;:30;37726:75;;;::::0;-1:-1:-1;;;37726:75:0;;21753:2:1;37726:75:0::1;::::0;::::1;21735:21:1::0;;;21772:18;;;21765:30;21831:34;21811:18;;;21804:62;21883:18;;37726:75:0::1;21725:182:1::0;37726:75:0::1;37816:24;::::0;;;:20:::1;:24;::::0;;;;:39;;;37598:384:::1;;;37941:1;37914:24:::0;;;:20:::1;:24;::::0;;;;;37906:64:::1;;;::::0;-1:-1:-1;;;37906:64:0;;14808:2:1;37906:64:0::1;::::0;::::1;14790:21:1::0;14847:2;14827:18;;;14820:30;14886:25;14866:18;;;14859:53;14929:18;;37906:64:0::1;14780:173:1::0;37906:64:0::1;37998:9;37994:106;38013:17:::0;;::::1;37994:106;;;38061:27;38067:6;;38074:1;38067:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38078:2;38082:1;38061:27;;;;;;;;;;;::::0;:5:::1;:27::i;:::-;38032:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37994:106;;;;37424:683:::0;;;;:::o;25227:442::-;-1:-1:-1;;;;;25460:20:0;;646:10;25460:20;;:60;;-1:-1:-1;25484:36:0;25501:4;646:10;24509:168;:::i;25484:36::-;25438:160;;;;-1:-1:-1;;;25438:160:0;;18227:2:1;25438:160:0;;;18209:21:1;18266:2;18246:18;;;18239:30;18305:34;18285:18;;;18278:62;-1:-1:-1;;;18356:18:1;;;18349:48;18414:19;;25438:160:0;18199:240:1;25438:160:0;25609:52;25632:4;25638:2;25642:3;25647:7;25656:4;25609:22;:52::i;23529:524::-;23685:16;23746:3;:10;23727:8;:15;:29;23719:83;;;;-1:-1:-1;;;23719:83:0;;20988:2:1;23719:83:0;;;20970:21:1;21027:2;21007:18;;;21000:30;21066:34;21046:18;;;21039:62;-1:-1:-1;;;21117:18:1;;;21110:39;21166:19;;23719:83:0;20960:231:1;23719:83:0;23815:30;23862:8;:15;23848:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23848:30:0;;23815:63;;23896:9;23891:122;23915:8;:15;23911:1;:19;23891:122;;;23971:30;23981:8;23990:1;23981:11;;;;;;;;:::i;:::-;;;;;;;23994:3;23998:1;23994:6;;;;;;;;:::i;:::-;;;;;;;23971:9;:30::i;:::-;23952:13;23966:1;23952:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;23932:3;;;:::i;:::-;;;23891:122;;;-1:-1:-1;24032:13:0;23529:524;-1:-1:-1;;;23529:524:0:o;2341:94::-;1763:6;;-1:-1:-1;;;;;1763:6:0;646:10;1910:23;1902:68;;;;-1:-1:-1;;;1902:68:0;;;;;;;:::i;:::-;2406:21:::1;2424:1;2406:9;:21::i;:::-;2341:94::o:0;36573:31::-;;;;;;;:::i;24126:311::-;646:10;-1:-1:-1;;;;;24229:24:0;;;;24221:78;;;;-1:-1:-1;;;24221:78:0;;20578:2:1;24221:78:0;;;20560:21:1;20617:2;20597:18;;;20590:30;20656:34;20636:18;;;20629:62;-1:-1:-1;;;20707:18:1;;;20700:39;20756:19;;24221:78:0;20550:231:1;24221:78:0;646:10;24312:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24312:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24312:53:0;;;;;;;;;;24381:48;;13152:41:1;;;24312:42:0;;646:10;24381:48;;13125:18:1;24381:48:0;;;;;;;24126:311;;:::o;37270:146::-;1763:6;;-1:-1:-1;;;;;1763:6:0;646:10;1910:23;1902:68;;;;-1:-1:-1;;;1902:68:0;;;;;;;:::i;:::-;37368:27:::1;::::0;;;:20:::1;:27;::::0;;;;;:40;37270:146::o;38115:254::-;646:10;37063:20;;;;:6;:20;;;;;;;;:28;;:20;:28;37055:53;;;;-1:-1:-1;;;37055:53:0;;17070:2:1;37055:53:0;;;17052:21:1;17109:2;17089:18;;;17082:30;-1:-1:-1;;;17128:18:1;;;17121:42;17180:18;;37055:53:0;17042:162:1;37055:53:0;38220:11:::1;38230:1;38220:7:::0;:11:::1;:::i;:::-;38235:1;38220:16;38212:65;;;::::0;-1:-1:-1;;;38212:65:0;;20173:2:1;38212:65:0::1;::::0;::::1;20155:21:1::0;20212:2;20192:18;;;20185:30;20251:34;20231:18;;;20224:62;-1:-1:-1;;;20302:18:1;;;20295:34;20346:19;;38212:65:0::1;20145:226:1::0;38212:65:0::1;38288:17;::::0;;;:8:::1;:17;::::0;;;;;;;:27;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;38344:7;38333:28;38353:7;38333:28;;;;;;:::i;:::-;;;;;;;;38115:254:::0;;:::o;37136:126::-;1763:6;;-1:-1:-1;;;;;1763:6:0;646:10;1910:23;1902:68;;;;-1:-1:-1;;;1902:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37235:19:0::1;;::::0;;;:6:::1;:19;::::0;;;;;;-1:-1:-1;;37212:42:0;::::1;37235:19;::::0;;::::1;37234:20;37212:42;::::0;;37136:126::o;38377:371::-;38446:10;38455:1;38446:6;:10;:::i;:::-;38460:1;38446:15;38438:45;;;;-1:-1:-1;;;38438:45:0;;22925:2:1;38438:45:0;;;22907:21:1;22964:2;22944:18;;;22937:30;-1:-1:-1;;;22983:18:1;;;22976:47;23040:18;;38438:45:0;22897:167:1;38438:45:0;38520:28;;;;:20;:28;;;;;;38502:15;:46;38494:81;;;;-1:-1:-1;;;38494:81:0;;18646:2:1;38494:81:0;;;18628:21:1;18685:2;18665:18;;;18658:30;-1:-1:-1;;;18704:18:1;;;18697:52;18766:18;;38494:81:0;18618:172:1;38494:81:0;38620:30;646:10;38640:6;38648:1;38620:5;:30::i;:::-;38700:38;646:10;38720;:6;38729:1;38720:10;:::i;:::-;38732:1;38700:38;;;;;;;;;;;;:5;:38::i;:::-;38377:371;:::o;24749:401::-;-1:-1:-1;;;;;24957:20:0;;646:10;24957:20;;:60;;-1:-1:-1;24981:36:0;24998:4;646:10;24509:168;:::i;24981:36::-;24935:151;;;;-1:-1:-1;;;24935:151:0;;17411:2:1;24935:151:0;;;17393:21:1;17450:2;17430:18;;;17423:30;17489:34;17469:18;;;17462:62;-1:-1:-1;;;17540:18:1;;;17533:39;17589:19;;24935:151:0;17383:231:1;24935:151:0;25097:45;25115:4;25121:2;25125;25129:6;25137:4;25097:17;:45::i;2590:192::-;1763:6;;-1:-1:-1;;;;;1763:6:0;646:10;1910:23;1902:68;;;;-1:-1:-1;;;1902:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2679:22:0;::::1;2671:73;;;::::0;-1:-1:-1;;;2671:73:0;;15912:2:1;2671:73:0::1;::::0;::::1;15894:21:1::0;15951:2;15931:18;;;15924:30;15990:34;15970:18;;;15963:62;-1:-1:-1;;;16041:18:1;;;16034:36;16087:19;;2671:73:0::1;15884:228:1::0;2671:73:0::1;2755:19;2765:8;2755:9;:19::i;29718:599::-:0;-1:-1:-1;;;;;29876:21:0;;29868:67;;;;-1:-1:-1;;;29868:67:0;;22523:2:1;29868:67:0;;;22505:21:1;22562:2;22542:18;;;22535:30;22601:34;22581:18;;;22574:62;-1:-1:-1;;;22652:18:1;;;22645:31;22693:19;;29868:67:0;22495:223:1;29868:67:0;646:10;29992:107;646:10;29948:16;30035:7;30044:21;30062:2;30044:17;:21::i;:::-;30067:25;30085:6;30067:17;:25::i;29992:107::-;30112:9;:13;;;;;;;;;;;-1:-1:-1;;;;;30112:22:0;;;;;;;;;:32;;30138:6;;30112:9;:32;;30138:6;;30112:32;:::i;:::-;;;;-1:-1:-1;;30160:57:0;;;23425:25:1;;;23481:2;23466:18;;23459:34;;;-1:-1:-1;;;;;30160:57:0;;;;30193:1;;30160:57;;;;;;23398:18:1;30160:57:0;;;;;;;30230:79;30261:8;30279:1;30283:7;30292:2;30296:6;30304:4;30230:30;:79::i;27311:1074::-;27538:7;:14;27524:3;:10;:28;27516:81;;;;-1:-1:-1;;;27516:81:0;;22114:2:1;27516:81:0;;;22096:21:1;22153:2;22133:18;;;22126:30;22192:34;22172:18;;;22165:62;-1:-1:-1;;;22243:18:1;;;22236:38;22291:19;;27516:81:0;22086:230:1;27516:81:0;-1:-1:-1;;;;;27616:16:0;;27608:66;;;;-1:-1:-1;;;27608:66:0;;;;;;;:::i;:::-;646:10;27687:16;27804:421;27828:3;:10;27824:1;:14;27804:421;;;27860:10;27873:3;27877:1;27873:6;;;;;;;;:::i;:::-;;;;;;;27860:19;;27894:14;27911:7;27919:1;27911:10;;;;;;;;:::i;:::-;;;;;;;;;;;;27938:19;27960:13;;;;;;;;;;-1:-1:-1;;;;;27960:19:0;;;;;;;;;;;;27911:10;;-1:-1:-1;28002:21:0;;;;27994:76;;;;-1:-1:-1;;;27994:76:0;;;;;;;:::i;:::-;28114:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28114:19:0;;;;;;;;;;28136:20;;;28114:42;;28186:17;;;;;;;:27;;28136:20;;28114:9;28186:27;;28136:20;;28186:27;:::i;:::-;;;;;;;;27845:380;;;27840:3;;;;:::i;:::-;;;27804:421;;;;28272:2;-1:-1:-1;;;;;28242:47:0;28266:4;-1:-1:-1;;;;;28242:47:0;28256:8;-1:-1:-1;;;;;28242:47:0;;28276:3;28281:7;28242:47;;;;;;;:::i;:::-;;;;;;;;28302:75;28338:8;28348:4;28354:2;28358:3;28363:7;28372:4;28302:35;:75::i;:::-;27505:880;27311:1074;;;;;:::o;2790:173::-;2865:6;;;-1:-1:-1;;;;;2882:17:0;;;-1:-1:-1;;;;;;2882:17:0;;;;;;;2915:40;;2865:6;;;2882:17;2865:6;;2915:40;;2846:16;;2915:40;2835:128;2790:173;:::o;31667:675::-;-1:-1:-1;;;;;31797:21:0;;31789:69;;;;-1:-1:-1;;;31789:69:0;;18997:2:1;31789:69:0;;;18979:21:1;19036:2;19016:18;;;19009:30;19075:34;19055:18;;;19048:62;-1:-1:-1;;;19126:18:1;;;19119:33;19169:19;;31789:69:0;18969:225:1;31789:69:0;646:10;31915:105;646:10;31946:7;31871:16;31967:21;31985:2;31967:17;:21::i;:::-;31990:25;32008:6;31990:17;:25::i;:::-;-1:-1:-1;;31915:105:0;;;;;;;;;-1:-1:-1;31915:105:0;;-1:-1:-1;;;27311:1074:0;31915:105;32033:22;32058:13;;;;;;;;;;;-1:-1:-1;;;;;32058:22:0;;;;;;;;;;32099:24;;;;32091:73;;;;-1:-1:-1;;;32091:73:0;;16319:2:1;32091:73:0;;;16301:21:1;16358:2;16338:18;;;16331:30;16397:34;16377:18;;;16370:62;-1:-1:-1;;;16448:18:1;;;16441:34;16492:19;;32091:73:0;16291:226:1;32091:73:0;32200:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32200:22:0;;;;;;;;;;;;32225:23;;;32200:48;;32277:57;;23425:25:1;;;23466:18;;;23459:34;;;32200:22:0;;32277:57;;;;;;23398:18:1;32277:57:0;;;;;;;31778:564;;31667:675;;;:::o;26133:820::-;-1:-1:-1;;;;;26321:16:0;;26313:66;;;;-1:-1:-1;;;26313:66:0;;;;;;;:::i;:::-;646:10;26436:96;646:10;26467:4;26473:2;26477:21;26495:2;26477:17;:21::i;26436:96::-;26545:19;26567:13;;;;;;;;;;;-1:-1:-1;;;;;26567:19:0;;;;;;;;;;26605:21;;;;26597:76;;;;-1:-1:-1;;;26597:76:0;;;;;;;:::i;:::-;26709:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26709:19:0;;;;;;;;;;26731:20;;;26709:42;;26773:17;;;;;;;:27;;26731:20;;26709:9;26773:27;;26731:20;;26773:27;:::i;:::-;;;;-1:-1:-1;;26818:46:0;;;23425:25:1;;;23481:2;23466:18;;23459:34;;;-1:-1:-1;;;;;26818:46:0;;;;;;;;;;;;;;23398:18:1;26818:46:0;;;;;;;26877:68;26908:8;26918:4;26924:2;26928;26932:6;26940:4;26877:30;:68::i;:::-;26302:651;;26133:820;;;;;:::o;36229:198::-;36349:16;;;36363:1;36349:16;;;;;;;;;36295;;36324:22;;36349:16;;;;;;;;;;;;-1:-1:-1;36349:16:0;36324:41;;36387:7;36376:5;36382:1;36376:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;36414:5;36229:198;-1:-1:-1;;36229:198:0:o;34648:748::-;-1:-1:-1;;;;;34863:13:0;;3974:20;4022:8;34859:530;;34899:72;;-1:-1:-1;;;34899:72:0;;-1:-1:-1;;;;;34899:38:0;;;;;:72;;34938:8;;34948:4;;34954:2;;34958:6;;34966:4;;34899:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34899:72:0;;;;;;;;-1:-1:-1;;34899:72:0;;;;;;;;;;;;:::i;:::-;;;34895:483;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;35251:6;35244:14;;-1:-1:-1;;;35244:14:0;;;;;;;;:::i;34895:483::-;;;35300:62;;-1:-1:-1;;;35300:62:0;;13630:2:1;35300:62:0;;;13612:21:1;13669:2;13649:18;;;13642:30;13708:34;13688:18;;;13681:62;-1:-1:-1;;;13759:18:1;;;13752:50;13819:19;;35300:62:0;13602:242:1;34895:483:0;-1:-1:-1;;;;;;35021:59:0;;-1:-1:-1;;;35021:59:0;35017:158;;35105:50;;-1:-1:-1;;;35105:50:0;;;;;;;:::i;35404:817::-;-1:-1:-1;;;;;35644:13:0;;3974:20;4022:8;35640:574;;35680:79;;-1:-1:-1;;;35680:79:0;;-1:-1:-1;;;;;35680:43:0;;;;;:79;;35724:8;;35734:4;;35740:3;;35745:7;;35754:4;;35680:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35680:79:0;;;;;;;;-1:-1:-1;;35680:79:0;;;;;;;;;;;;:::i;:::-;;;35676:527;;;;:::i;:::-;-1:-1:-1;;;;;;35841:64:0;;-1:-1:-1;;;35841:64:0;35837:163;;35930:50;;-1:-1:-1;;;35930:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:2;;;369:1;366;359:12;328:2;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;88:394;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:1;;594:42;;584:2;;650:1;647;640:12;584:2;536:124;;;:::o;665:735::-;719:5;772:3;765:4;757:6;753:17;749:27;739:2;;790:1;787;780:12;739:2;826:6;813:20;852:4;875:43;915:2;875:43;:::i;:::-;947:2;941:9;959:31;987:2;979:6;959:31;:::i;:::-;1025:18;;;1059:15;;;;-1:-1:-1;1094:15:1;;;1144:1;1140:10;;;1128:23;;1124:32;;1121:41;-1:-1:-1;1118:2:1;;;1175:1;1172;1165:12;1118:2;1197:1;1207:163;1221:2;1218:1;1215:9;1207:163;;;1278:17;;1266:30;;1316:12;;;;1348;;;;1239:1;1232:9;1207:163;;;-1:-1:-1;1388:6:1;;729:671;-1:-1:-1;;;;;;;729:671:1:o;1405:220::-;1447:5;1500:3;1493:4;1485:6;1481:17;1477:27;1467:2;;1518:1;1515;1508:12;1467:2;1540:79;1615:3;1606:6;1593:20;1586:4;1578:6;1574:17;1540:79;:::i;:::-;1531:88;1457:168;-1:-1:-1;;;1457:168:1:o;1630:186::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:2;;;1758:1;1755;1748:12;1710:2;1781:29;1800:9;1781:29;:::i;1821:260::-;1889:6;1897;1950:2;1938:9;1929:7;1925:23;1921:32;1918:2;;;1966:1;1963;1956:12;1918:2;1989:29;2008:9;1989:29;:::i;:::-;1979:39;;2037:38;2071:2;2060:9;2056:18;2037:38;:::i;:::-;2027:48;;1908:173;;;;;:::o;2086:943::-;2240:6;2248;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:2;;;2342:1;2339;2332:12;2293:2;2365:29;2384:9;2365:29;:::i;:::-;2355:39;;2413:38;2447:2;2436:9;2432:18;2413:38;:::i;:::-;2403:48;;2502:2;2491:9;2487:18;2474:32;2525:18;2566:2;2558:6;2555:14;2552:2;;;2582:1;2579;2572:12;2552:2;2605:61;2658:7;2649:6;2638:9;2634:22;2605:61;:::i;:::-;2595:71;;2719:2;2708:9;2704:18;2691:32;2675:48;;2748:2;2738:8;2735:16;2732:2;;;2764:1;2761;2754:12;2732:2;2787:63;2842:7;2831:8;2820:9;2816:24;2787:63;:::i;:::-;2777:73;;2903:3;2892:9;2888:19;2875:33;2859:49;;2933:2;2923:8;2920:16;2917:2;;;2949:1;2946;2939:12;2917:2;;2972:51;3015:7;3004:8;2993:9;2989:24;2972:51;:::i;:::-;2962:61;;;2283:746;;;;;;;;:::o;3034:606::-;3138:6;3146;3154;3162;3170;3223:3;3211:9;3202:7;3198:23;3194:33;3191:2;;;3240:1;3237;3230:12;3191:2;3263:29;3282:9;3263:29;:::i;:::-;3253:39;;3311:38;3345:2;3334:9;3330:18;3311:38;:::i;:::-;3301:48;;3396:2;3385:9;3381:18;3368:32;3358:42;;3447:2;3436:9;3432:18;3419:32;3409:42;;3502:3;3491:9;3487:19;3474:33;3530:18;3522:6;3519:30;3516:2;;;3562:1;3559;3552:12;3516:2;3585:49;3626:7;3617:6;3606:9;3602:22;3585:49;:::i;3645:347::-;3710:6;3718;3771:2;3759:9;3750:7;3746:23;3742:32;3739:2;;;3787:1;3784;3777:12;3739:2;3810:29;3829:9;3810:29;:::i;:::-;3800:39;;3889:2;3878:9;3874:18;3861:32;3936:5;3929:13;3922:21;3915:5;3912:32;3902:2;;3958:1;3955;3948:12;3902:2;3981:5;3971:15;;;3729:263;;;;;:::o;3997:254::-;4065:6;4073;4126:2;4114:9;4105:7;4101:23;4097:32;4094:2;;;4142:1;4139;4132:12;4094:2;4165:29;4184:9;4165:29;:::i;:::-;4155:39;4241:2;4226:18;;;;4213:32;;-1:-1:-1;;;4084:167:1:o;4256:757::-;4360:6;4368;4376;4384;4437:2;4425:9;4416:7;4412:23;4408:32;4405:2;;;4453:1;4450;4443:12;4405:2;4493:9;4480:23;4522:18;4563:2;4555:6;4552:14;4549:2;;;4579:1;4576;4569:12;4549:2;4617:6;4606:9;4602:22;4592:32;;4662:7;4655:4;4651:2;4647:13;4643:27;4633:2;;4684:1;4681;4674:12;4633:2;4724;4711:16;4750:2;4742:6;4739:14;4736:2;;;4766:1;4763;4756:12;4736:2;4821:7;4814:4;4804:6;4801:1;4797:14;4793:2;4789:23;4785:34;4782:47;4779:2;;;4842:1;4839;4832:12;4779:2;4873:4;4865:13;;;;4897:6;;-1:-1:-1;4935:20:1;;;4922:34;;5003:2;4988:18;4975:32;;-1:-1:-1;4395:618:1;;-1:-1:-1;;;;4395:618:1:o;5018:1219::-;5136:6;5144;5197:2;5185:9;5176:7;5172:23;5168:32;5165:2;;;5213:1;5210;5203:12;5165:2;5253:9;5240:23;5282:18;5323:2;5315:6;5312:14;5309:2;;;5339:1;5336;5329:12;5309:2;5377:6;5366:9;5362:22;5352:32;;5422:7;5415:4;5411:2;5407:13;5403:27;5393:2;;5444:1;5441;5434:12;5393:2;5480;5467:16;5502:4;5525:43;5565:2;5525:43;:::i;:::-;5597:2;5591:9;5609:31;5637:2;5629:6;5609:31;:::i;:::-;5675:18;;;5709:15;;;;-1:-1:-1;5744:11:1;;;5786:1;5782:10;;;5774:19;;5770:28;;5767:41;-1:-1:-1;5764:2:1;;;5821:1;5818;5811:12;5764:2;5843:1;5834:10;;5853:169;5867:2;5864:1;5861:9;5853:169;;;5924:23;5943:3;5924:23;:::i;:::-;5912:36;;5885:1;5878:9;;;;;5968:12;;;;6000;;5853:169;;;-1:-1:-1;6041:6:1;-1:-1:-1;;6085:18:1;;6072:32;;-1:-1:-1;;6116:16:1;;;6113:2;;;6145:1;6142;6135:12;6113:2;;6168:63;6223:7;6212:8;6201:9;6197:24;6168:63;:::i;:::-;6158:73;;;5155:1082;;;;;:::o;6242:245::-;6300:6;6353:2;6341:9;6332:7;6328:23;6324:32;6321:2;;;6369:1;6366;6359:12;6321:2;6408:9;6395:23;6427:30;6451:5;6427:30;:::i;6492:249::-;6561:6;6614:2;6602:9;6593:7;6589:23;6585:32;6582:2;;;6630:1;6627;6620:12;6582:2;6662:9;6656:16;6681:30;6705:5;6681:30;:::i;6746:180::-;6805:6;6858:2;6846:9;6837:7;6833:23;6829:32;6826:2;;;6874:1;6871;6864:12;6826:2;-1:-1:-1;6897:23:1;;6816:110;-1:-1:-1;6816:110:1:o;6931:518::-;7009:6;7017;7070:2;7058:9;7049:7;7045:23;7041:32;7038:2;;;7086:1;7083;7076:12;7038:2;7122:9;7109:23;7099:33;;7183:2;7172:9;7168:18;7155:32;7210:18;7202:6;7199:30;7196:2;;;7242:1;7239;7232:12;7196:2;7265:22;;7318:4;7310:13;;7306:27;-1:-1:-1;7296:2:1;;7347:1;7344;7337:12;7296:2;7370:73;7435:7;7430:2;7417:16;7412:2;7408;7404:11;7370:73;:::i;7454:248::-;7522:6;7530;7583:2;7571:9;7562:7;7558:23;7554:32;7551:2;;;7599:1;7596;7589:12;7551:2;-1:-1:-1;;7622:23:1;;;7692:2;7677:18;;;7664:32;;-1:-1:-1;7541:161:1:o;7707:435::-;7760:3;7798:5;7792:12;7825:6;7820:3;7813:19;7851:4;7880:2;7875:3;7871:12;7864:19;;7917:2;7910:5;7906:14;7938:1;7948:169;7962:6;7959:1;7956:13;7948:169;;;8023:13;;8011:26;;8057:12;;;;8092:15;;;;7984:1;7977:9;7948:169;;;-1:-1:-1;8133:3:1;;7768:374;-1:-1:-1;;;;;7768:374:1:o;8147:471::-;8188:3;8226:5;8220:12;8253:6;8248:3;8241:19;8278:1;8288:162;8302:6;8299:1;8296:13;8288:162;;;8364:4;8420:13;;;8416:22;;8410:29;8392:11;;;8388:20;;8381:59;8317:12;8288:162;;;8468:6;8465:1;8462:13;8459:2;;;8534:1;8527:4;8518:6;8513:3;8509:16;8505:27;8498:38;8459:2;-1:-1:-1;8600:2:1;8579:15;-1:-1:-1;;8575:29:1;8566:39;;;;8607:4;8562:50;;8196:422;-1:-1:-1;;8196:422:1:o;8623:973::-;8708:12;;8673:3;;8763:1;8783:18;;;;8836;;;;8863:2;;8917:4;8909:6;8905:17;8895:27;;8863:2;8943;8991;8983:6;8980:14;8960:18;8957:38;8954:2;;;9037:10;9032:3;9028:20;9025:1;9018:31;9072:4;9069:1;9062:15;9100:4;9097:1;9090:15;8954:2;9131:18;9158:104;;;;9276:1;9271:319;;;;9124:466;;9158:104;-1:-1:-1;;9191:24:1;;9179:37;;9236:16;;;;-1:-1:-1;9158:104:1;;9271:319;23765:1;23758:14;;;23802:4;23789:18;;9365:1;9379:165;9393:6;9390:1;9387:13;9379:165;;;9471:14;;9458:11;;;9451:35;9514:16;;;;9408:10;;9379:165;;;9383:3;;9573:6;9568:3;9564:16;9557:23;;9124:466;;;;;;;8681:915;;;;:::o;9601:352::-;9830:3;9858:38;9892:3;9884:6;9858:38;:::i;:::-;-1:-1:-1;;;9905:16:1;;9945:1;9937:10;;9838:115;-1:-1:-1;;;9838:115:1:o;9958:352::-;10187:3;10215:38;10249:3;10241:6;10215:38;:::i;:::-;-1:-1:-1;;;10262:16:1;;10302:1;10294:10;;10195:115;-1:-1:-1;;;10195:115:1:o;10315:352::-;10544:3;10572:38;10606:3;10598:6;10572:38;:::i;:::-;-1:-1:-1;;;10619:16:1;;10659:1;10651:10;;10552:115;-1:-1:-1;;;10552:115:1:o;10880:826::-;-1:-1:-1;;;;;11277:15:1;;;11259:34;;11329:15;;11324:2;11309:18;;11302:43;11239:3;11376:2;11361:18;;11354:31;;;11202:4;;11408:57;;11445:19;;11437:6;11408:57;:::i;:::-;11513:9;11505:6;11501:22;11496:2;11485:9;11481:18;11474:50;11547:44;11584:6;11576;11547:44;:::i;:::-;11533:58;;11640:9;11632:6;11628:22;11622:3;11611:9;11607:19;11600:51;11668:32;11693:6;11685;11668:32;:::i;:::-;11660:40;11211:495;-1:-1:-1;;;;;;;;11211:495:1:o;11711:560::-;-1:-1:-1;;;;;12008:15:1;;;11990:34;;12060:15;;12055:2;12040:18;;12033:43;12107:2;12092:18;;12085:34;;;12150:2;12135:18;;12128:34;;;11970:3;12193;12178:19;;12171:32;;;11933:4;;12220:45;;12245:19;;12237:6;12220:45;:::i;:::-;12212:53;11942:329;-1:-1:-1;;;;;;;11942:329:1:o;12276:261::-;12455:2;12444:9;12437:21;12418:4;12475:56;12527:2;12516:9;12512:18;12504:6;12475:56;:::i;12542:465::-;12799:2;12788:9;12781:21;12762:4;12825:56;12877:2;12866:9;12862:18;12854:6;12825:56;:::i;:::-;12929:9;12921:6;12917:22;12912:2;12901:9;12897:18;12890:50;12957:44;12994:6;12986;12957:44;:::i;:::-;12949:52;12771:236;-1:-1:-1;;;;;12771:236:1:o;13204:219::-;13353:2;13342:9;13335:21;13316:4;13373:44;13413:2;13402:9;13398:18;13390:6;13373:44;:::i;13849:404::-;14051:2;14033:21;;;14090:2;14070:18;;;14063:30;14129:34;14124:2;14109:18;;14102:62;-1:-1:-1;;;14195:2:1;14180:18;;14173:38;14243:3;14228:19;;14023:230::o;17619:401::-;17821:2;17803:21;;;17860:2;17840:18;;;17833:30;17899:34;17894:2;17879:18;;17872:62;-1:-1:-1;;;17965:2:1;17950:18;;17943:35;18010:3;17995:19;;17793:227::o;19199:406::-;19401:2;19383:21;;;19440:2;19420:18;;;19413:30;19479:34;19474:2;19459:18;;19452:62;-1:-1:-1;;;19545:2:1;19530:18;;19523:40;19595:3;19580:19;;19373:232::o;19610:356::-;19812:2;19794:21;;;19831:18;;;19824:30;19890:34;19885:2;19870:18;;19863:62;19957:2;19942:18;;19784:182::o;23504:183::-;23564:4;23597:18;23589:6;23586:30;23583:2;;;23619:18;;:::i;:::-;-1:-1:-1;23664:1:1;23660:14;23676:4;23656:25;;23573:114::o;23818:128::-;23858:3;23889:1;23885:6;23882:1;23879:13;23876:2;;;23895:18;;:::i;:::-;-1:-1:-1;23931:9:1;;23866:80::o;23951:125::-;23991:4;24019:1;24016;24013:8;24010:2;;;24024:18;;:::i;:::-;-1:-1:-1;24061:9:1;;24000:76::o;24081:380::-;24160:1;24156:12;;;;24203;;;24224:2;;24278:4;24270:6;24266:17;24256:27;;24224:2;24331;24323:6;24320:14;24300:18;24297:38;24294:2;;;24377:10;24372:3;24368:20;24365:1;24358:31;24412:4;24409:1;24402:15;24440:4;24437:1;24430:15;24294:2;;24136:325;;;:::o;24466:249::-;24576:2;24557:13;;-1:-1:-1;;24553:27:1;24541:40;;24611:18;24596:34;;24632:22;;;24593:62;24590:2;;;24658:18;;:::i;:::-;24694:2;24687:22;-1:-1:-1;;24513:202:1:o;24720:135::-;24759:3;-1:-1:-1;;24780:17:1;;24777:2;;;24800:18;;:::i;:::-;-1:-1:-1;24847:1:1;24836:13;;24767:88::o;24860:209::-;24892:1;24918;24908:2;;24962:10;24957:3;24953:20;24950:1;24943:31;24997:4;24994:1;24987:15;25025:4;25022:1;25015:15;24908:2;-1:-1:-1;25054:9:1;;24898:171::o;25074:127::-;25135:10;25130:3;25126:20;25123:1;25116:31;25166:4;25163:1;25156:15;25190:4;25187:1;25180:15;25206:127;25267:10;25262:3;25258:20;25255:1;25248:31;25298:4;25295:1;25288:15;25322:4;25319:1;25312:15;25338:127;25399:10;25394:3;25390:20;25387:1;25380:31;25430:4;25427:1;25420:15;25454:4;25451:1;25444:15;25470:179;25505:3;25547:1;25529:16;25526:23;25523:2;;;25593:1;25590;25587;25572:23;-1:-1:-1;25630:1:1;25624:8;25619:3;25615:18;25523:2;25513:136;:::o;25654:671::-;25693:3;25735:4;25717:16;25714:26;25711:2;;;25701:624;:::o;25711:2::-;25777;25771:9;-1:-1:-1;;25842:16:1;25838:25;;25835:1;25771:9;25814:50;25893:4;25887:11;25917:16;25952:18;26023:2;26016:4;26008:6;26004:17;26001:25;25996:2;25988:6;25985:14;25982:45;25979:2;;;26030:5;;;;;25701:624;:::o;25979:2::-;26067:6;26061:4;26057:17;26046:28;;26103:3;26097:10;26130:2;26122:6;26119:14;26116:2;;;26136:5;;;;;;25701:624;:::o;26116:2::-;26220;26201:16;26195:4;26191:27;26187:36;26180:4;26171:6;26166:3;26162:16;26158:27;26155:69;26152:2;;;26227:5;;;;;;25701:624;:::o;26152:2::-;26243:57;26294:4;26285:6;26277;26273:19;26269:30;26263:4;26243:57;:::i;:::-;-1:-1:-1;26316:3:1;;25701:624;-1:-1:-1;;;;;25701:624:1:o;26330:131::-;-1:-1:-1;;;;;;26404:32:1;;26394:43;;26384:2;;26451:1;26448;26441:12

Swarm Source

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