ETH Price: $2,270.42 (+1.67%)

Token

 

Overview

Max Total Supply

500

Holders

79

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
lukasz82.eth
0x257b2ec44566384b70e60e010174d54a05be0f60
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:
ERC1155HeartsToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-25
*/

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: 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.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        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 {
        _setApprovalForAll(_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 token owner or 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: caller is not token owner or 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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, 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);

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

        _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);

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

        _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 `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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 _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);

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

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

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

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

        address operator = _msgSender();

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

        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: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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 `ids` and `amounts` 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 {}

    /**
     * @dev Hook that is called after 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 _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

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

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

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

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    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);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: contracts/ERC1155HeartsToken.sol


pragma solidity ^0.8.0;

/**
 * @title ERC1155HeartsToken
 * @dev ERC1155 token contract for Serduszka of WOSP 2023.
 */
contract ERC1155HeartsToken is Ownable, ERC1155Supply {
    using Strings for uint256;
    using Strings for uint8;

    struct SerieCount {
        uint8 kind;
        uint16 count;
    }

    address private _wallet;
    string private _metadataUriPrefix;
    mapping(uint8 => SerieCount) private _seriesCounts;
    mapping(uint256 => bool) private _claimedTokens;
    uint256 public currentIndex = 1;
    uint256 public seriesStartIndex = 0;
    uint8 public seriesCount = 0;
    bool public canMint = true;

    uint96 constant KINDS_COUNT = 10;

    /**
     * @dev Requires that minting is still possible.
     */
    modifier onlyWhenCanMint {
        require(canMint, "ERC1155HeartsToken: minting was already finished");
        _;
    }

    /**
     * @dev Creates token instance with URI prefix set to `metadataUriPrefix` and minted to `_wallet`.
     */
    constructor(address wallet, string memory metadataUriPrefix) ERC1155("") {
        require(wallet != address(0), "ERC1155HeartsToken: cannot mint to the zero address");

        _wallet = wallet;
        _metadataUriPrefix = metadataUriPrefix;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory identifiers, uint256[] memory counts, bytes memory data) internal virtual override {
        if (from != address(0) && to != address(0)) {
            for (uint256 i = 0; i < identifiers.length; ++i) {
                uint256 identifier = identifiers[i];

                require(!_claimedTokens[identifier], "ERC1155HeartsToken: token was already claimed");

                _claimedTokens[identifier] = true;
            }
        }

        super._beforeTokenTransfer(operator, from, to, identifiers, counts, data);
    }

    /**
     * @dev Mints `count` of tokens to `_wallet`.
     */
    function _mintTokens(uint256 count) internal {
        require(count > 0, "ERC1155HeartsToken: count must be bigger than 0");

        uint256[] memory identifiers = new uint256[](count);
        uint256[] memory counts = new uint256[](count);

        for (uint256 i = 0; i < count; ++i) {
            identifiers[i] = currentIndex + i;
            counts[i] = 1;
        }

        currentIndex += count;

        _mintBatch(_wallet, identifiers, counts, "");
    }

    /**
     * @dev Updates internal state for `count` tokens of a `kind` tokens serie.
     */
    function _updateSeriesCounts(uint8 kind, uint16 count) internal {
        require(kind > 0 && kind <= KINDS_COUNT, "ERC1155HeartsToken: kind out of range");

        if (seriesCount == 0) {
            seriesStartIndex = currentIndex;
        }

        if (seriesCount > 0 && _seriesCounts[seriesCount - 1].kind == kind) {
            _seriesCounts[seriesCount - 1].count += count;
        } else {
            _seriesCounts[seriesCount] = SerieCount(kind, count);

            ++seriesCount;
        }
    }

     /**
     * @dev Burns tokens specified by `identifiers`, only if they belong to the `_wallet`.
     */
    function burnTokens(uint256[] calldata identifiers) external onlyOwner {
        require(identifiers.length > 0, "ERC1155HeartsToken: list cannot be empty");

        uint256[] memory counts = new uint256[](identifiers.length);

        for (uint256 i = 0; i < identifiers.length; ++i) {
            counts[i] = 1;
        }

        _burnBatch(_wallet, identifiers, counts);
    }

    /**
     * @dev Mints `count` of mixed tokens to `_wallet`.
     */
    function mintMixedTokens(uint256 count) external onlyOwner onlyWhenCanMint {
        require(seriesStartIndex == 0, "ERC1155HeartsToken: cannot mint mixed tokens before tokens of a kind");

        _mintTokens(count);
    }

    /**
     * @dev Mints `count` tokens of a `kind` to `_wallet`.
     */
    function mintTokensKind(uint8 kind, uint16 count) public onlyOwner onlyWhenCanMint {
        require(exists(1), "ERC1155HeartsToken: cannot mint tokens of a kind before mixed tokens");

        _updateSeriesCounts(kind, count);
        _mintTokens(count);
    }

    /**
     * @dev Mints tokens of a kind in series identified by `kinds` and `counts` to `_wallet`.
     */
    function mintTokensKindBatch(uint8[] calldata kinds, uint16[] calldata counts) external onlyOwner onlyWhenCanMint {
        require(exists(1), "ERC1155HeartsToken: cannot mint tokens of a kind before mixed tokens");
        require(kinds.length > 0, "ERC1155HeartsToken: list cannot be empty");
        require(kinds.length == counts.length, "ERC1155HeartsToken: lists must have the same length");

        uint256 count = 0;

        for (uint8 i = 0; i < kinds.length; ++i) {
            count += counts[i];

            _updateSeriesCounts(kinds[i], counts[i]);
        }

        _mintTokens(count);
    }

    /**
     * @dev Closes minting.
     */
    function closeMinting() external onlyOwner onlyWhenCanMint {
        canMint = false;
    }

    /**
     * @dev Sets metadata URI prefix to `metadataUriPrefix`.
     */
    function setMetadataUriPrefix(string calldata metadataUriPrefix) external onlyOwner {
        require(keccak256(abi.encodePacked(_metadataUriPrefix)) != keccak256(abi.encodePacked(metadataUriPrefix)), "ERC721GoldenHeartsLimitedToken: new value is the same");

        _metadataUriPrefix = metadataUriPrefix;
    }

    /**
     * @dev Returns metadata URI for given `identifier`.
     */
    function uri(uint256 identifier) public view override returns (string memory) {
        require(exists(identifier), "ERC1155HeartsToken: token with given identifier does not exist");

        if (identifier >= seriesStartIndex) {
            uint256 offset = seriesStartIndex;

            for (uint8 i = 0; i < seriesCount; ++i) {
                if (identifier >= offset && identifier < offset + _seriesCounts[i].count) {
                    return string(abi.encodePacked(_metadataUriPrefix, _seriesCounts[i].kind.toString(), ".json"));
                }

                offset += _seriesCounts[i].count;
            }
        }

        return string(abi.encodePacked(_metadataUriPrefix, (((identifier - 1) % KINDS_COUNT) + 1).toString(), ".json"));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"string","name":"metadataUriPrefix","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"identifiers","type":"uint256[]"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintMixedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"kind","type":"uint8"},{"internalType":"uint16","name":"count","type":"uint16"}],"name":"mintTokensKind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"kinds","type":"uint8[]"},{"internalType":"uint16[]","name":"counts","type":"uint16[]"}],"name":"mintTokensKindBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seriesCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seriesStartIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadataUriPrefix","type":"string"}],"name":"setMetadataUriPrefix","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"identifier","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405260016009556000600a556000600b60006101000a81548160ff021916908360ff1602179055506001600b60016101000a81548160ff0219169083151502179055503480156200005257600080fd5b50604051620056d3380380620056d38339818101604052810190620000789190620003bc565b60405180602001604052806000815250620000a86200009c6200018f60201b60201c565b6200019760201b60201c565b620000b9816200025b60201b60201c565b50600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200012d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001249062000449565b60405180910390fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600690805190602001906200018692919062000277565b5050506200069d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600390805190602001906200027392919062000277565b5050565b828054620002859062000545565b90600052602060002090601f016020900481019282620002a95760008555620002f5565b82601f10620002c457805160ff1916838001178555620002f5565b82800160010185558215620002f5579182015b82811115620002f4578251825591602001919060010190620002d7565b5b50905062000304919062000308565b5090565b5b808211156200032357600081600090555060010162000309565b5090565b60006200033e620003388462000494565b6200046b565b9050828152602081018484840111156200035d576200035c62000614565b5b6200036a8482856200050f565b509392505050565b600081519050620003838162000683565b92915050565b600082601f830112620003a157620003a06200060f565b5b8151620003b384826020860162000327565b91505092915050565b60008060408385031215620003d657620003d56200061e565b5b6000620003e68582860162000372565b925050602083015167ffffffffffffffff8111156200040a576200040962000619565b5b620004188582860162000389565b9150509250929050565b600062000431603383620004ca565b91506200043e8262000634565b604082019050919050565b60006020820190508181036000830152620004648162000422565b9050919050565b6000620004776200048a565b90506200048582826200057b565b919050565b6000604051905090565b600067ffffffffffffffff821115620004b257620004b1620005e0565b5b620004bd8262000623565b9050602081019050919050565b600082825260208201905092915050565b6000620004e882620004ef565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200052f57808201518184015260208101905062000512565b838111156200053f576000848401525b50505050565b600060028204905060018216806200055e57607f821691505b60208210811415620005755762000574620005b1565b5b50919050565b620005868262000623565b810181811067ffffffffffffffff82111715620005a857620005a7620005e0565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524331313535486561727473546f6b656e3a2063616e6e6f74206d696e742060008201527f746f20746865207a65726f206164647265737300000000000000000000000000602082015250565b6200068e81620004db565b81146200069a57600080fd5b50565b61502680620006ad6000396000f3fe608060405234801561001057600080fd5b506004361061014c5760003560e01c806387491c60116100c3578063beb9716d1161007c578063beb9716d14610387578063d7f2c0ef146103a5578063e8518ced146103c3578063e985e9c5146103df578063f242432a1461040f578063f2fde38b1461042b5761014c565b806387491c60146102d95780638da5cb5b146102e3578063a22cb46514610301578063ad2628cd1461031d578063b052068e14610339578063bd85b039146103575761014c565b80634e1273f4116101155780634e1273f41461021b5780634f558e791461024b57806362880fe71461027b57806367a53173146102975780636f45c6a3146102b3578063715018a6146102cf5761014c565b8062fdd58e1461015157806301ffc9a7146101815780630e89341c146101b157806326987b60146101e15780632eb2c2d6146101ff575b600080fd5b61016b60048036038101906101669190613399565b610447565b6040516101789190614115565b60405180910390f35b61019b6004803603810190610196919061351f565b610511565b6040516101a89190613db8565b60405180910390f35b6101cb60048036038101906101c691906135f3565b6105f3565b6040516101d89190613dd3565b60405180910390f35b6101e96107cf565b6040516101f69190614115565b60405180910390f35b610219600480360381019061021491906131f3565b6107d5565b005b610235600480360381019061023091906133d9565b610876565b6040516102429190613d5f565b60405180910390f35b610265600480360381019061026091906135f3565b61098f565b6040516102729190613db8565b60405180910390f35b6102956004803603810190610290919061349e565b6109a3565b005b6102b160048036038101906102ac9190613451565b610b9f565b005b6102cd60048036038101906102c8919061364d565b610cf1565b005b6102d7610dac565b005b6102e1610dc0565b005b6102eb610e34565b6040516102f89190613c82565b60405180910390f35b61031b60048036038101906103169190613359565b610e5d565b005b61033760048036038101906103329190613579565b610e73565b005b610341610f23565b60405161034e9190614115565b60405180910390f35b610371600480360381019061036c91906135f3565b610f29565b60405161037e9190614115565b60405180910390f35b61038f610f46565b60405161039c9190613db8565b60405180910390f35b6103ad610f59565b6040516103ba9190614159565b60405180910390f35b6103dd60048036038101906103d891906135f3565b610f6c565b005b6103f960048036038101906103f491906131b3565b611014565b6040516104069190613db8565b60405180910390f35b610429600480360381019061042491906132c2565b6110a8565b005b61044560048036038101906104409190613186565b611149565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156104b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104af90613eb5565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105dc57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ec57506105eb826111cd565b5b9050919050565b60606105fe8261098f565b61063d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063490613f15565b60405180910390fd5b600a54821061076a576000600a54905060005b600b60009054906101000a900460ff1660ff168160ff161015610767578184101580156106b55750600760008260ff1660ff16815260200190815260200160002060000160019054906101000a900461ffff1661ffff16826106b291906142eb565b84105b1561071a5760066106f1600760008460ff1660ff16815260200190815260200160002060000160009054906101000a900460ff1660ff16611237565b604051602001610702929190613c53565b604051602081830303815290604052925050506107ca565b600760008260ff1660ff16815260200190815260200160002060000160019054906101000a900461ffff1661ffff168261075491906142eb565b91508061076090614526565b9050610650565b50505b60066107a76001600a6bffffffffffffffffffffffff1660018661078e9190614341565b6107989190614550565b6107a291906142eb565b611237565b6040516020016107b8929190613c53565b60405160208183030381529060405290505b919050565b60095481565b6107dd61130f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061082357506108228561081d61130f565b611014565b5b610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990613ef5565b60405180910390fd5b61086f8585858585611317565b5050505050565b606081518351146108bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b390614035565b60405180910390fd5b6000835167ffffffffffffffff8111156108d9576108d861463d565b5b6040519080825280602002602001820160405280156109075781602001602082028036833780820191505090505b50905060005b84518110156109845761095485828151811061092c5761092b61460e565b5b60200260200101518583815181106109475761094661460e565b5b6020026020010151610447565b8282815181106109675761096661460e565b5b6020026020010181815250508061097d906144dd565b905061090d565b508091505092915050565b60008061099b83610f29565b119050919050565b6109ab61163c565b600b60019054906101000a900460ff166109fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f1906140b5565b60405180910390fd5b610a04600161098f565b610a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3a906140d5565b60405180910390fd5b60008484905011610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090613ed5565b60405180910390fd5b818190508484905014610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613f55565b60405180910390fd5b6000805b858590508160ff161015610b8e5783838260ff16818110610af957610af861460e565b5b9050602002016020810190610b0e91906135c6565b61ffff1682610b1d91906142eb565b9150610b7d86868360ff16818110610b3857610b3761460e565b5b9050602002016020810190610b4d9190613620565b85858460ff16818110610b6357610b6261460e565b5b9050602002016020810190610b7891906135c6565b6116ba565b80610b8790614526565b9050610ad5565b50610b98816118e9565b5050505050565b610ba761163c565b60008282905011610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be490613ed5565b60405180910390fd5b60008282905067ffffffffffffffff811115610c0c57610c0b61463d565b5b604051908082528060200260200182016040528015610c3a5781602001602082028036833780820191505090505b50905060005b83839050811015610c7d576001828281518110610c6057610c5f61460e565b5b60200260200101818152505080610c76906144dd565b9050610c40565b50610cec600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083611a8c565b505050565b610cf961163c565b600b60019054906101000a900460ff16610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f906140b5565b60405180910390fd5b610d52600161098f565b610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d88906140d5565b60405180910390fd5b610d9b82826116ba565b610da88161ffff166118e9565b5050565b610db461163c565b610dbe6000611d5d565b565b610dc861163c565b600b60019054906101000a900460ff16610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e906140b5565b60405180910390fd5b6000600b60016101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e6f610e6861130f565b8383611e21565b5050565b610e7b61163c565b8181604051602001610e8e929190613c23565b604051602081830303815290604052805190602001206006604051602001610eb69190613c3c565b604051602081830303815290604052805190602001201415610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613e55565b60405180910390fd5b818160069190610f1e929190612d4c565b505050565b600a5481565b600060046000838152602001908152602001600020549050919050565b600b60019054906101000a900460ff1681565b600b60009054906101000a900460ff1681565b610f7461163c565b600b60019054906101000a900460ff16610fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fba906140b5565b60405180910390fd5b6000600a5414611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff906140f5565b60405180910390fd5b611011816118e9565b50565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110b061130f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806110f657506110f5856110f061130f565b611014565b5b611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c90613ef5565b60405180910390fd5b6111428585858585611f8e565b5050505050565b61115161163c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890613e75565b60405180910390fd5b6111ca81611d5d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600060016112468461222d565b01905060008167ffffffffffffffff8111156112655761126461463d565b5b6040519080825280601f01601f1916602001820160405280156112975781602001600182028036833780820191505090505b509050600082602001820190505b600115611304578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816112ee576112ed6145b0565b5b04945060008514156112ff57611304565b6112a5565b819350505050919050565b600033905090565b815183511461135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135290614055565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156113cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c290613f35565b60405180910390fd5b60006113d561130f565b90506113e5818787878787612380565b60005b84518110156115995760008582815181106114065761140561460e565b5b6020026020010151905060008583815181106114255761142461460e565b5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be90613f95565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461157e91906142eb565b9250508190555050505080611592906144dd565b90506113e8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611610929190613d81565b60405180910390a46116268187878787876124d1565b6116348187878787876124d9565b505050505050565b61164461130f565b73ffffffffffffffffffffffffffffffffffffffff16611662610e34565b73ffffffffffffffffffffffffffffffffffffffff16146116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af90613fb5565b60405180910390fd5b565b60008260ff161180156116df5750600a6bffffffffffffffffffffffff168260ff1611155b61171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590613e15565b60405180910390fd5b6000600b60009054906101000a900460ff1660ff16141561174357600954600a819055505b6000600b60009054906101000a900460ff1660ff161180156117ae57508160ff16600760006001600b60009054906101000a900460ff166117849190614375565b60ff1660ff16815260200190815260200160002060000160009054906101000a900460ff1660ff16145b156118265780600760006001600b60009054906101000a900460ff166117d49190614375565b60ff1660ff16815260200190815260200160002060000160018282829054906101000a900461ffff1661180791906142b3565b92506101000a81548161ffff021916908361ffff1602179055506118e5565b60405180604001604052808360ff1681526020018261ffff1681525060076000600b60009054906101000a900460ff1660ff1660ff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff160217905550905050600b600081819054906101000a900460ff166118cc90614526565b91906101000a81548160ff021916908360ff1602179055505b5050565b6000811161192c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192390613ff5565b60405180910390fd5b60008167ffffffffffffffff8111156119485761194761463d565b5b6040519080825280602002602001820160405280156119765781602001602082028036833780820191505090505b50905060008267ffffffffffffffff8111156119955761199461463d565b5b6040519080825280602002602001820160405280156119c35781602001602082028036833780820191505090505b50905060005b83811015611a3057806009546119df91906142eb565b8382815181106119f2576119f161460e565b5b6020026020010181815250506001828281518110611a1357611a1261460e565b5b60200260200101818152505080611a29906144dd565b90506119c9565b508260096000828254611a4391906142eb565b92505081905550611a87600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383604051806020016040528060008152506126c0565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af390613f75565b60405180910390fd5b8051825114611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614055565b60405180910390fd5b6000611b4a61130f565b9050611b6a81856000868660405180602001604052806000815250612380565b60005b8351811015611cb9576000848281518110611b8b57611b8a61460e565b5b602002602001015190506000848381518110611baa57611ba961460e565b5b6020026020010151905060006001600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4390613e95565b60405180910390fd5b8181036001600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611cb1906144dd565b915050611b6d565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d31929190613d81565b60405180910390a4611d57818560008686604051806020016040528060008152506124d1565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790614015565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f819190613db8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff590613f35565b60405180910390fd5b600061200861130f565b90506000612015856128ee565b90506000612022856128ee565b9050612032838989858589612380565b60006001600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c190613f95565b60405180910390fd5b8581036001600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856001600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218191906142eb565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516121fe929190614130565b60405180910390a4612214848a8a86868a6124d1565b612222848a8a8a8a8a612968565b505050505050505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061228b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612281576122806145b0565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106122c8576d04ee2d6d415b85acef810000000083816122be576122bd6145b0565b5b0492506020810190505b662386f26fc1000083106122f757662386f26fc1000083816122ed576122ec6145b0565b5b0492506010810190505b6305f5e1008310612320576305f5e1008381612316576123156145b0565b5b0492506008810190505b612710831061234557612710838161233b5761233a6145b0565b5b0492506004810190505b60648310612368576064838161235e5761235d6145b0565b5b0492506002810190505b600a8310612377576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156123ea5750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156124bb5760005b83518110156124b95760008482815181106124105761240f61460e565b5b602002602001015190506008600082815260200190815260200160002060009054906101000a900460ff161561247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290613e35565b60405180910390fd5b60016008600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050806124b2906144dd565b90506123f2565b505b6124c9868686868686612b4f565b505050505050565b505050505050565b6124f88473ffffffffffffffffffffffffffffffffffffffff16612d21565b156126b8578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161253e959493929190613c9d565b602060405180830381600087803b15801561255857600080fd5b505af192505050801561258957506040513d601f19601f82011682018060405250810190612586919061354c565b60015b61262f5761259561466c565b806308c379a014156125f257506125aa614ed0565b806125b557506125f4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e99190613dd3565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262690614095565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90613df5565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272790614075565b60405180910390fd5b8151835114612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b90614055565b60405180910390fd5b600061277e61130f565b905061278f81600087878787612380565b60005b8451811015612849578381815181106127ae576127ad61460e565b5b6020026020010151600160008784815181106127cd576127cc61460e565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461282f91906142eb565b925050819055508080612841906144dd565b915050612792565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128c1929190613d81565b60405180910390a46128d8816000878787876124d1565b6128e7816000878787876124d9565b5050505050565b60606000600167ffffffffffffffff81111561290d5761290c61463d565b5b60405190808252806020026020018201604052801561293b5781602001602082028036833780820191505090505b50905082816000815181106129535761295261460e565b5b60200260200101818152505080915050919050565b6129878473ffffffffffffffffffffffffffffffffffffffff16612d21565b15612b47578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016129cd959493929190613d05565b602060405180830381600087803b1580156129e757600080fd5b505af1925050508015612a1857506040513d601f19601f82011682018060405250810190612a15919061354c565b60015b612abe57612a2461466c565b806308c379a01415612a815750612a39614ed0565b80612a445750612a83565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a789190613dd3565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab590614095565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3c90613df5565b60405180910390fd5b505b505050505050565b612b5d868686868686612d44565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612c0f5760005b8351811015612c0d57828181518110612bb157612bb061460e565b5b602002602001015160046000868481518110612bd057612bcf61460e565b5b602002602001015181526020019081526020016000206000828254612bf591906142eb565b9250508190555080612c06906144dd565b9050612b95565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d195760005b8351811015612d17576000848281518110612c6557612c6461460e565b5b602002602001015190506000848381518110612c8457612c8361460e565b5b6020026020010151905060006004600084815260200190815260200160002054905081811015612ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce090613fd5565b60405180910390fd5b818103600460008581526020019081526020016000208190555050505080612d10906144dd565b9050612c47565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b828054612d589061447a565b90600052602060002090601f016020900481019282612d7a5760008555612dc1565b82601f10612d9357803560ff1916838001178555612dc1565b82800160010185558215612dc1579182015b82811115612dc0578235825591602001919060010190612da5565b5b509050612dce9190612dd2565b5090565b5b80821115612deb576000816000905550600101612dd3565b5090565b6000612e02612dfd84614199565b614174565b90508083825260208201905082856020860282011115612e2557612e24614698565b5b60005b85811015612e555781612e3b8882612f11565b845260208401935060208301925050600181019050612e28565b5050509392505050565b6000612e72612e6d846141c5565b614174565b90508083825260208201905082856020860282011115612e9557612e94614698565b5b60005b85811015612ec55781612eab888261315c565b845260208401935060208301925050600181019050612e98565b5050509392505050565b6000612ee2612edd846141f1565b614174565b905082815260208101848484011115612efe57612efd61469d565b5b612f09848285614438565b509392505050565b600081359050612f2081614f66565b92915050565b600082601f830112612f3b57612f3a614693565b5b8135612f4b848260208601612def565b91505092915050565b60008083601f840112612f6a57612f69614693565b5b8235905067ffffffffffffffff811115612f8757612f8661468e565b5b602083019150836020820283011115612fa357612fa2614698565b5b9250929050565b60008083601f840112612fc057612fbf614693565b5b8235905067ffffffffffffffff811115612fdd57612fdc61468e565b5b602083019150836020820283011115612ff957612ff8614698565b5b9250929050565b600082601f83011261301557613014614693565b5b8135613025848260208601612e5f565b91505092915050565b60008083601f84011261304457613043614693565b5b8235905067ffffffffffffffff8111156130615761306061468e565b5b60208301915083602082028301111561307d5761307c614698565b5b9250929050565b60008135905061309381614f7d565b92915050565b6000813590506130a881614f94565b92915050565b6000815190506130bd81614f94565b92915050565b600082601f8301126130d8576130d7614693565b5b81356130e8848260208601612ecf565b91505092915050565b60008083601f84011261310757613106614693565b5b8235905067ffffffffffffffff8111156131245761312361468e565b5b6020830191508360018202830111156131405761313f614698565b5b9250929050565b60008135905061315681614fab565b92915050565b60008135905061316b81614fc2565b92915050565b60008135905061318081614fd9565b92915050565b60006020828403121561319c5761319b6146a7565b5b60006131aa84828501612f11565b91505092915050565b600080604083850312156131ca576131c96146a7565b5b60006131d885828601612f11565b92505060206131e985828601612f11565b9150509250929050565b600080600080600060a0868803121561320f5761320e6146a7565b5b600061321d88828901612f11565b955050602061322e88828901612f11565b945050604086013567ffffffffffffffff81111561324f5761324e6146a2565b5b61325b88828901613000565b935050606086013567ffffffffffffffff81111561327c5761327b6146a2565b5b61328888828901613000565b925050608086013567ffffffffffffffff8111156132a9576132a86146a2565b5b6132b5888289016130c3565b9150509295509295909350565b600080600080600060a086880312156132de576132dd6146a7565b5b60006132ec88828901612f11565b95505060206132fd88828901612f11565b945050604061330e8882890161315c565b935050606061331f8882890161315c565b925050608086013567ffffffffffffffff8111156133405761333f6146a2565b5b61334c888289016130c3565b9150509295509295909350565b600080604083850312156133705761336f6146a7565b5b600061337e85828601612f11565b925050602061338f85828601613084565b9150509250929050565b600080604083850312156133b0576133af6146a7565b5b60006133be85828601612f11565b92505060206133cf8582860161315c565b9150509250929050565b600080604083850312156133f0576133ef6146a7565b5b600083013567ffffffffffffffff81111561340e5761340d6146a2565b5b61341a85828601612f26565b925050602083013567ffffffffffffffff81111561343b5761343a6146a2565b5b61344785828601613000565b9150509250929050565b60008060208385031215613468576134676146a7565b5b600083013567ffffffffffffffff811115613486576134856146a2565b5b61349285828601612faa565b92509250509250929050565b600080600080604085870312156134b8576134b76146a7565b5b600085013567ffffffffffffffff8111156134d6576134d56146a2565b5b6134e28782880161302e565b9450945050602085013567ffffffffffffffff811115613505576135046146a2565b5b61351187828801612f54565b925092505092959194509250565b600060208284031215613535576135346146a7565b5b600061354384828501613099565b91505092915050565b600060208284031215613562576135616146a7565b5b6000613570848285016130ae565b91505092915050565b600080602083850312156135905761358f6146a7565b5b600083013567ffffffffffffffff8111156135ae576135ad6146a2565b5b6135ba858286016130f1565b92509250509250929050565b6000602082840312156135dc576135db6146a7565b5b60006135ea84828501613147565b91505092915050565b600060208284031215613609576136086146a7565b5b60006136178482850161315c565b91505092915050565b600060208284031215613636576136356146a7565b5b600061364484828501613171565b91505092915050565b60008060408385031215613664576136636146a7565b5b600061367285828601613171565b925050602061368385828601613147565b9150509250929050565b60006136998383613bf6565b60208301905092915050565b6136ae816143a9565b82525050565b60006136bf82614247565b6136c98185614275565b93506136d483614222565b8060005b838110156137055781516136ec888261368d565b97506136f783614268565b9250506001810190506136d8565b5085935050505092915050565b61371b816143bb565b82525050565b600061372c82614252565b6137368185614286565b9350613746818560208601614447565b61374f816146ac565b840191505092915050565b600061376683856142a8565b9350613773838584614438565b82840190509392505050565b600061378a8261425d565b6137948185614297565b93506137a4818560208601614447565b6137ad816146ac565b840191505092915050565b60006137c38261425d565b6137cd81856142a8565b93506137dd818560208601614447565b80840191505092915050565b600081546137f68161447a565b61380081866142a8565b9450600182166000811461381b576001811461382c5761385f565b60ff1983168652818601935061385f565b61383585614232565b60005b8381101561385757815481890152600182019150602081019050613838565b838801955050505b50505092915050565b6000613875602883614297565b9150613880826146ca565b604082019050919050565b6000613898602583614297565b91506138a382614719565b604082019050919050565b60006138bb602d83614297565b91506138c682614768565b604082019050919050565b60006138de603583614297565b91506138e9826147b7565b604082019050919050565b6000613901602683614297565b915061390c82614806565b604082019050919050565b6000613924602483614297565b915061392f82614855565b604082019050919050565b6000613947602a83614297565b9150613952826148a4565b604082019050919050565b600061396a602883614297565b9150613975826148f3565b604082019050919050565b600061398d602e83614297565b915061399882614942565b604082019050919050565b60006139b0603e83614297565b91506139bb82614991565b604082019050919050565b60006139d3602583614297565b91506139de826149e0565b604082019050919050565b60006139f6603383614297565b9150613a0182614a2f565b604082019050919050565b6000613a19602383614297565b9150613a2482614a7e565b604082019050919050565b6000613a3c602a83614297565b9150613a4782614acd565b604082019050919050565b6000613a5f6005836142a8565b9150613a6a82614b1c565b600582019050919050565b6000613a82602083614297565b9150613a8d82614b45565b602082019050919050565b6000613aa5602883614297565b9150613ab082614b6e565b604082019050919050565b6000613ac8602f83614297565b9150613ad382614bbd565b604082019050919050565b6000613aeb602983614297565b9150613af682614c0c565b604082019050919050565b6000613b0e602983614297565b9150613b1982614c5b565b604082019050919050565b6000613b31602883614297565b9150613b3c82614caa565b604082019050919050565b6000613b54602183614297565b9150613b5f82614cf9565b604082019050919050565b6000613b77603483614297565b9150613b8282614d48565b604082019050919050565b6000613b9a603083614297565b9150613ba582614d97565b604082019050919050565b6000613bbd604483614297565b9150613bc882614de6565b606082019050919050565b6000613be0604483614297565b9150613beb82614e5b565b606082019050919050565b613bff81614421565b82525050565b613c0e81614421565b82525050565b613c1d8161442b565b82525050565b6000613c3082848661375a565b91508190509392505050565b6000613c4882846137e9565b915081905092915050565b6000613c5f82856137e9565b9150613c6b82846137b8565b9150613c7682613a52565b91508190509392505050565b6000602082019050613c9760008301846136a5565b92915050565b600060a082019050613cb260008301886136a5565b613cbf60208301876136a5565b8181036040830152613cd181866136b4565b90508181036060830152613ce581856136b4565b90508181036080830152613cf98184613721565b90509695505050505050565b600060a082019050613d1a60008301886136a5565b613d2760208301876136a5565b613d346040830186613c05565b613d416060830185613c05565b8181036080830152613d538184613721565b90509695505050505050565b60006020820190508181036000830152613d7981846136b4565b905092915050565b60006040820190508181036000830152613d9b81856136b4565b90508181036020830152613daf81846136b4565b90509392505050565b6000602082019050613dcd6000830184613712565b92915050565b60006020820190508181036000830152613ded818461377f565b905092915050565b60006020820190508181036000830152613e0e81613868565b9050919050565b60006020820190508181036000830152613e2e8161388b565b9050919050565b60006020820190508181036000830152613e4e816138ae565b9050919050565b60006020820190508181036000830152613e6e816138d1565b9050919050565b60006020820190508181036000830152613e8e816138f4565b9050919050565b60006020820190508181036000830152613eae81613917565b9050919050565b60006020820190508181036000830152613ece8161393a565b9050919050565b60006020820190508181036000830152613eee8161395d565b9050919050565b60006020820190508181036000830152613f0e81613980565b9050919050565b60006020820190508181036000830152613f2e816139a3565b9050919050565b60006020820190508181036000830152613f4e816139c6565b9050919050565b60006020820190508181036000830152613f6e816139e9565b9050919050565b60006020820190508181036000830152613f8e81613a0c565b9050919050565b60006020820190508181036000830152613fae81613a2f565b9050919050565b60006020820190508181036000830152613fce81613a75565b9050919050565b60006020820190508181036000830152613fee81613a98565b9050919050565b6000602082019050818103600083015261400e81613abb565b9050919050565b6000602082019050818103600083015261402e81613ade565b9050919050565b6000602082019050818103600083015261404e81613b01565b9050919050565b6000602082019050818103600083015261406e81613b24565b9050919050565b6000602082019050818103600083015261408e81613b47565b9050919050565b600060208201905081810360008301526140ae81613b6a565b9050919050565b600060208201905081810360008301526140ce81613b8d565b9050919050565b600060208201905081810360008301526140ee81613bb0565b9050919050565b6000602082019050818103600083015261410e81613bd3565b9050919050565b600060208201905061412a6000830184613c05565b92915050565b60006040820190506141456000830185613c05565b6141526020830184613c05565b9392505050565b600060208201905061416e6000830184613c14565b92915050565b600061417e61418f565b905061418a82826144ac565b919050565b6000604051905090565b600067ffffffffffffffff8211156141b4576141b361463d565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141e0576141df61463d565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561420c5761420b61463d565b5b614215826146ac565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142be826143f3565b91506142c9836143f3565b92508261ffff038211156142e0576142df614581565b5b828201905092915050565b60006142f682614421565b915061430183614421565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561433657614335614581565b5b828201905092915050565b600061434c82614421565b915061435783614421565b92508282101561436a57614369614581565b5b828203905092915050565b60006143808261442b565b915061438b8361442b565b92508282101561439e5761439d614581565b5b828203905092915050565b60006143b482614401565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561446557808201518184015260208101905061444a565b83811115614474576000848401525b50505050565b6000600282049050600182168061449257607f821691505b602082108114156144a6576144a56145df565b5b50919050565b6144b5826146ac565b810181811067ffffffffffffffff821117156144d4576144d361463d565b5b80604052505050565b60006144e882614421565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561451b5761451a614581565b5b600182019050919050565b60006145318261442b565b915060ff82141561454557614544614581565b5b600182019050919050565b600061455b82614421565b915061456683614421565b925082614576576145756145b0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561468b5760046000803e6146886000516146bd565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a206b696e64206f7574206f662060008201527f72616e6765000000000000000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a20746f6b656e2077617320616c60008201527f726561647920636c61696d656400000000000000000000000000000000000000602082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f6e65772076616c7565206973207468652073616d650000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a206c6973742063616e6e6f742060008201527f626520656d707479000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a20746f6b656e2077697468206760008201527f6976656e206964656e74696669657220646f6573206e6f742065786973740000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a206c69737473206d757374206860008201527f617665207468652073616d65206c656e67746800000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a20636f756e74206d757374206260008201527f6520626967676572207468616e20300000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a206d696e74696e67207761732060008201527f616c72656164792066696e697368656400000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a2063616e6e6f74206d696e742060008201527f746f6b656e73206f662061206b696e64206265666f7265206d6978656420746f60208201527f6b656e7300000000000000000000000000000000000000000000000000000000604082015250565b7f45524331313535486561727473546f6b656e3a2063616e6e6f74206d696e742060008201527f6d6978656420746f6b656e73206265666f726520746f6b656e73206f6620612060208201527f6b696e6400000000000000000000000000000000000000000000000000000000604082015250565b600060443d1015614ee057614f63565b614ee861418f565b60043d036004823e80513d602482011167ffffffffffffffff82111715614f10575050614f63565b808201805167ffffffffffffffff811115614f2e5750505050614f63565b80602083010160043d038501811115614f4b575050505050614f63565b614f5a826020018501866144ac565b82955050505050505b90565b614f6f816143a9565b8114614f7a57600080fd5b50565b614f86816143bb565b8114614f9157600080fd5b50565b614f9d816143c7565b8114614fa857600080fd5b50565b614fb4816143f3565b8114614fbf57600080fd5b50565b614fcb81614421565b8114614fd657600080fd5b50565b614fe28161442b565b8114614fed57600080fd5b5056fea264697066735822122004dcd0b62960e57bf85e6587fd461dc2eb2037d14e61fb7f765252fc99796dc764736f6c63430008070033000000000000000000000000a9ee71c587d1d72314bf385bbcb840e440becbf90000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003568747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f696e666c75766572756d2d6e66742d776f73702f682f0000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014c5760003560e01c806387491c60116100c3578063beb9716d1161007c578063beb9716d14610387578063d7f2c0ef146103a5578063e8518ced146103c3578063e985e9c5146103df578063f242432a1461040f578063f2fde38b1461042b5761014c565b806387491c60146102d95780638da5cb5b146102e3578063a22cb46514610301578063ad2628cd1461031d578063b052068e14610339578063bd85b039146103575761014c565b80634e1273f4116101155780634e1273f41461021b5780634f558e791461024b57806362880fe71461027b57806367a53173146102975780636f45c6a3146102b3578063715018a6146102cf5761014c565b8062fdd58e1461015157806301ffc9a7146101815780630e89341c146101b157806326987b60146101e15780632eb2c2d6146101ff575b600080fd5b61016b60048036038101906101669190613399565b610447565b6040516101789190614115565b60405180910390f35b61019b6004803603810190610196919061351f565b610511565b6040516101a89190613db8565b60405180910390f35b6101cb60048036038101906101c691906135f3565b6105f3565b6040516101d89190613dd3565b60405180910390f35b6101e96107cf565b6040516101f69190614115565b60405180910390f35b610219600480360381019061021491906131f3565b6107d5565b005b610235600480360381019061023091906133d9565b610876565b6040516102429190613d5f565b60405180910390f35b610265600480360381019061026091906135f3565b61098f565b6040516102729190613db8565b60405180910390f35b6102956004803603810190610290919061349e565b6109a3565b005b6102b160048036038101906102ac9190613451565b610b9f565b005b6102cd60048036038101906102c8919061364d565b610cf1565b005b6102d7610dac565b005b6102e1610dc0565b005b6102eb610e34565b6040516102f89190613c82565b60405180910390f35b61031b60048036038101906103169190613359565b610e5d565b005b61033760048036038101906103329190613579565b610e73565b005b610341610f23565b60405161034e9190614115565b60405180910390f35b610371600480360381019061036c91906135f3565b610f29565b60405161037e9190614115565b60405180910390f35b61038f610f46565b60405161039c9190613db8565b60405180910390f35b6103ad610f59565b6040516103ba9190614159565b60405180910390f35b6103dd60048036038101906103d891906135f3565b610f6c565b005b6103f960048036038101906103f491906131b3565b611014565b6040516104069190613db8565b60405180910390f35b610429600480360381019061042491906132c2565b6110a8565b005b61044560048036038101906104409190613186565b611149565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156104b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104af90613eb5565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105dc57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ec57506105eb826111cd565b5b9050919050565b60606105fe8261098f565b61063d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063490613f15565b60405180910390fd5b600a54821061076a576000600a54905060005b600b60009054906101000a900460ff1660ff168160ff161015610767578184101580156106b55750600760008260ff1660ff16815260200190815260200160002060000160019054906101000a900461ffff1661ffff16826106b291906142eb565b84105b1561071a5760066106f1600760008460ff1660ff16815260200190815260200160002060000160009054906101000a900460ff1660ff16611237565b604051602001610702929190613c53565b604051602081830303815290604052925050506107ca565b600760008260ff1660ff16815260200190815260200160002060000160019054906101000a900461ffff1661ffff168261075491906142eb565b91508061076090614526565b9050610650565b50505b60066107a76001600a6bffffffffffffffffffffffff1660018661078e9190614341565b6107989190614550565b6107a291906142eb565b611237565b6040516020016107b8929190613c53565b60405160208183030381529060405290505b919050565b60095481565b6107dd61130f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061082357506108228561081d61130f565b611014565b5b610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990613ef5565b60405180910390fd5b61086f8585858585611317565b5050505050565b606081518351146108bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b390614035565b60405180910390fd5b6000835167ffffffffffffffff8111156108d9576108d861463d565b5b6040519080825280602002602001820160405280156109075781602001602082028036833780820191505090505b50905060005b84518110156109845761095485828151811061092c5761092b61460e565b5b60200260200101518583815181106109475761094661460e565b5b6020026020010151610447565b8282815181106109675761096661460e565b5b6020026020010181815250508061097d906144dd565b905061090d565b508091505092915050565b60008061099b83610f29565b119050919050565b6109ab61163c565b600b60019054906101000a900460ff166109fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f1906140b5565b60405180910390fd5b610a04600161098f565b610a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3a906140d5565b60405180910390fd5b60008484905011610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090613ed5565b60405180910390fd5b818190508484905014610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613f55565b60405180910390fd5b6000805b858590508160ff161015610b8e5783838260ff16818110610af957610af861460e565b5b9050602002016020810190610b0e91906135c6565b61ffff1682610b1d91906142eb565b9150610b7d86868360ff16818110610b3857610b3761460e565b5b9050602002016020810190610b4d9190613620565b85858460ff16818110610b6357610b6261460e565b5b9050602002016020810190610b7891906135c6565b6116ba565b80610b8790614526565b9050610ad5565b50610b98816118e9565b5050505050565b610ba761163c565b60008282905011610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be490613ed5565b60405180910390fd5b60008282905067ffffffffffffffff811115610c0c57610c0b61463d565b5b604051908082528060200260200182016040528015610c3a5781602001602082028036833780820191505090505b50905060005b83839050811015610c7d576001828281518110610c6057610c5f61460e565b5b60200260200101818152505080610c76906144dd565b9050610c40565b50610cec600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083611a8c565b505050565b610cf961163c565b600b60019054906101000a900460ff16610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f906140b5565b60405180910390fd5b610d52600161098f565b610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d88906140d5565b60405180910390fd5b610d9b82826116ba565b610da88161ffff166118e9565b5050565b610db461163c565b610dbe6000611d5d565b565b610dc861163c565b600b60019054906101000a900460ff16610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e906140b5565b60405180910390fd5b6000600b60016101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e6f610e6861130f565b8383611e21565b5050565b610e7b61163c565b8181604051602001610e8e929190613c23565b604051602081830303815290604052805190602001206006604051602001610eb69190613c3c565b604051602081830303815290604052805190602001201415610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613e55565b60405180910390fd5b818160069190610f1e929190612d4c565b505050565b600a5481565b600060046000838152602001908152602001600020549050919050565b600b60019054906101000a900460ff1681565b600b60009054906101000a900460ff1681565b610f7461163c565b600b60019054906101000a900460ff16610fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fba906140b5565b60405180910390fd5b6000600a5414611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff906140f5565b60405180910390fd5b611011816118e9565b50565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110b061130f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806110f657506110f5856110f061130f565b611014565b5b611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c90613ef5565b60405180910390fd5b6111428585858585611f8e565b5050505050565b61115161163c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890613e75565b60405180910390fd5b6111ca81611d5d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600060016112468461222d565b01905060008167ffffffffffffffff8111156112655761126461463d565b5b6040519080825280601f01601f1916602001820160405280156112975781602001600182028036833780820191505090505b509050600082602001820190505b600115611304578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816112ee576112ed6145b0565b5b04945060008514156112ff57611304565b6112a5565b819350505050919050565b600033905090565b815183511461135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135290614055565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156113cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c290613f35565b60405180910390fd5b60006113d561130f565b90506113e5818787878787612380565b60005b84518110156115995760008582815181106114065761140561460e565b5b6020026020010151905060008583815181106114255761142461460e565b5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be90613f95565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461157e91906142eb565b9250508190555050505080611592906144dd565b90506113e8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611610929190613d81565b60405180910390a46116268187878787876124d1565b6116348187878787876124d9565b505050505050565b61164461130f565b73ffffffffffffffffffffffffffffffffffffffff16611662610e34565b73ffffffffffffffffffffffffffffffffffffffff16146116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af90613fb5565b60405180910390fd5b565b60008260ff161180156116df5750600a6bffffffffffffffffffffffff168260ff1611155b61171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590613e15565b60405180910390fd5b6000600b60009054906101000a900460ff1660ff16141561174357600954600a819055505b6000600b60009054906101000a900460ff1660ff161180156117ae57508160ff16600760006001600b60009054906101000a900460ff166117849190614375565b60ff1660ff16815260200190815260200160002060000160009054906101000a900460ff1660ff16145b156118265780600760006001600b60009054906101000a900460ff166117d49190614375565b60ff1660ff16815260200190815260200160002060000160018282829054906101000a900461ffff1661180791906142b3565b92506101000a81548161ffff021916908361ffff1602179055506118e5565b60405180604001604052808360ff1681526020018261ffff1681525060076000600b60009054906101000a900460ff1660ff1660ff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff160217905550905050600b600081819054906101000a900460ff166118cc90614526565b91906101000a81548160ff021916908360ff1602179055505b5050565b6000811161192c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192390613ff5565b60405180910390fd5b60008167ffffffffffffffff8111156119485761194761463d565b5b6040519080825280602002602001820160405280156119765781602001602082028036833780820191505090505b50905060008267ffffffffffffffff8111156119955761199461463d565b5b6040519080825280602002602001820160405280156119c35781602001602082028036833780820191505090505b50905060005b83811015611a3057806009546119df91906142eb565b8382815181106119f2576119f161460e565b5b6020026020010181815250506001828281518110611a1357611a1261460e565b5b60200260200101818152505080611a29906144dd565b90506119c9565b508260096000828254611a4391906142eb565b92505081905550611a87600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383604051806020016040528060008152506126c0565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af390613f75565b60405180910390fd5b8051825114611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614055565b60405180910390fd5b6000611b4a61130f565b9050611b6a81856000868660405180602001604052806000815250612380565b60005b8351811015611cb9576000848281518110611b8b57611b8a61460e565b5b602002602001015190506000848381518110611baa57611ba961460e565b5b6020026020010151905060006001600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4390613e95565b60405180910390fd5b8181036001600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611cb1906144dd565b915050611b6d565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d31929190613d81565b60405180910390a4611d57818560008686604051806020016040528060008152506124d1565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790614015565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f819190613db8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff590613f35565b60405180910390fd5b600061200861130f565b90506000612015856128ee565b90506000612022856128ee565b9050612032838989858589612380565b60006001600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c190613f95565b60405180910390fd5b8581036001600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856001600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218191906142eb565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516121fe929190614130565b60405180910390a4612214848a8a86868a6124d1565b612222848a8a8a8a8a612968565b505050505050505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061228b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612281576122806145b0565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106122c8576d04ee2d6d415b85acef810000000083816122be576122bd6145b0565b5b0492506020810190505b662386f26fc1000083106122f757662386f26fc1000083816122ed576122ec6145b0565b5b0492506010810190505b6305f5e1008310612320576305f5e1008381612316576123156145b0565b5b0492506008810190505b612710831061234557612710838161233b5761233a6145b0565b5b0492506004810190505b60648310612368576064838161235e5761235d6145b0565b5b0492506002810190505b600a8310612377576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156123ea5750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156124bb5760005b83518110156124b95760008482815181106124105761240f61460e565b5b602002602001015190506008600082815260200190815260200160002060009054906101000a900460ff161561247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290613e35565b60405180910390fd5b60016008600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050806124b2906144dd565b90506123f2565b505b6124c9868686868686612b4f565b505050505050565b505050505050565b6124f88473ffffffffffffffffffffffffffffffffffffffff16612d21565b156126b8578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161253e959493929190613c9d565b602060405180830381600087803b15801561255857600080fd5b505af192505050801561258957506040513d601f19601f82011682018060405250810190612586919061354c565b60015b61262f5761259561466c565b806308c379a014156125f257506125aa614ed0565b806125b557506125f4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e99190613dd3565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262690614095565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90613df5565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272790614075565b60405180910390fd5b8151835114612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b90614055565b60405180910390fd5b600061277e61130f565b905061278f81600087878787612380565b60005b8451811015612849578381815181106127ae576127ad61460e565b5b6020026020010151600160008784815181106127cd576127cc61460e565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461282f91906142eb565b925050819055508080612841906144dd565b915050612792565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128c1929190613d81565b60405180910390a46128d8816000878787876124d1565b6128e7816000878787876124d9565b5050505050565b60606000600167ffffffffffffffff81111561290d5761290c61463d565b5b60405190808252806020026020018201604052801561293b5781602001602082028036833780820191505090505b50905082816000815181106129535761295261460e565b5b60200260200101818152505080915050919050565b6129878473ffffffffffffffffffffffffffffffffffffffff16612d21565b15612b47578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016129cd959493929190613d05565b602060405180830381600087803b1580156129e757600080fd5b505af1925050508015612a1857506040513d601f19601f82011682018060405250810190612a15919061354c565b60015b612abe57612a2461466c565b806308c379a01415612a815750612a39614ed0565b80612a445750612a83565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a789190613dd3565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab590614095565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3c90613df5565b60405180910390fd5b505b505050505050565b612b5d868686868686612d44565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612c0f5760005b8351811015612c0d57828181518110612bb157612bb061460e565b5b602002602001015160046000868481518110612bd057612bcf61460e565b5b602002602001015181526020019081526020016000206000828254612bf591906142eb565b9250508190555080612c06906144dd565b9050612b95565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d195760005b8351811015612d17576000848281518110612c6557612c6461460e565b5b602002602001015190506000848381518110612c8457612c8361460e565b5b6020026020010151905060006004600084815260200190815260200160002054905081811015612ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce090613fd5565b60405180910390fd5b818103600460008581526020019081526020016000208190555050505080612d10906144dd565b9050612c47565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b828054612d589061447a565b90600052602060002090601f016020900481019282612d7a5760008555612dc1565b82601f10612d9357803560ff1916838001178555612dc1565b82800160010185558215612dc1579182015b82811115612dc0578235825591602001919060010190612da5565b5b509050612dce9190612dd2565b5090565b5b80821115612deb576000816000905550600101612dd3565b5090565b6000612e02612dfd84614199565b614174565b90508083825260208201905082856020860282011115612e2557612e24614698565b5b60005b85811015612e555781612e3b8882612f11565b845260208401935060208301925050600181019050612e28565b5050509392505050565b6000612e72612e6d846141c5565b614174565b90508083825260208201905082856020860282011115612e9557612e94614698565b5b60005b85811015612ec55781612eab888261315c565b845260208401935060208301925050600181019050612e98565b5050509392505050565b6000612ee2612edd846141f1565b614174565b905082815260208101848484011115612efe57612efd61469d565b5b612f09848285614438565b509392505050565b600081359050612f2081614f66565b92915050565b600082601f830112612f3b57612f3a614693565b5b8135612f4b848260208601612def565b91505092915050565b60008083601f840112612f6a57612f69614693565b5b8235905067ffffffffffffffff811115612f8757612f8661468e565b5b602083019150836020820283011115612fa357612fa2614698565b5b9250929050565b60008083601f840112612fc057612fbf614693565b5b8235905067ffffffffffffffff811115612fdd57612fdc61468e565b5b602083019150836020820283011115612ff957612ff8614698565b5b9250929050565b600082601f83011261301557613014614693565b5b8135613025848260208601612e5f565b91505092915050565b60008083601f84011261304457613043614693565b5b8235905067ffffffffffffffff8111156130615761306061468e565b5b60208301915083602082028301111561307d5761307c614698565b5b9250929050565b60008135905061309381614f7d565b92915050565b6000813590506130a881614f94565b92915050565b6000815190506130bd81614f94565b92915050565b600082601f8301126130d8576130d7614693565b5b81356130e8848260208601612ecf565b91505092915050565b60008083601f84011261310757613106614693565b5b8235905067ffffffffffffffff8111156131245761312361468e565b5b6020830191508360018202830111156131405761313f614698565b5b9250929050565b60008135905061315681614fab565b92915050565b60008135905061316b81614fc2565b92915050565b60008135905061318081614fd9565b92915050565b60006020828403121561319c5761319b6146a7565b5b60006131aa84828501612f11565b91505092915050565b600080604083850312156131ca576131c96146a7565b5b60006131d885828601612f11565b92505060206131e985828601612f11565b9150509250929050565b600080600080600060a0868803121561320f5761320e6146a7565b5b600061321d88828901612f11565b955050602061322e88828901612f11565b945050604086013567ffffffffffffffff81111561324f5761324e6146a2565b5b61325b88828901613000565b935050606086013567ffffffffffffffff81111561327c5761327b6146a2565b5b61328888828901613000565b925050608086013567ffffffffffffffff8111156132a9576132a86146a2565b5b6132b5888289016130c3565b9150509295509295909350565b600080600080600060a086880312156132de576132dd6146a7565b5b60006132ec88828901612f11565b95505060206132fd88828901612f11565b945050604061330e8882890161315c565b935050606061331f8882890161315c565b925050608086013567ffffffffffffffff8111156133405761333f6146a2565b5b61334c888289016130c3565b9150509295509295909350565b600080604083850312156133705761336f6146a7565b5b600061337e85828601612f11565b925050602061338f85828601613084565b9150509250929050565b600080604083850312156133b0576133af6146a7565b5b60006133be85828601612f11565b92505060206133cf8582860161315c565b9150509250929050565b600080604083850312156133f0576133ef6146a7565b5b600083013567ffffffffffffffff81111561340e5761340d6146a2565b5b61341a85828601612f26565b925050602083013567ffffffffffffffff81111561343b5761343a6146a2565b5b61344785828601613000565b9150509250929050565b60008060208385031215613468576134676146a7565b5b600083013567ffffffffffffffff811115613486576134856146a2565b5b61349285828601612faa565b92509250509250929050565b600080600080604085870312156134b8576134b76146a7565b5b600085013567ffffffffffffffff8111156134d6576134d56146a2565b5b6134e28782880161302e565b9450945050602085013567ffffffffffffffff811115613505576135046146a2565b5b61351187828801612f54565b925092505092959194509250565b600060208284031215613535576135346146a7565b5b600061354384828501613099565b91505092915050565b600060208284031215613562576135616146a7565b5b6000613570848285016130ae565b91505092915050565b600080602083850312156135905761358f6146a7565b5b600083013567ffffffffffffffff8111156135ae576135ad6146a2565b5b6135ba858286016130f1565b92509250509250929050565b6000602082840312156135dc576135db6146a7565b5b60006135ea84828501613147565b91505092915050565b600060208284031215613609576136086146a7565b5b60006136178482850161315c565b91505092915050565b600060208284031215613636576136356146a7565b5b600061364484828501613171565b91505092915050565b60008060408385031215613664576136636146a7565b5b600061367285828601613171565b925050602061368385828601613147565b9150509250929050565b60006136998383613bf6565b60208301905092915050565b6136ae816143a9565b82525050565b60006136bf82614247565b6136c98185614275565b93506136d483614222565b8060005b838110156137055781516136ec888261368d565b97506136f783614268565b9250506001810190506136d8565b5085935050505092915050565b61371b816143bb565b82525050565b600061372c82614252565b6137368185614286565b9350613746818560208601614447565b61374f816146ac565b840191505092915050565b600061376683856142a8565b9350613773838584614438565b82840190509392505050565b600061378a8261425d565b6137948185614297565b93506137a4818560208601614447565b6137ad816146ac565b840191505092915050565b60006137c38261425d565b6137cd81856142a8565b93506137dd818560208601614447565b80840191505092915050565b600081546137f68161447a565b61380081866142a8565b9450600182166000811461381b576001811461382c5761385f565b60ff1983168652818601935061385f565b61383585614232565b60005b8381101561385757815481890152600182019150602081019050613838565b838801955050505b50505092915050565b6000613875602883614297565b9150613880826146ca565b604082019050919050565b6000613898602583614297565b91506138a382614719565b604082019050919050565b60006138bb602d83614297565b91506138c682614768565b604082019050919050565b60006138de603583614297565b91506138e9826147b7565b604082019050919050565b6000613901602683614297565b915061390c82614806565b604082019050919050565b6000613924602483614297565b915061392f82614855565b604082019050919050565b6000613947602a83614297565b9150613952826148a4565b604082019050919050565b600061396a602883614297565b9150613975826148f3565b604082019050919050565b600061398d602e83614297565b915061399882614942565b604082019050919050565b60006139b0603e83614297565b91506139bb82614991565b604082019050919050565b60006139d3602583614297565b91506139de826149e0565b604082019050919050565b60006139f6603383614297565b9150613a0182614a2f565b604082019050919050565b6000613a19602383614297565b9150613a2482614a7e565b604082019050919050565b6000613a3c602a83614297565b9150613a4782614acd565b604082019050919050565b6000613a5f6005836142a8565b9150613a6a82614b1c565b600582019050919050565b6000613a82602083614297565b9150613a8d82614b45565b602082019050919050565b6000613aa5602883614297565b9150613ab082614b6e565b604082019050919050565b6000613ac8602f83614297565b9150613ad382614bbd565b604082019050919050565b6000613aeb602983614297565b9150613af682614c0c565b604082019050919050565b6000613b0e602983614297565b9150613b1982614c5b565b604082019050919050565b6000613b31602883614297565b9150613b3c82614caa565b604082019050919050565b6000613b54602183614297565b9150613b5f82614cf9565b604082019050919050565b6000613b77603483614297565b9150613b8282614d48565b604082019050919050565b6000613b9a603083614297565b9150613ba582614d97565b604082019050919050565b6000613bbd604483614297565b9150613bc882614de6565b606082019050919050565b6000613be0604483614297565b9150613beb82614e5b565b606082019050919050565b613bff81614421565b82525050565b613c0e81614421565b82525050565b613c1d8161442b565b82525050565b6000613c3082848661375a565b91508190509392505050565b6000613c4882846137e9565b915081905092915050565b6000613c5f82856137e9565b9150613c6b82846137b8565b9150613c7682613a52565b91508190509392505050565b6000602082019050613c9760008301846136a5565b92915050565b600060a082019050613cb260008301886136a5565b613cbf60208301876136a5565b8181036040830152613cd181866136b4565b90508181036060830152613ce581856136b4565b90508181036080830152613cf98184613721565b90509695505050505050565b600060a082019050613d1a60008301886136a5565b613d2760208301876136a5565b613d346040830186613c05565b613d416060830185613c05565b8181036080830152613d538184613721565b90509695505050505050565b60006020820190508181036000830152613d7981846136b4565b905092915050565b60006040820190508181036000830152613d9b81856136b4565b90508181036020830152613daf81846136b4565b90509392505050565b6000602082019050613dcd6000830184613712565b92915050565b60006020820190508181036000830152613ded818461377f565b905092915050565b60006020820190508181036000830152613e0e81613868565b9050919050565b60006020820190508181036000830152613e2e8161388b565b9050919050565b60006020820190508181036000830152613e4e816138ae565b9050919050565b60006020820190508181036000830152613e6e816138d1565b9050919050565b60006020820190508181036000830152613e8e816138f4565b9050919050565b60006020820190508181036000830152613eae81613917565b9050919050565b60006020820190508181036000830152613ece8161393a565b9050919050565b60006020820190508181036000830152613eee8161395d565b9050919050565b60006020820190508181036000830152613f0e81613980565b9050919050565b60006020820190508181036000830152613f2e816139a3565b9050919050565b60006020820190508181036000830152613f4e816139c6565b9050919050565b60006020820190508181036000830152613f6e816139e9565b9050919050565b60006020820190508181036000830152613f8e81613a0c565b9050919050565b60006020820190508181036000830152613fae81613a2f565b9050919050565b60006020820190508181036000830152613fce81613a75565b9050919050565b60006020820190508181036000830152613fee81613a98565b9050919050565b6000602082019050818103600083015261400e81613abb565b9050919050565b6000602082019050818103600083015261402e81613ade565b9050919050565b6000602082019050818103600083015261404e81613b01565b9050919050565b6000602082019050818103600083015261406e81613b24565b9050919050565b6000602082019050818103600083015261408e81613b47565b9050919050565b600060208201905081810360008301526140ae81613b6a565b9050919050565b600060208201905081810360008301526140ce81613b8d565b9050919050565b600060208201905081810360008301526140ee81613bb0565b9050919050565b6000602082019050818103600083015261410e81613bd3565b9050919050565b600060208201905061412a6000830184613c05565b92915050565b60006040820190506141456000830185613c05565b6141526020830184613c05565b9392505050565b600060208201905061416e6000830184613c14565b92915050565b600061417e61418f565b905061418a82826144ac565b919050565b6000604051905090565b600067ffffffffffffffff8211156141b4576141b361463d565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141e0576141df61463d565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561420c5761420b61463d565b5b614215826146ac565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142be826143f3565b91506142c9836143f3565b92508261ffff038211156142e0576142df614581565b5b828201905092915050565b60006142f682614421565b915061430183614421565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561433657614335614581565b5b828201905092915050565b600061434c82614421565b915061435783614421565b92508282101561436a57614369614581565b5b828203905092915050565b60006143808261442b565b915061438b8361442b565b92508282101561439e5761439d614581565b5b828203905092915050565b60006143b482614401565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561446557808201518184015260208101905061444a565b83811115614474576000848401525b50505050565b6000600282049050600182168061449257607f821691505b602082108114156144a6576144a56145df565b5b50919050565b6144b5826146ac565b810181811067ffffffffffffffff821117156144d4576144d361463d565b5b80604052505050565b60006144e882614421565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561451b5761451a614581565b5b600182019050919050565b60006145318261442b565b915060ff82141561454557614544614581565b5b600182019050919050565b600061455b82614421565b915061456683614421565b925082614576576145756145b0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561468b5760046000803e6146886000516146bd565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a206b696e64206f7574206f662060008201527f72616e6765000000000000000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a20746f6b656e2077617320616c60008201527f726561647920636c61696d656400000000000000000000000000000000000000602082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f6e65772076616c7565206973207468652073616d650000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a206c6973742063616e6e6f742060008201527f626520656d707479000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a20746f6b656e2077697468206760008201527f6976656e206964656e74696669657220646f6573206e6f742065786973740000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a206c69737473206d757374206860008201527f617665207468652073616d65206c656e67746800000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a20636f756e74206d757374206260008201527f6520626967676572207468616e20300000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a206d696e74696e67207761732060008201527f616c72656164792066696e697368656400000000000000000000000000000000602082015250565b7f45524331313535486561727473546f6b656e3a2063616e6e6f74206d696e742060008201527f746f6b656e73206f662061206b696e64206265666f7265206d6978656420746f60208201527f6b656e7300000000000000000000000000000000000000000000000000000000604082015250565b7f45524331313535486561727473546f6b656e3a2063616e6e6f74206d696e742060008201527f6d6978656420746f6b656e73206265666f726520746f6b656e73206f6620612060208201527f6b696e6400000000000000000000000000000000000000000000000000000000604082015250565b600060443d1015614ee057614f63565b614ee861418f565b60043d036004823e80513d602482011167ffffffffffffffff82111715614f10575050614f63565b808201805167ffffffffffffffff811115614f2e5750505050614f63565b80602083010160043d038501811115614f4b575050505050614f63565b614f5a826020018501866144ac565b82955050505050505b90565b614f6f816143a9565b8114614f7a57600080fd5b50565b614f86816143bb565b8114614f9157600080fd5b50565b614f9d816143c7565b8114614fa857600080fd5b50565b614fb4816143f3565b8114614fbf57600080fd5b50565b614fcb81614421565b8114614fd657600080fd5b50565b614fe28161442b565b8114614fed57600080fd5b5056fea264697066735822122004dcd0b62960e57bf85e6587fd461dc2eb2037d14e61fb7f765252fc99796dc764736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000a9ee71c587d1d72314bf385bbcb840e440becbf90000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003568747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f696e666c75766572756d2d6e66742d776f73702f682f0000000000000000000000

-----Decoded View---------------
Arg [0] : wallet (address): 0xA9eE71C587d1d72314BF385BBCB840E440bECBf9
Arg [1] : metadataUriPrefix (string): https://storage.googleapis.com/influverum-nft-wosp/h/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000a9ee71c587d1d72314bf385bbcb840e440becbf9
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f69
Arg [4] : 6e666c75766572756d2d6e66742d776f73702f682f0000000000000000000000


Deployed Bytecode Sourcemap

57466:6377:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24492:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23515:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63064:776;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57850:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26435:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24888:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40964:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61804:623;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60630:391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61417:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2803:103;;;:::i;:::-;;62482:93;;;:::i;:::-;;2155:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25485:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62663:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57888:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40753:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57965:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57930:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61104:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25712:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25952:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3061:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24492:230;24578:7;24625:1;24606:21;;:7;:21;;;;24598:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24692:9;:13;24702:2;24692:13;;;;;;;;;;;:22;24706:7;24692:22;;;;;;;;;;;;;;;;24685:29;;24492:230;;;;:::o;23515:310::-;23617:4;23669:26;23654:41;;;:11;:41;;;;:110;;;;23727:37;23712:52;;;:11;:52;;;;23654:110;:163;;;;23781:36;23805:11;23781:23;:36::i;:::-;23654:163;23634:183;;23515:310;;;:::o;63064:776::-;63127:13;63161:18;63168:10;63161:6;:18::i;:::-;63153:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;63277:16;;63263:10;:30;63259:450;;63310:14;63327:16;;63310:33;;63365:7;63360:338;63382:11;;;;;;;;;;;63378:15;;:1;:15;;;63360:338;;;63437:6;63423:10;:20;;:68;;;;;63469:13;:16;63483:1;63469:16;;;;;;;;;;;;;;;:22;;;;;;;;;;;;63460:31;;:6;:31;;;;:::i;:::-;63447:10;:44;63423:68;63419:211;;;63547:18;63567:32;:13;:16;63581:1;63567:16;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:30;;;:32::i;:::-;63530:79;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63516:94;;;;;;63419:211;63660:13;:16;63674:1;63660:16;;;;;;;;;;;;;;;:22;;;;;;;;;;;;63650:32;;;;;;;:::i;:::-;;;63395:3;;;;:::i;:::-;;;63360:338;;;;63295:414;63259:450;63752:18;63772:49;63808:1;58030:2;63774:30;;63788:1;63775:10;:14;;;;:::i;:::-;63774:30;;;;:::i;:::-;63773:36;;;;:::i;:::-;63772:47;:49::i;:::-;63735:96;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63721:111;;63064:776;;;;:::o;57850:31::-;;;;:::o;26435:438::-;26676:12;:10;:12::i;:::-;26668:20;;:4;:20;;;:60;;;;26692:36;26709:4;26715:12;:10;:12::i;:::-;26692:16;:36::i;:::-;26668:60;26646:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;26813:52;26836:4;26842:2;26846:3;26851:7;26860:4;26813:22;:52::i;:::-;26435:438;;;;;:::o;24888:524::-;25044:16;25105:3;:10;25086:8;:15;:29;25078:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;25174:30;25221:8;:15;25207:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25174:63;;25255:9;25250:122;25274:8;:15;25270:1;:19;25250:122;;;25330:30;25340:8;25349:1;25340:11;;;;;;;;:::i;:::-;;;;;;;;25353:3;25357:1;25353:6;;;;;;;;:::i;:::-;;;;;;;;25330:9;:30::i;:::-;25311:13;25325:1;25311:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;25291:3;;;;:::i;:::-;;;25250:122;;;;25391:13;25384:20;;;24888:524;;;;:::o;40964:122::-;41021:4;41077:1;41045:29;41071:2;41045:25;:29::i;:::-;:33;41038:40;;40964:122;;;:::o;61804:623::-;2041:13;:11;:13::i;:::-;58157:7:::1;;;;;;;;;;;58149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61937:9:::2;61944:1;61937:6;:9::i;:::-;61929:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;62053:1;62038:5;;:12;;:16;62030:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;62134:6;;:13;;62118:5;;:12;;:29;62110:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;62216:13;62251:7:::0;62246:143:::2;62268:5;;:12;;62264:1;:16;;;62246:143;;;62311:6;;62318:1;62311:9;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62302:18;;;;;;;:::i;:::-;;;62337:40;62357:5;;62363:1;62357:8;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62367:6;;62374:1;62367:9;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62337:19;:40::i;:::-;62282:3;;;;:::i;:::-;;;62246:143;;;;62401:18;62413:5;62401:11;:18::i;:::-;61918:509;61804:623:::0;;;;:::o;60630:391::-;2041:13;:11;:13::i;:::-;60741:1:::1;60720:11;;:18;;:22;60712:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;60800:23;60840:11;;:18;;60826:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60800:59;;60877:9;60872:89;60896:11;;:18;;60892:1;:22;60872:89;;;60948:1;60936:6;60943:1;60936:9;;;;;;;;:::i;:::-;;;;;;;:13;;;::::0;::::1;60916:3;;;;:::i;:::-;;;60872:89;;;;60973:40;60984:7;;;;;;;;;;;60993:11;;60973:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61006:6;60973:10;:40::i;:::-;60701:320;60630:391:::0;;:::o;61417:266::-;2041:13;:11;:13::i;:::-;58157:7:::1;;;;;;;;;;;58149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61519:9:::2;61526:1;61519:6;:9::i;:::-;61511:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;61614:32;61634:4;61640:5;61614:19;:32::i;:::-;61657:18;61669:5;61657:18;;:11;:18::i;:::-;61417:266:::0;;:::o;2803:103::-;2041:13;:11;:13::i;:::-;2868:30:::1;2895:1;2868:18;:30::i;:::-;2803:103::o:0;62482:93::-;2041:13;:11;:13::i;:::-;58157:7:::1;;;;;;;;;;;58149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62562:5:::2;62552:7;;:15;;;;;;;;;;;;;;;;;;62482:93::o:0;2155:87::-;2201:7;2228:6;;;;;;;;;;;2221:13;;2155:87;:::o;25485:155::-;25580:52;25599:12;:10;:12::i;:::-;25613:8;25623;25580:18;:52::i;:::-;25485:155;;:::o;62663:317::-;2041:13;:11;:13::i;:::-;62844:17:::1;;62827:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62817:46;;;;;;62793:18;62776:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;62766:47;;;;;;:97;;62758:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;62955:17;;62934:18;:38;;;;;;;:::i;:::-;;62663:317:::0;;:::o;57888:35::-;;;;:::o;40753:113::-;40815:7;40842:12;:16;40855:2;40842:16;;;;;;;;;;;;40835:23;;40753:113;;;:::o;57965:26::-;;;;;;;;;;;;;:::o;57930:28::-;;;;;;;;;;;;;:::o;61104:227::-;2041:13;:11;:13::i;:::-;58157:7:::1;;;;;;;;;;;58149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61218:1:::2;61198:16;;:21;61190:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;61305:18;61317:5;61305:11;:18::i;:::-;61104:227:::0;:::o;25712:168::-;25811:4;25835:18;:27;25854:7;25835:27;;;;;;;;;;;;;;;:37;25863:8;25835:37;;;;;;;;;;;;;;;;;;;;;;;;;25828:44;;25712:168;;;;:::o;25952:406::-;26168:12;:10;:12::i;:::-;26160:20;;:4;:20;;;:60;;;;26184:36;26201:4;26207:12;:10;:12::i;:::-;26184:16;:36::i;:::-;26160:60;26138:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;26305:45;26323:4;26329:2;26333;26337:6;26345:4;26305:17;:45::i;:::-;25952:406;;;;;:::o;3061:201::-;2041:13;:11;:13::i;:::-;3170:1:::1;3150:22;;:8;:22;;;;3142:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3226:28;3245:8;3226:18;:28::i;:::-;3061:201:::0;:::o;22273:157::-;22358:4;22397:25;22382:40;;;:11;:40;;;;22375:47;;22273:157;;;:::o;55398:716::-;55454:13;55505:14;55542:1;55522:17;55533:5;55522:10;:17::i;:::-;:21;55505:38;;55558:20;55592:6;55581:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55558:41;;55614:11;55743:6;55739:2;55735:15;55727:6;55723:28;55716:35;;55780:288;55787:4;55780:288;;;55812:5;;;;;;;;55954:8;55949:2;55942:5;55938:14;55933:30;55928:3;55920:44;56010:2;56001:11;;;;;;:::i;:::-;;;;;56044:1;56035:5;:10;56031:21;;;56047:5;;56031:21;55780:288;;;56089:6;56082:13;;;;;55398:716;;;:::o;710:98::-;763:7;790:10;783:17;;710:98;:::o;28669:1146::-;28896:7;:14;28882:3;:10;:28;28874:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28988:1;28974:16;;:2;:16;;;;28966:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;29045:16;29064:12;:10;:12::i;:::-;29045:31;;29089:60;29110:8;29120:4;29126:2;29130:3;29135:7;29144:4;29089:20;:60::i;:::-;29167:9;29162:421;29186:3;:10;29182:1;:14;29162:421;;;29218:10;29231:3;29235:1;29231:6;;;;;;;;:::i;:::-;;;;;;;;29218:19;;29252:14;29269:7;29277:1;29269:10;;;;;;;;:::i;:::-;;;;;;;;29252:27;;29296:19;29318:9;:13;29328:2;29318:13;;;;;;;;;;;:19;29332:4;29318:19;;;;;;;;;;;;;;;;29296:41;;29375:6;29360:11;:21;;29352:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29508:6;29494:11;:20;29472:9;:13;29482:2;29472:13;;;;;;;;;;;:19;29486:4;29472:19;;;;;;;;;;;;;;;:42;;;;29565:6;29544:9;:13;29554:2;29544:13;;;;;;;;;;;:17;29558:2;29544:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29203:380;;;29198:3;;;;:::i;:::-;;;29162:421;;;;29630:2;29600:47;;29624:4;29600:47;;29614:8;29600:47;;;29634:3;29639:7;29600:47;;;;;;;:::i;:::-;;;;;;;;29660:59;29680:8;29690:4;29696:2;29700:3;29705:7;29714:4;29660:19;:59::i;:::-;29732:75;29768:8;29778:4;29784:2;29788:3;29793:7;29802:4;29732:35;:75::i;:::-;28863:952;28669:1146;;;;;:::o;2320:132::-;2395:12;:10;:12::i;:::-;2384:23;;:7;:5;:7::i;:::-;:23;;;2376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2320:132::o;59988:523::-;60078:1;60071:4;:8;;;:31;;;;;58030:2;60083:19;;:4;:19;;;;60071:31;60063:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60176:1;60161:11;;;;;;;;;;;:16;;;60157:80;;;60213:12;;60194:16;:31;;;;60157:80;60267:1;60253:11;;;;;;;;;;;:15;;;:62;;;;;60311:4;60272:43;;:13;:30;60300:1;60286:11;;;;;;;;;;;:15;;;;:::i;:::-;60272:30;;;;;;;;;;;;;;;:35;;;;;;;;;;;;:43;;;60253:62;60249:255;;;60372:5;60332:13;:30;60360:1;60346:11;;;;;;;;;;;:15;;;;:::i;:::-;60332:30;;;;;;;;;;;;;;;:36;;;:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;60249:255;;;60439:23;;;;;;;;60450:4;60439:23;;;;;;60456:5;60439:23;;;;;60410:13;:26;60424:11;;;;;;;;;;;60410:26;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60481:11;;60479:13;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;60249:255;59988:523;;:::o;59400:481::-;59472:1;59464:5;:9;59456:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59538:28;59583:5;59569:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59538:51;;59600:23;59640:5;59626:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59600:46;;59664:9;59659:124;59683:5;59679:1;:9;59659:124;;;59742:1;59727:12;;:16;;;;:::i;:::-;59710:11;59722:1;59710:14;;;;;;;;:::i;:::-;;;;;;;:33;;;;;59770:1;59758:6;59765:1;59758:9;;;;;;;;:::i;:::-;;;;;;;:13;;;;;59690:3;;;;:::i;:::-;;;59659:124;;;;59811:5;59795:12;;:21;;;;;;;:::i;:::-;;;;;;;;59829:44;59840:7;;;;;;;;;;;59849:11;59862:6;59829:44;;;;;;;;;;;;:10;:44::i;:::-;59445:436;;59400:481;:::o;34434:969::-;34602:1;34586:18;;:4;:18;;;;34578:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34677:7;:14;34663:3;:10;:28;34655:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34749:16;34768:12;:10;:12::i;:::-;34749:31;;34793:66;34814:8;34824:4;34838:1;34842:3;34847:7;34793:66;;;;;;;;;;;;:20;:66::i;:::-;34877:9;34872:373;34896:3;:10;34892:1;:14;34872:373;;;34928:10;34941:3;34945:1;34941:6;;;;;;;;:::i;:::-;;;;;;;;34928:19;;34962:14;34979:7;34987:1;34979:10;;;;;;;;:::i;:::-;;;;;;;;34962:27;;35006:19;35028:9;:13;35038:2;35028:13;;;;;;;;;;;:19;35042:4;35028:19;;;;;;;;;;;;;;;;35006:41;;35085:6;35070:11;:21;;35062:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;35212:6;35198:11;:20;35176:9;:13;35186:2;35176:13;;;;;;;;;;;:19;35190:4;35176:19;;;;;;;;;;;;;;;:42;;;;34913:332;;;34908:3;;;;;:::i;:::-;;;;34872:373;;;;35300:1;35262:55;;35286:4;35262:55;;35276:8;35262:55;;;35304:3;35309:7;35262:55;;;;;;;:::i;:::-;;;;;;;;35330:65;35350:8;35360:4;35374:1;35378:3;35383:7;35330:65;;;;;;;;;;;;:19;:65::i;:::-;34567:836;34434:969;;;:::o;3422:191::-;3496:16;3515:6;;;;;;;;;;;3496:25;;3541:8;3532:6;;:17;;;;;;;;;;;;;;;;;;3596:8;3565:40;;3586:8;3565:40;;;;;;;;;;;;3485:128;3422:191;:::o;35546:331::-;35701:8;35692:17;;:5;:17;;;;35684:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35804:8;35766:18;:25;35785:5;35766:25;;;;;;;;;;;;;;;:35;35792:8;35766:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35850:8;35828:41;;35843:5;35828:41;;;35860:8;35828:41;;;;;;:::i;:::-;;;;;;;;35546:331;;;:::o;27337:974::-;27539:1;27525:16;;:2;:16;;;;27517:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27596:16;27615:12;:10;:12::i;:::-;27596:31;;27638:20;27661:21;27679:2;27661:17;:21::i;:::-;27638:44;;27693:24;27720:25;27738:6;27720:17;:25::i;:::-;27693:52;;27758:60;27779:8;27789:4;27795:2;27799:3;27804:7;27813:4;27758:20;:60::i;:::-;27831:19;27853:9;:13;27863:2;27853:13;;;;;;;;;;;:19;27867:4;27853:19;;;;;;;;;;;;;;;;27831:41;;27906:6;27891:11;:21;;27883:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28031:6;28017:11;:20;27995:9;:13;28005:2;27995:13;;;;;;;;;;;:19;28009:4;27995:19;;;;;;;;;;;;;;;:42;;;;28080:6;28059:9;:13;28069:2;28059:13;;;;;;;;;;;:17;28073:2;28059:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;28135:2;28104:46;;28129:4;28104:46;;28119:8;28104:46;;;28139:2;28143:6;28104:46;;;;;;;:::i;:::-;;;;;;;;28163:59;28183:8;28193:4;28199:2;28203:3;28208:7;28217:4;28163:19;:59::i;:::-;28235:68;28266:8;28276:4;28282:2;28286;28290:6;28298:4;28235:30;:68::i;:::-;27506:805;;;;27337:974;;;;;:::o;52268:922::-;52321:7;52341:14;52358:1;52341:18;;52408:6;52399:5;:15;52395:102;;52444:6;52435:15;;;;;;:::i;:::-;;;;;52479:2;52469:12;;;;52395:102;52524:6;52515:5;:15;52511:102;;52560:6;52551:15;;;;;;:::i;:::-;;;;;52595:2;52585:12;;;;52511:102;52640:6;52631:5;:15;52627:102;;52676:6;52667:15;;;;;;:::i;:::-;;;;;52711:2;52701:12;;;;52627:102;52756:5;52747;:14;52743:99;;52791:5;52782:14;;;;;;:::i;:::-;;;;;52825:1;52815:11;;;;52743:99;52869:5;52860;:14;52856:99;;52904:5;52895:14;;;;;;:::i;:::-;;;;;52938:1;52928:11;;;;52856:99;52982:5;52973;:14;52969:99;;53017:5;53008:14;;;;;;:::i;:::-;;;;;53051:1;53041:11;;;;52969:99;53095:5;53086;:14;53082:66;;53131:1;53121:11;;;;53082:66;53176:6;53169:13;;;52268:922;;;:::o;58696:627::-;58901:1;58885:18;;:4;:18;;;;:38;;;;;58921:1;58907:16;;:2;:16;;;;58885:38;58881:349;;;58945:9;58940:279;58964:11;:18;58960:1;:22;58940:279;;;59008:18;59029:11;59041:1;59029:14;;;;;;;;:::i;:::-;;;;;;;;59008:35;;59073:14;:26;59088:10;59073:26;;;;;;;;;;;;;;;;;;;;;59072:27;59064:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59199:4;59170:14;:26;59185:10;59170:26;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;58989:230;58984:3;;;;:::i;:::-;;;58940:279;;;;58881:349;59242:73;59269:8;59279:4;59285:2;59289:11;59302:6;59310:4;59242:26;:73::i;:::-;58696:627;;;;;;:::o;38011:220::-;;;;;;;:::o;38991:813::-;39231:15;:2;:13;;;:15::i;:::-;39227:570;;;39284:2;39267:43;;;39311:8;39321:4;39327:3;39332:7;39341:4;39267:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39263:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;39659:6;39652:14;;;;;;;;;;;:::i;:::-;;;;;;;;39263:523;;;39708:62;;;;;;;;;;:::i;:::-;;;;;;;;39263:523;39440:48;;;39428:60;;;:8;:60;;;;39424:159;;39513:50;;;;;;;;;;:::i;:::-;;;;;;;;39424:159;39347:251;39227:570;38991:813;;;;;;:::o;32265:::-;32457:1;32443:16;;:2;:16;;;;32435:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32530:7;:14;32516:3;:10;:28;32508:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32602:16;32621:12;:10;:12::i;:::-;32602:31;;32646:66;32667:8;32685:1;32689:2;32693:3;32698:7;32707:4;32646:20;:66::i;:::-;32730:9;32725:103;32749:3;:10;32745:1;:14;32725:103;;;32806:7;32814:1;32806:10;;;;;;;;:::i;:::-;;;;;;;;32781:9;:17;32791:3;32795:1;32791:6;;;;;;;;:::i;:::-;;;;;;;;32781:17;;;;;;;;;;;:21;32799:2;32781:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;32761:3;;;;;:::i;:::-;;;;32725:103;;;;32881:2;32845:53;;32877:1;32845:53;;32859:8;32845:53;;;32885:3;32890:7;32845:53;;;;;;;:::i;:::-;;;;;;;;32911:65;32931:8;32949:1;32953:2;32957:3;32962:7;32971:4;32911:19;:65::i;:::-;32989:81;33025:8;33043:1;33047:2;33051:3;33056:7;33065:4;32989:35;:81::i;:::-;32424:654;32265:813;;;;:::o;39812:198::-;39878:16;39907:22;39946:1;39932:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39907:41;;39970:7;39959:5;39965:1;39959:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;39997:5;39990:12;;;39812:198;;;:::o;38239:744::-;38454:15;:2;:13;;;:15::i;:::-;38450:526;;;38507:2;38490:38;;;38529:8;38539:4;38545:2;38549:6;38557:4;38490:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38486:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;38838:6;38831:14;;;;;;;;;;;:::i;:::-;;;;;;;;38486:479;;;38887:62;;;;;;;;;;:::i;:::-;;;;;;;;38486:479;38624:43;;;38612:55;;;:8;:55;;;;38608:154;;38692:50;;;;;;;;;;:::i;:::-;;;;;;;;38608:154;38563:214;38450:526;38239:744;;;;;;:::o;41161:931::-;41400:66;41427:8;41437:4;41443:2;41447:3;41452:7;41461:4;41400:26;:66::i;:::-;41499:1;41483:18;;:4;:18;;;41479:160;;;41523:9;41518:110;41542:3;:10;41538:1;:14;41518:110;;;41602:7;41610:1;41602:10;;;;;;;;:::i;:::-;;;;;;;;41578:12;:20;41591:3;41595:1;41591:6;;;;;;;;:::i;:::-;;;;;;;;41578:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;41554:3;;;;:::i;:::-;;;41518:110;;;;41479:160;41669:1;41655:16;;:2;:16;;;41651:434;;;41693:9;41688:386;41712:3;:10;41708:1;:14;41688:386;;;41748:10;41761:3;41765:1;41761:6;;;;;;;;:::i;:::-;;;;;;;;41748:19;;41786:14;41803:7;41811:1;41803:10;;;;;;;;:::i;:::-;;;;;;;;41786:27;;41832:14;41849:12;:16;41862:2;41849:16;;;;;;;;;;;;41832:33;;41902:6;41892;:16;;41884:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42033:6;42024;:15;42005:12;:16;42018:2;42005:16;;;;;;;;;;;:34;;;;41729:345;;;41724:3;;;;:::i;:::-;;;41688:386;;;;41651:434;41161:931;;;;;;:::o;13217:326::-;13277:4;13534:1;13512:7;:19;;;:23;13505:30;;13217:326;;;:::o;36835:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2075:370::-;2146:5;2195:3;2188:4;2180:6;2176:17;2172:27;2162:122;;2203:79;;:::i;:::-;2162:122;2320:6;2307:20;2345:94;2435:3;2427:6;2420:4;2412:6;2408:17;2345:94;:::i;:::-;2336:103;;2152:293;2075:370;;;;:::o;2467:567::-;2539:8;2549:6;2599:3;2592:4;2584:6;2580:17;2576:27;2566:122;;2607:79;;:::i;:::-;2566:122;2720:6;2707:20;2697:30;;2750:18;2742:6;2739:30;2736:117;;;2772:79;;:::i;:::-;2736:117;2886:4;2878:6;2874:17;2862:29;;2940:3;2932:4;2924:6;2920:17;2910:8;2906:32;2903:41;2900:128;;;2947:79;;:::i;:::-;2900:128;2467:567;;;;;:::o;3057:568::-;3130:8;3140:6;3190:3;3183:4;3175:6;3171:17;3167:27;3157:122;;3198:79;;:::i;:::-;3157:122;3311:6;3298:20;3288:30;;3341:18;3333:6;3330:30;3327:117;;;3363:79;;:::i;:::-;3327:117;3477:4;3469:6;3465:17;3453:29;;3531:3;3523:4;3515:6;3511:17;3501:8;3497:32;3494:41;3491:128;;;3538:79;;:::i;:::-;3491:128;3057:568;;;;;:::o;3648:370::-;3719:5;3768:3;3761:4;3753:6;3749:17;3745:27;3735:122;;3776:79;;:::i;:::-;3735:122;3893:6;3880:20;3918:94;4008:3;4000:6;3993:4;3985:6;3981:17;3918:94;:::i;:::-;3909:103;;3725:293;3648:370;;;;:::o;4039:566::-;4110:8;4120:6;4170:3;4163:4;4155:6;4151:17;4147:27;4137:122;;4178:79;;:::i;:::-;4137:122;4291:6;4278:20;4268:30;;4321:18;4313:6;4310:30;4307:117;;;4343:79;;:::i;:::-;4307:117;4457:4;4449:6;4445:17;4433:29;;4511:3;4503:4;4495:6;4491:17;4481:8;4477:32;4474:41;4471:128;;;4518:79;;:::i;:::-;4471:128;4039:566;;;;;:::o;4611:133::-;4654:5;4692:6;4679:20;4670:29;;4708:30;4732:5;4708:30;:::i;:::-;4611:133;;;;:::o;4750:137::-;4795:5;4833:6;4820:20;4811:29;;4849:32;4875:5;4849:32;:::i;:::-;4750:137;;;;:::o;4893:141::-;4949:5;4980:6;4974:13;4965:22;;4996:32;5022:5;4996:32;:::i;:::-;4893:141;;;;:::o;5053:338::-;5108:5;5157:3;5150:4;5142:6;5138:17;5134:27;5124:122;;5165:79;;:::i;:::-;5124:122;5282:6;5269:20;5307:78;5381:3;5373:6;5366:4;5358:6;5354:17;5307:78;:::i;:::-;5298:87;;5114:277;5053:338;;;;:::o;5411:553::-;5469:8;5479:6;5529:3;5522:4;5514:6;5510:17;5506:27;5496:122;;5537:79;;:::i;:::-;5496:122;5650:6;5637:20;5627:30;;5680:18;5672:6;5669:30;5666:117;;;5702:79;;:::i;:::-;5666:117;5816:4;5808:6;5804:17;5792:29;;5870:3;5862:4;5854:6;5850:17;5840:8;5836:32;5833:41;5830:128;;;5877:79;;:::i;:::-;5830:128;5411:553;;;;;:::o;5970:137::-;6015:5;6053:6;6040:20;6031:29;;6069:32;6095:5;6069:32;:::i;:::-;5970:137;;;;:::o;6113:139::-;6159:5;6197:6;6184:20;6175:29;;6213:33;6240:5;6213:33;:::i;:::-;6113:139;;;;:::o;6258:135::-;6302:5;6340:6;6327:20;6318:29;;6356:31;6381:5;6356:31;:::i;:::-;6258:135;;;;:::o;6399:329::-;6458:6;6507:2;6495:9;6486:7;6482:23;6478:32;6475:119;;;6513:79;;:::i;:::-;6475:119;6633:1;6658:53;6703:7;6694:6;6683:9;6679:22;6658:53;:::i;:::-;6648:63;;6604:117;6399:329;;;;:::o;6734:474::-;6802:6;6810;6859:2;6847:9;6838:7;6834:23;6830:32;6827:119;;;6865:79;;:::i;:::-;6827:119;6985:1;7010:53;7055:7;7046:6;7035:9;7031:22;7010:53;:::i;:::-;7000:63;;6956:117;7112:2;7138:53;7183:7;7174:6;7163:9;7159:22;7138:53;:::i;:::-;7128:63;;7083:118;6734:474;;;;;:::o;7214:1509::-;7368:6;7376;7384;7392;7400;7449:3;7437:9;7428:7;7424:23;7420:33;7417:120;;;7456:79;;:::i;:::-;7417:120;7576:1;7601:53;7646:7;7637:6;7626:9;7622:22;7601:53;:::i;:::-;7591:63;;7547:117;7703:2;7729:53;7774:7;7765:6;7754:9;7750:22;7729:53;:::i;:::-;7719:63;;7674:118;7859:2;7848:9;7844:18;7831:32;7890:18;7882:6;7879:30;7876:117;;;7912:79;;:::i;:::-;7876:117;8017:78;8087:7;8078:6;8067:9;8063:22;8017:78;:::i;:::-;8007:88;;7802:303;8172:2;8161:9;8157:18;8144:32;8203:18;8195:6;8192:30;8189:117;;;8225:79;;:::i;:::-;8189:117;8330:78;8400:7;8391:6;8380:9;8376:22;8330:78;:::i;:::-;8320:88;;8115:303;8485:3;8474:9;8470:19;8457:33;8517:18;8509:6;8506:30;8503:117;;;8539:79;;:::i;:::-;8503:117;8644:62;8698:7;8689:6;8678:9;8674:22;8644:62;:::i;:::-;8634:72;;8428:288;7214:1509;;;;;;;;:::o;8729:1089::-;8833:6;8841;8849;8857;8865;8914:3;8902:9;8893:7;8889:23;8885:33;8882:120;;;8921:79;;:::i;:::-;8882:120;9041:1;9066:53;9111:7;9102:6;9091:9;9087:22;9066:53;:::i;:::-;9056:63;;9012:117;9168:2;9194:53;9239:7;9230:6;9219:9;9215:22;9194:53;:::i;:::-;9184:63;;9139:118;9296:2;9322:53;9367:7;9358:6;9347:9;9343:22;9322:53;:::i;:::-;9312:63;;9267:118;9424:2;9450:53;9495:7;9486:6;9475:9;9471:22;9450:53;:::i;:::-;9440:63;;9395:118;9580:3;9569:9;9565:19;9552:33;9612:18;9604:6;9601:30;9598:117;;;9634:79;;:::i;:::-;9598:117;9739:62;9793:7;9784:6;9773:9;9769:22;9739:62;:::i;:::-;9729:72;;9523:288;8729:1089;;;;;;;;:::o;9824:468::-;9889:6;9897;9946:2;9934:9;9925:7;9921:23;9917:32;9914:119;;;9952:79;;:::i;:::-;9914:119;10072:1;10097:53;10142:7;10133:6;10122:9;10118:22;10097:53;:::i;:::-;10087:63;;10043:117;10199:2;10225:50;10267:7;10258:6;10247:9;10243:22;10225:50;:::i;:::-;10215:60;;10170:115;9824:468;;;;;:::o;10298:474::-;10366:6;10374;10423:2;10411:9;10402:7;10398:23;10394:32;10391:119;;;10429:79;;:::i;:::-;10391:119;10549:1;10574:53;10619:7;10610:6;10599:9;10595:22;10574:53;:::i;:::-;10564:63;;10520:117;10676:2;10702:53;10747:7;10738:6;10727:9;10723:22;10702:53;:::i;:::-;10692:63;;10647:118;10298:474;;;;;:::o;10778:894::-;10896:6;10904;10953:2;10941:9;10932:7;10928:23;10924:32;10921:119;;;10959:79;;:::i;:::-;10921:119;11107:1;11096:9;11092:17;11079:31;11137:18;11129:6;11126:30;11123:117;;;11159:79;;:::i;:::-;11123:117;11264:78;11334:7;11325:6;11314:9;11310:22;11264:78;:::i;:::-;11254:88;;11050:302;11419:2;11408:9;11404:18;11391:32;11450:18;11442:6;11439:30;11436:117;;;11472:79;;:::i;:::-;11436:117;11577:78;11647:7;11638:6;11627:9;11623:22;11577:78;:::i;:::-;11567:88;;11362:303;10778:894;;;;;:::o;11678:559::-;11764:6;11772;11821:2;11809:9;11800:7;11796:23;11792:32;11789:119;;;11827:79;;:::i;:::-;11789:119;11975:1;11964:9;11960:17;11947:31;12005:18;11997:6;11994:30;11991:117;;;12027:79;;:::i;:::-;11991:117;12140:80;12212:7;12203:6;12192:9;12188:22;12140:80;:::i;:::-;12122:98;;;;11918:312;11678:559;;;;;:::o;12243:928::-;12362:6;12370;12378;12386;12435:2;12423:9;12414:7;12410:23;12406:32;12403:119;;;12441:79;;:::i;:::-;12403:119;12589:1;12578:9;12574:17;12561:31;12619:18;12611:6;12608:30;12605:117;;;12641:79;;:::i;:::-;12605:117;12754:78;12824:7;12815:6;12804:9;12800:22;12754:78;:::i;:::-;12736:96;;;;12532:310;12909:2;12898:9;12894:18;12881:32;12940:18;12932:6;12929:30;12926:117;;;12962:79;;:::i;:::-;12926:117;13075:79;13146:7;13137:6;13126:9;13122:22;13075:79;:::i;:::-;13057:97;;;;12852:312;12243:928;;;;;;;:::o;13177:327::-;13235:6;13284:2;13272:9;13263:7;13259:23;13255:32;13252:119;;;13290:79;;:::i;:::-;13252:119;13410:1;13435:52;13479:7;13470:6;13459:9;13455:22;13435:52;:::i;:::-;13425:62;;13381:116;13177:327;;;;:::o;13510:349::-;13579:6;13628:2;13616:9;13607:7;13603:23;13599:32;13596:119;;;13634:79;;:::i;:::-;13596:119;13754:1;13779:63;13834:7;13825:6;13814:9;13810:22;13779:63;:::i;:::-;13769:73;;13725:127;13510:349;;;;:::o;13865:529::-;13936:6;13944;13993:2;13981:9;13972:7;13968:23;13964:32;13961:119;;;13999:79;;:::i;:::-;13961:119;14147:1;14136:9;14132:17;14119:31;14177:18;14169:6;14166:30;14163:117;;;14199:79;;:::i;:::-;14163:117;14312:65;14369:7;14360:6;14349:9;14345:22;14312:65;:::i;:::-;14294:83;;;;14090:297;13865:529;;;;;:::o;14400:327::-;14458:6;14507:2;14495:9;14486:7;14482:23;14478:32;14475:119;;;14513:79;;:::i;:::-;14475:119;14633:1;14658:52;14702:7;14693:6;14682:9;14678:22;14658:52;:::i;:::-;14648:62;;14604:116;14400:327;;;;:::o;14733:329::-;14792:6;14841:2;14829:9;14820:7;14816:23;14812:32;14809:119;;;14847:79;;:::i;:::-;14809:119;14967:1;14992:53;15037:7;15028:6;15017:9;15013:22;14992:53;:::i;:::-;14982:63;;14938:117;14733:329;;;;:::o;15068:325::-;15125:6;15174:2;15162:9;15153:7;15149:23;15145:32;15142:119;;;15180:79;;:::i;:::-;15142:119;15300:1;15325:51;15368:7;15359:6;15348:9;15344:22;15325:51;:::i;:::-;15315:61;;15271:115;15068:325;;;;:::o;15399:468::-;15464:6;15472;15521:2;15509:9;15500:7;15496:23;15492:32;15489:119;;;15527:79;;:::i;:::-;15489:119;15647:1;15672:51;15715:7;15706:6;15695:9;15691:22;15672:51;:::i;:::-;15662:61;;15618:115;15772:2;15798:52;15842:7;15833:6;15822:9;15818:22;15798:52;:::i;:::-;15788:62;;15743:117;15399:468;;;;;:::o;15873:179::-;15942:10;15963:46;16005:3;15997:6;15963:46;:::i;:::-;16041:4;16036:3;16032:14;16018:28;;15873:179;;;;:::o;16058:118::-;16145:24;16163:5;16145:24;:::i;:::-;16140:3;16133:37;16058:118;;:::o;16212:732::-;16331:3;16360:54;16408:5;16360:54;:::i;:::-;16430:86;16509:6;16504:3;16430:86;:::i;:::-;16423:93;;16540:56;16590:5;16540:56;:::i;:::-;16619:7;16650:1;16635:284;16660:6;16657:1;16654:13;16635:284;;;16736:6;16730:13;16763:63;16822:3;16807:13;16763:63;:::i;:::-;16756:70;;16849:60;16902:6;16849:60;:::i;:::-;16839:70;;16695:224;16682:1;16679;16675:9;16670:14;;16635:284;;;16639:14;16935:3;16928:10;;16336:608;;;16212:732;;;;:::o;16950:109::-;17031:21;17046:5;17031:21;:::i;:::-;17026:3;17019:34;16950:109;;:::o;17065:360::-;17151:3;17179:38;17211:5;17179:38;:::i;:::-;17233:70;17296:6;17291:3;17233:70;:::i;:::-;17226:77;;17312:52;17357:6;17352:3;17345:4;17338:5;17334:16;17312:52;:::i;:::-;17389:29;17411:6;17389:29;:::i;:::-;17384:3;17380:39;17373:46;;17155:270;17065:360;;;;:::o;17455:317::-;17571:3;17592:89;17674:6;17669:3;17592:89;:::i;:::-;17585:96;;17691:43;17727:6;17722:3;17715:5;17691:43;:::i;:::-;17759:6;17754:3;17750:16;17743:23;;17455:317;;;;;:::o;17778:364::-;17866:3;17894:39;17927:5;17894:39;:::i;:::-;17949:71;18013:6;18008:3;17949:71;:::i;:::-;17942:78;;18029:52;18074:6;18069:3;18062:4;18055:5;18051:16;18029:52;:::i;:::-;18106:29;18128:6;18106:29;:::i;:::-;18101:3;18097:39;18090:46;;17870:272;17778:364;;;;:::o;18148:377::-;18254:3;18282:39;18315:5;18282:39;:::i;:::-;18337:89;18419:6;18414:3;18337:89;:::i;:::-;18330:96;;18435:52;18480:6;18475:3;18468:4;18461:5;18457:16;18435:52;:::i;:::-;18512:6;18507:3;18503:16;18496:23;;18258:267;18148:377;;;;:::o;18555:845::-;18658:3;18695:5;18689:12;18724:36;18750:9;18724:36;:::i;:::-;18776:89;18858:6;18853:3;18776:89;:::i;:::-;18769:96;;18896:1;18885:9;18881:17;18912:1;18907:137;;;;19058:1;19053:341;;;;18874:520;;18907:137;18991:4;18987:9;18976;18972:25;18967:3;18960:38;19027:6;19022:3;19018:16;19011:23;;18907:137;;19053:341;19120:38;19152:5;19120:38;:::i;:::-;19180:1;19194:154;19208:6;19205:1;19202:13;19194:154;;;19282:7;19276:14;19272:1;19267:3;19263:11;19256:35;19332:1;19323:7;19319:15;19308:26;;19230:4;19227:1;19223:12;19218:17;;19194:154;;;19377:6;19372:3;19368:16;19361:23;;19060:334;;18874:520;;18662:738;;18555:845;;;;:::o;19406:366::-;19548:3;19569:67;19633:2;19628:3;19569:67;:::i;:::-;19562:74;;19645:93;19734:3;19645:93;:::i;:::-;19763:2;19758:3;19754:12;19747:19;;19406:366;;;:::o;19778:::-;19920:3;19941:67;20005:2;20000:3;19941:67;:::i;:::-;19934:74;;20017:93;20106:3;20017:93;:::i;:::-;20135:2;20130:3;20126:12;20119:19;;19778:366;;;:::o;20150:::-;20292:3;20313:67;20377:2;20372:3;20313:67;:::i;:::-;20306:74;;20389:93;20478:3;20389:93;:::i;:::-;20507:2;20502:3;20498:12;20491:19;;20150:366;;;:::o;20522:::-;20664:3;20685:67;20749:2;20744:3;20685:67;:::i;:::-;20678:74;;20761:93;20850:3;20761:93;:::i;:::-;20879:2;20874:3;20870:12;20863:19;;20522:366;;;:::o;20894:::-;21036:3;21057:67;21121:2;21116:3;21057:67;:::i;:::-;21050:74;;21133:93;21222:3;21133:93;:::i;:::-;21251:2;21246:3;21242:12;21235:19;;20894:366;;;:::o;21266:::-;21408:3;21429:67;21493:2;21488:3;21429:67;:::i;:::-;21422:74;;21505:93;21594:3;21505:93;:::i;:::-;21623:2;21618:3;21614:12;21607:19;;21266:366;;;:::o;21638:::-;21780:3;21801:67;21865:2;21860:3;21801:67;:::i;:::-;21794:74;;21877:93;21966:3;21877:93;:::i;:::-;21995:2;21990:3;21986:12;21979:19;;21638:366;;;:::o;22010:::-;22152:3;22173:67;22237:2;22232:3;22173:67;:::i;:::-;22166:74;;22249:93;22338:3;22249:93;:::i;:::-;22367:2;22362:3;22358:12;22351:19;;22010:366;;;:::o;22382:::-;22524:3;22545:67;22609:2;22604:3;22545:67;:::i;:::-;22538:74;;22621:93;22710:3;22621:93;:::i;:::-;22739:2;22734:3;22730:12;22723:19;;22382:366;;;:::o;22754:::-;22896:3;22917:67;22981:2;22976:3;22917:67;:::i;:::-;22910:74;;22993:93;23082:3;22993:93;:::i;:::-;23111:2;23106:3;23102:12;23095:19;;22754:366;;;:::o;23126:::-;23268:3;23289:67;23353:2;23348:3;23289:67;:::i;:::-;23282:74;;23365:93;23454:3;23365:93;:::i;:::-;23483:2;23478:3;23474:12;23467:19;;23126:366;;;:::o;23498:::-;23640:3;23661:67;23725:2;23720:3;23661:67;:::i;:::-;23654:74;;23737:93;23826:3;23737:93;:::i;:::-;23855:2;23850:3;23846:12;23839:19;;23498:366;;;:::o;23870:::-;24012:3;24033:67;24097:2;24092:3;24033:67;:::i;:::-;24026:74;;24109:93;24198:3;24109:93;:::i;:::-;24227:2;24222:3;24218:12;24211:19;;23870:366;;;:::o;24242:::-;24384:3;24405:67;24469:2;24464:3;24405:67;:::i;:::-;24398:74;;24481:93;24570:3;24481:93;:::i;:::-;24599:2;24594:3;24590:12;24583:19;;24242:366;;;:::o;24614:400::-;24774:3;24795:84;24877:1;24872:3;24795:84;:::i;:::-;24788:91;;24888:93;24977:3;24888:93;:::i;:::-;25006:1;25001:3;24997:11;24990:18;;24614:400;;;:::o;25020:366::-;25162:3;25183:67;25247:2;25242:3;25183:67;:::i;:::-;25176:74;;25259:93;25348:3;25259:93;:::i;:::-;25377:2;25372:3;25368:12;25361:19;;25020:366;;;:::o;25392:::-;25534:3;25555:67;25619:2;25614:3;25555:67;:::i;:::-;25548:74;;25631:93;25720:3;25631:93;:::i;:::-;25749:2;25744:3;25740:12;25733:19;;25392:366;;;:::o;25764:::-;25906:3;25927:67;25991:2;25986:3;25927:67;:::i;:::-;25920:74;;26003:93;26092:3;26003:93;:::i;:::-;26121:2;26116:3;26112:12;26105:19;;25764:366;;;:::o;26136:::-;26278:3;26299:67;26363:2;26358:3;26299:67;:::i;:::-;26292:74;;26375:93;26464:3;26375:93;:::i;:::-;26493:2;26488:3;26484:12;26477:19;;26136:366;;;:::o;26508:::-;26650:3;26671:67;26735:2;26730:3;26671:67;:::i;:::-;26664:74;;26747:93;26836:3;26747:93;:::i;:::-;26865:2;26860:3;26856:12;26849:19;;26508:366;;;:::o;26880:::-;27022:3;27043:67;27107:2;27102:3;27043:67;:::i;:::-;27036:74;;27119:93;27208:3;27119:93;:::i;:::-;27237:2;27232:3;27228:12;27221:19;;26880:366;;;:::o;27252:::-;27394:3;27415:67;27479:2;27474:3;27415:67;:::i;:::-;27408:74;;27491:93;27580:3;27491:93;:::i;:::-;27609:2;27604:3;27600:12;27593:19;;27252:366;;;:::o;27624:::-;27766:3;27787:67;27851:2;27846:3;27787:67;:::i;:::-;27780:74;;27863:93;27952:3;27863:93;:::i;:::-;27981:2;27976:3;27972:12;27965:19;;27624:366;;;:::o;27996:::-;28138:3;28159:67;28223:2;28218:3;28159:67;:::i;:::-;28152:74;;28235:93;28324:3;28235:93;:::i;:::-;28353:2;28348:3;28344:12;28337:19;;27996:366;;;:::o;28368:::-;28510:3;28531:67;28595:2;28590:3;28531:67;:::i;:::-;28524:74;;28607:93;28696:3;28607:93;:::i;:::-;28725:2;28720:3;28716:12;28709:19;;28368:366;;;:::o;28740:::-;28882:3;28903:67;28967:2;28962:3;28903:67;:::i;:::-;28896:74;;28979:93;29068:3;28979:93;:::i;:::-;29097:2;29092:3;29088:12;29081:19;;28740:366;;;:::o;29112:108::-;29189:24;29207:5;29189:24;:::i;:::-;29184:3;29177:37;29112:108;;:::o;29226:118::-;29313:24;29331:5;29313:24;:::i;:::-;29308:3;29301:37;29226:118;;:::o;29350:112::-;29433:22;29449:5;29433:22;:::i;:::-;29428:3;29421:35;29350:112;;:::o;29468:295::-;29610:3;29632:105;29733:3;29724:6;29716;29632:105;:::i;:::-;29625:112;;29754:3;29747:10;;29468:295;;;;;:::o;29769:269::-;29898:3;29920:92;30008:3;29999:6;29920:92;:::i;:::-;29913:99;;30029:3;30022:10;;29769:269;;;;:::o;30044:695::-;30322:3;30344:92;30432:3;30423:6;30344:92;:::i;:::-;30337:99;;30453:95;30544:3;30535:6;30453:95;:::i;:::-;30446:102;;30565:148;30709:3;30565:148;:::i;:::-;30558:155;;30730:3;30723:10;;30044:695;;;;;:::o;30745:222::-;30838:4;30876:2;30865:9;30861:18;30853:26;;30889:71;30957:1;30946:9;30942:17;30933:6;30889:71;:::i;:::-;30745:222;;;;:::o;30973:1053::-;31296:4;31334:3;31323:9;31319:19;31311:27;;31348:71;31416:1;31405:9;31401:17;31392:6;31348:71;:::i;:::-;31429:72;31497:2;31486:9;31482:18;31473:6;31429:72;:::i;:::-;31548:9;31542:4;31538:20;31533:2;31522:9;31518:18;31511:48;31576:108;31679:4;31670:6;31576:108;:::i;:::-;31568:116;;31731:9;31725:4;31721:20;31716:2;31705:9;31701:18;31694:48;31759:108;31862:4;31853:6;31759:108;:::i;:::-;31751:116;;31915:9;31909:4;31905:20;31899:3;31888:9;31884:19;31877:49;31943:76;32014:4;32005:6;31943:76;:::i;:::-;31935:84;;30973:1053;;;;;;;;:::o;32032:751::-;32255:4;32293:3;32282:9;32278:19;32270:27;;32307:71;32375:1;32364:9;32360:17;32351:6;32307:71;:::i;:::-;32388:72;32456:2;32445:9;32441:18;32432:6;32388:72;:::i;:::-;32470;32538:2;32527:9;32523:18;32514:6;32470:72;:::i;:::-;32552;32620:2;32609:9;32605:18;32596:6;32552:72;:::i;:::-;32672:9;32666:4;32662:20;32656:3;32645:9;32641:19;32634:49;32700:76;32771:4;32762:6;32700:76;:::i;:::-;32692:84;;32032:751;;;;;;;;:::o;32789:373::-;32932:4;32970:2;32959:9;32955:18;32947:26;;33019:9;33013:4;33009:20;33005:1;32994:9;32990:17;32983:47;33047:108;33150:4;33141:6;33047:108;:::i;:::-;33039:116;;32789:373;;;;:::o;33168:634::-;33389:4;33427:2;33416:9;33412:18;33404:26;;33476:9;33470:4;33466:20;33462:1;33451:9;33447:17;33440:47;33504:108;33607:4;33598:6;33504:108;:::i;:::-;33496:116;;33659:9;33653:4;33649:20;33644:2;33633:9;33629:18;33622:48;33687:108;33790:4;33781:6;33687:108;:::i;:::-;33679:116;;33168:634;;;;;:::o;33808:210::-;33895:4;33933:2;33922:9;33918:18;33910:26;;33946:65;34008:1;33997:9;33993:17;33984:6;33946:65;:::i;:::-;33808:210;;;;:::o;34024:313::-;34137:4;34175:2;34164:9;34160:18;34152:26;;34224:9;34218:4;34214:20;34210:1;34199:9;34195:17;34188:47;34252:78;34325:4;34316:6;34252:78;:::i;:::-;34244:86;;34024:313;;;;:::o;34343:419::-;34509:4;34547:2;34536:9;34532:18;34524:26;;34596:9;34590:4;34586:20;34582:1;34571:9;34567:17;34560:47;34624:131;34750:4;34624:131;:::i;:::-;34616:139;;34343:419;;;:::o;34768:::-;34934:4;34972:2;34961:9;34957:18;34949:26;;35021:9;35015:4;35011:20;35007:1;34996:9;34992:17;34985:47;35049:131;35175:4;35049:131;:::i;:::-;35041:139;;34768:419;;;:::o;35193:::-;35359:4;35397:2;35386:9;35382:18;35374:26;;35446:9;35440:4;35436:20;35432:1;35421:9;35417:17;35410:47;35474:131;35600:4;35474:131;:::i;:::-;35466:139;;35193:419;;;:::o;35618:::-;35784:4;35822:2;35811:9;35807:18;35799:26;;35871:9;35865:4;35861:20;35857:1;35846:9;35842:17;35835:47;35899:131;36025:4;35899:131;:::i;:::-;35891:139;;35618:419;;;:::o;36043:::-;36209:4;36247:2;36236:9;36232:18;36224:26;;36296:9;36290:4;36286:20;36282:1;36271:9;36267:17;36260:47;36324:131;36450:4;36324:131;:::i;:::-;36316:139;;36043:419;;;:::o;36468:::-;36634:4;36672:2;36661:9;36657:18;36649:26;;36721:9;36715:4;36711:20;36707:1;36696:9;36692:17;36685:47;36749:131;36875:4;36749:131;:::i;:::-;36741:139;;36468:419;;;:::o;36893:::-;37059:4;37097:2;37086:9;37082:18;37074:26;;37146:9;37140:4;37136:20;37132:1;37121:9;37117:17;37110:47;37174:131;37300:4;37174:131;:::i;:::-;37166:139;;36893:419;;;:::o;37318:::-;37484:4;37522:2;37511:9;37507:18;37499:26;;37571:9;37565:4;37561:20;37557:1;37546:9;37542:17;37535:47;37599:131;37725:4;37599:131;:::i;:::-;37591:139;;37318:419;;;:::o;37743:::-;37909:4;37947:2;37936:9;37932:18;37924:26;;37996:9;37990:4;37986:20;37982:1;37971:9;37967:17;37960:47;38024:131;38150:4;38024:131;:::i;:::-;38016:139;;37743:419;;;:::o;38168:::-;38334:4;38372:2;38361:9;38357:18;38349:26;;38421:9;38415:4;38411:20;38407:1;38396:9;38392:17;38385:47;38449:131;38575:4;38449:131;:::i;:::-;38441:139;;38168:419;;;:::o;38593:::-;38759:4;38797:2;38786:9;38782:18;38774:26;;38846:9;38840:4;38836:20;38832:1;38821:9;38817:17;38810:47;38874:131;39000:4;38874:131;:::i;:::-;38866:139;;38593:419;;;:::o;39018:::-;39184:4;39222:2;39211:9;39207:18;39199:26;;39271:9;39265:4;39261:20;39257:1;39246:9;39242:17;39235:47;39299:131;39425:4;39299:131;:::i;:::-;39291:139;;39018:419;;;:::o;39443:::-;39609:4;39647:2;39636:9;39632:18;39624:26;;39696:9;39690:4;39686:20;39682:1;39671:9;39667:17;39660:47;39724:131;39850:4;39724:131;:::i;:::-;39716:139;;39443:419;;;:::o;39868:::-;40034:4;40072:2;40061:9;40057:18;40049:26;;40121:9;40115:4;40111:20;40107:1;40096:9;40092:17;40085:47;40149:131;40275:4;40149:131;:::i;:::-;40141:139;;39868:419;;;:::o;40293:::-;40459:4;40497:2;40486:9;40482:18;40474:26;;40546:9;40540:4;40536:20;40532:1;40521:9;40517:17;40510:47;40574:131;40700:4;40574:131;:::i;:::-;40566:139;;40293:419;;;:::o;40718:::-;40884:4;40922:2;40911:9;40907:18;40899:26;;40971:9;40965:4;40961:20;40957:1;40946:9;40942:17;40935:47;40999:131;41125:4;40999:131;:::i;:::-;40991:139;;40718:419;;;:::o;41143:::-;41309:4;41347:2;41336:9;41332:18;41324:26;;41396:9;41390:4;41386:20;41382:1;41371:9;41367:17;41360:47;41424:131;41550:4;41424:131;:::i;:::-;41416:139;;41143:419;;;:::o;41568:::-;41734:4;41772:2;41761:9;41757:18;41749:26;;41821:9;41815:4;41811:20;41807:1;41796:9;41792:17;41785:47;41849:131;41975:4;41849:131;:::i;:::-;41841:139;;41568:419;;;:::o;41993:::-;42159:4;42197:2;42186:9;42182:18;42174:26;;42246:9;42240:4;42236:20;42232:1;42221:9;42217:17;42210:47;42274:131;42400:4;42274:131;:::i;:::-;42266:139;;41993:419;;;:::o;42418:::-;42584:4;42622:2;42611:9;42607:18;42599:26;;42671:9;42665:4;42661:20;42657:1;42646:9;42642:17;42635:47;42699:131;42825:4;42699:131;:::i;:::-;42691:139;;42418:419;;;:::o;42843:::-;43009:4;43047:2;43036:9;43032:18;43024:26;;43096:9;43090:4;43086:20;43082:1;43071:9;43067:17;43060:47;43124:131;43250:4;43124:131;:::i;:::-;43116:139;;42843:419;;;:::o;43268:::-;43434:4;43472:2;43461:9;43457:18;43449:26;;43521:9;43515:4;43511:20;43507:1;43496:9;43492:17;43485:47;43549:131;43675:4;43549:131;:::i;:::-;43541:139;;43268:419;;;:::o;43693:::-;43859:4;43897:2;43886:9;43882:18;43874:26;;43946:9;43940:4;43936:20;43932:1;43921:9;43917:17;43910:47;43974:131;44100:4;43974:131;:::i;:::-;43966:139;;43693:419;;;:::o;44118:::-;44284:4;44322:2;44311:9;44307:18;44299:26;;44371:9;44365:4;44361:20;44357:1;44346:9;44342:17;44335:47;44399:131;44525:4;44399:131;:::i;:::-;44391:139;;44118:419;;;:::o;44543:::-;44709:4;44747:2;44736:9;44732:18;44724:26;;44796:9;44790:4;44786:20;44782:1;44771:9;44767:17;44760:47;44824:131;44950:4;44824:131;:::i;:::-;44816:139;;44543:419;;;:::o;44968:222::-;45061:4;45099:2;45088:9;45084:18;45076:26;;45112:71;45180:1;45169:9;45165:17;45156:6;45112:71;:::i;:::-;44968:222;;;;:::o;45196:332::-;45317:4;45355:2;45344:9;45340:18;45332:26;;45368:71;45436:1;45425:9;45421:17;45412:6;45368:71;:::i;:::-;45449:72;45517:2;45506:9;45502:18;45493:6;45449:72;:::i;:::-;45196:332;;;;;:::o;45534:214::-;45623:4;45661:2;45650:9;45646:18;45638:26;;45674:67;45738:1;45727:9;45723:17;45714:6;45674:67;:::i;:::-;45534:214;;;;:::o;45754:129::-;45788:6;45815:20;;:::i;:::-;45805:30;;45844:33;45872:4;45864:6;45844:33;:::i;:::-;45754:129;;;:::o;45889:75::-;45922:6;45955:2;45949:9;45939:19;;45889:75;:::o;45970:311::-;46047:4;46137:18;46129:6;46126:30;46123:56;;;46159:18;;:::i;:::-;46123:56;46209:4;46201:6;46197:17;46189:25;;46269:4;46263;46259:15;46251:23;;45970:311;;;:::o;46287:::-;46364:4;46454:18;46446:6;46443:30;46440:56;;;46476:18;;:::i;:::-;46440:56;46526:4;46518:6;46514:17;46506:25;;46586:4;46580;46576:15;46568:23;;46287:311;;;:::o;46604:307::-;46665:4;46755:18;46747:6;46744:30;46741:56;;;46777:18;;:::i;:::-;46741:56;46815:29;46837:6;46815:29;:::i;:::-;46807:37;;46899:4;46893;46889:15;46881:23;;46604:307;;;:::o;46917:132::-;46984:4;47007:3;46999:11;;47037:4;47032:3;47028:14;47020:22;;46917:132;;;:::o;47055:141::-;47104:4;47127:3;47119:11;;47150:3;47147:1;47140:14;47184:4;47181:1;47171:18;47163:26;;47055:141;;;:::o;47202:114::-;47269:6;47303:5;47297:12;47287:22;;47202:114;;;:::o;47322:98::-;47373:6;47407:5;47401:12;47391:22;;47322:98;;;:::o;47426:99::-;47478:6;47512:5;47506:12;47496:22;;47426:99;;;:::o;47531:113::-;47601:4;47633;47628:3;47624:14;47616:22;;47531:113;;;:::o;47650:184::-;47749:11;47783:6;47778:3;47771:19;47823:4;47818:3;47814:14;47799:29;;47650:184;;;;:::o;47840:168::-;47923:11;47957:6;47952:3;47945:19;47997:4;47992:3;47988:14;47973:29;;47840:168;;;;:::o;48014:169::-;48098:11;48132:6;48127:3;48120:19;48172:4;48167:3;48163:14;48148:29;;48014:169;;;;:::o;48189:148::-;48291:11;48328:3;48313:18;;48189:148;;;;:::o;48343:242::-;48382:3;48401:19;48418:1;48401:19;:::i;:::-;48396:24;;48434:19;48451:1;48434:19;:::i;:::-;48429:24;;48527:1;48519:6;48515:14;48512:1;48509:21;48506:47;;;48533:18;;:::i;:::-;48506:47;48577:1;48574;48570:9;48563:16;;48343:242;;;;:::o;48591:305::-;48631:3;48650:20;48668:1;48650:20;:::i;:::-;48645:25;;48684:20;48702:1;48684:20;:::i;:::-;48679:25;;48838:1;48770:66;48766:74;48763:1;48760:81;48757:107;;;48844:18;;:::i;:::-;48757:107;48888:1;48885;48881:9;48874:16;;48591:305;;;;:::o;48902:191::-;48942:4;48962:20;48980:1;48962:20;:::i;:::-;48957:25;;48996:20;49014:1;48996:20;:::i;:::-;48991:25;;49035:1;49032;49029:8;49026:34;;;49040:18;;:::i;:::-;49026:34;49085:1;49082;49078:9;49070:17;;48902:191;;;;:::o;49099:185::-;49137:4;49157:18;49173:1;49157:18;:::i;:::-;49152:23;;49189:18;49205:1;49189:18;:::i;:::-;49184:23;;49226:1;49223;49220:8;49217:34;;;49231:18;;:::i;:::-;49217:34;49276:1;49273;49269:9;49261:17;;49099:185;;;;:::o;49290:96::-;49327:7;49356:24;49374:5;49356:24;:::i;:::-;49345:35;;49290:96;;;:::o;49392:90::-;49426:7;49469:5;49462:13;49455:21;49444:32;;49392:90;;;:::o;49488:149::-;49524:7;49564:66;49557:5;49553:78;49542:89;;49488:149;;;:::o;49643:89::-;49679:7;49719:6;49712:5;49708:18;49697:29;;49643:89;;;:::o;49738:126::-;49775:7;49815:42;49808:5;49804:54;49793:65;;49738:126;;;:::o;49870:77::-;49907:7;49936:5;49925:16;;49870:77;;;:::o;49953:86::-;49988:7;50028:4;50021:5;50017:16;50006:27;;49953:86;;;:::o;50045:154::-;50129:6;50124:3;50119;50106:30;50191:1;50182:6;50177:3;50173:16;50166:27;50045:154;;;:::o;50205:307::-;50273:1;50283:113;50297:6;50294:1;50291:13;50283:113;;;50382:1;50377:3;50373:11;50367:18;50363:1;50358:3;50354:11;50347:39;50319:2;50316:1;50312:10;50307:15;;50283:113;;;50414:6;50411:1;50408:13;50405:101;;;50494:1;50485:6;50480:3;50476:16;50469:27;50405:101;50254:258;50205:307;;;:::o;50518:320::-;50562:6;50599:1;50593:4;50589:12;50579:22;;50646:1;50640:4;50636:12;50667:18;50657:81;;50723:4;50715:6;50711:17;50701:27;;50657:81;50785:2;50777:6;50774:14;50754:18;50751:38;50748:84;;;50804:18;;:::i;:::-;50748:84;50569:269;50518:320;;;:::o;50844:281::-;50927:27;50949:4;50927:27;:::i;:::-;50919:6;50915:40;51057:6;51045:10;51042:22;51021:18;51009:10;51006:34;51003:62;51000:88;;;51068:18;;:::i;:::-;51000:88;51108:10;51104:2;51097:22;50887:238;50844:281;;:::o;51131:233::-;51170:3;51193:24;51211:5;51193:24;:::i;:::-;51184:33;;51239:66;51232:5;51229:77;51226:103;;;51309:18;;:::i;:::-;51226:103;51356:1;51349:5;51345:13;51338:20;;51131:233;;;:::o;51370:167::-;51407:3;51430:22;51446:5;51430:22;:::i;:::-;51421:31;;51474:4;51467:5;51464:15;51461:41;;;51482:18;;:::i;:::-;51461:41;51529:1;51522:5;51518:13;51511:20;;51370:167;;;:::o;51543:176::-;51575:1;51592:20;51610:1;51592:20;:::i;:::-;51587:25;;51626:20;51644:1;51626:20;:::i;:::-;51621:25;;51665:1;51655:35;;51670:18;;:::i;:::-;51655:35;51711:1;51708;51704:9;51699:14;;51543:176;;;;:::o;51725:180::-;51773:77;51770:1;51763:88;51870:4;51867:1;51860:15;51894:4;51891:1;51884:15;51911:180;51959:77;51956:1;51949:88;52056:4;52053:1;52046:15;52080:4;52077:1;52070:15;52097:180;52145:77;52142:1;52135:88;52242:4;52239:1;52232:15;52266:4;52263:1;52256:15;52283:180;52331:77;52328:1;52321:88;52428:4;52425:1;52418:15;52452:4;52449:1;52442:15;52469:180;52517:77;52514:1;52507:88;52614:4;52611:1;52604:15;52638:4;52635:1;52628:15;52655:183;52690:3;52728:1;52710:16;52707:23;52704:128;;;52766:1;52763;52760;52745:23;52788:34;52819:1;52813:8;52788:34;:::i;:::-;52781:41;;52704:128;52655:183;:::o;52844:117::-;52953:1;52950;52943:12;52967:117;53076:1;53073;53066:12;53090:117;53199:1;53196;53189:12;53213:117;53322:1;53319;53312:12;53336:117;53445:1;53442;53435:12;53459:117;53568:1;53565;53558:12;53582:102;53623:6;53674:2;53670:7;53665:2;53658:5;53654:14;53650:28;53640:38;;53582:102;;;:::o;53690:106::-;53734:8;53783:5;53778:3;53774:15;53753:36;;53690:106;;;:::o;53802:227::-;53942:34;53938:1;53930:6;53926:14;53919:58;54011:10;54006:2;53998:6;53994:15;53987:35;53802:227;:::o;54035:224::-;54175:34;54171:1;54163:6;54159:14;54152:58;54244:7;54239:2;54231:6;54227:15;54220:32;54035:224;:::o;54265:232::-;54405:34;54401:1;54393:6;54389:14;54382:58;54474:15;54469:2;54461:6;54457:15;54450:40;54265:232;:::o;54503:240::-;54643:34;54639:1;54631:6;54627:14;54620:58;54712:23;54707:2;54699:6;54695:15;54688:48;54503:240;:::o;54749:225::-;54889:34;54885:1;54877:6;54873:14;54866:58;54958:8;54953:2;54945:6;54941:15;54934:33;54749:225;:::o;54980:223::-;55120:34;55116:1;55108:6;55104:14;55097:58;55189:6;55184:2;55176:6;55172:15;55165:31;54980:223;:::o;55209:229::-;55349:34;55345:1;55337:6;55333:14;55326:58;55418:12;55413:2;55405:6;55401:15;55394:37;55209:229;:::o;55444:227::-;55584:34;55580:1;55572:6;55568:14;55561:58;55653:10;55648:2;55640:6;55636:15;55629:35;55444:227;:::o;55677:233::-;55817:34;55813:1;55805:6;55801:14;55794:58;55886:16;55881:2;55873:6;55869:15;55862:41;55677:233;:::o;55916:249::-;56056:34;56052:1;56044:6;56040:14;56033:58;56125:32;56120:2;56112:6;56108:15;56101:57;55916:249;:::o;56171:224::-;56311:34;56307:1;56299:6;56295:14;56288:58;56380:7;56375:2;56367:6;56363:15;56356:32;56171:224;:::o;56401:238::-;56541:34;56537:1;56529:6;56525:14;56518:58;56610:21;56605:2;56597:6;56593:15;56586:46;56401:238;:::o;56645:222::-;56785:34;56781:1;56773:6;56769:14;56762:58;56854:5;56849:2;56841:6;56837:15;56830:30;56645:222;:::o;56873:229::-;57013:34;57009:1;57001:6;56997:14;56990:58;57082:12;57077:2;57069:6;57065:15;57058:37;56873:229;:::o;57108:155::-;57248:7;57244:1;57236:6;57232:14;57225:31;57108:155;:::o;57269:182::-;57409:34;57405:1;57397:6;57393:14;57386:58;57269:182;:::o;57457:227::-;57597:34;57593:1;57585:6;57581:14;57574:58;57666:10;57661:2;57653:6;57649:15;57642:35;57457:227;:::o;57690:234::-;57830:34;57826:1;57818:6;57814:14;57807:58;57899:17;57894:2;57886:6;57882:15;57875:42;57690:234;:::o;57930:228::-;58070:34;58066:1;58058:6;58054:14;58047:58;58139:11;58134:2;58126:6;58122:15;58115:36;57930:228;:::o;58164:::-;58304:34;58300:1;58292:6;58288:14;58281:58;58373:11;58368:2;58360:6;58356:15;58349:36;58164:228;:::o;58398:227::-;58538:34;58534:1;58526:6;58522:14;58515:58;58607:10;58602:2;58594:6;58590:15;58583:35;58398:227;:::o;58631:220::-;58771:34;58767:1;58759:6;58755:14;58748:58;58840:3;58835:2;58827:6;58823:15;58816:28;58631:220;:::o;58857:239::-;58997:34;58993:1;58985:6;58981:14;58974:58;59066:22;59061:2;59053:6;59049:15;59042:47;58857:239;:::o;59102:235::-;59242:34;59238:1;59230:6;59226:14;59219:58;59311:18;59306:2;59298:6;59294:15;59287:43;59102:235;:::o;59343:292::-;59483:34;59479:1;59471:6;59467:14;59460:58;59552:34;59547:2;59539:6;59535:15;59528:59;59621:6;59616:2;59608:6;59604:15;59597:31;59343:292;:::o;59641:::-;59781:34;59777:1;59769:6;59765:14;59758:58;59850:34;59845:2;59837:6;59833:15;59826:59;59919:6;59914:2;59906:6;59902:15;59895:31;59641:292;:::o;59939:711::-;59978:3;60016:4;59998:16;59995:26;59992:39;;;60024:5;;59992:39;60053:20;;:::i;:::-;60128:1;60110:16;60106:24;60103:1;60097:4;60082:49;60161:4;60155:11;60260:16;60253:4;60245:6;60241:17;60238:39;60205:18;60197:6;60194:30;60178:113;60175:146;;;60306:5;;;;60175:146;60352:6;60346:4;60342:17;60388:3;60382:10;60415:18;60407:6;60404:30;60401:43;;;60437:5;;;;;;60401:43;60485:6;60478:4;60473:3;60469:14;60465:27;60544:1;60526:16;60522:24;60516:4;60512:35;60507:3;60504:44;60501:57;;;60551:5;;;;;;;60501:57;60568;60616:6;60610:4;60606:17;60598:6;60594:30;60588:4;60568:57;:::i;:::-;60641:3;60634:10;;59982:668;;;;;59939:711;;:::o;60656:122::-;60729:24;60747:5;60729:24;:::i;:::-;60722:5;60719:35;60709:63;;60768:1;60765;60758:12;60709:63;60656:122;:::o;60784:116::-;60854:21;60869:5;60854:21;:::i;:::-;60847:5;60844:32;60834:60;;60890:1;60887;60880:12;60834:60;60784:116;:::o;60906:120::-;60978:23;60995:5;60978:23;:::i;:::-;60971:5;60968:34;60958:62;;61016:1;61013;61006:12;60958:62;60906:120;:::o;61032:::-;61104:23;61121:5;61104:23;:::i;:::-;61097:5;61094:34;61084:62;;61142:1;61139;61132:12;61084:62;61032:120;:::o;61158:122::-;61231:24;61249:5;61231:24;:::i;:::-;61224:5;61221:35;61211:63;;61270:1;61267;61260:12;61211:63;61158:122;:::o;61286:118::-;61357:22;61373:5;61357:22;:::i;:::-;61350:5;61347:33;61337:61;;61394:1;61391;61384:12;61337:61;61286:118;:::o

Swarm Source

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