ETH Price: $3,279.49 (-1.12%)

Token

Based Fish Mafia Wire ()
 

Overview

Max Total Supply

0

Holders

566

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x67b9A49baB1aEd81B54bE26b6A335325f492bb86
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:
BasedFishMafiaWire

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}






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



interface LinkTokenInterface {

  function allowance(
    address owner,
    address spender
  )
    external
    view
    returns (
      uint256 remaining
    );

  function approve(
    address spender,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function balanceOf(
    address owner
  )
    external
    view
    returns (
      uint256 balance
    );

  function decimals()
    external
    view
    returns (
      uint8 decimalPlaces
    );

  function decreaseApproval(
    address spender,
    uint256 addedValue
  )
    external
    returns (
      bool success
    );

  function increaseApproval(
    address spender,
    uint256 subtractedValue
  ) external;

  function name()
    external
    view
    returns (
      string memory tokenName
    );

  function symbol()
    external
    view
    returns (
      string memory tokenSymbol
    );

  function totalSupply()
    external
    view
    returns (
      uint256 totalTokensIssued
    );

  function transfer(
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  )
    external
    returns (
      bool success
    );

  function transferFrom(
    address from,
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

}






/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// wire.sol

















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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

        return array;
    }
}



/**
 * @dev ERC1155 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Pausable is ERC1155, Pausable {
    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        require(!paused(), "ERC1155Pausable: token transfer while paused");
    }
}












/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}


/**
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}







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










contract VRFRequestIDBase {

  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  )
    internal
    pure
    returns (
      uint256
    )
  {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(
    bytes32 _keyHash,
    uint256 _vRFInputSeed
  )
    internal
    pure
    returns (
      bytes32
    )
  {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constuctor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
  function fulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    internal
    virtual;

  /**
   * @dev In order to keep backwards compatibility we have kept the user
   * seed field around. We remove the use of it because given that the blockhash
   * enters later, it overrides whatever randomness the used seed provides.
   * Given that it adds no security, and can easily lead to misunderstandings,
   * we have removed it from usage and can now provide a simpler API.
   */
  uint256 constant private USER_SEED_PLACEHOLDER = 0;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(
    bytes32 _keyHash,
    uint256 _fee
  )
    internal
    returns (
      bytes32 requestId
    )
  {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed  = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface immutable internal LINK;
  address immutable private vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(
    address _vrfCoordinator,
    address _link
  ) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    external
  {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}


interface Contract {
    function balanceOf(address owner) external view returns (uint256 balance);
    function totalSupply() external view returns (uint256 supply);
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

contract BasedFishMafiaWire is ERC1155Pausable, ERC1155Holder, VRFConsumerBase {

    event RandomId(uint id);

    mapping(address => bool) private m_admin_map;
    uint private m_salt;

    Contract private constant m_bfm = Contract(0x138Ff21a21DFC06FbfCcf15F2D9Fd290a660E152);
    Contract private constant m_zfm = Contract(0xd66247EdA32bAcC0C06DACC80D19281535CE9D35);

    uint private m_seed;

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC1155, ERC1155Receiver)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function _processAddAdmin(address user) internal {
        m_admin_map[user] = true;
    }

    modifier onlyAdmin() {
        require(m_admin_map[msg.sender], "must be admin to perform this action");
        _;
    }

    function addAdmin(address user) external onlyAdmin {
        _processAddAdmin(user);
    }

    constructor() ERC1155("https://basedfishmafia.com/api/wires/wires.json")
        VRFConsumerBase(
            0xf0d54349aDdcf704F77AE15b96510dEA15cb7952, // VRF
            0x514910771AF9Ca656af840dff83E8264EcF986CA  // LINK
        )
    {
        _processAddAdmin(msg.sender);
    }


    function burn(address user, uint count) external onlyAdmin {
        _burn(user, 0, count);
    }

    function seed() external onlyAdmin returns (bytes32 requestId) {
        uint fee = 2 * 10 ** 18;
        bytes32 keyh = 0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445;
        require(LINK.balanceOf(address(this)) >= fee, "not enough LINK for transaction");
        return requestRandomness(keyh, fee);
    }

    function fulfillRandomness(bytes32, uint256 randomness) internal override {
        m_seed = randomness;
    }

    function distribute(uint count) external onlyAdmin {
        require(m_seed != 0, "need to seed() random value first");

        uint bfm_supply = m_bfm.totalSupply();
        uint zfm_supply = m_zfm.totalSupply();
        uint combined_supply = bfm_supply + zfm_supply;

        uint numPicked = 0;
        Contract selContract;
        uint randomId;
        address selUser;
        while (numPicked < count) {
            randomId = uint(keccak256(abi.encode(m_seed, m_salt++))) % combined_supply;
            emit RandomId(randomId);

            if (randomId < bfm_supply) {
                selContract = m_bfm;
            } else {
                selContract = m_zfm;
                randomId -= bfm_supply;
            }

            selUser = selContract.ownerOf(randomId);
            if (selUser == address(0xE052113bd7D7700d623414a0a4585BCaE754E9d5) ||
                selUser == address(0xCB6eA8Bb9cDF31c1cAcFD207906520aDc249a856)
            ) {
                continue;
            }

            _mint(selUser, 0, 1, "");
            ++numPicked;
        }
    }
}

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"RandomId","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addAdmin","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":"address","name":"user","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"distribute","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":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","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":[],"name":"seed","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b5073f0d54349addcf704f77ae15b96510dea15cb795273514910771af9ca656af840dff83e8264ecf986ca6040518060600160405280602f815260200162002b86602f91396200006181620000b4565b506003805460ff191690556001600160601b0319606092831b811660a052911b16608052620000ae336001600160a01b03166000908152600560205260409020805460ff19166001179055565b620001b0565b8051620000c9906002906020840190620000cd565b5050565b828054620000db9062000173565b90600052602060002090601f016020900481019282620000ff57600085556200014a565b82601f106200011a57805160ff19168380011785556200014a565b828001600101855582156200014a579182015b828111156200014a5782518255916020019190600101906200012d565b50620001589291506200015c565b5090565b5b808211156200015857600081556001016200015d565b600181811c908216806200018857607f821691505b60208210811415620001aa57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05160601c61299c620001ea60003960008181610d7c01526113de01526000818161082001526113a2015261299c6000f3fe608060405234801561001057600080fd5b50600436106100ff5760003560e01c806391c05b0b11610097578063bc197c8111610066578063bc197c8114610214578063e985e9c51461027d578063f23a6e61146102c6578063f242432a146102fe57600080fd5b806391c05b0b146101c857806394985ddd146101db5780639dc29fac146101ee578063a22cb4651461020157600080fd5b80634e1273f4116100d35780634e1273f4146101825780635c975abb146101a257806370480275146101ad5780637d94792a146101c057600080fd5b8062fdd58e1461010457806301ffc9a71461012a5780630e89341c1461014d5780632eb2c2d61461016d575b600080fd5b6101176101123660046122be565b610311565b6040519081526020015b60405180910390f35b61013d6101383660046123fc565b6103d4565b6040519015158152602001610121565b61016061015b366004612436565b6103e5565b604051610121919061263f565b61018061017b366004612179565b610479565b005b6101956101903660046122ea565b610528565b6040516101219190612607565b60035460ff1661013d565b6101806101bb3660046120ff565b610666565b610117610740565b6101806101d6366004612436565b61090f565b6101806101e93660046123da565b610d64565b6101806101fc3660046122be565b610df3565b61018061020f366004612290565b610e83565b61024c610222366004612179565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610121565b61013d61028b366004612140565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61024c6102d4366004612227565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b61018061030c366004612227565b610fa6565b600073ffffffffffffffffffffffffffffffffffffffff83166103a15760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60006103df8261104e565b92915050565b6060600280546103f4906126a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610420906126a5565b801561046d5780601f106104425761010080835404028352916020019161046d565b820191906000526020600020905b81548152906001019060200180831161045057829003601f168201915b50505050509050919050565b73ffffffffffffffffffffffffffffffffffffffff85163314806104a257506104a2853361028b565b6105145760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610398565b61052185858585856110a4565b5050505050565b606081518351146105a15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610398565b6000835167ffffffffffffffff8111156105bd576105bd612816565b6040519080825280602002602001820160405280156105e6578160200160208202803683370190505b50905060005b845181101561065e5761063185828151811061060a5761060a6127e7565b6020026020010151858381518110610624576106246127e7565b6020026020010151610311565b828281518110610643576106436127e7565b602090810291909101015261065781612744565b90506105ec565b509392505050565b3360009081526005602052604090205460ff166106ea5760405162461bcd60e51b8152602060048201526024808201527f6d7573742062652061646d696e20746f20706572666f726d207468697320616360448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610398565b61073d8173ffffffffffffffffffffffffffffffffffffffff16600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b50565b3360009081526005602052604081205460ff166107c45760405162461bcd60e51b8152602060048201526024808201527f6d7573742062652061646d696e20746f20706572666f726d207468697320616360448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610398565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152671bc16d674ec80000907faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af4459082907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561087757600080fd5b505afa15801561088b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108af919061244f565b10156108fd5760405162461bcd60e51b815260206004820152601f60248201527f6e6f7420656e6f756768204c494e4b20666f72207472616e73616374696f6e006044820152606401610398565b610907818361139e565b925050505b90565b3360009081526005602052604090205460ff166109935760405162461bcd60e51b8152602060048201526024808201527f6d7573742062652061646d696e20746f20706572666f726d207468697320616360448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610398565b600754610a085760405162461bcd60e51b815260206004820152602160248201527f6e65656420746f207365656428292072616e646f6d2076616c7565206669727360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610398565b600073138ff21a21dfc06fbfccf15f2d9fd290a660e15273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a6457600080fd5b505afa158015610a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9c919061244f565b9050600073d66247eda32bacc0c06dacc80d19281535ce9d3573ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afa57600080fd5b505afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b32919061244f565b90506000610b408284612676565b90506000808060005b87841015610d5a57600754600680548792916000610b6683612744565b909155506040805160208101939093528201526060016040516020818303038152906040528051906020012060001c610b9f919061277d565b91507f7f67bf8e00fe84bc064a953ec765f995ad389b5f98426788d18dc4ed0fd18a9d82604051610bd291815260200190565b60405180910390a186821015610bfe5773138ff21a21dfc06fbfccf15f2d9fd290a660e1529250610c22565b73d66247eda32bacc0c06dacc80d19281535ce9d359250610c1f878361268e565b91505b6040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff841690636352211e9060240160206040518083038186803b158015610c8857600080fd5b505afa158015610c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc09190612123565b905073ffffffffffffffffffffffffffffffffffffffff811673e052113bd7d7700d623414a0a4585bcae754e9d51480610d23575073ffffffffffffffffffffffffffffffffffffffff811673cb6ea8bb9cdf31c1cacfd207906520adc249a856145b15610d2d57610b49565b610d4a81600060016040518060200160405280600081525061153e565b610d5384612744565b9350610b49565b5050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610de95760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610398565b60075550565b5050565b3360009081526005602052604090205460ff16610e775760405162461bcd60e51b8152602060048201526024808201527f6d7573742062652061646d696e20746f20706572666f726d207468697320616360448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610398565b610def82600083611691565b3373ffffffffffffffffffffffffffffffffffffffff83161415610f0f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610398565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8516331480610fcf5750610fcf853361028b565b6110415760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610398565b6105218585858585611864565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806103df57506103df82611a61565b815183511461111b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610398565b73ffffffffffffffffffffffffffffffffffffffff84166111a45760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610398565b336111b3818787878787611b44565b60005b84518110156113095760008582815181106111d3576111d36127e7565b6020026020010151905060008583815181106111f1576111f16127e7565b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156112a45760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610398565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b168252812080548492906112ee908490612676565b925050819055505050508061130290612744565b90506111b6565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161138092919061261a565b60405180910390a4611396818787878787611bbd565b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f00000000000000000000000000000000000000000000000000000000000000008486600060405160200161141b929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611448939291906125c9565b602060405180830381600087803b15801561146257600080fd5b505af1158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a91906123bd565b50600083815260046020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a0909101909252815191830191909120938790529190526114f6906001612676565b6000858152600460205260409020556115368482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84166115c75760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610398565b336115e7816000876115d888611e09565b6115e188611e09565b87611b44565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8916845290915281208054859290611624908490612676565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461052181600087878787611e54565b73ffffffffffffffffffffffffffffffffffffffff831661171a5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610398565b336117498185600061172b87611e09565b61173487611e09565b60405180602001604052806000815250611b44565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902054828110156117ec5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610398565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b73ffffffffffffffffffffffffffffffffffffffff84166118ed5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610398565b336118fd8187876115d888611e09565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902054838110156119a15760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610398565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b81168552925280832087850390559088168252812080548692906119eb908490612676565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611a58828888888888611e54565b50505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480611af457507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806103df57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146103df565b60035460ff16156113965760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201527f7768696c652070617573656400000000000000000000000000000000000000006064820152608401610398565b73ffffffffffffffffffffffffffffffffffffffff84163b15611396576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190611c34908990899088908890889060040161250e565b602060405180830381600087803b158015611c4e57600080fd5b505af1925050508015611c9c575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611c9991810190612419565b60015b611d5257611ca8612845565b806308c379a01415611ce25750611cbd612860565b80611cc85750611ce4565b8060405162461bcd60e51b8152600401610398919061263f565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610398565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611a585760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610398565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611e4357611e436127e7565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15611396576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190611ecb9089908990889088908890600401612579565b602060405180830381600087803b158015611ee557600080fd5b505af1925050508015611f33575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f3091810190612419565b60015b611f3f57611ca8612845565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611a585760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610398565b600082601f83011261200757600080fd5b8135602061201482612652565b60405161202182826126f9565b8381528281019150858301600585901b8701840188101561204157600080fd5b60005b8581101561206057813584529284019290840190600101612044565b5090979650505050505050565b600082601f83011261207e57600080fd5b813567ffffffffffffffff81111561209857612098612816565b6040516120cd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601826126f9565b8181528460208386010111156120e257600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561211157600080fd5b813561211c81612908565b9392505050565b60006020828403121561213557600080fd5b815161211c81612908565b6000806040838503121561215357600080fd5b823561215e81612908565b9150602083013561216e81612908565b809150509250929050565b600080600080600060a0868803121561219157600080fd5b853561219c81612908565b945060208601356121ac81612908565b9350604086013567ffffffffffffffff808211156121c957600080fd5b6121d589838a01611ff6565b945060608801359150808211156121eb57600080fd5b6121f789838a01611ff6565b9350608088013591508082111561220d57600080fd5b5061221a8882890161206d565b9150509295509295909350565b600080600080600060a0868803121561223f57600080fd5b853561224a81612908565b9450602086013561225a81612908565b93506040860135925060608601359150608086013567ffffffffffffffff81111561228457600080fd5b61221a8882890161206d565b600080604083850312156122a357600080fd5b82356122ae81612908565b9150602083013561216e8161292a565b600080604083850312156122d157600080fd5b82356122dc81612908565b946020939093013593505050565b600080604083850312156122fd57600080fd5b823567ffffffffffffffff8082111561231557600080fd5b818501915085601f83011261232957600080fd5b8135602061233682612652565b60405161234382826126f9565b8381528281019150858301600585901b870184018b101561236357600080fd5b600096505b8487101561238f57803561237b81612908565b835260019690960195918301918301612368565b50965050860135925050808211156123a657600080fd5b506123b385828601611ff6565b9150509250929050565b6000602082840312156123cf57600080fd5b815161211c8161292a565b600080604083850312156123ed57600080fd5b50508035926020909101359150565b60006020828403121561240e57600080fd5b813561211c81612938565b60006020828403121561242b57600080fd5b815161211c81612938565b60006020828403121561244857600080fd5b5035919050565b60006020828403121561246157600080fd5b5051919050565b600081518084526020808501945080840160005b838110156124985781518752958201959082019060010161247c565b509495945050505050565b6000815180845260005b818110156124c9576020818501810151868301820152016124ad565b818111156124db576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261254760a0830186612468565b82810360608401526125598186612468565b9050828103608084015261256d81856124a3565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526125be60a08301846124a3565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681528260208201526060604082015260006125fe60608301846124a3565b95945050505050565b60208152600061211c6020830184612468565b60408152600061262d6040830185612468565b82810360208401526125fe8185612468565b60208152600061211c60208301846124a3565b600067ffffffffffffffff82111561266c5761266c612816565b5060051b60200190565b60008219821115612689576126896127b8565b500190565b6000828210156126a0576126a06127b8565b500390565b600181811c908216806126b957607f821691505b602082108114156126f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff8211171561273d5761273d612816565b6040525050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612776576127766127b8565b5060010190565b6000826127b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561090c5760046000803e5060005160e01c90565b600060443d101561286e5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff81602484011181841117156128bc57505050505090565b82850191508151818111156128d45750505050505090565b843d87010160208285010111156128ee5750505050505090565b6128fd602082860101876126f9565b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461073d57600080fd5b801515811461073d57600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461073d57600080fdfea264697066735822122064f4a81c1d33d49a27abdc14692452007faa09a922c6822b2b947c651c03f13c64736f6c6343000807003368747470733a2f2f6261736564666973686d616669612e636f6d2f6170692f77697265732f77697265732e6a736f6e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ff5760003560e01c806391c05b0b11610097578063bc197c8111610066578063bc197c8114610214578063e985e9c51461027d578063f23a6e61146102c6578063f242432a146102fe57600080fd5b806391c05b0b146101c857806394985ddd146101db5780639dc29fac146101ee578063a22cb4651461020157600080fd5b80634e1273f4116100d35780634e1273f4146101825780635c975abb146101a257806370480275146101ad5780637d94792a146101c057600080fd5b8062fdd58e1461010457806301ffc9a71461012a5780630e89341c1461014d5780632eb2c2d61461016d575b600080fd5b6101176101123660046122be565b610311565b6040519081526020015b60405180910390f35b61013d6101383660046123fc565b6103d4565b6040519015158152602001610121565b61016061015b366004612436565b6103e5565b604051610121919061263f565b61018061017b366004612179565b610479565b005b6101956101903660046122ea565b610528565b6040516101219190612607565b60035460ff1661013d565b6101806101bb3660046120ff565b610666565b610117610740565b6101806101d6366004612436565b61090f565b6101806101e93660046123da565b610d64565b6101806101fc3660046122be565b610df3565b61018061020f366004612290565b610e83565b61024c610222366004612179565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610121565b61013d61028b366004612140565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61024c6102d4366004612227565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b61018061030c366004612227565b610fa6565b600073ffffffffffffffffffffffffffffffffffffffff83166103a15760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60006103df8261104e565b92915050565b6060600280546103f4906126a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610420906126a5565b801561046d5780601f106104425761010080835404028352916020019161046d565b820191906000526020600020905b81548152906001019060200180831161045057829003601f168201915b50505050509050919050565b73ffffffffffffffffffffffffffffffffffffffff85163314806104a257506104a2853361028b565b6105145760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610398565b61052185858585856110a4565b5050505050565b606081518351146105a15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610398565b6000835167ffffffffffffffff8111156105bd576105bd612816565b6040519080825280602002602001820160405280156105e6578160200160208202803683370190505b50905060005b845181101561065e5761063185828151811061060a5761060a6127e7565b6020026020010151858381518110610624576106246127e7565b6020026020010151610311565b828281518110610643576106436127e7565b602090810291909101015261065781612744565b90506105ec565b509392505050565b3360009081526005602052604090205460ff166106ea5760405162461bcd60e51b8152602060048201526024808201527f6d7573742062652061646d696e20746f20706572666f726d207468697320616360448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610398565b61073d8173ffffffffffffffffffffffffffffffffffffffff16600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b50565b3360009081526005602052604081205460ff166107c45760405162461bcd60e51b8152602060048201526024808201527f6d7573742062652061646d696e20746f20706572666f726d207468697320616360448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610398565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152671bc16d674ec80000907faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af4459082907f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561087757600080fd5b505afa15801561088b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108af919061244f565b10156108fd5760405162461bcd60e51b815260206004820152601f60248201527f6e6f7420656e6f756768204c494e4b20666f72207472616e73616374696f6e006044820152606401610398565b610907818361139e565b925050505b90565b3360009081526005602052604090205460ff166109935760405162461bcd60e51b8152602060048201526024808201527f6d7573742062652061646d696e20746f20706572666f726d207468697320616360448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610398565b600754610a085760405162461bcd60e51b815260206004820152602160248201527f6e65656420746f207365656428292072616e646f6d2076616c7565206669727360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610398565b600073138ff21a21dfc06fbfccf15f2d9fd290a660e15273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a6457600080fd5b505afa158015610a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9c919061244f565b9050600073d66247eda32bacc0c06dacc80d19281535ce9d3573ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afa57600080fd5b505afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b32919061244f565b90506000610b408284612676565b90506000808060005b87841015610d5a57600754600680548792916000610b6683612744565b909155506040805160208101939093528201526060016040516020818303038152906040528051906020012060001c610b9f919061277d565b91507f7f67bf8e00fe84bc064a953ec765f995ad389b5f98426788d18dc4ed0fd18a9d82604051610bd291815260200190565b60405180910390a186821015610bfe5773138ff21a21dfc06fbfccf15f2d9fd290a660e1529250610c22565b73d66247eda32bacc0c06dacc80d19281535ce9d359250610c1f878361268e565b91505b6040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff841690636352211e9060240160206040518083038186803b158015610c8857600080fd5b505afa158015610c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc09190612123565b905073ffffffffffffffffffffffffffffffffffffffff811673e052113bd7d7700d623414a0a4585bcae754e9d51480610d23575073ffffffffffffffffffffffffffffffffffffffff811673cb6ea8bb9cdf31c1cacfd207906520adc249a856145b15610d2d57610b49565b610d4a81600060016040518060200160405280600081525061153e565b610d5384612744565b9350610b49565b5050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb79521614610de95760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610398565b60075550565b5050565b3360009081526005602052604090205460ff16610e775760405162461bcd60e51b8152602060048201526024808201527f6d7573742062652061646d696e20746f20706572666f726d207468697320616360448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610398565b610def82600083611691565b3373ffffffffffffffffffffffffffffffffffffffff83161415610f0f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610398565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8516331480610fcf5750610fcf853361028b565b6110415760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610398565b6105218585858585611864565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806103df57506103df82611a61565b815183511461111b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610398565b73ffffffffffffffffffffffffffffffffffffffff84166111a45760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610398565b336111b3818787878787611b44565b60005b84518110156113095760008582815181106111d3576111d36127e7565b6020026020010151905060008583815181106111f1576111f16127e7565b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156112a45760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610398565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b168252812080548492906112ee908490612676565b925050819055505050508061130290612744565b90506111b6565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161138092919061261a565b60405180910390a4611396818787878787611bbd565b505050505050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb79528486600060405160200161141b929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611448939291906125c9565b602060405180830381600087803b15801561146257600080fd5b505af1158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a91906123bd565b50600083815260046020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a0909101909252815191830191909120938790529190526114f6906001612676565b6000858152600460205260409020556115368482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84166115c75760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610398565b336115e7816000876115d888611e09565b6115e188611e09565b87611b44565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8916845290915281208054859290611624908490612676565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461052181600087878787611e54565b73ffffffffffffffffffffffffffffffffffffffff831661171a5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610398565b336117498185600061172b87611e09565b61173487611e09565b60405180602001604052806000815250611b44565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902054828110156117ec5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610398565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b73ffffffffffffffffffffffffffffffffffffffff84166118ed5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610398565b336118fd8187876115d888611e09565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902054838110156119a15760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610398565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b81168552925280832087850390559088168252812080548692906119eb908490612676565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611a58828888888888611e54565b50505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480611af457507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806103df57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146103df565b60035460ff16156113965760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201527f7768696c652070617573656400000000000000000000000000000000000000006064820152608401610398565b73ffffffffffffffffffffffffffffffffffffffff84163b15611396576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190611c34908990899088908890889060040161250e565b602060405180830381600087803b158015611c4e57600080fd5b505af1925050508015611c9c575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611c9991810190612419565b60015b611d5257611ca8612845565b806308c379a01415611ce25750611cbd612860565b80611cc85750611ce4565b8060405162461bcd60e51b8152600401610398919061263f565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610398565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611a585760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610398565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611e4357611e436127e7565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15611396576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190611ecb9089908990889088908890600401612579565b602060405180830381600087803b158015611ee557600080fd5b505af1925050508015611f33575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f3091810190612419565b60015b611f3f57611ca8612845565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611a585760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610398565b600082601f83011261200757600080fd5b8135602061201482612652565b60405161202182826126f9565b8381528281019150858301600585901b8701840188101561204157600080fd5b60005b8581101561206057813584529284019290840190600101612044565b5090979650505050505050565b600082601f83011261207e57600080fd5b813567ffffffffffffffff81111561209857612098612816565b6040516120cd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601826126f9565b8181528460208386010111156120e257600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561211157600080fd5b813561211c81612908565b9392505050565b60006020828403121561213557600080fd5b815161211c81612908565b6000806040838503121561215357600080fd5b823561215e81612908565b9150602083013561216e81612908565b809150509250929050565b600080600080600060a0868803121561219157600080fd5b853561219c81612908565b945060208601356121ac81612908565b9350604086013567ffffffffffffffff808211156121c957600080fd5b6121d589838a01611ff6565b945060608801359150808211156121eb57600080fd5b6121f789838a01611ff6565b9350608088013591508082111561220d57600080fd5b5061221a8882890161206d565b9150509295509295909350565b600080600080600060a0868803121561223f57600080fd5b853561224a81612908565b9450602086013561225a81612908565b93506040860135925060608601359150608086013567ffffffffffffffff81111561228457600080fd5b61221a8882890161206d565b600080604083850312156122a357600080fd5b82356122ae81612908565b9150602083013561216e8161292a565b600080604083850312156122d157600080fd5b82356122dc81612908565b946020939093013593505050565b600080604083850312156122fd57600080fd5b823567ffffffffffffffff8082111561231557600080fd5b818501915085601f83011261232957600080fd5b8135602061233682612652565b60405161234382826126f9565b8381528281019150858301600585901b870184018b101561236357600080fd5b600096505b8487101561238f57803561237b81612908565b835260019690960195918301918301612368565b50965050860135925050808211156123a657600080fd5b506123b385828601611ff6565b9150509250929050565b6000602082840312156123cf57600080fd5b815161211c8161292a565b600080604083850312156123ed57600080fd5b50508035926020909101359150565b60006020828403121561240e57600080fd5b813561211c81612938565b60006020828403121561242b57600080fd5b815161211c81612938565b60006020828403121561244857600080fd5b5035919050565b60006020828403121561246157600080fd5b5051919050565b600081518084526020808501945080840160005b838110156124985781518752958201959082019060010161247c565b509495945050505050565b6000815180845260005b818110156124c9576020818501810151868301820152016124ad565b818111156124db576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261254760a0830186612468565b82810360608401526125598186612468565b9050828103608084015261256d81856124a3565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526125be60a08301846124a3565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681528260208201526060604082015260006125fe60608301846124a3565b95945050505050565b60208152600061211c6020830184612468565b60408152600061262d6040830185612468565b82810360208401526125fe8185612468565b60208152600061211c60208301846124a3565b600067ffffffffffffffff82111561266c5761266c612816565b5060051b60200190565b60008219821115612689576126896127b8565b500190565b6000828210156126a0576126a06127b8565b500390565b600181811c908216806126b957607f821691505b602082108114156126f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff8211171561273d5761273d612816565b6040525050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612776576127766127b8565b5060010190565b6000826127b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561090c5760046000803e5060005160e01c90565b600060443d101561286e5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff81602484011181841117156128bc57505050505090565b82850191508151818111156128d45750505050505090565b843d87010160208285010111156128ee5750505050505090565b6128fd602082860101876126f9565b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461073d57600080fd5b801515811461073d57600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461073d57600080fdfea264697066735822122064f4a81c1d33d49a27abdc14692452007faa09a922c6822b2b947c651c03f13c64736f6c63430008070033

Deployed Bytecode Sourcemap

52274:2969:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22974:231;;;;;;:::i;:::-;;:::i;:::-;;;11857:25:1;;;11845:2;11830:18;22974:231:0;;;;;;;;52689:229;;;;;;:::i;:::-;;:::i;:::-;;;11684:14:1;;11677:22;11659:41;;11647:2;11632:18;52689:229:0;11519:187:1;22718:105:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25069:442::-;;;;;;:::i;:::-;;:::i;:::-;;23371:524;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7278:86::-;7349:7;;;;7278:86;;53158:92;;;;;;:::i;:::-;;:::i;53666:334::-;;;:::i;54128:1112::-;;;;;;:::i;:::-;;:::i;51779:233::-;;;;;;:::i;:::-;;:::i;53559:99::-;;;;;;:::i;:::-;;:::i;23968:311::-;;;;;;:::i;:::-;;:::i;37949:255::-;;;;;;:::i;:::-;38160:36;37949:255;;;;;;;;;;;12765:66:1;12753:79;;;12735:98;;12723:2;12708:18;37949:255:0;12591:248:1;24351:168:0;;;;;;:::i;:::-;24474:27;;;;24450:4;24474:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;24351:168;37714:227;;;;;;:::i;:::-;37902:31;37714:227;;;;;;;;24591:401;;;;;;:::i;:::-;;:::i;22974:231::-;23060:7;23088:21;;;23080:77;;;;-1:-1:-1;;;23080:77:0;;14100:2:1;23080:77:0;;;14082:21:1;14139:2;14119:18;;;14112:30;14178:34;14158:18;;;14151:62;14249:13;14229:18;;;14222:41;14280:19;;23080:77:0;;;;;;;;;-1:-1:-1;23175:9:0;:13;;;;;;;;;;;:22;;;;;;;;;;;;;22974:231::o;52689:229::-;52845:4;52874:36;52898:11;52874:23;:36::i;:::-;52867:43;52689:229;-1:-1:-1;;52689:229:0:o;22718:105::-;22778:13;22811:4;22804:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22718:105;;;:::o;25069:442::-;25302:20;;;4651:10;25302:20;;:60;;-1:-1:-1;25326:36:0;25343:4;4651:10;24351:168;:::i;25326:36::-;25280:160;;;;-1:-1:-1;;;25280:160:0;;16506:2:1;25280:160:0;;;16488:21:1;16545:2;16525:18;;;16518:30;16584:34;16564:18;;;16557:62;16655:20;16635:18;;;16628:48;16693:19;;25280:160:0;16304:414:1;25280:160:0;25451:52;25474:4;25480:2;25484:3;25489:7;25498:4;25451:22;:52::i;:::-;25069:442;;;;;:::o;23371:524::-;23527:16;23588:3;:10;23569:8;:15;:29;23561:83;;;;-1:-1:-1;;;23561:83:0;;18915:2:1;23561:83:0;;;18897:21:1;18954:2;18934:18;;;18927:30;18993:34;18973:18;;;18966:62;19064:11;19044:18;;;19037:39;19093:19;;23561:83:0;18713:405:1;23561:83:0;23657:30;23704:8;:15;23690:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23690:30:0;;23657:63;;23738:9;23733:122;23757:8;:15;23753:1;:19;23733:122;;;23813:30;23823:8;23832:1;23823:11;;;;;;;;:::i;:::-;;;;;;;23836:3;23840:1;23836:6;;;;;;;;:::i;:::-;;;;;;;23813:9;:30::i;:::-;23794:13;23808:1;23794:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;23774:3;;;:::i;:::-;;;23733:122;;;-1:-1:-1;23874:13:0;23371:524;-1:-1:-1;;;23371:524:0:o;53158:92::-;53078:10;53066:23;;;;:11;:23;;;;;;;;53058:72;;;;-1:-1:-1;;;53058:72:0;;18100:2:1;53058:72:0;;;18082:21:1;18139:2;18119:18;;;18112:30;18178:34;18158:18;;;18151:62;18249:6;18229:18;;;18222:34;18273:19;;53058:72:0;17898:400:1;53058:72:0;53220:22:::1;53237:4;52986:17:::0;;;;;;:11;:17;;;;;:24;;;;53006:4;52986:24;;;52926:92;53220:22:::1;53158:92:::0;:::o;53666:334::-;53078:10;53710:17;53066:23;;;:11;:23;;;;;;;;53058:72;;;;-1:-1:-1;;;53058:72:0;;18100:2:1;53058:72:0;;;18082:21:1;18139:2;18119:18;;;18112:30;18178:34;18158:18;;;18151:62;18249:6;18229:18;;;18222:34;18273:19;;53058:72:0;17898:400:1;53058:72:0;53874:29:::1;::::0;;;;53897:4:::1;53874:29;::::0;::::1;8843:74:1::0;53751:12:0::1;::::0;53789:66:::1;::::0;53751:12;;53874:4:::1;:14;;::::0;::::1;::::0;8816:18:1;;53874:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;53866:80;;;::::0;-1:-1:-1;;;53866:80:0;;15740:2:1;53866:80:0::1;::::0;::::1;15722:21:1::0;15779:2;15759:18;;;15752:30;15818:33;15798:18;;;15791:61;15869:18;;53866:80:0::1;15538:355:1::0;53866:80:0::1;53964:28;53982:4;53988:3;53964:17;:28::i;:::-;53957:35;;;;53141:1;53666:334:::0;:::o;54128:1112::-;53078:10;53066:23;;;;:11;:23;;;;;;;;53058:72;;;;-1:-1:-1;;;53058:72:0;;18100:2:1;53058:72:0;;;18082:21:1;18139:2;18119:18;;;18112:30;18178:34;18158:18;;;18151:62;18249:6;18229:18;;;18222:34;18273:19;;53058:72:0;17898:400:1;53058:72:0;54198:6:::1;::::0;54190:57:::1;;;::::0;-1:-1:-1;;;54190:57:0;;20136:2:1;54190:57:0::1;::::0;::::1;20118:21:1::0;20175:2;20155:18;;;20148:30;20214:34;20194:18;;;20187:62;20285:3;20265:18;;;20258:31;20306:19;;54190:57:0::1;19934:397:1::0;54190:57:0::1;54260:15;52516:42;54278:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54260:37;;54308:15;52609:42;54326:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54308:37:::0;-1:-1:-1;54356:20:0::1;54379:23;54308:37:::0;54379:10;:23:::1;:::i;:::-;54356:46;;54415:14;54444:20:::0;54475:13;54499:15:::1;54525:708;54544:5;54532:9;:17;54525:708;;;54603:6;::::0;54611::::1;:8:::0;;54625:15;;54603:6;54611::::1;:8;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;54592:28:0::1;::::0;;::::1;::::0;::::1;12067:25:1::0;;;;12108:18;;12101:34;12040:18;;54592:28:0::1;;;;;;;;;;;;54582:39;;;;;;54577:45;;:63;;;;:::i;:::-;54566:74;;54660:18;54669:8;54660:18;;;;11857:25:1::0;;11845:2;11830:18;;11711:177;54660:18:0::1;;;;;;;;54710:10;54699:8;:21;54695:182;;;52516:42;54741:19;;54695:182;;;52609:42;::::0;-1:-1:-1;54839:22:0::1;54851:10:::0;54839:22;::::1;:::i;:::-;;;54695:182;54903:29;::::0;;;;::::1;::::0;::::1;11857:25:1::0;;;54903:19:0::1;::::0;::::1;::::0;::::1;::::0;11830:18:1;;54903:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54893:39:::0;-1:-1:-1;54951:62:0::1;::::0;::::1;54970:42;54951:62;::::0;:145:::1;;-1:-1:-1::0;55034:62:0::1;::::0;::::1;55053:42;55034:62;54951:145;54947:208;;;55131:8;;54947:208;55171:24;55177:7;55186:1;55189;55171:24;;;;;;;;;;;::::0;:5:::1;:24::i;:::-;55210:11;::::0;::::1;:::i;:::-;;;54525:708;;;54179:1061;;;;;;;54128:1112:::0;:::o;51779:233::-;51895:10;:28;51909:14;51895:28;;51887:72;;;;-1:-1:-1;;;51887:72:0;;17740:2:1;51887:72:0;;;17722:21:1;17779:2;17759:18;;;17752:30;17818:33;17798:18;;;17791:61;17869:18;;51887:72:0;17538:355:1;51887:72:0;54093:6;:19;-1:-1:-1;51779:233:0:o;51966:40::-;51779:233;;:::o;53559:99::-;53078:10;53066:23;;;;:11;:23;;;;;;;;53058:72;;;;-1:-1:-1;;;53058:72:0;;18100:2:1;53058:72:0;;;18082:21:1;18139:2;18119:18;;;18112:30;18178:34;18158:18;;;18151:62;18249:6;18229:18;;;18222:34;18273:19;;53058:72:0;17898:400:1;53058:72:0;53629:21:::1;53635:4;53641:1;53644:5;53629;:21::i;23968:311::-:0;4651:10;24071:24;;;;;24063:78;;;;-1:-1:-1;;;24063:78:0;;18505:2:1;24063:78:0;;;18487:21:1;18544:2;18524:18;;;18517:30;18583:34;18563:18;;;18556:62;18654:11;18634:18;;;18627:39;18683:19;;24063:78:0;18303:405:1;24063:78:0;4651:10;24154:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;24223:48;;11659:41:1;;;24154:42:0;;4651:10;24223:48;;11632:18:1;24223:48:0;;;;;;;23968:311;;:::o;24591:401::-;24799:20;;;4651:10;24799:20;;:60;;-1:-1:-1;24823:36:0;24840:4;4651:10;24351:168;:::i;24823:36::-;24777:151;;;;-1:-1:-1;;;24777:151:0;;15330:2:1;24777:151:0;;;15312:21:1;15369:2;15349:18;;;15342:30;15408:34;15388:18;;;15381:62;15479:11;15459:18;;;15452:39;15508:19;;24777:151:0;15128:405:1;24777:151:0;24939:45;24957:4;24963:2;24967;24971:6;24979:4;24939:17;:45::i;37390:223::-;37492:4;37516:49;;;37531:34;37516:49;;:89;;;37569:36;37593:11;37569:23;:36::i;27153:1074::-;27380:7;:14;27366:3;:10;:28;27358:81;;;;-1:-1:-1;;;27358:81:0;;19325:2:1;27358:81:0;;;19307:21:1;19364:2;19344:18;;;19337:30;19403:34;19383:18;;;19376:62;19474:10;19454:18;;;19447:38;19502:19;;27358:81:0;19123:404:1;27358:81:0;27458:16;;;27450:66;;;;-1:-1:-1;;;27450:66:0;;16100:2:1;27450:66:0;;;16082:21:1;16139:2;16119:18;;;16112:30;16178:34;16158:18;;;16151:62;16249:7;16229:18;;;16222:35;16274:19;;27450:66:0;15898:401:1;27450:66:0;4651:10;27573:60;4651:10;27604:4;27610:2;27614:3;27619:7;27628:4;27573:20;:60::i;:::-;27651:9;27646:421;27670:3;:10;27666:1;:14;27646:421;;;27702:10;27715:3;27719:1;27715:6;;;;;;;;:::i;:::-;;;;;;;27702:19;;27736:14;27753:7;27761:1;27753:10;;;;;;;;:::i;:::-;;;;;;;;;;;;27780:19;27802:13;;;;;;;;;;:19;;;;;;;;;;;;;27753:10;;-1:-1:-1;27844:21:0;;;;27836:76;;;;-1:-1:-1;;;27836:76:0;;17329:2:1;27836:76:0;;;17311:21:1;17368:2;17348:18;;;17341:30;17407:34;17387:18;;;17380:62;17478:12;17458:18;;;17451:40;17508:19;;27836:76:0;17127:406:1;27836:76:0;27956:9;:13;;;;;;;;;;;:19;;;;;;;;;;;27978:20;;;27956:42;;28028:17;;;;;;;:27;;27978:20;;27956:9;28028:27;;27978:20;;28028:27;:::i;:::-;;;;;;;;27687:380;;;27682:3;;;;:::i;:::-;;;27646:421;;;;28114:2;28084:47;;28108:4;28084:47;;28098:8;28084:47;;;28118:3;28123:7;28084:47;;;;;;;:::i;:::-;;;;;;;;28144:75;28180:8;28190:4;28196:2;28200:3;28205:7;28214:4;28144:35;:75::i;:::-;27347:880;27153:1074;;;;;:::o;49843:1077::-;49953:17;49988:4;:20;;;50009:14;50025:4;50042:8;48673:1;50031:43;;;;;;;;12067:25:1;;;12123:2;12108:18;;12101:34;12055:2;12040:18;;11893:248;50031:43:0;;;;;;;;;;;;;49988:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;50310:15:0;50394:16;;;:6;:16;;;;;;;;;41407:51;;;;;12377:25:1;;;12418:18;;;12411:34;;;50387:4:0;12461:18:1;;;12454:83;12553:18;;;;12546:34;;;41407:51:0;;;;;;;;;;12349:19:1;;;;41407:51:0;;;41397:62;;;;;;;;;50848:16;;;;;;;:20;;50867:1;50848:20;:::i;:::-;50829:16;;;;:6;:16;;;;;:39;50882:32;50836:8;50906:7;42024:41;;;;;;;8602:19:1;;;;8637:12;;;8630:28;;;;42024:41:0;;;;;;;;;8674:12:1;;;;42024:41:0;;42014:52;;;;;;41857:215;50882:32;50875:39;49843:1077;-1:-1:-1;;;;49843:1077:0:o;29560:599::-;29718:21;;;29710:67;;;;-1:-1:-1;;;29710:67:0;;19734:2:1;29710:67:0;;;19716:21:1;19773:2;19753:18;;;19746:30;19812:34;19792:18;;;19785:62;19883:3;19863:18;;;19856:31;19904:19;;29710:67:0;19532:397:1;29710:67:0;4651:10;29834:107;4651:10;29790:16;29877:7;29886:21;29904:2;29886:17;:21::i;:::-;29909:25;29927:6;29909:17;:25::i;:::-;29936:4;29834:20;:107::i;:::-;29954:9;:13;;;;;;;;;;;:22;;;;;;;;;;:32;;29980:6;;29954:9;:32;;29980:6;;29954:32;:::i;:::-;;;;-1:-1:-1;;30002:57:0;;;12067:25:1;;;12123:2;12108:18;;12101:34;;;30002:57:0;;;;;30035:1;;30002:57;;;;;;12040:18:1;30002:57:0;;;;;;;30072:79;30103:8;30121:1;30125:7;30134:2;30138:6;30146:4;30072:30;:79::i;31509:675::-;31639:21;;;31631:69;;;;-1:-1:-1;;;31631:69:0;;16925:2:1;31631:69:0;;;16907:21:1;16964:2;16944:18;;;16937:30;17003:34;16983:18;;;16976:62;17074:5;17054:18;;;17047:33;17097:19;;31631:69:0;16723:399:1;31631:69:0;4651:10;31757:105;4651:10;31788:7;31713:16;31809:21;31827:2;31809:17;:21::i;:::-;31832:25;31850:6;31832:17;:25::i;:::-;31757:105;;;;;;;;;;;;:20;:105::i;:::-;31875:22;31900:13;;;;;;;;;;;:22;;;;;;;;;;;31941:24;;;;31933:73;;;;-1:-1:-1;;;31933:73:0;;14512:2:1;31933:73:0;;;14494:21:1;14551:2;14531:18;;;14524:30;14590:34;14570:18;;;14563:62;14661:6;14641:18;;;14634:34;14685:19;;31933:73:0;14310:400:1;31933:73:0;32042:9;:13;;;;;;;;;;;:22;;;;;;;;;;;;;32067:23;;;32042:48;;32119:57;;12067:25:1;;;12108:18;;;12101:34;;;32042:22:0;;32119:57;;;;;;12040:18:1;32119:57:0;;;;;;;31620:564;;31509:675;;;:::o;25975:820::-;26163:16;;;26155:66;;;;-1:-1:-1;;;26155:66:0;;16100:2:1;26155:66:0;;;16082:21:1;16139:2;16119:18;;;16112:30;16178:34;16158:18;;;16151:62;16249:7;16229:18;;;16222:35;16274:19;;26155:66:0;15898:401:1;26155:66:0;4651:10;26278:96;4651:10;26309:4;26315:2;26319:21;26337:2;26319:17;:21::i;26278:96::-;26387:19;26409:13;;;;;;;;;;;:19;;;;;;;;;;;26447:21;;;;26439:76;;;;-1:-1:-1;;;26439:76:0;;17329:2:1;26439:76:0;;;17311:21:1;17368:2;17348:18;;;17341:30;17407:34;17387:18;;;17380:62;17478:12;17458:18;;;17451:40;17508:19;;26439:76:0;17127:406:1;26439:76:0;26551:9;:13;;;;;;;;;;;:19;;;;;;;;;;;26573:20;;;26551:42;;26615:17;;;;;;;:27;;26573:20;;26551:9;26615:27;;26573:20;;26615:27;:::i;:::-;;;;-1:-1:-1;;26660:46:0;;;12067:25:1;;;12123:2;12108:18;;12101:34;;;26660:46:0;;;;;;;;;;;;;;;12040:18:1;26660:46:0;;;;;;;26719:68;26750:8;26760:4;26766:2;26770;26774:6;26782:4;26719:30;:68::i;:::-;26144:651;;25975:820;;;;;:::o;21997:310::-;22099:4;22136:41;;;22151:26;22136:41;;:110;;-1:-1:-1;22194:52:0;;;22209:37;22194:52;22136:110;:163;;;-1:-1:-1;1644:25:0;1629:40;;;;22263:36;1520:157;36793:392;7349:7;;;;37119:9;37111:66;;;;-1:-1:-1;;;37111:66:0;;14917:2:1;37111:66:0;;;14899:21:1;14956:2;14936:18;;;14929:30;14995:34;14975:18;;;14968:62;15066:14;15046:18;;;15039:42;15098:19;;37111:66:0;14715:408:1;35242:813:0;35482:13;;;14073:20;14121:8;35478:570;;35518:79;;;;;:43;;;;;;:79;;35562:8;;35572:4;;35578:3;;35583:7;;35592:4;;35518:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35518:79:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35514:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;35910:6;35903:14;;-1:-1:-1;;;35903:14:0;;;;;;;;:::i;35514:523::-;;;35959:62;;-1:-1:-1;;;35959:62:0;;13270:2:1;35959:62:0;;;13252:21:1;13309:2;13289:18;;;13282:30;13348:34;13328:18;;;13321:62;13419:22;13399:18;;;13392:50;13459:19;;35959:62:0;13068:416:1;35514:523:0;35679:60;;;35691:48;35679:60;35675:159;;35764:50;;-1:-1:-1;;;35764:50:0;;13691:2:1;35764:50:0;;;13673:21:1;13730:2;13710:18;;;13703:30;13769:34;13749:18;;;13742:62;13840:10;13820:18;;;13813:38;13868:19;;35764:50:0;13489:404:1;36063:198:0;36183:16;;;36197:1;36183:16;;;;;;;;;36129;;36158:22;;36183:16;;;;;;;;;;;;-1:-1:-1;36183:16:0;36158:41;;36221:7;36210:5;36216:1;36210:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;36248:5;36063:198;-1:-1:-1;;36063:198:0:o;34490:744::-;34705:13;;;14073:20;14121:8;34701:526;;34741:72;;;;;:38;;;;;;:72;;34780:8;;34790:4;;34796:2;;34800:6;;34808:4;;34741:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34741:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34737:479;;;;:::i;:::-;34863:55;;;34875:43;34863:55;34859:154;;34943:50;;-1:-1:-1;;;34943:50:0;;13691:2:1;34943:50:0;;;13673:21:1;13730:2;13710:18;;;13703:30;13769:34;13749:18;;;13742:62;13840:10;13820:18;;;13813:38;13868:19;;34943:50:0;13489:404:1;14:735;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;224:43;264:2;224:43;:::i;:::-;296:2;290:9;308:31;336:2;328:6;308:31;:::i;:::-;374:18;;;408:15;;;;-1:-1:-1;443:15:1;;;493:1;489:10;;;477:23;;473:32;;470:41;-1:-1:-1;467:61:1;;;524:1;521;514:12;467:61;546:1;556:163;570:2;567:1;564:9;556:163;;;627:17;;615:30;;665:12;;;;697;;;;588:1;581:9;556:163;;;-1:-1:-1;737:6:1;;14:735;-1:-1:-1;;;;;;;14:735:1:o;754:614::-;796:5;849:3;842:4;834:6;830:17;826:27;816:55;;867:1;864;857:12;816:55;903:6;890:20;929:18;925:2;922:26;919:52;;;951:18;;:::i;:::-;1000:2;994:9;1012:126;1132:4;1063:66;1056:4;1052:2;1048:13;1044:86;1040:97;1032:6;1012:126;:::i;:::-;1162:2;1154:6;1147:18;1208:3;1201:4;1196:2;1188:6;1184:15;1180:26;1177:35;1174:55;;;1225:1;1222;1215:12;1174:55;1289:2;1282:4;1274:6;1270:17;1263:4;1255:6;1251:17;1238:54;1336:1;1312:15;;;1329:4;1308:26;1301:37;;;;1316:6;754:614;-1:-1:-1;;;754:614:1:o;1373:247::-;1432:6;1485:2;1473:9;1464:7;1460:23;1456:32;1453:52;;;1501:1;1498;1491:12;1453:52;1540:9;1527:23;1559:31;1584:5;1559:31;:::i;:::-;1609:5;1373:247;-1:-1:-1;;;1373:247:1:o;1625:251::-;1695:6;1748:2;1736:9;1727:7;1723:23;1719:32;1716:52;;;1764:1;1761;1754:12;1716:52;1796:9;1790:16;1815:31;1840:5;1815:31;:::i;1881:388::-;1949:6;1957;2010:2;1998:9;1989:7;1985:23;1981:32;1978:52;;;2026:1;2023;2016:12;1978:52;2065:9;2052:23;2084:31;2109:5;2084:31;:::i;:::-;2134:5;-1:-1:-1;2191:2:1;2176:18;;2163:32;2204:33;2163:32;2204:33;:::i;:::-;2256:7;2246:17;;;1881:388;;;;;:::o;2274:1071::-;2428:6;2436;2444;2452;2460;2513:3;2501:9;2492:7;2488:23;2484:33;2481:53;;;2530:1;2527;2520:12;2481:53;2569:9;2556:23;2588:31;2613:5;2588:31;:::i;:::-;2638:5;-1:-1:-1;2695:2:1;2680:18;;2667:32;2708:33;2667:32;2708:33;:::i;:::-;2760:7;-1:-1:-1;2818:2:1;2803:18;;2790:32;2841:18;2871:14;;;2868:34;;;2898:1;2895;2888:12;2868:34;2921:61;2974:7;2965:6;2954:9;2950:22;2921:61;:::i;:::-;2911:71;;3035:2;3024:9;3020:18;3007:32;2991:48;;3064:2;3054:8;3051:16;3048:36;;;3080:1;3077;3070:12;3048:36;3103:63;3158:7;3147:8;3136:9;3132:24;3103:63;:::i;:::-;3093:73;;3219:3;3208:9;3204:19;3191:33;3175:49;;3249:2;3239:8;3236:16;3233:36;;;3265:1;3262;3255:12;3233:36;;3288:51;3331:7;3320:8;3309:9;3305:24;3288:51;:::i;:::-;3278:61;;;2274:1071;;;;;;;;:::o;3350:734::-;3454:6;3462;3470;3478;3486;3539:3;3527:9;3518:7;3514:23;3510:33;3507:53;;;3556:1;3553;3546:12;3507:53;3595:9;3582:23;3614:31;3639:5;3614:31;:::i;:::-;3664:5;-1:-1:-1;3721:2:1;3706:18;;3693:32;3734:33;3693:32;3734:33;:::i;:::-;3786:7;-1:-1:-1;3840:2:1;3825:18;;3812:32;;-1:-1:-1;3891:2:1;3876:18;;3863:32;;-1:-1:-1;3946:3:1;3931:19;;3918:33;3974:18;3963:30;;3960:50;;;4006:1;4003;3996:12;3960:50;4029:49;4070:7;4061:6;4050:9;4046:22;4029:49;:::i;4089:382::-;4154:6;4162;4215:2;4203:9;4194:7;4190:23;4186:32;4183:52;;;4231:1;4228;4221:12;4183:52;4270:9;4257:23;4289:31;4314:5;4289:31;:::i;:::-;4339:5;-1:-1:-1;4396:2:1;4381:18;;4368:32;4409:30;4368:32;4409:30;:::i;4476:315::-;4544:6;4552;4605:2;4593:9;4584:7;4580:23;4576:32;4573:52;;;4621:1;4618;4611:12;4573:52;4660:9;4647:23;4679:31;4704:5;4679:31;:::i;:::-;4729:5;4781:2;4766:18;;;;4753:32;;-1:-1:-1;;;4476:315:1:o;4796:1288::-;4914:6;4922;4975:2;4963:9;4954:7;4950:23;4946:32;4943:52;;;4991:1;4988;4981:12;4943:52;5031:9;5018:23;5060:18;5101:2;5093:6;5090:14;5087:34;;;5117:1;5114;5107:12;5087:34;5155:6;5144:9;5140:22;5130:32;;5200:7;5193:4;5189:2;5185:13;5181:27;5171:55;;5222:1;5219;5212:12;5171:55;5258:2;5245:16;5280:4;5303:43;5343:2;5303:43;:::i;:::-;5375:2;5369:9;5387:31;5415:2;5407:6;5387:31;:::i;:::-;5453:18;;;5487:15;;;;-1:-1:-1;5522:11:1;;;5564:1;5560:10;;;5552:19;;5548:28;;5545:41;-1:-1:-1;5542:61:1;;;5599:1;5596;5589:12;5542:61;5621:1;5612:10;;5631:238;5645:2;5642:1;5639:9;5631:238;;;5716:3;5703:17;5733:31;5758:5;5733:31;:::i;:::-;5777:18;;5663:1;5656:9;;;;;5815:12;;;;5847;;5631:238;;;-1:-1:-1;5888:6:1;-1:-1:-1;;5932:18:1;;5919:32;;-1:-1:-1;;5963:16:1;;;5960:36;;;5992:1;5989;5982:12;5960:36;;6015:63;6070:7;6059:8;6048:9;6044:24;6015:63;:::i;:::-;6005:73;;;4796:1288;;;;;:::o;6089:245::-;6156:6;6209:2;6197:9;6188:7;6184:23;6180:32;6177:52;;;6225:1;6222;6215:12;6177:52;6257:9;6251:16;6276:28;6298:5;6276:28;:::i;6339:248::-;6407:6;6415;6468:2;6456:9;6447:7;6443:23;6439:32;6436:52;;;6484:1;6481;6474:12;6436:52;-1:-1:-1;;6507:23:1;;;6577:2;6562:18;;;6549:32;;-1:-1:-1;6339:248:1:o;6592:245::-;6650:6;6703:2;6691:9;6682:7;6678:23;6674:32;6671:52;;;6719:1;6716;6709:12;6671:52;6758:9;6745:23;6777:30;6801:5;6777:30;:::i;6842:249::-;6911:6;6964:2;6952:9;6943:7;6939:23;6935:32;6932:52;;;6980:1;6977;6970:12;6932:52;7012:9;7006:16;7031:30;7055:5;7031:30;:::i;7096:180::-;7155:6;7208:2;7196:9;7187:7;7183:23;7179:32;7176:52;;;7224:1;7221;7214:12;7176:52;-1:-1:-1;7247:23:1;;7096:180;-1:-1:-1;7096:180:1:o;7281:184::-;7351:6;7404:2;7392:9;7383:7;7379:23;7375:32;7372:52;;;7420:1;7417;7410:12;7372:52;-1:-1:-1;7443:16:1;;7281:184;-1:-1:-1;7281:184:1:o;7470:435::-;7523:3;7561:5;7555:12;7588:6;7583:3;7576:19;7614:4;7643:2;7638:3;7634:12;7627:19;;7680:2;7673:5;7669:14;7701:1;7711:169;7725:6;7722:1;7719:13;7711:169;;;7786:13;;7774:26;;7820:12;;;;7855:15;;;;7747:1;7740:9;7711:169;;;-1:-1:-1;7896:3:1;;7470:435;-1:-1:-1;;;;;7470:435:1:o;7910:530::-;7951:3;7989:5;7983:12;8016:6;8011:3;8004:19;8041:1;8051:162;8065:6;8062:1;8059:13;8051:162;;;8127:4;8183:13;;;8179:22;;8173:29;8155:11;;;8151:20;;8144:59;8080:12;8051:162;;;8231:6;8228:1;8225:13;8222:87;;;8297:1;8290:4;8281:6;8276:3;8272:16;8268:27;8261:38;8222:87;-1:-1:-1;8354:2:1;8342:15;8359:66;8338:88;8329:98;;;;8429:4;8325:109;;7910:530;-1:-1:-1;;7910:530:1:o;8928:849::-;9250:4;9279:42;9360:2;9352:6;9348:15;9337:9;9330:34;9412:2;9404:6;9400:15;9395:2;9384:9;9380:18;9373:43;;9452:3;9447:2;9436:9;9432:18;9425:31;9479:57;9531:3;9520:9;9516:19;9508:6;9479:57;:::i;:::-;9584:9;9576:6;9572:22;9567:2;9556:9;9552:18;9545:50;9618:44;9655:6;9647;9618:44;:::i;:::-;9604:58;;9711:9;9703:6;9699:22;9693:3;9682:9;9678:19;9671:51;9739:32;9764:6;9756;9739:32;:::i;:::-;9731:40;8928:849;-1:-1:-1;;;;;;;;8928:849:1:o;9782:583::-;10004:4;10033:42;10114:2;10106:6;10102:15;10091:9;10084:34;10166:2;10158:6;10154:15;10149:2;10138:9;10134:18;10127:43;;10206:6;10201:2;10190:9;10186:18;10179:34;10249:6;10244:2;10233:9;10229:18;10222:34;10293:3;10287;10276:9;10272:19;10265:32;10314:45;10354:3;10343:9;10339:19;10331:6;10314:45;:::i;:::-;10306:53;9782:583;-1:-1:-1;;;;;;;9782:583:1:o;10370:408::-;10585:42;10577:6;10573:55;10562:9;10555:74;10665:6;10660:2;10649:9;10645:18;10638:34;10708:2;10703;10692:9;10688:18;10681:30;10536:4;10728:44;10768:2;10757:9;10753:18;10745:6;10728:44;:::i;:::-;10720:52;10370:408;-1:-1:-1;;;;;10370:408:1:o;10783:261::-;10962:2;10951:9;10944:21;10925:4;10982:56;11034:2;11023:9;11019:18;11011:6;10982:56;:::i;11049:465::-;11306:2;11295:9;11288:21;11269:4;11332:56;11384:2;11373:9;11369:18;11361:6;11332:56;:::i;:::-;11436:9;11428:6;11424:22;11419:2;11408:9;11404:18;11397:50;11464:44;11501:6;11493;11464:44;:::i;12844:219::-;12993:2;12982:9;12975:21;12956:4;13013:44;13053:2;13042:9;13038:18;13030:6;13013:44;:::i;20771:183::-;20831:4;20864:18;20856:6;20853:30;20850:56;;;20886:18;;:::i;:::-;-1:-1:-1;20931:1:1;20927:14;20943:4;20923:25;;20771:183::o;20959:128::-;20999:3;21030:1;21026:6;21023:1;21020:13;21017:39;;;21036:18;;:::i;:::-;-1:-1:-1;21072:9:1;;20959:128::o;21092:125::-;21132:4;21160:1;21157;21154:8;21151:34;;;21165:18;;:::i;:::-;-1:-1:-1;21202:9:1;;21092:125::o;21222:437::-;21301:1;21297:12;;;;21344;;;21365:61;;21419:4;21411:6;21407:17;21397:27;;21365:61;21472:2;21464:6;21461:14;21441:18;21438:38;21435:218;;;21509:77;21506:1;21499:88;21610:4;21607:1;21600:15;21638:4;21635:1;21628:15;21435:218;;21222:437;;;:::o;21664:308::-;21770:66;21765:2;21759:4;21755:13;21751:86;21743:6;21739:99;21904:6;21892:10;21889:22;21868:18;21856:10;21853:34;21850:62;21847:88;;;21915:18;;:::i;:::-;21951:2;21944:22;-1:-1:-1;;21664:308:1:o;21977:195::-;22016:3;22047:66;22040:5;22037:77;22034:103;;;22117:18;;:::i;:::-;-1:-1:-1;22164:1:1;22153:13;;21977:195::o;22177:266::-;22209:1;22235;22225:189;;22270:77;22267:1;22260:88;22371:4;22368:1;22361:15;22399:4;22396:1;22389:15;22225:189;-1:-1:-1;22428:9:1;;22177:266::o;22448:184::-;22500:77;22497:1;22490:88;22597:4;22594:1;22587:15;22621:4;22618:1;22611:15;22637:184;22689:77;22686:1;22679:88;22786:4;22783:1;22776:15;22810:4;22807:1;22800:15;22826:184;22878:77;22875:1;22868:88;22975:4;22972:1;22965:15;22999:4;22996:1;22989:15;23015:179;23050:3;23092:1;23074:16;23071:23;23068:120;;;23138:1;23135;23132;23117:23;-1:-1:-1;23175:1:1;23169:8;23164:3;23160:18;23015:179;:::o;23199:731::-;23238:3;23280:4;23262:16;23259:26;23256:39;;;23199:731;:::o;23256:39::-;23322:2;23316:9;23344:66;23465:2;23447:16;23443:25;23440:1;23434:4;23419:50;23498:4;23492:11;23522:16;23557:18;23628:2;23621:4;23613:6;23609:17;23606:25;23601:2;23593:6;23590:14;23587:45;23584:58;;;23635:5;;;;;23199:731;:::o;23584:58::-;23672:6;23666:4;23662:17;23651:28;;23708:3;23702:10;23735:2;23727:6;23724:14;23721:27;;;23741:5;;;;;;23199:731;:::o;23721:27::-;23825:2;23806:16;23800:4;23796:27;23792:36;23785:4;23776:6;23771:3;23767:16;23763:27;23760:69;23757:82;;;23832:5;;;;;;23199:731;:::o;23757:82::-;23848:57;23899:4;23890:6;23882;23878:19;23874:30;23868:4;23848:57;:::i;:::-;-1:-1:-1;23921:3:1;;23199:731;-1:-1:-1;;;;;23199:731:1:o;23935:154::-;24021:42;24014:5;24010:54;24003:5;24000:65;23990:93;;24079:1;24076;24069:12;24094:118;24180:5;24173:13;24166:21;24159:5;24156:32;24146:60;;24202:1;24199;24192:12;24217:177;24302:66;24295:5;24291:78;24284:5;24281:89;24271:117;;24384:1;24381;24374:12

Swarm Source

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