ETH Price: $2,503.34 (+0.48%)

Token

Magic Mushrooms (SHROOM)
 

Overview

Max Total Supply

219 SHROOM

Holders

76

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SHROOM
0xec8e08da68e0d9f1769a45896c4fcb2bbf5b8756
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:
Mushrooms

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;
    
    // Base URI
    string private _baseURI;

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

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

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

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

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

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

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(bytes(baseURI()).length != 0, "BaseURI has not been set yet");
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

        return string(abi.encodePacked(baseURI(), _tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    
    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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


contract Mushrooms is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public constant MAX_NFT_SUPPLY = 1200;
    
    uint256 public constant reserveMushrooms = 200;

    uint256 public constant tokenPrice = 40000000000000000;

    uint256 public constant _reserveIndexStart = 1000;

    uint256 public constant maxPurchase = 10;

    address public constant devAddress = 0x0dd874F41cE844FcdaeBA33714B6197136D89B7F;

    // used for counting while minting the reserve tokens
    uint256 internal _reserveIndexCounter = 1000;

    // checks whether or not reserves have been taken already
    bool public reservesTaken = false;
    
    // SHA256 of concatenated hash string containing all the hashes of all 1200 tokens 
    string public FinalProofHash;

    // IPFS HASH containing all the token metadata in one json
    string public METADATA_IPFS_HASH;

    // ensures that we do not change the metadata multiple times
    bool public metadataRevealed = false;

    // whether the tokenURI link needs ".json" after the tokenId
    bool internal tokenURIDotJson = false;

    // Sale starts when the function "flipSaleIsActive()" is called
    bool public saleIsActive = false;

    // helper variable for artificial randomness
    uint256 internal _randomOffset = 0;
    
    // starts indexing tokenIds
    uint256 internal _currentTokenId = 0;

    constructor() ERC721("Magic Mushrooms", "SHROOM") {}

    function _getRandomId() internal returns (uint256) {
      uint256 id = uint256(keccak256(abi.encodePacked(block.timestamp + block.difficulty + _randomOffset))) % MAX_NFT_SUPPLY;

      if (totalSupply() < MAX_NFT_SUPPLY) {
        while(_exists(id))  {
        _randomOffset++;
        id = uint256(keccak256(abi.encodePacked(block.timestamp + block.difficulty + _randomOffset))) % MAX_NFT_SUPPLY;
        }
      }
      return id;
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        if (tokenURIDotJson == true) {
            return string(abi.encodePacked(baseURI(), _tokenId.toString(), ".json"));
        } else {
            return string(abi.encodePacked(baseURI(), _tokenId.toString()));
        }
    }

    function mintShrooms(uint256 numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint Mushrooms");
        require(numberOfTokens > 0 && numberOfTokens <= maxPurchase, "Can only mint 10 tokens at a time");
        require(_currentTokenId + numberOfTokens <= _reserveIndexStart, "Purchase would exceed max supply of public Mushrooms");
        require(msg.value >= tokenPrice * numberOfTokens, "Ether value sent is not correct");
        
        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 randHash = _getRandomId();
            if (totalSupply() < MAX_NFT_SUPPLY) {
                _safeMint(msg.sender, randHash);
            }
        }
    }

    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    // OWNER ONLY FUNCTIONS

    // reveals the metadata and prohibits further changes
    function revealMetadata(string memory finalHash, string memory metadataHash) public onlyOwner {
        require(metadataRevealed != true, "CryptoMunks: You've already revealed the metadata!");

        FinalProofHash = finalHash;
        METADATA_IPFS_HASH = metadataHash;
        metadataRevealed = true;
    }

    // withdraw all the Ether from the contract to the owner
    function withdrawAll() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "not enough balance");
        payable(devAddress).transfer(balance*10/100);
        payable(msg.sender).transfer(address(this).balance);
    }

    // set baseURI
    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }

    function getReserves() public onlyOwner {
        require(reservesTaken != true, "Magic Mushrooms: Reserves already taken!");
        
        for (uint256 i = 0; i < 25; i++) {
            uint256 id = _reserveIndexCounter;
            if (totalSupply() < MAX_NFT_SUPPLY) {
                _safeMint(msg.sender, id);
                _reserveIndexCounter++;
            }
        }
        if (_reserveIndexCounter == 1200) {
            reservesTaken = true;
        }
    }
    
    // switches between using and not using the ".json" extension
    function switchDotJson() public onlyOwner {
        if (tokenURIDotJson == true) {
            tokenURIDotJson = false;
        } else {
            tokenURIDotJson = true;
        }
    }

    // begins the sale
    function flipSaleIsActive() public onlyOwner {
        saleIsActive = true;
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FinalProofHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_IPFS_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reserveIndexStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintShrooms","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveMushrooms","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservesTaken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"finalHash","type":"string"},{"internalType":"string","name":"metadataHash","type":"string"}],"name":"revealMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchDotJson","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526103e8600d556000600e60006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506000601160026101000a81548160ff021916908315150217905550600060125560006013553480156200008d57600080fd5b506040518060400160405280600f81526020017f4d61676963204d757368726f6f6d7300000000000000000000000000000000008152506040518060400160405280600681526020017f5348524f4f4d000000000000000000000000000000000000000000000000000081525081600090805190602001906200011292919062000222565b5080600190805190602001906200012b92919062000222565b5050506200014e620001426200015460201b60201c565b6200015c60201b60201c565b62000337565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023090620002d2565b90600052602060002090601f016020900481019282620002545760008555620002a0565b82601f106200026f57805160ff1916838001178555620002a0565b82800160010185558215620002a0579182015b828111156200029f57825182559160200191906001019062000282565b5b509050620002af9190620002b3565b5090565b5b80821115620002ce576000816000905550600101620002b4565b5090565b60006002820490506001821680620002eb57607f821691505b6020821081141562000302576200030162000308565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614ab780620003476000396000f3fe6080604052600436106102305760003560e01c80637ff9b5961161012e578063be18c45e116100ab578063e985e9c51161006f578063e985e9c51461080e578063eb8d24441461084b578063ed06f66b14610876578063f2e94c961461088d578063f2fde38b146108b857610230565b8063be18c45e14610727578063c87b56dd14610752578063d24f07571461078f578063d9f80c3e146107b8578063dcc7ba24146107e357610230565b806395d89b41116100f257806395d89b4114610654578063977b055b1461067f578063a22cb465146106aa578063b5077f44146106d3578063b88d4fde146106fe57610230565b80637ff9b5961461059357806383b96a64146105be5780638462151c146105d5578063853828b6146106125780638da5cb5b1461062957610230565b80632f745c59116101bc57806355f804b31161018057806355f804b3146104ae5780636352211e146104d75780636c0360eb1461051457806370a082311461053f578063715018a61461057c57610230565b80632f745c59146103b55780633ad10ef6146103f257806342842e0e1461041d57806342cc5d25146104465780634f6ccce71461047157610230565b8063095ea7b311610203578063095ea7b3146102f15780630a54b57a1461031a5780630d6023e31461033657806318160ddd1461036157806323b872dd1461038c57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d5780630902f1ac146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906134a8565b6108e1565b6040516102699190613b9e565b60405180910390f35b34801561027e57600080fd5b5061028761095b565b6040516102949190613bb9565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906135a7565b6109ed565b6040516102d19190613b15565b60405180910390f35b3480156102e657600080fd5b506102ef610a72565b005b3480156102fd57600080fd5b506103186004803603810190610313919061346c565b610bcb565b005b610334600480360381019061032f91906135a7565b610ce3565b005b34801561034257600080fd5b5061034b610e74565b6040516103589190613b9e565b60405180910390f35b34801561036d57600080fd5b50610376610e87565b6040516103839190613edb565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190613366565b610e94565b005b3480156103c157600080fd5b506103dc60048036038101906103d7919061346c565b610ef4565b6040516103e99190613edb565b60405180910390f35b3480156103fe57600080fd5b50610407610f99565b6040516104149190613b15565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190613366565b610fb1565b005b34801561045257600080fd5b5061045b610fd1565b6040516104689190613bb9565b60405180910390f35b34801561047d57600080fd5b50610498600480360381019061049391906135a7565b61105f565b6040516104a59190613edb565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d091906134fa565b6110f6565b005b3480156104e357600080fd5b506104fe60048036038101906104f991906135a7565b61117e565b60405161050b9190613b15565b60405180910390f35b34801561052057600080fd5b50610529611230565b6040516105369190613bb9565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613301565b6112c2565b6040516105739190613edb565b60405180910390f35b34801561058857600080fd5b5061059161137a565b005b34801561059f57600080fd5b506105a8611402565b6040516105b59190613edb565b60405180910390f35b3480156105ca57600080fd5b506105d361140d565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613301565b6114e3565b6040516106099190613b7c565b60405180910390f35b34801561061e57600080fd5b5061062761165f565b005b34801561063557600080fd5b5061063e6117e0565b60405161064b9190613b15565b60405180910390f35b34801561066057600080fd5b5061066961180a565b6040516106769190613bb9565b60405180910390f35b34801561068b57600080fd5b5061069461189c565b6040516106a19190613edb565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613430565b6118a1565b005b3480156106df57600080fd5b506106e8611a22565b6040516106f59190613edb565b60405180910390f35b34801561070a57600080fd5b50610725600480360381019061072091906133b5565b611a28565b005b34801561073357600080fd5b5061073c611a8a565b6040516107499190613edb565b60405180910390f35b34801561075e57600080fd5b50610779600480360381019061077491906135a7565b611a90565b6040516107869190613bb9565b60405180910390f35b34801561079b57600080fd5b506107b660048036038101906107b1919061353b565b611b1f565b005b3480156107c457600080fd5b506107cd611c3f565b6040516107da9190613edb565b60405180910390f35b3480156107ef57600080fd5b506107f8611c44565b6040516108059190613b9e565b60405180910390f35b34801561081a57600080fd5b506108356004803603810190610830919061332a565b611c57565b6040516108429190613b9e565b60405180910390f35b34801561085757600080fd5b50610860611ceb565b60405161086d9190613b9e565b60405180910390f35b34801561088257600080fd5b5061088b611cfe565b005b34801561089957600080fd5b506108a2611d97565b6040516108af9190613bb9565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da9190613301565b611e25565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610954575061095382611f1d565b5b9050919050565b60606000805461096a906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610996906141c4565b80156109e35780601f106109b8576101008083540402835291602001916109e3565b820191906000526020600020905b8154815290600101906020018083116109c657829003601f168201915b5050505050905090565b60006109f882611fff565b610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90613ddb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a7a61206b565b73ffffffffffffffffffffffffffffffffffffffff16610a986117e0565b73ffffffffffffffffffffffffffffffffffffffff1614610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae590613dfb565b60405180910390fd5b60011515600e60009054906101000a900460ff1615151415610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613e9b565b60405180910390fd5b60005b6019811015610ba0576000600d5490506104b0610b63610e87565b1015610b8c57610b733382612073565b600d6000815480929190610b8690614227565b91905055505b508080610b9890614227565b915050610b48565b506104b0600d541415610bc9576001600e60006101000a81548160ff0219169083151502179055505b565b6000610bd68261117e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90613e3b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6661206b565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f61206b565b611c57565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90613d5b565b60405180910390fd5b610cde8383612091565b505050565b601160029054906101000a900460ff16610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2990613bdb565b60405180910390fd5b600081118015610d435750600a8111155b610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7990613ebb565b60405180910390fd5b6103e881601354610d939190613ff9565b1115610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90613c9b565b60405180910390fd5b80668e1bc9bf040000610de79190614080565b341015610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090613cfb565b60405180910390fd5b60005b81811015610e70576000610e3e61214a565b90506104b0610e4b610e87565b1015610e5c57610e5b3382612073565b5b508080610e6890614227565b915050610e2c565b5050565b600e60009054906101000a900460ff1681565b6000600a80549050905090565b610ea5610e9f61206b565b82612234565b610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb90613e5b565b60405180910390fd5b610eef838383612312565b505050565b6000610eff836112c2565b8210610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613c1b565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b730dd874f41ce844fcdaeba33714b6197136d89b7f81565b610fcc83838360405180602001604052806000815250611a28565b505050565b600f8054610fde906141c4565b80601f016020809104026020016040519081016040528092919081815260200182805461100a906141c4565b80156110575780601f1061102c57610100808354040283529160200191611057565b820191906000526020600020905b81548152906001019060200180831161103a57829003601f168201915b505050505081565b6000611069610e87565b82106110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190613e7b565b60405180910390fd5b600a82815481106110e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110fe61206b565b73ffffffffffffffffffffffffffffffffffffffff1661111c6117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990613dfb565b60405180910390fd5b61117b8161256e565b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90613d9b565b60405180910390fd5b80915050919050565b60606002805461123f906141c4565b80601f016020809104026020016040519081016040528092919081815260200182805461126b906141c4565b80156112b85780601f1061128d576101008083540402835291602001916112b8565b820191906000526020600020905b81548152906001019060200180831161129b57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90613d7b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61138261206b565b73ffffffffffffffffffffffffffffffffffffffff166113a06117e0565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90613dfb565b60405180910390fd5b6114006000612588565b565b668e1bc9bf04000081565b61141561206b565b73ffffffffffffffffffffffffffffffffffffffff166114336117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090613dfb565b60405180910390fd5b60011515601160019054906101000a900460ff16151514156114c5576000601160016101000a81548160ff0219169083151502179055506114e1565b6001601160016101000a81548160ff0219169083151502179055505b565b606060006114f0836112c2565b9050600081141561157357600067ffffffffffffffff81111561153c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561156a5781602001602082028036833780820191505090505b5091505061165a565b60008167ffffffffffffffff8111156115b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115e35781602001602082028036833780820191505090505b50905060005b82811015611653576115fb8582610ef4565b828281518110611634577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061164b90614227565b9150506115e9565b8193505050505b919050565b61166761206b565b73ffffffffffffffffffffffffffffffffffffffff166116856117e0565b73ffffffffffffffffffffffffffffffffffffffff16146116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290613dfb565b60405180910390fd5b600047905060008111611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a90613d3b565b60405180910390fd5b730dd874f41ce844fcdaeba33714b6197136d89b7f73ffffffffffffffffffffffffffffffffffffffff166108fc6064600a846117609190614080565b61176a919061404f565b9081150290604051600060405180830381858888f19350505050158015611795573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156117dc573d6000803e3d6000fd5b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611819906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611845906141c4565b80156118925780601f1061186757610100808354040283529160200191611892565b820191906000526020600020905b81548152906001019060200180831161187557829003601f168201915b5050505050905090565b600a81565b6118a961206b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90613cdb565b60405180910390fd5b806006600061192461206b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119d161206b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a169190613b9e565b60405180910390a35050565b6104b081565b611a39611a3361206b565b83612234565b611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90613e5b565b60405180910390fd5b611a848484848461264e565b50505050565b6103e881565b606060011515601160019054906101000a900460ff1615151415611ae657611ab6611230565b611abf836126aa565b604051602001611ad0929190613acb565b6040516020818303038152906040529050611b1a565b611aee611230565b611af7836126aa565b604051602001611b08929190613aa7565b60405160208183030381529060405290505b919050565b611b2761206b565b73ffffffffffffffffffffffffffffffffffffffff16611b456117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9290613dfb565b60405180910390fd5b60011515601160009054906101000a900460ff1615151415611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990613bfb565b60405180910390fd5b81600f9080519060200190611c08929190613125565b508060109080519060200190611c1f929190613125565b506001601160006101000a81548160ff0219169083151502179055505050565b60c881565b601160009054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160029054906101000a900460ff1681565b611d0661206b565b73ffffffffffffffffffffffffffffffffffffffff16611d246117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7190613dfb565b60405180910390fd5b6001601160026101000a81548160ff021916908315150217905550565b60108054611da4906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd0906141c4565b8015611e1d5780601f10611df257610100808354040283529160200191611e1d565b820191906000526020600020905b815481529060010190602001808311611e0057829003601f168201915b505050505081565b611e2d61206b565b73ffffffffffffffffffffffffffffffffffffffff16611e4b6117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890613dfb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890613c5b565b60405180910390fd5b611f1a81612588565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fe857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ff85750611ff782612857565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b61208d8282604051806020016040528060008152506128c1565b5050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166121048361117e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806104b0601254444261215f9190613ff9565b6121699190613ff9565b6040516020016121799190613afa565b6040516020818303038152906040528051906020012060001c61219c919061427a565b90506104b06121a9610e87565b101561222d575b6121b981611fff565b1561222c57601260008154809291906121d190614227565b91905055506104b060125444426121e89190613ff9565b6121f29190613ff9565b6040516020016122029190613afa565b6040516020818303038152906040528051906020012060001c612225919061427a565b90506121b0565b5b8091505090565b600061223f82611fff565b61227e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227590613d1b565b60405180910390fd5b60006122898361117e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122f857508373ffffffffffffffffffffffffffffffffffffffff166122e0846109ed565b73ffffffffffffffffffffffffffffffffffffffff16145b8061230957506123088185611c57565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123328261117e565b73ffffffffffffffffffffffffffffffffffffffff1614612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90613e1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ef90613cbb565b60405180910390fd5b61240383838361291c565b61240e600082612091565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461245e91906140da565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124b59190613ff9565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8060029080519060200190612584929190613125565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612659848484612312565b61266584848484612a30565b6126a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269b90613c3b565b60405180910390fd5b50505050565b606060008214156126f2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612852565b600082905060005b6000821461272457808061270d90614227565b915050600a8261271d919061404f565b91506126fa565b60008167ffffffffffffffff811115612766577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127985781602001600182028036833780820191505090505b5090505b6000851461284b576001826127b191906140da565b9150600a856127c0919061427a565b60306127cc9190613ff9565b60f81b818381518110612808577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612844919061404f565b945061279c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128cb8383612bc7565b6128d86000848484612a30565b612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e90613c3b565b60405180910390fd5b505050565b612927838383612d95565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561296a5761296581612d9a565b6129a9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129a8576129a78382612de3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129ec576129e781612f50565b612a2b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a2a57612a298282613093565b5b5b505050565b6000612a518473ffffffffffffffffffffffffffffffffffffffff16613112565b15612bba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a7a61206b565b8786866040518563ffffffff1660e01b8152600401612a9c9493929190613b30565b602060405180830381600087803b158015612ab657600080fd5b505af1925050508015612ae757506040513d601f19601f82011682018060405250810190612ae491906134d1565b60015b612b6a573d8060008114612b17576040519150601f19603f3d011682016040523d82523d6000602084013e612b1c565b606091505b50600081511415612b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5990613c3b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bbf565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e90613dbb565b60405180910390fd5b612c4081611fff565b15612c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7790613c7b565b60405180910390fd5b612c8c6000838361291c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cdc9190613ff9565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612df0846112c2565b612dfa91906140da565b9050600060096000848152602001908152602001600020549050818114612edf576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612f6491906140da565b90506000600b60008481526020019081526020016000205490506000600a8381548110612fba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a8381548110613002577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613077577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061309e836112c2565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613131906141c4565b90600052602060002090601f016020900481019282613153576000855561319a565b82601f1061316c57805160ff191683800117855561319a565b8280016001018555821561319a579182015b8281111561319957825182559160200191906001019061317e565b5b5090506131a791906131ab565b5090565b5b808211156131c45760008160009055506001016131ac565b5090565b60006131db6131d684613f1b565b613ef6565b9050828152602081018484840111156131f357600080fd5b6131fe848285614182565b509392505050565b600061321961321484613f4c565b613ef6565b90508281526020810184848401111561323157600080fd5b61323c848285614182565b509392505050565b60008135905061325381614a25565b92915050565b60008135905061326881614a3c565b92915050565b60008135905061327d81614a53565b92915050565b60008151905061329281614a53565b92915050565b600082601f8301126132a957600080fd5b81356132b98482602086016131c8565b91505092915050565b600082601f8301126132d357600080fd5b81356132e3848260208601613206565b91505092915050565b6000813590506132fb81614a6a565b92915050565b60006020828403121561331357600080fd5b600061332184828501613244565b91505092915050565b6000806040838503121561333d57600080fd5b600061334b85828601613244565b925050602061335c85828601613244565b9150509250929050565b60008060006060848603121561337b57600080fd5b600061338986828701613244565b935050602061339a86828701613244565b92505060406133ab868287016132ec565b9150509250925092565b600080600080608085870312156133cb57600080fd5b60006133d987828801613244565b94505060206133ea87828801613244565b93505060406133fb878288016132ec565b925050606085013567ffffffffffffffff81111561341857600080fd5b61342487828801613298565b91505092959194509250565b6000806040838503121561344357600080fd5b600061345185828601613244565b925050602061346285828601613259565b9150509250929050565b6000806040838503121561347f57600080fd5b600061348d85828601613244565b925050602061349e858286016132ec565b9150509250929050565b6000602082840312156134ba57600080fd5b60006134c88482850161326e565b91505092915050565b6000602082840312156134e357600080fd5b60006134f184828501613283565b91505092915050565b60006020828403121561350c57600080fd5b600082013567ffffffffffffffff81111561352657600080fd5b613532848285016132c2565b91505092915050565b6000806040838503121561354e57600080fd5b600083013567ffffffffffffffff81111561356857600080fd5b613574858286016132c2565b925050602083013567ffffffffffffffff81111561359157600080fd5b61359d858286016132c2565b9150509250929050565b6000602082840312156135b957600080fd5b60006135c7848285016132ec565b91505092915050565b60006135dc8383613a72565b60208301905092915050565b6135f18161410e565b82525050565b600061360282613f8d565b61360c8185613fbb565b935061361783613f7d565b8060005b8381101561364857815161362f88826135d0565b975061363a83613fae565b92505060018101905061361b565b5085935050505092915050565b61365e81614120565b82525050565b600061366f82613f98565b6136798185613fcc565b9350613689818560208601614191565b61369281614367565b840191505092915050565b60006136a882613fa3565b6136b28185613fdd565b93506136c2818560208601614191565b6136cb81614367565b840191505092915050565b60006136e182613fa3565b6136eb8185613fee565b93506136fb818560208601614191565b80840191505092915050565b6000613714602583613fdd565b915061371f82614378565b604082019050919050565b6000613737603283613fdd565b9150613742826143c7565b604082019050919050565b600061375a602b83613fdd565b915061376582614416565b604082019050919050565b600061377d603283613fdd565b915061378882614465565b604082019050919050565b60006137a0602683613fdd565b91506137ab826144b4565b604082019050919050565b60006137c3601c83613fdd565b91506137ce82614503565b602082019050919050565b60006137e6603483613fdd565b91506137f18261452c565b604082019050919050565b6000613809602483613fdd565b91506138148261457b565b604082019050919050565b600061382c601983613fdd565b9150613837826145ca565b602082019050919050565b600061384f601f83613fdd565b915061385a826145f3565b602082019050919050565b6000613872602c83613fdd565b915061387d8261461c565b604082019050919050565b6000613895601283613fdd565b91506138a08261466b565b602082019050919050565b60006138b8603883613fdd565b91506138c382614694565b604082019050919050565b60006138db602a83613fdd565b91506138e6826146e3565b604082019050919050565b60006138fe602983613fdd565b915061390982614732565b604082019050919050565b6000613921602083613fdd565b915061392c82614781565b602082019050919050565b6000613944602c83613fdd565b915061394f826147aa565b604082019050919050565b6000613967600583613fee565b9150613972826147f9565b600582019050919050565b600061398a602083613fdd565b915061399582614822565b602082019050919050565b60006139ad602983613fdd565b91506139b88261484b565b604082019050919050565b60006139d0602183613fdd565b91506139db8261489a565b604082019050919050565b60006139f3603183613fdd565b91506139fe826148e9565b604082019050919050565b6000613a16602c83613fdd565b9150613a2182614938565b604082019050919050565b6000613a39602883613fdd565b9150613a4482614987565b604082019050919050565b6000613a5c602183613fdd565b9150613a67826149d6565b604082019050919050565b613a7b81614178565b82525050565b613a8a81614178565b82525050565b613aa1613a9c82614178565b614270565b82525050565b6000613ab382856136d6565b9150613abf82846136d6565b91508190509392505050565b6000613ad782856136d6565b9150613ae382846136d6565b9150613aee8261395a565b91508190509392505050565b6000613b068284613a90565b60208201915081905092915050565b6000602082019050613b2a60008301846135e8565b92915050565b6000608082019050613b4560008301876135e8565b613b5260208301866135e8565b613b5f6040830185613a81565b8181036060830152613b718184613664565b905095945050505050565b60006020820190508181036000830152613b9681846135f7565b905092915050565b6000602082019050613bb36000830184613655565b92915050565b60006020820190508181036000830152613bd3818461369d565b905092915050565b60006020820190508181036000830152613bf481613707565b9050919050565b60006020820190508181036000830152613c148161372a565b9050919050565b60006020820190508181036000830152613c348161374d565b9050919050565b60006020820190508181036000830152613c5481613770565b9050919050565b60006020820190508181036000830152613c7481613793565b9050919050565b60006020820190508181036000830152613c94816137b6565b9050919050565b60006020820190508181036000830152613cb4816137d9565b9050919050565b60006020820190508181036000830152613cd4816137fc565b9050919050565b60006020820190508181036000830152613cf48161381f565b9050919050565b60006020820190508181036000830152613d1481613842565b9050919050565b60006020820190508181036000830152613d3481613865565b9050919050565b60006020820190508181036000830152613d5481613888565b9050919050565b60006020820190508181036000830152613d74816138ab565b9050919050565b60006020820190508181036000830152613d94816138ce565b9050919050565b60006020820190508181036000830152613db4816138f1565b9050919050565b60006020820190508181036000830152613dd481613914565b9050919050565b60006020820190508181036000830152613df481613937565b9050919050565b60006020820190508181036000830152613e148161397d565b9050919050565b60006020820190508181036000830152613e34816139a0565b9050919050565b60006020820190508181036000830152613e54816139c3565b9050919050565b60006020820190508181036000830152613e74816139e6565b9050919050565b60006020820190508181036000830152613e9481613a09565b9050919050565b60006020820190508181036000830152613eb481613a2c565b9050919050565b60006020820190508181036000830152613ed481613a4f565b9050919050565b6000602082019050613ef06000830184613a81565b92915050565b6000613f00613f11565b9050613f0c82826141f6565b919050565b6000604051905090565b600067ffffffffffffffff821115613f3657613f35614338565b5b613f3f82614367565b9050602081019050919050565b600067ffffffffffffffff821115613f6757613f66614338565b5b613f7082614367565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061400482614178565b915061400f83614178565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614044576140436142ab565b5b828201905092915050565b600061405a82614178565b915061406583614178565b925082614075576140746142da565b5b828204905092915050565b600061408b82614178565b915061409683614178565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140cf576140ce6142ab565b5b828202905092915050565b60006140e582614178565b91506140f083614178565b925082821015614103576141026142ab565b5b828203905092915050565b600061411982614158565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141af578082015181840152602081019050614194565b838111156141be576000848401525b50505050565b600060028204905060018216806141dc57607f821691505b602082108114156141f0576141ef614309565b5b50919050565b6141ff82614367565b810181811067ffffffffffffffff8211171561421e5761421d614338565b5b80604052505050565b600061423282614178565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614265576142646142ab565b5b600182019050919050565b6000819050919050565b600061428582614178565b915061429083614178565b9250826142a05761429f6142da565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c65206d7573742062652061637469766520746f206d696e74204d75736860008201527f726f6f6d73000000000000000000000000000000000000000000000000000000602082015250565b7f43727970746f4d756e6b733a20596f7527766520616c7265616479207265766560008201527f616c656420746865206d65746164617461210000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66207075626c6963204d757368726f6f6d73000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f7567682062616c616e63650000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d61676963204d757368726f6f6d733a20526573657276657320616c7265616460008201527f792074616b656e21000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420313020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b614a2e8161410e565b8114614a3957600080fd5b50565b614a4581614120565b8114614a5057600080fd5b50565b614a5c8161412c565b8114614a6757600080fd5b50565b614a7381614178565b8114614a7e57600080fd5b5056fea2646970667358221220d0e520d45318e46b6c1849644a2db7480bb60f7bf0c3c0f70333cd3d5f2a681164736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102305760003560e01c80637ff9b5961161012e578063be18c45e116100ab578063e985e9c51161006f578063e985e9c51461080e578063eb8d24441461084b578063ed06f66b14610876578063f2e94c961461088d578063f2fde38b146108b857610230565b8063be18c45e14610727578063c87b56dd14610752578063d24f07571461078f578063d9f80c3e146107b8578063dcc7ba24146107e357610230565b806395d89b41116100f257806395d89b4114610654578063977b055b1461067f578063a22cb465146106aa578063b5077f44146106d3578063b88d4fde146106fe57610230565b80637ff9b5961461059357806383b96a64146105be5780638462151c146105d5578063853828b6146106125780638da5cb5b1461062957610230565b80632f745c59116101bc57806355f804b31161018057806355f804b3146104ae5780636352211e146104d75780636c0360eb1461051457806370a082311461053f578063715018a61461057c57610230565b80632f745c59146103b55780633ad10ef6146103f257806342842e0e1461041d57806342cc5d25146104465780634f6ccce71461047157610230565b8063095ea7b311610203578063095ea7b3146102f15780630a54b57a1461031a5780630d6023e31461033657806318160ddd1461036157806323b872dd1461038c57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d5780630902f1ac146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906134a8565b6108e1565b6040516102699190613b9e565b60405180910390f35b34801561027e57600080fd5b5061028761095b565b6040516102949190613bb9565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906135a7565b6109ed565b6040516102d19190613b15565b60405180910390f35b3480156102e657600080fd5b506102ef610a72565b005b3480156102fd57600080fd5b506103186004803603810190610313919061346c565b610bcb565b005b610334600480360381019061032f91906135a7565b610ce3565b005b34801561034257600080fd5b5061034b610e74565b6040516103589190613b9e565b60405180910390f35b34801561036d57600080fd5b50610376610e87565b6040516103839190613edb565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190613366565b610e94565b005b3480156103c157600080fd5b506103dc60048036038101906103d7919061346c565b610ef4565b6040516103e99190613edb565b60405180910390f35b3480156103fe57600080fd5b50610407610f99565b6040516104149190613b15565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190613366565b610fb1565b005b34801561045257600080fd5b5061045b610fd1565b6040516104689190613bb9565b60405180910390f35b34801561047d57600080fd5b50610498600480360381019061049391906135a7565b61105f565b6040516104a59190613edb565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d091906134fa565b6110f6565b005b3480156104e357600080fd5b506104fe60048036038101906104f991906135a7565b61117e565b60405161050b9190613b15565b60405180910390f35b34801561052057600080fd5b50610529611230565b6040516105369190613bb9565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613301565b6112c2565b6040516105739190613edb565b60405180910390f35b34801561058857600080fd5b5061059161137a565b005b34801561059f57600080fd5b506105a8611402565b6040516105b59190613edb565b60405180910390f35b3480156105ca57600080fd5b506105d361140d565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613301565b6114e3565b6040516106099190613b7c565b60405180910390f35b34801561061e57600080fd5b5061062761165f565b005b34801561063557600080fd5b5061063e6117e0565b60405161064b9190613b15565b60405180910390f35b34801561066057600080fd5b5061066961180a565b6040516106769190613bb9565b60405180910390f35b34801561068b57600080fd5b5061069461189c565b6040516106a19190613edb565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613430565b6118a1565b005b3480156106df57600080fd5b506106e8611a22565b6040516106f59190613edb565b60405180910390f35b34801561070a57600080fd5b50610725600480360381019061072091906133b5565b611a28565b005b34801561073357600080fd5b5061073c611a8a565b6040516107499190613edb565b60405180910390f35b34801561075e57600080fd5b50610779600480360381019061077491906135a7565b611a90565b6040516107869190613bb9565b60405180910390f35b34801561079b57600080fd5b506107b660048036038101906107b1919061353b565b611b1f565b005b3480156107c457600080fd5b506107cd611c3f565b6040516107da9190613edb565b60405180910390f35b3480156107ef57600080fd5b506107f8611c44565b6040516108059190613b9e565b60405180910390f35b34801561081a57600080fd5b506108356004803603810190610830919061332a565b611c57565b6040516108429190613b9e565b60405180910390f35b34801561085757600080fd5b50610860611ceb565b60405161086d9190613b9e565b60405180910390f35b34801561088257600080fd5b5061088b611cfe565b005b34801561089957600080fd5b506108a2611d97565b6040516108af9190613bb9565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da9190613301565b611e25565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610954575061095382611f1d565b5b9050919050565b60606000805461096a906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610996906141c4565b80156109e35780601f106109b8576101008083540402835291602001916109e3565b820191906000526020600020905b8154815290600101906020018083116109c657829003601f168201915b5050505050905090565b60006109f882611fff565b610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90613ddb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a7a61206b565b73ffffffffffffffffffffffffffffffffffffffff16610a986117e0565b73ffffffffffffffffffffffffffffffffffffffff1614610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae590613dfb565b60405180910390fd5b60011515600e60009054906101000a900460ff1615151415610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613e9b565b60405180910390fd5b60005b6019811015610ba0576000600d5490506104b0610b63610e87565b1015610b8c57610b733382612073565b600d6000815480929190610b8690614227565b91905055505b508080610b9890614227565b915050610b48565b506104b0600d541415610bc9576001600e60006101000a81548160ff0219169083151502179055505b565b6000610bd68261117e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90613e3b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6661206b565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f61206b565b611c57565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90613d5b565b60405180910390fd5b610cde8383612091565b505050565b601160029054906101000a900460ff16610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2990613bdb565b60405180910390fd5b600081118015610d435750600a8111155b610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7990613ebb565b60405180910390fd5b6103e881601354610d939190613ff9565b1115610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90613c9b565b60405180910390fd5b80668e1bc9bf040000610de79190614080565b341015610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090613cfb565b60405180910390fd5b60005b81811015610e70576000610e3e61214a565b90506104b0610e4b610e87565b1015610e5c57610e5b3382612073565b5b508080610e6890614227565b915050610e2c565b5050565b600e60009054906101000a900460ff1681565b6000600a80549050905090565b610ea5610e9f61206b565b82612234565b610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb90613e5b565b60405180910390fd5b610eef838383612312565b505050565b6000610eff836112c2565b8210610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613c1b565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b730dd874f41ce844fcdaeba33714b6197136d89b7f81565b610fcc83838360405180602001604052806000815250611a28565b505050565b600f8054610fde906141c4565b80601f016020809104026020016040519081016040528092919081815260200182805461100a906141c4565b80156110575780601f1061102c57610100808354040283529160200191611057565b820191906000526020600020905b81548152906001019060200180831161103a57829003601f168201915b505050505081565b6000611069610e87565b82106110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190613e7b565b60405180910390fd5b600a82815481106110e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110fe61206b565b73ffffffffffffffffffffffffffffffffffffffff1661111c6117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990613dfb565b60405180910390fd5b61117b8161256e565b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90613d9b565b60405180910390fd5b80915050919050565b60606002805461123f906141c4565b80601f016020809104026020016040519081016040528092919081815260200182805461126b906141c4565b80156112b85780601f1061128d576101008083540402835291602001916112b8565b820191906000526020600020905b81548152906001019060200180831161129b57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90613d7b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61138261206b565b73ffffffffffffffffffffffffffffffffffffffff166113a06117e0565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90613dfb565b60405180910390fd5b6114006000612588565b565b668e1bc9bf04000081565b61141561206b565b73ffffffffffffffffffffffffffffffffffffffff166114336117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090613dfb565b60405180910390fd5b60011515601160019054906101000a900460ff16151514156114c5576000601160016101000a81548160ff0219169083151502179055506114e1565b6001601160016101000a81548160ff0219169083151502179055505b565b606060006114f0836112c2565b9050600081141561157357600067ffffffffffffffff81111561153c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561156a5781602001602082028036833780820191505090505b5091505061165a565b60008167ffffffffffffffff8111156115b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115e35781602001602082028036833780820191505090505b50905060005b82811015611653576115fb8582610ef4565b828281518110611634577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061164b90614227565b9150506115e9565b8193505050505b919050565b61166761206b565b73ffffffffffffffffffffffffffffffffffffffff166116856117e0565b73ffffffffffffffffffffffffffffffffffffffff16146116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290613dfb565b60405180910390fd5b600047905060008111611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a90613d3b565b60405180910390fd5b730dd874f41ce844fcdaeba33714b6197136d89b7f73ffffffffffffffffffffffffffffffffffffffff166108fc6064600a846117609190614080565b61176a919061404f565b9081150290604051600060405180830381858888f19350505050158015611795573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156117dc573d6000803e3d6000fd5b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611819906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611845906141c4565b80156118925780601f1061186757610100808354040283529160200191611892565b820191906000526020600020905b81548152906001019060200180831161187557829003601f168201915b5050505050905090565b600a81565b6118a961206b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90613cdb565b60405180910390fd5b806006600061192461206b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119d161206b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a169190613b9e565b60405180910390a35050565b6104b081565b611a39611a3361206b565b83612234565b611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90613e5b565b60405180910390fd5b611a848484848461264e565b50505050565b6103e881565b606060011515601160019054906101000a900460ff1615151415611ae657611ab6611230565b611abf836126aa565b604051602001611ad0929190613acb565b6040516020818303038152906040529050611b1a565b611aee611230565b611af7836126aa565b604051602001611b08929190613aa7565b60405160208183030381529060405290505b919050565b611b2761206b565b73ffffffffffffffffffffffffffffffffffffffff16611b456117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9290613dfb565b60405180910390fd5b60011515601160009054906101000a900460ff1615151415611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990613bfb565b60405180910390fd5b81600f9080519060200190611c08929190613125565b508060109080519060200190611c1f929190613125565b506001601160006101000a81548160ff0219169083151502179055505050565b60c881565b601160009054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160029054906101000a900460ff1681565b611d0661206b565b73ffffffffffffffffffffffffffffffffffffffff16611d246117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7190613dfb565b60405180910390fd5b6001601160026101000a81548160ff021916908315150217905550565b60108054611da4906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd0906141c4565b8015611e1d5780601f10611df257610100808354040283529160200191611e1d565b820191906000526020600020905b815481529060010190602001808311611e0057829003601f168201915b505050505081565b611e2d61206b565b73ffffffffffffffffffffffffffffffffffffffff16611e4b6117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890613dfb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890613c5b565b60405180910390fd5b611f1a81612588565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fe857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ff85750611ff782612857565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b61208d8282604051806020016040528060008152506128c1565b5050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166121048361117e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806104b0601254444261215f9190613ff9565b6121699190613ff9565b6040516020016121799190613afa565b6040516020818303038152906040528051906020012060001c61219c919061427a565b90506104b06121a9610e87565b101561222d575b6121b981611fff565b1561222c57601260008154809291906121d190614227565b91905055506104b060125444426121e89190613ff9565b6121f29190613ff9565b6040516020016122029190613afa565b6040516020818303038152906040528051906020012060001c612225919061427a565b90506121b0565b5b8091505090565b600061223f82611fff565b61227e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227590613d1b565b60405180910390fd5b60006122898361117e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122f857508373ffffffffffffffffffffffffffffffffffffffff166122e0846109ed565b73ffffffffffffffffffffffffffffffffffffffff16145b8061230957506123088185611c57565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123328261117e565b73ffffffffffffffffffffffffffffffffffffffff1614612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90613e1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ef90613cbb565b60405180910390fd5b61240383838361291c565b61240e600082612091565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461245e91906140da565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124b59190613ff9565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8060029080519060200190612584929190613125565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612659848484612312565b61266584848484612a30565b6126a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269b90613c3b565b60405180910390fd5b50505050565b606060008214156126f2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612852565b600082905060005b6000821461272457808061270d90614227565b915050600a8261271d919061404f565b91506126fa565b60008167ffffffffffffffff811115612766577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127985781602001600182028036833780820191505090505b5090505b6000851461284b576001826127b191906140da565b9150600a856127c0919061427a565b60306127cc9190613ff9565b60f81b818381518110612808577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612844919061404f565b945061279c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128cb8383612bc7565b6128d86000848484612a30565b612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e90613c3b565b60405180910390fd5b505050565b612927838383612d95565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561296a5761296581612d9a565b6129a9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129a8576129a78382612de3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129ec576129e781612f50565b612a2b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a2a57612a298282613093565b5b5b505050565b6000612a518473ffffffffffffffffffffffffffffffffffffffff16613112565b15612bba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a7a61206b565b8786866040518563ffffffff1660e01b8152600401612a9c9493929190613b30565b602060405180830381600087803b158015612ab657600080fd5b505af1925050508015612ae757506040513d601f19601f82011682018060405250810190612ae491906134d1565b60015b612b6a573d8060008114612b17576040519150601f19603f3d011682016040523d82523d6000602084013e612b1c565b606091505b50600081511415612b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5990613c3b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bbf565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e90613dbb565b60405180910390fd5b612c4081611fff565b15612c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7790613c7b565b60405180910390fd5b612c8c6000838361291c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cdc9190613ff9565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612df0846112c2565b612dfa91906140da565b9050600060096000848152602001908152602001600020549050818114612edf576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612f6491906140da565b90506000600b60008481526020019081526020016000205490506000600a8381548110612fba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a8381548110613002577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613077577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061309e836112c2565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613131906141c4565b90600052602060002090601f016020900481019282613153576000855561319a565b82601f1061316c57805160ff191683800117855561319a565b8280016001018555821561319a579182015b8281111561319957825182559160200191906001019061317e565b5b5090506131a791906131ab565b5090565b5b808211156131c45760008160009055506001016131ac565b5090565b60006131db6131d684613f1b565b613ef6565b9050828152602081018484840111156131f357600080fd5b6131fe848285614182565b509392505050565b600061321961321484613f4c565b613ef6565b90508281526020810184848401111561323157600080fd5b61323c848285614182565b509392505050565b60008135905061325381614a25565b92915050565b60008135905061326881614a3c565b92915050565b60008135905061327d81614a53565b92915050565b60008151905061329281614a53565b92915050565b600082601f8301126132a957600080fd5b81356132b98482602086016131c8565b91505092915050565b600082601f8301126132d357600080fd5b81356132e3848260208601613206565b91505092915050565b6000813590506132fb81614a6a565b92915050565b60006020828403121561331357600080fd5b600061332184828501613244565b91505092915050565b6000806040838503121561333d57600080fd5b600061334b85828601613244565b925050602061335c85828601613244565b9150509250929050565b60008060006060848603121561337b57600080fd5b600061338986828701613244565b935050602061339a86828701613244565b92505060406133ab868287016132ec565b9150509250925092565b600080600080608085870312156133cb57600080fd5b60006133d987828801613244565b94505060206133ea87828801613244565b93505060406133fb878288016132ec565b925050606085013567ffffffffffffffff81111561341857600080fd5b61342487828801613298565b91505092959194509250565b6000806040838503121561344357600080fd5b600061345185828601613244565b925050602061346285828601613259565b9150509250929050565b6000806040838503121561347f57600080fd5b600061348d85828601613244565b925050602061349e858286016132ec565b9150509250929050565b6000602082840312156134ba57600080fd5b60006134c88482850161326e565b91505092915050565b6000602082840312156134e357600080fd5b60006134f184828501613283565b91505092915050565b60006020828403121561350c57600080fd5b600082013567ffffffffffffffff81111561352657600080fd5b613532848285016132c2565b91505092915050565b6000806040838503121561354e57600080fd5b600083013567ffffffffffffffff81111561356857600080fd5b613574858286016132c2565b925050602083013567ffffffffffffffff81111561359157600080fd5b61359d858286016132c2565b9150509250929050565b6000602082840312156135b957600080fd5b60006135c7848285016132ec565b91505092915050565b60006135dc8383613a72565b60208301905092915050565b6135f18161410e565b82525050565b600061360282613f8d565b61360c8185613fbb565b935061361783613f7d565b8060005b8381101561364857815161362f88826135d0565b975061363a83613fae565b92505060018101905061361b565b5085935050505092915050565b61365e81614120565b82525050565b600061366f82613f98565b6136798185613fcc565b9350613689818560208601614191565b61369281614367565b840191505092915050565b60006136a882613fa3565b6136b28185613fdd565b93506136c2818560208601614191565b6136cb81614367565b840191505092915050565b60006136e182613fa3565b6136eb8185613fee565b93506136fb818560208601614191565b80840191505092915050565b6000613714602583613fdd565b915061371f82614378565b604082019050919050565b6000613737603283613fdd565b9150613742826143c7565b604082019050919050565b600061375a602b83613fdd565b915061376582614416565b604082019050919050565b600061377d603283613fdd565b915061378882614465565b604082019050919050565b60006137a0602683613fdd565b91506137ab826144b4565b604082019050919050565b60006137c3601c83613fdd565b91506137ce82614503565b602082019050919050565b60006137e6603483613fdd565b91506137f18261452c565b604082019050919050565b6000613809602483613fdd565b91506138148261457b565b604082019050919050565b600061382c601983613fdd565b9150613837826145ca565b602082019050919050565b600061384f601f83613fdd565b915061385a826145f3565b602082019050919050565b6000613872602c83613fdd565b915061387d8261461c565b604082019050919050565b6000613895601283613fdd565b91506138a08261466b565b602082019050919050565b60006138b8603883613fdd565b91506138c382614694565b604082019050919050565b60006138db602a83613fdd565b91506138e6826146e3565b604082019050919050565b60006138fe602983613fdd565b915061390982614732565b604082019050919050565b6000613921602083613fdd565b915061392c82614781565b602082019050919050565b6000613944602c83613fdd565b915061394f826147aa565b604082019050919050565b6000613967600583613fee565b9150613972826147f9565b600582019050919050565b600061398a602083613fdd565b915061399582614822565b602082019050919050565b60006139ad602983613fdd565b91506139b88261484b565b604082019050919050565b60006139d0602183613fdd565b91506139db8261489a565b604082019050919050565b60006139f3603183613fdd565b91506139fe826148e9565b604082019050919050565b6000613a16602c83613fdd565b9150613a2182614938565b604082019050919050565b6000613a39602883613fdd565b9150613a4482614987565b604082019050919050565b6000613a5c602183613fdd565b9150613a67826149d6565b604082019050919050565b613a7b81614178565b82525050565b613a8a81614178565b82525050565b613aa1613a9c82614178565b614270565b82525050565b6000613ab382856136d6565b9150613abf82846136d6565b91508190509392505050565b6000613ad782856136d6565b9150613ae382846136d6565b9150613aee8261395a565b91508190509392505050565b6000613b068284613a90565b60208201915081905092915050565b6000602082019050613b2a60008301846135e8565b92915050565b6000608082019050613b4560008301876135e8565b613b5260208301866135e8565b613b5f6040830185613a81565b8181036060830152613b718184613664565b905095945050505050565b60006020820190508181036000830152613b9681846135f7565b905092915050565b6000602082019050613bb36000830184613655565b92915050565b60006020820190508181036000830152613bd3818461369d565b905092915050565b60006020820190508181036000830152613bf481613707565b9050919050565b60006020820190508181036000830152613c148161372a565b9050919050565b60006020820190508181036000830152613c348161374d565b9050919050565b60006020820190508181036000830152613c5481613770565b9050919050565b60006020820190508181036000830152613c7481613793565b9050919050565b60006020820190508181036000830152613c94816137b6565b9050919050565b60006020820190508181036000830152613cb4816137d9565b9050919050565b60006020820190508181036000830152613cd4816137fc565b9050919050565b60006020820190508181036000830152613cf48161381f565b9050919050565b60006020820190508181036000830152613d1481613842565b9050919050565b60006020820190508181036000830152613d3481613865565b9050919050565b60006020820190508181036000830152613d5481613888565b9050919050565b60006020820190508181036000830152613d74816138ab565b9050919050565b60006020820190508181036000830152613d94816138ce565b9050919050565b60006020820190508181036000830152613db4816138f1565b9050919050565b60006020820190508181036000830152613dd481613914565b9050919050565b60006020820190508181036000830152613df481613937565b9050919050565b60006020820190508181036000830152613e148161397d565b9050919050565b60006020820190508181036000830152613e34816139a0565b9050919050565b60006020820190508181036000830152613e54816139c3565b9050919050565b60006020820190508181036000830152613e74816139e6565b9050919050565b60006020820190508181036000830152613e9481613a09565b9050919050565b60006020820190508181036000830152613eb481613a2c565b9050919050565b60006020820190508181036000830152613ed481613a4f565b9050919050565b6000602082019050613ef06000830184613a81565b92915050565b6000613f00613f11565b9050613f0c82826141f6565b919050565b6000604051905090565b600067ffffffffffffffff821115613f3657613f35614338565b5b613f3f82614367565b9050602081019050919050565b600067ffffffffffffffff821115613f6757613f66614338565b5b613f7082614367565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061400482614178565b915061400f83614178565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614044576140436142ab565b5b828201905092915050565b600061405a82614178565b915061406583614178565b925082614075576140746142da565b5b828204905092915050565b600061408b82614178565b915061409683614178565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140cf576140ce6142ab565b5b828202905092915050565b60006140e582614178565b91506140f083614178565b925082821015614103576141026142ab565b5b828203905092915050565b600061411982614158565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141af578082015181840152602081019050614194565b838111156141be576000848401525b50505050565b600060028204905060018216806141dc57607f821691505b602082108114156141f0576141ef614309565b5b50919050565b6141ff82614367565b810181811067ffffffffffffffff8211171561421e5761421d614338565b5b80604052505050565b600061423282614178565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614265576142646142ab565b5b600182019050919050565b6000819050919050565b600061428582614178565b915061429083614178565b9250826142a05761429f6142da565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c65206d7573742062652061637469766520746f206d696e74204d75736860008201527f726f6f6d73000000000000000000000000000000000000000000000000000000602082015250565b7f43727970746f4d756e6b733a20596f7527766520616c7265616479207265766560008201527f616c656420746865206d65746164617461210000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66207075626c6963204d757368726f6f6d73000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f7567682062616c616e63650000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d61676963204d757368726f6f6d733a20526573657276657320616c7265616460008201527f792074616b656e21000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420313020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b614a2e8161410e565b8114614a3957600080fd5b50565b614a4581614120565b8114614a5057600080fd5b50565b614a5c8161412c565b8114614a6757600080fd5b50565b614a7381614178565b8114614a7e57600080fd5b5056fea2646970667358221220d0e520d45318e46b6c1849644a2db7480bb60f7bf0c3c0f70333cd3d5f2a681164736f6c63430008040033

Deployed Bytecode Sourcemap

42265:5314:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33925:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20716:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22612:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46694:488;;;;;;;;;;;;;:::i;:::-;;22135:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44541:715;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42900:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34565:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23502:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34233:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42637:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23912:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43035:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34755:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46587:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20410:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21640:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20140:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41634:94;;;;;;;;;;;;;:::i;:::-;;42467:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47261:194;;;;;;;;;;;;;:::i;:::-;;45264:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46289:270;;;;;;;;;;;;;:::i;:::-;;40983:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20885:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42588:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22905:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42354:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24168:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42530:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44202:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45902:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42412:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43243:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23271:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43469:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47487:83;;;;;;;;;;;;;:::i;:::-;;43136:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41883:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33925:224;34027:4;34066:35;34051:50;;;:11;:50;;;;:90;;;;34105:36;34129:11;34105:23;:36::i;:::-;34051:90;34044:97;;33925:224;;;:::o;20716:100::-;20770:13;20803:5;20796:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20716:100;:::o;22612:221::-;22688:7;22716:16;22724:7;22716;:16::i;:::-;22708:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22801:15;:24;22817:7;22801:24;;;;;;;;;;;;;;;;;;;;;22794:31;;22612:221;;;:::o;46694:488::-;41214:12;:10;:12::i;:::-;41203:23;;:7;:5;:7::i;:::-;:23;;;41195:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46770:4:::1;46753:21;;:13;;;;;;;;;;;:21;;;;46745:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46845:9;46840:244;46864:2;46860:1;:6;46840:244;;;46888:10;46901:20;;46888:33;;42395:4;46940:13;:11;:13::i;:::-;:30;46936:137;;;46991:25;47001:10;47013:2;46991:9;:25::i;:::-;47035:20;;:22;;;;;;;;;:::i;:::-;;;;;;46936:137;46840:244;46868:3;;;;;:::i;:::-;;;;46840:244;;;;47122:4;47098:20;;:28;47094:81;;;47159:4;47143:13;;:20;;;;;;;;;;;;;;;;;;47094:81;46694:488::o:0;22135:411::-;22216:13;22232:23;22247:7;22232:14;:23::i;:::-;22216:39;;22280:5;22274:11;;:2;:11;;;;22266:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22374:5;22358:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22383:37;22400:5;22407:12;:10;:12::i;:::-;22383:16;:37::i;:::-;22358:62;22336:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22517:21;22526:2;22530:7;22517:8;:21::i;:::-;22135:411;;;:::o;44541:715::-;44620:12;;;;;;;;;;;44612:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44710:1;44693:14;:18;:51;;;;;42626:2;44715:14;:29;;44693:51;44685:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;42575:4;44819:14;44801:15;;:32;;;;:::i;:::-;:54;;44793:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;44957:14;42504:17;44944:27;;;;:::i;:::-;44931:9;:40;;44923:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;45033:9;45028:221;45052:14;45048:1;:18;45028:221;;;45088:16;45107:14;:12;:14::i;:::-;45088:33;;42395:4;45140:13;:11;:13::i;:::-;:30;45136:102;;;45191:31;45201:10;45213:8;45191:9;:31::i;:::-;45136:102;45028:221;45068:3;;;;;:::i;:::-;;;;45028:221;;;;44541:715;:::o;42900:33::-;;;;;;;;;;;;;:::o;34565:113::-;34626:7;34653:10;:17;;;;34646:24;;34565:113;:::o;23502:339::-;23697:41;23716:12;:10;:12::i;:::-;23730:7;23697:18;:41::i;:::-;23689:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23805:28;23815:4;23821:2;23825:7;23805:9;:28::i;:::-;23502:339;;;:::o;34233:256::-;34330:7;34366:23;34383:5;34366:16;:23::i;:::-;34358:5;:31;34350:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34455:12;:19;34468:5;34455:19;;;;;;;;;;;;;;;:26;34475:5;34455:26;;;;;;;;;;;;34448:33;;34233:256;;;;:::o;42637:79::-;42674:42;42637:79;:::o;23912:185::-;24050:39;24067:4;24073:2;24077:7;24050:39;;;;;;;;;;;;:16;:39::i;:::-;23912:185;;;:::o;43035:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34755:233::-;34830:7;34866:30;:28;:30::i;:::-;34858:5;:38;34850:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34963:10;34974:5;34963:17;;;;;;;;;;;;;;;;;;;;;;;;34956:24;;34755:233;;;:::o;46587:99::-;41214:12;:10;:12::i;:::-;41203:23;;:7;:5;:7::i;:::-;:23;;;41195:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46658:20:::1;46670:7;46658:11;:20::i;:::-;46587:99:::0;:::o;20410:239::-;20482:7;20502:13;20518:7;:16;20526:7;20518:16;;;;;;;;;;;;;;;;;;;;;20502:32;;20570:1;20553:19;;:5;:19;;;;20545:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20636:5;20629:12;;;20410:239;;;:::o;21640:97::-;21688:13;21721:8;21714:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21640:97;:::o;20140:208::-;20212:7;20257:1;20240:19;;:5;:19;;;;20232:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20324:9;:16;20334:5;20324:16;;;;;;;;;;;;;;;;20317:23;;20140:208;;;:::o;41634:94::-;41214:12;:10;:12::i;:::-;41203:23;;:7;:5;:7::i;:::-;:23;;;41195:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41699:21:::1;41717:1;41699:9;:21::i;:::-;41634:94::o:0;42467:54::-;42504:17;42467:54;:::o;47261:194::-;41214:12;:10;:12::i;:::-;41203:23;;:7;:5;:7::i;:::-;:23;;;41195:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47337:4:::1;47318:23;;:15;;;;;;;;;;;:23;;;47314:134;;;47376:5;47358:15;;:23;;;;;;;;;;;;;;;;;;47314:134;;;47432:4;47414:15;;:22;;;;;;;;;;;;;;;;;;47314:134;47261:194::o:0;45264:540::-;45325:16;45355:18;45376:17;45386:6;45376:9;:17::i;:::-;45355:38;;45422:1;45408:10;:15;45404:393;;;45499:1;45485:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45478:23;;;;;45404:393;45534:23;45574:10;45560:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45534:51;;45600:13;45628:130;45652:10;45644:5;:18;45628:130;;;45708:34;45728:6;45736:5;45708:19;:34::i;:::-;45692:6;45699:5;45692:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;45664:7;;;;;:::i;:::-;;;;45628:130;;;45779:6;45772:13;;;;;45264:540;;;;:::o;46289:270::-;41214:12;:10;:12::i;:::-;41203:23;;:7;:5;:7::i;:::-;:23;;;41195:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46342:15:::1;46360:21;46342:39;;46410:1;46400:7;:11;46392:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;42674;46445:28;;:44;46485:3;46482:2;46474:7;:10;;;;:::i;:::-;:14;;;;:::i;:::-;46445:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46508:10;46500:28;;:51;46529:21;46500:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41274:1;46289:270::o:0;40983:87::-;41029:7;41056:6;;;;;;;;;;;41049:13;;40983:87;:::o;20885:104::-;20941:13;20974:7;20967:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20885:104;:::o;42588:40::-;42626:2;42588:40;:::o;22905:295::-;23020:12;:10;:12::i;:::-;23008:24;;:8;:24;;;;23000:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23120:8;23075:18;:32;23094:12;:10;:12::i;:::-;23075:32;;;;;;;;;;;;;;;:42;23108:8;23075:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23173:8;23144:48;;23159:12;:10;:12::i;:::-;23144:48;;;23183:8;23144:48;;;;;;:::i;:::-;;;;;;;;22905:295;;:::o;42354:45::-;42395:4;42354:45;:::o;24168:328::-;24343:41;24362:12;:10;:12::i;:::-;24376:7;24343:18;:41::i;:::-;24335:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24449:39;24463:4;24469:2;24473:7;24482:5;24449:13;:39::i;:::-;24168:328;;;;:::o;42530:49::-;42575:4;42530:49;:::o;44202:331::-;44276:13;44325:4;44306:23;;:15;;;;;;;;;;;:23;;;44302:224;;;44377:9;:7;:9::i;:::-;44388:19;:8;:17;:19::i;:::-;44360:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44346:72;;;;44302:224;44482:9;:7;:9::i;:::-;44493:19;:8;:17;:19::i;:::-;44465:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44451:63;;44202:331;;;;:::o;45902:317::-;41214:12;:10;:12::i;:::-;41203:23;;:7;:5;:7::i;:::-;:23;;;41195:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46035:4:::1;46015:24;;:16;;;;;;;;;;;:24;;;;46007:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46124:9;46107:14;:26;;;;;;;;;;;;:::i;:::-;;46165:12;46144:18;:33;;;;;;;;;;;;:::i;:::-;;46207:4;46188:16;;:23;;;;;;;;;;;;;;;;;;45902:317:::0;;:::o;42412:46::-;42455:3;42412:46;:::o;43243:36::-;;;;;;;;;;;;;:::o;23271:164::-;23368:4;23392:18;:25;23411:5;23392:25;;;;;;;;;;;;;;;:35;23418:8;23392:35;;;;;;;;;;;;;;;;;;;;;;;;;23385:42;;23271:164;;;;:::o;43469:32::-;;;;;;;;;;;;;:::o;47487:83::-;41214:12;:10;:12::i;:::-;41203:23;;:7;:5;:7::i;:::-;:23;;;41195:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47558:4:::1;47543:12;;:19;;;;;;;;;;;;;;;;;;47487:83::o:0;43136:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41883:192::-;41214:12;:10;:12::i;:::-;41203:23;;:7;:5;:7::i;:::-;:23;;;41195:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41992:1:::1;41972:22;;:8;:22;;;;41964:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42048:19;42058:8;42048:9;:19::i;:::-;41883:192:::0;:::o;19771:305::-;19873:4;19925:25;19910:40;;;:11;:40;;;;:105;;;;19982:33;19967:48;;;:11;:48;;;;19910:105;:158;;;;20032:36;20056:11;20032:23;:36::i;:::-;19910:158;19890:178;;19771:305;;;:::o;26006:127::-;26071:4;26123:1;26095:30;;:7;:16;26103:7;26095:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26088:37;;26006:127;;;:::o;15335:98::-;15388:7;15415:10;15408:17;;15335:98;:::o;26990:110::-;27066:26;27076:2;27080:7;27066:26;;;;;;;;;;;;:9;:26::i;:::-;26990:110;;:::o;29988:174::-;30090:2;30063:15;:24;30079:7;30063:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30146:7;30142:2;30108:46;;30117:23;30132:7;30117:14;:23::i;:::-;30108:46;;;;;;;;;;;;29988:174;;:::o;43745:449::-;43787:7;43805:10;42395:4;43890:13;;43871:16;43853:15;:34;;;;:::i;:::-;:50;;;;:::i;:::-;43836:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;43826:79;;;;;;43818:88;;:105;;;;:::i;:::-;43805:118;;42395:4;43938:13;:11;:13::i;:::-;:30;43934:235;;;43981:179;43987:11;43995:2;43987:7;:11::i;:::-;43981:179;;;44012:13;;:15;;;;;;;;;:::i;:::-;;;;;;42395:4;44115:13;;44096:16;44078:15;:34;;;;:::i;:::-;:50;;;;:::i;:::-;44061:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;44051:79;;;;;;44043:88;;:105;;;;:::i;:::-;44038:110;;43981:179;;;43934:235;44184:2;44177:9;;;43745:449;:::o;26300:348::-;26393:4;26418:16;26426:7;26418;:16::i;:::-;26410:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26494:13;26510:23;26525:7;26510:14;:23::i;:::-;26494:39;;26563:5;26552:16;;:7;:16;;;:51;;;;26596:7;26572:31;;:20;26584:7;26572:11;:20::i;:::-;:31;;;26552:51;:87;;;;26607:32;26624:5;26631:7;26607:16;:32::i;:::-;26552:87;26544:96;;;26300:348;;;;:::o;29292:578::-;29451:4;29424:31;;:23;29439:7;29424:14;:23::i;:::-;:31;;;29416:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29534:1;29520:16;;:2;:16;;;;29512:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29590:39;29611:4;29617:2;29621:7;29590:20;:39::i;:::-;29694:29;29711:1;29715:7;29694:8;:29::i;:::-;29755:1;29736:9;:15;29746:4;29736:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29784:1;29767:9;:13;29777:2;29767:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29815:2;29796:7;:16;29804:7;29796:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29854:7;29850:2;29835:27;;29844:4;29835:27;;;;;;;;;;;;29292:578;;;:::o;21973:100::-;22057:8;22046;:19;;;;;;;;;;;;:::i;:::-;;21973:100;:::o;42083:173::-;42139:16;42158:6;;;;;;;;;;;42139:25;;42184:8;42175:6;;:17;;;;;;;;;;;;;;;;;;42239:8;42208:40;;42229:8;42208:40;;;;;;;;;;;;42083:173;;:::o;25378:315::-;25535:28;25545:4;25551:2;25555:7;25535:9;:28::i;:::-;25582:48;25605:4;25611:2;25615:7;25624:5;25582:22;:48::i;:::-;25574:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25378:315;;;;:::o;15775:723::-;15831:13;16061:1;16052:5;:10;16048:53;;;16079:10;;;;;;;;;;;;;;;;;;;;;16048:53;16111:12;16126:5;16111:20;;16142:14;16167:78;16182:1;16174:4;:9;16167:78;;16200:8;;;;;:::i;:::-;;;;16231:2;16223:10;;;;;:::i;:::-;;;16167:78;;;16255:19;16287:6;16277:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16255:39;;16305:154;16321:1;16312:5;:10;16305:154;;16349:1;16339:11;;;;;:::i;:::-;;;16416:2;16408:5;:10;;;;:::i;:::-;16395:2;:24;;;;:::i;:::-;16382:39;;16365:6;16372;16365:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16445:2;16436:11;;;;;:::i;:::-;;;16305:154;;;16483:6;16469:21;;;;;15775:723;;;;:::o;18232:157::-;18317:4;18356:25;18341:40;;;:11;:40;;;;18334:47;;18232:157;;;:::o;27327:321::-;27457:18;27463:2;27467:7;27457:5;:18::i;:::-;27508:54;27539:1;27543:2;27547:7;27556:5;27508:22;:54::i;:::-;27486:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27327:321;;;:::o;35601:589::-;35745:45;35772:4;35778:2;35782:7;35745:26;:45::i;:::-;35823:1;35807:18;;:4;:18;;;35803:187;;;35842:40;35874:7;35842:31;:40::i;:::-;35803:187;;;35912:2;35904:10;;:4;:10;;;35900:90;;35931:47;35964:4;35970:7;35931:32;:47::i;:::-;35900:90;35803:187;36018:1;36004:16;;:2;:16;;;36000:183;;;36037:45;36074:7;36037:36;:45::i;:::-;36000:183;;;36110:4;36104:10;;:2;:10;;;36100:83;;36131:40;36159:2;36163:7;36131:27;:40::i;:::-;36100:83;36000:183;35601:589;;;:::o;30727:803::-;30882:4;30903:15;:2;:13;;;:15::i;:::-;30899:624;;;30955:2;30939:36;;;30976:12;:10;:12::i;:::-;30990:4;30996:7;31005:5;30939:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30935:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31202:1;31185:6;:13;:18;31181:272;;;31228:60;;;;;;;;;;:::i;:::-;;;;;;;;31181:272;31403:6;31397:13;31388:6;31384:2;31380:15;31373:38;30935:533;31072:45;;;31062:55;;;:6;:55;;;;31055:62;;;;;30899:624;31507:4;31500:11;;30727:803;;;;;;;:::o;27984:382::-;28078:1;28064:16;;:2;:16;;;;28056:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28137:16;28145:7;28137;:16::i;:::-;28136:17;28128:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28199:45;28228:1;28232:2;28236:7;28199:20;:45::i;:::-;28274:1;28257:9;:13;28267:2;28257:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28305:2;28286:7;:16;28294:7;28286:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28350:7;28346:2;28325:33;;28342:1;28325:33;;;;;;;;;;;;27984:382;;:::o;32102:126::-;;;;:::o;36913:164::-;37017:10;:17;;;;36990:15;:24;37006:7;36990:24;;;;;;;;;;;:44;;;;37045:10;37061:7;37045:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36913:164;:::o;37704:988::-;37970:22;38020:1;37995:22;38012:4;37995:16;:22::i;:::-;:26;;;;:::i;:::-;37970:51;;38032:18;38053:17;:26;38071:7;38053:26;;;;;;;;;;;;38032:47;;38200:14;38186:10;:28;38182:328;;38231:19;38253:12;:18;38266:4;38253:18;;;;;;;;;;;;;;;:34;38272:14;38253:34;;;;;;;;;;;;38231:56;;38337:11;38304:12;:18;38317:4;38304:18;;;;;;;;;;;;;;;:30;38323:10;38304:30;;;;;;;;;;;:44;;;;38454:10;38421:17;:30;38439:11;38421:30;;;;;;;;;;;:43;;;;38182:328;;38606:17;:26;38624:7;38606:26;;;;;;;;;;;38599:33;;;38650:12;:18;38663:4;38650:18;;;;;;;;;;;;;;;:34;38669:14;38650:34;;;;;;;;;;;38643:41;;;37704:988;;;;:::o;38987:1079::-;39240:22;39285:1;39265:10;:17;;;;:21;;;;:::i;:::-;39240:46;;39297:18;39318:15;:24;39334:7;39318:24;;;;;;;;;;;;39297:45;;39669:19;39691:10;39702:14;39691:26;;;;;;;;;;;;;;;;;;;;;;;;39669:48;;39755:11;39730:10;39741;39730:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39866:10;39835:15;:28;39851:11;39835:28;;;;;;;;;;;:41;;;;40007:15;:24;40023:7;40007:24;;;;;;;;;;;40000:31;;;40042:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38987:1079;;;;:::o;36491:221::-;36576:14;36593:20;36610:2;36593:16;:20::i;:::-;36576:37;;36651:7;36624:12;:16;36637:2;36624:16;;;;;;;;;;;;;;;:24;36641:6;36624:24;;;;;;;;;;;:34;;;;36698:6;36669:17;:26;36687:7;36669:26;;;;;;;;;;;:35;;;;36491:221;;;:::o;7682:387::-;7742:4;7950:12;8017:7;8005:20;7997:28;;8060:1;8053:4;:8;8046:15;;;7682:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:633::-;5906:6;5914;5963:2;5951:9;5942:7;5938:23;5934:32;5931:2;;;5979:1;5976;5969:12;5931:2;6050:1;6039:9;6035:17;6022:31;6080:18;6072:6;6069:30;6066:2;;;6112:1;6109;6102:12;6066:2;6140:63;6195:7;6186:6;6175:9;6171:22;6140:63;:::i;:::-;6130:73;;5993:220;6280:2;6269:9;6265:18;6252:32;6311:18;6303:6;6300:30;6297:2;;;6343:1;6340;6333:12;6297:2;6371:63;6426:7;6417:6;6406:9;6402:22;6371:63;:::i;:::-;6361:73;;6223:221;5921:530;;;;;:::o;6457:262::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:2;;;6581:1;6578;6571:12;6533:2;6624:1;6649:53;6694:7;6685:6;6674:9;6670:22;6649:53;:::i;:::-;6639:63;;6595:117;6523:196;;;;:::o;6725:179::-;6794:10;6815:46;6857:3;6849:6;6815:46;:::i;:::-;6893:4;6888:3;6884:14;6870:28;;6805:99;;;;:::o;6910:118::-;6997:24;7015:5;6997:24;:::i;:::-;6992:3;6985:37;6975:53;;:::o;7064:732::-;7183:3;7212:54;7260:5;7212:54;:::i;:::-;7282:86;7361:6;7356:3;7282:86;:::i;:::-;7275:93;;7392:56;7442:5;7392:56;:::i;:::-;7471:7;7502:1;7487:284;7512:6;7509:1;7506:13;7487:284;;;7588:6;7582:13;7615:63;7674:3;7659:13;7615:63;:::i;:::-;7608:70;;7701:60;7754:6;7701:60;:::i;:::-;7691:70;;7547:224;7534:1;7531;7527:9;7522:14;;7487:284;;;7491:14;7787:3;7780:10;;7188:608;;;;;;;:::o;7802:109::-;7883:21;7898:5;7883:21;:::i;:::-;7878:3;7871:34;7861:50;;:::o;7917:360::-;8003:3;8031:38;8063:5;8031:38;:::i;:::-;8085:70;8148:6;8143:3;8085:70;:::i;:::-;8078:77;;8164:52;8209:6;8204:3;8197:4;8190:5;8186:16;8164:52;:::i;:::-;8241:29;8263:6;8241:29;:::i;:::-;8236:3;8232:39;8225:46;;8007:270;;;;;:::o;8283:364::-;8371:3;8399:39;8432:5;8399:39;:::i;:::-;8454:71;8518:6;8513:3;8454:71;:::i;:::-;8447:78;;8534:52;8579:6;8574:3;8567:4;8560:5;8556:16;8534:52;:::i;:::-;8611:29;8633:6;8611:29;:::i;:::-;8606:3;8602:39;8595:46;;8375:272;;;;;:::o;8653:377::-;8759:3;8787:39;8820:5;8787:39;:::i;:::-;8842:89;8924:6;8919:3;8842:89;:::i;:::-;8835:96;;8940:52;8985:6;8980:3;8973:4;8966:5;8962:16;8940:52;:::i;:::-;9017:6;9012:3;9008:16;9001:23;;8763:267;;;;;:::o;9036:366::-;9178:3;9199:67;9263:2;9258:3;9199:67;:::i;:::-;9192:74;;9275:93;9364:3;9275:93;:::i;:::-;9393:2;9388:3;9384:12;9377:19;;9182:220;;;:::o;9408:366::-;9550:3;9571:67;9635:2;9630:3;9571:67;:::i;:::-;9564:74;;9647:93;9736:3;9647:93;:::i;:::-;9765:2;9760:3;9756:12;9749:19;;9554:220;;;:::o;9780:366::-;9922:3;9943:67;10007:2;10002:3;9943:67;:::i;:::-;9936:74;;10019:93;10108:3;10019:93;:::i;:::-;10137:2;10132:3;10128:12;10121:19;;9926:220;;;:::o;10152:366::-;10294:3;10315:67;10379:2;10374:3;10315:67;:::i;:::-;10308:74;;10391:93;10480:3;10391:93;:::i;:::-;10509:2;10504:3;10500:12;10493:19;;10298:220;;;:::o;10524:366::-;10666:3;10687:67;10751:2;10746:3;10687:67;:::i;:::-;10680:74;;10763:93;10852:3;10763:93;:::i;:::-;10881:2;10876:3;10872:12;10865:19;;10670:220;;;:::o;10896:366::-;11038:3;11059:67;11123:2;11118:3;11059:67;:::i;:::-;11052:74;;11135:93;11224:3;11135:93;:::i;:::-;11253:2;11248:3;11244:12;11237:19;;11042:220;;;:::o;11268:366::-;11410:3;11431:67;11495:2;11490:3;11431:67;:::i;:::-;11424:74;;11507:93;11596:3;11507:93;:::i;:::-;11625:2;11620:3;11616:12;11609:19;;11414:220;;;:::o;11640:366::-;11782:3;11803:67;11867:2;11862:3;11803:67;:::i;:::-;11796:74;;11879:93;11968:3;11879:93;:::i;:::-;11997:2;11992:3;11988:12;11981:19;;11786:220;;;:::o;12012:366::-;12154:3;12175:67;12239:2;12234:3;12175:67;:::i;:::-;12168:74;;12251:93;12340:3;12251:93;:::i;:::-;12369:2;12364:3;12360:12;12353:19;;12158:220;;;:::o;12384:366::-;12526:3;12547:67;12611:2;12606:3;12547:67;:::i;:::-;12540:74;;12623:93;12712:3;12623:93;:::i;:::-;12741:2;12736:3;12732:12;12725:19;;12530:220;;;:::o;12756:366::-;12898:3;12919:67;12983:2;12978:3;12919:67;:::i;:::-;12912:74;;12995:93;13084:3;12995:93;:::i;:::-;13113:2;13108:3;13104:12;13097:19;;12902:220;;;:::o;13128:366::-;13270:3;13291:67;13355:2;13350:3;13291:67;:::i;:::-;13284:74;;13367:93;13456:3;13367:93;:::i;:::-;13485:2;13480:3;13476:12;13469:19;;13274:220;;;:::o;13500:366::-;13642:3;13663:67;13727:2;13722:3;13663:67;:::i;:::-;13656:74;;13739:93;13828:3;13739:93;:::i;:::-;13857:2;13852:3;13848:12;13841:19;;13646:220;;;:::o;13872:366::-;14014:3;14035:67;14099:2;14094:3;14035:67;:::i;:::-;14028:74;;14111:93;14200:3;14111:93;:::i;:::-;14229:2;14224:3;14220:12;14213:19;;14018:220;;;:::o;14244:366::-;14386:3;14407:67;14471:2;14466:3;14407:67;:::i;:::-;14400:74;;14483:93;14572:3;14483:93;:::i;:::-;14601:2;14596:3;14592:12;14585:19;;14390:220;;;:::o;14616:366::-;14758:3;14779:67;14843:2;14838:3;14779:67;:::i;:::-;14772:74;;14855:93;14944:3;14855:93;:::i;:::-;14973:2;14968:3;14964:12;14957:19;;14762:220;;;:::o;14988:366::-;15130:3;15151:67;15215:2;15210:3;15151:67;:::i;:::-;15144:74;;15227:93;15316:3;15227:93;:::i;:::-;15345:2;15340:3;15336:12;15329:19;;15134:220;;;:::o;15360:400::-;15520:3;15541:84;15623:1;15618:3;15541:84;:::i;:::-;15534:91;;15634:93;15723:3;15634:93;:::i;:::-;15752:1;15747:3;15743:11;15736:18;;15524:236;;;:::o;15766:366::-;15908:3;15929:67;15993:2;15988:3;15929:67;:::i;:::-;15922:74;;16005:93;16094:3;16005:93;:::i;:::-;16123:2;16118:3;16114:12;16107:19;;15912:220;;;:::o;16138:366::-;16280:3;16301:67;16365:2;16360:3;16301:67;:::i;:::-;16294:74;;16377:93;16466:3;16377:93;:::i;:::-;16495:2;16490:3;16486:12;16479:19;;16284:220;;;:::o;16510:366::-;16652:3;16673:67;16737:2;16732:3;16673:67;:::i;:::-;16666:74;;16749:93;16838:3;16749:93;:::i;:::-;16867:2;16862:3;16858:12;16851:19;;16656:220;;;:::o;16882:366::-;17024:3;17045:67;17109:2;17104:3;17045:67;:::i;:::-;17038:74;;17121:93;17210:3;17121:93;:::i;:::-;17239:2;17234:3;17230:12;17223:19;;17028:220;;;:::o;17254:366::-;17396:3;17417:67;17481:2;17476:3;17417:67;:::i;:::-;17410:74;;17493:93;17582:3;17493:93;:::i;:::-;17611:2;17606:3;17602:12;17595:19;;17400:220;;;:::o;17626:366::-;17768:3;17789:67;17853:2;17848:3;17789:67;:::i;:::-;17782:74;;17865:93;17954:3;17865:93;:::i;:::-;17983:2;17978:3;17974:12;17967:19;;17772:220;;;:::o;17998:366::-;18140:3;18161:67;18225:2;18220:3;18161:67;:::i;:::-;18154:74;;18237:93;18326:3;18237:93;:::i;:::-;18355:2;18350:3;18346:12;18339:19;;18144:220;;;:::o;18370:108::-;18447:24;18465:5;18447:24;:::i;:::-;18442:3;18435:37;18425:53;;:::o;18484:118::-;18571:24;18589:5;18571:24;:::i;:::-;18566:3;18559:37;18549:53;;:::o;18608:157::-;18713:45;18733:24;18751:5;18733:24;:::i;:::-;18713:45;:::i;:::-;18708:3;18701:58;18691:74;;:::o;18771:435::-;18951:3;18973:95;19064:3;19055:6;18973:95;:::i;:::-;18966:102;;19085:95;19176:3;19167:6;19085:95;:::i;:::-;19078:102;;19197:3;19190:10;;18955:251;;;;;:::o;19212:701::-;19493:3;19515:95;19606:3;19597:6;19515:95;:::i;:::-;19508:102;;19627:95;19718:3;19709:6;19627:95;:::i;:::-;19620:102;;19739:148;19883:3;19739:148;:::i;:::-;19732:155;;19904:3;19897:10;;19497:416;;;;;:::o;19919:256::-;20031:3;20046:75;20117:3;20108:6;20046:75;:::i;:::-;20146:2;20141:3;20137:12;20130:19;;20166:3;20159:10;;20035:140;;;;:::o;20181:222::-;20274:4;20312:2;20301:9;20297:18;20289:26;;20325:71;20393:1;20382:9;20378:17;20369:6;20325:71;:::i;:::-;20279:124;;;;:::o;20409:640::-;20604:4;20642:3;20631:9;20627:19;20619:27;;20656:71;20724:1;20713:9;20709:17;20700:6;20656:71;:::i;:::-;20737:72;20805:2;20794:9;20790:18;20781:6;20737:72;:::i;:::-;20819;20887:2;20876:9;20872:18;20863:6;20819:72;:::i;:::-;20938:9;20932:4;20928:20;20923:2;20912:9;20908:18;20901:48;20966:76;21037:4;21028:6;20966:76;:::i;:::-;20958:84;;20609:440;;;;;;;:::o;21055:373::-;21198:4;21236:2;21225:9;21221:18;21213:26;;21285:9;21279:4;21275:20;21271:1;21260:9;21256:17;21249:47;21313:108;21416:4;21407:6;21313:108;:::i;:::-;21305:116;;21203:225;;;;:::o;21434:210::-;21521:4;21559:2;21548:9;21544:18;21536:26;;21572:65;21634:1;21623:9;21619:17;21610:6;21572:65;:::i;:::-;21526:118;;;;:::o;21650:313::-;21763:4;21801:2;21790:9;21786:18;21778:26;;21850:9;21844:4;21840:20;21836:1;21825:9;21821:17;21814:47;21878:78;21951:4;21942:6;21878:78;:::i;:::-;21870:86;;21768:195;;;;:::o;21969:419::-;22135:4;22173:2;22162:9;22158:18;22150:26;;22222:9;22216:4;22212:20;22208:1;22197:9;22193:17;22186:47;22250:131;22376:4;22250:131;:::i;:::-;22242:139;;22140:248;;;:::o;22394:419::-;22560:4;22598:2;22587:9;22583:18;22575:26;;22647:9;22641:4;22637:20;22633:1;22622:9;22618:17;22611:47;22675:131;22801:4;22675:131;:::i;:::-;22667:139;;22565:248;;;:::o;22819:419::-;22985:4;23023:2;23012:9;23008:18;23000:26;;23072:9;23066:4;23062:20;23058:1;23047:9;23043:17;23036:47;23100:131;23226:4;23100:131;:::i;:::-;23092:139;;22990:248;;;:::o;23244:419::-;23410:4;23448:2;23437:9;23433:18;23425:26;;23497:9;23491:4;23487:20;23483:1;23472:9;23468:17;23461:47;23525:131;23651:4;23525:131;:::i;:::-;23517:139;;23415:248;;;:::o;23669:419::-;23835:4;23873:2;23862:9;23858:18;23850:26;;23922:9;23916:4;23912:20;23908:1;23897:9;23893:17;23886:47;23950:131;24076:4;23950:131;:::i;:::-;23942:139;;23840:248;;;:::o;24094:419::-;24260:4;24298:2;24287:9;24283:18;24275:26;;24347:9;24341:4;24337:20;24333:1;24322:9;24318:17;24311:47;24375:131;24501:4;24375:131;:::i;:::-;24367:139;;24265:248;;;:::o;24519:419::-;24685:4;24723:2;24712:9;24708:18;24700:26;;24772:9;24766:4;24762:20;24758:1;24747:9;24743:17;24736:47;24800:131;24926:4;24800:131;:::i;:::-;24792:139;;24690:248;;;:::o;24944:419::-;25110:4;25148:2;25137:9;25133:18;25125:26;;25197:9;25191:4;25187:20;25183:1;25172:9;25168:17;25161:47;25225:131;25351:4;25225:131;:::i;:::-;25217:139;;25115:248;;;:::o;25369:419::-;25535:4;25573:2;25562:9;25558:18;25550:26;;25622:9;25616:4;25612:20;25608:1;25597:9;25593:17;25586:47;25650:131;25776:4;25650:131;:::i;:::-;25642:139;;25540:248;;;:::o;25794:419::-;25960:4;25998:2;25987:9;25983:18;25975:26;;26047:9;26041:4;26037:20;26033:1;26022:9;26018:17;26011:47;26075:131;26201:4;26075:131;:::i;:::-;26067:139;;25965:248;;;:::o;26219:419::-;26385:4;26423:2;26412:9;26408:18;26400:26;;26472:9;26466:4;26462:20;26458:1;26447:9;26443:17;26436:47;26500:131;26626:4;26500:131;:::i;:::-;26492:139;;26390:248;;;:::o;26644:419::-;26810:4;26848:2;26837:9;26833:18;26825:26;;26897:9;26891:4;26887:20;26883:1;26872:9;26868:17;26861:47;26925:131;27051:4;26925:131;:::i;:::-;26917:139;;26815:248;;;:::o;27069:419::-;27235:4;27273:2;27262:9;27258:18;27250:26;;27322:9;27316:4;27312:20;27308:1;27297:9;27293:17;27286:47;27350:131;27476:4;27350:131;:::i;:::-;27342:139;;27240:248;;;:::o;27494:419::-;27660:4;27698:2;27687:9;27683:18;27675:26;;27747:9;27741:4;27737:20;27733:1;27722:9;27718:17;27711:47;27775:131;27901:4;27775:131;:::i;:::-;27767:139;;27665:248;;;:::o;27919:419::-;28085:4;28123:2;28112:9;28108:18;28100:26;;28172:9;28166:4;28162:20;28158:1;28147:9;28143:17;28136:47;28200:131;28326:4;28200:131;:::i;:::-;28192:139;;28090:248;;;:::o;28344:419::-;28510:4;28548:2;28537:9;28533:18;28525:26;;28597:9;28591:4;28587:20;28583:1;28572:9;28568:17;28561:47;28625:131;28751:4;28625:131;:::i;:::-;28617:139;;28515:248;;;:::o;28769:419::-;28935:4;28973:2;28962:9;28958:18;28950:26;;29022:9;29016:4;29012:20;29008:1;28997:9;28993:17;28986:47;29050:131;29176:4;29050:131;:::i;:::-;29042:139;;28940:248;;;:::o;29194:419::-;29360:4;29398:2;29387:9;29383:18;29375:26;;29447:9;29441:4;29437:20;29433:1;29422:9;29418:17;29411:47;29475:131;29601:4;29475:131;:::i;:::-;29467:139;;29365:248;;;:::o;29619:419::-;29785:4;29823:2;29812:9;29808:18;29800:26;;29872:9;29866:4;29862:20;29858:1;29847:9;29843:17;29836:47;29900:131;30026:4;29900:131;:::i;:::-;29892:139;;29790:248;;;:::o;30044:419::-;30210:4;30248:2;30237:9;30233:18;30225:26;;30297:9;30291:4;30287:20;30283:1;30272:9;30268:17;30261:47;30325:131;30451:4;30325:131;:::i;:::-;30317:139;;30215:248;;;:::o;30469:419::-;30635:4;30673:2;30662:9;30658:18;30650:26;;30722:9;30716:4;30712:20;30708:1;30697:9;30693:17;30686:47;30750:131;30876:4;30750:131;:::i;:::-;30742:139;;30640:248;;;:::o;30894:419::-;31060:4;31098:2;31087:9;31083:18;31075:26;;31147:9;31141:4;31137:20;31133:1;31122:9;31118:17;31111:47;31175:131;31301:4;31175:131;:::i;:::-;31167:139;;31065:248;;;:::o;31319:419::-;31485:4;31523:2;31512:9;31508:18;31500:26;;31572:9;31566:4;31562:20;31558:1;31547:9;31543:17;31536:47;31600:131;31726:4;31600:131;:::i;:::-;31592:139;;31490:248;;;:::o;31744:419::-;31910:4;31948:2;31937:9;31933:18;31925:26;;31997:9;31991:4;31987:20;31983:1;31972:9;31968:17;31961:47;32025:131;32151:4;32025:131;:::i;:::-;32017:139;;31915:248;;;:::o;32169:222::-;32262:4;32300:2;32289:9;32285:18;32277:26;;32313:71;32381:1;32370:9;32366:17;32357:6;32313:71;:::i;:::-;32267:124;;;;:::o;32397:129::-;32431:6;32458:20;;:::i;:::-;32448:30;;32487:33;32515:4;32507:6;32487:33;:::i;:::-;32438:88;;;:::o;32532:75::-;32565:6;32598:2;32592:9;32582:19;;32572:35;:::o;32613:307::-;32674:4;32764:18;32756:6;32753:30;32750:2;;;32786:18;;:::i;:::-;32750:2;32824:29;32846:6;32824:29;:::i;:::-;32816:37;;32908:4;32902;32898:15;32890:23;;32679:241;;;:::o;32926:308::-;32988:4;33078:18;33070:6;33067:30;33064:2;;;33100:18;;:::i;:::-;33064:2;33138:29;33160:6;33138:29;:::i;:::-;33130:37;;33222:4;33216;33212:15;33204:23;;32993:241;;;:::o;33240:132::-;33307:4;33330:3;33322:11;;33360:4;33355:3;33351:14;33343:22;;33312:60;;;:::o;33378:114::-;33445:6;33479:5;33473:12;33463:22;;33452:40;;;:::o;33498:98::-;33549:6;33583:5;33577:12;33567:22;;33556:40;;;:::o;33602:99::-;33654:6;33688:5;33682:12;33672:22;;33661:40;;;:::o;33707:113::-;33777:4;33809;33804:3;33800:14;33792:22;;33782:38;;;:::o;33826:184::-;33925:11;33959:6;33954:3;33947:19;33999:4;33994:3;33990:14;33975:29;;33937:73;;;;:::o;34016:168::-;34099:11;34133:6;34128:3;34121:19;34173:4;34168:3;34164:14;34149:29;;34111:73;;;;:::o;34190:169::-;34274:11;34308:6;34303:3;34296:19;34348:4;34343:3;34339:14;34324:29;;34286:73;;;;:::o;34365:148::-;34467:11;34504:3;34489:18;;34479:34;;;;:::o;34519:305::-;34559:3;34578:20;34596:1;34578:20;:::i;:::-;34573:25;;34612:20;34630:1;34612:20;:::i;:::-;34607:25;;34766:1;34698:66;34694:74;34691:1;34688:81;34685:2;;;34772:18;;:::i;:::-;34685:2;34816:1;34813;34809:9;34802:16;;34563:261;;;;:::o;34830:185::-;34870:1;34887:20;34905:1;34887:20;:::i;:::-;34882:25;;34921:20;34939:1;34921:20;:::i;:::-;34916:25;;34960:1;34950:2;;34965:18;;:::i;:::-;34950:2;35007:1;35004;35000:9;34995:14;;34872:143;;;;:::o;35021:348::-;35061:7;35084:20;35102:1;35084:20;:::i;:::-;35079:25;;35118:20;35136:1;35118:20;:::i;:::-;35113:25;;35306:1;35238:66;35234:74;35231:1;35228:81;35223:1;35216:9;35209:17;35205:105;35202:2;;;35313:18;;:::i;:::-;35202:2;35361:1;35358;35354:9;35343:20;;35069:300;;;;:::o;35375:191::-;35415:4;35435:20;35453:1;35435:20;:::i;:::-;35430:25;;35469:20;35487:1;35469:20;:::i;:::-;35464:25;;35508:1;35505;35502:8;35499:2;;;35513:18;;:::i;:::-;35499:2;35558:1;35555;35551:9;35543:17;;35420:146;;;;:::o;35572:96::-;35609:7;35638:24;35656:5;35638:24;:::i;:::-;35627:35;;35617:51;;;:::o;35674:90::-;35708:7;35751:5;35744:13;35737:21;35726:32;;35716:48;;;:::o;35770:149::-;35806:7;35846:66;35839:5;35835:78;35824:89;;35814:105;;;:::o;35925:126::-;35962:7;36002:42;35995:5;35991:54;35980:65;;35970:81;;;:::o;36057:77::-;36094:7;36123:5;36112:16;;36102:32;;;:::o;36140:154::-;36224:6;36219:3;36214;36201:30;36286:1;36277:6;36272:3;36268:16;36261:27;36191:103;;;:::o;36300:307::-;36368:1;36378:113;36392:6;36389:1;36386:13;36378:113;;;36477:1;36472:3;36468:11;36462:18;36458:1;36453:3;36449:11;36442:39;36414:2;36411:1;36407:10;36402:15;;36378:113;;;36509:6;36506:1;36503:13;36500:2;;;36589:1;36580:6;36575:3;36571:16;36564:27;36500:2;36349:258;;;;:::o;36613:320::-;36657:6;36694:1;36688:4;36684:12;36674:22;;36741:1;36735:4;36731:12;36762:18;36752:2;;36818:4;36810:6;36806:17;36796:27;;36752:2;36880;36872:6;36869:14;36849:18;36846:38;36843:2;;;36899:18;;:::i;:::-;36843:2;36664:269;;;;:::o;36939:281::-;37022:27;37044:4;37022:27;:::i;:::-;37014:6;37010:40;37152:6;37140:10;37137:22;37116:18;37104:10;37101:34;37098:62;37095:2;;;37163:18;;:::i;:::-;37095:2;37203:10;37199:2;37192:22;36982:238;;;:::o;37226:233::-;37265:3;37288:24;37306:5;37288:24;:::i;:::-;37279:33;;37334:66;37327:5;37324:77;37321:2;;;37404:18;;:::i;:::-;37321:2;37451:1;37444:5;37440:13;37433:20;;37269:190;;;:::o;37465:79::-;37504:7;37533:5;37522:16;;37512:32;;;:::o;37550:176::-;37582:1;37599:20;37617:1;37599:20;:::i;:::-;37594:25;;37633:20;37651:1;37633:20;:::i;:::-;37628:25;;37672:1;37662:2;;37677:18;;:::i;:::-;37662:2;37718:1;37715;37711:9;37706:14;;37584:142;;;;:::o;37732:180::-;37780:77;37777:1;37770:88;37877:4;37874:1;37867:15;37901:4;37898:1;37891:15;37918:180;37966:77;37963:1;37956:88;38063:4;38060:1;38053:15;38087:4;38084:1;38077:15;38104:180;38152:77;38149:1;38142:88;38249:4;38246:1;38239:15;38273:4;38270:1;38263:15;38290:180;38338:77;38335:1;38328:88;38435:4;38432:1;38425:15;38459:4;38456:1;38449:15;38476:102;38517:6;38568:2;38564:7;38559:2;38552:5;38548:14;38544:28;38534:38;;38524:54;;;:::o;38584:224::-;38724:34;38720:1;38712:6;38708:14;38701:58;38793:7;38788:2;38780:6;38776:15;38769:32;38690:118;:::o;38814:237::-;38954:34;38950:1;38942:6;38938:14;38931:58;39023:20;39018:2;39010:6;39006:15;38999:45;38920:131;:::o;39057:230::-;39197:34;39193:1;39185:6;39181:14;39174:58;39266:13;39261:2;39253:6;39249:15;39242:38;39163:124;:::o;39293:237::-;39433:34;39429:1;39421:6;39417:14;39410:58;39502:20;39497:2;39489:6;39485:15;39478:45;39399:131;:::o;39536:225::-;39676:34;39672:1;39664:6;39660:14;39653:58;39745:8;39740:2;39732:6;39728:15;39721:33;39642:119;:::o;39767:178::-;39907:30;39903:1;39895:6;39891:14;39884:54;39873:72;:::o;39951:239::-;40091:34;40087:1;40079:6;40075:14;40068:58;40160:22;40155:2;40147:6;40143:15;40136:47;40057:133;:::o;40196:223::-;40336:34;40332:1;40324:6;40320:14;40313:58;40405:6;40400:2;40392:6;40388:15;40381:31;40302:117;:::o;40425:175::-;40565:27;40561:1;40553:6;40549:14;40542:51;40531:69;:::o;40606:181::-;40746:33;40742:1;40734:6;40730:14;40723:57;40712:75;:::o;40793:231::-;40933:34;40929:1;40921:6;40917:14;40910:58;41002:14;40997:2;40989:6;40985:15;40978:39;40899:125;:::o;41030:168::-;41170:20;41166:1;41158:6;41154:14;41147:44;41136:62;:::o;41204:243::-;41344:34;41340:1;41332:6;41328:14;41321:58;41413:26;41408:2;41400:6;41396:15;41389:51;41310:137;:::o;41453:229::-;41593:34;41589:1;41581:6;41577:14;41570:58;41662:12;41657:2;41649:6;41645:15;41638:37;41559:123;:::o;41688:228::-;41828:34;41824:1;41816:6;41812:14;41805:58;41897:11;41892:2;41884:6;41880:15;41873:36;41794:122;:::o;41922:182::-;42062:34;42058:1;42050:6;42046:14;42039:58;42028:76;:::o;42110:231::-;42250:34;42246:1;42238:6;42234:14;42227:58;42319:14;42314:2;42306:6;42302:15;42295:39;42216:125;:::o;42347:155::-;42487:7;42483:1;42475:6;42471:14;42464:31;42453:49;:::o;42508:182::-;42648:34;42644:1;42636:6;42632:14;42625:58;42614:76;:::o;42696:228::-;42836:34;42832:1;42824:6;42820:14;42813:58;42905:11;42900:2;42892:6;42888:15;42881:36;42802:122;:::o;42930:220::-;43070:34;43066:1;43058:6;43054:14;43047:58;43139:3;43134:2;43126:6;43122:15;43115:28;43036:114;:::o;43156:236::-;43296:34;43292:1;43284:6;43280:14;43273:58;43365:19;43360:2;43352:6;43348:15;43341:44;43262:130;:::o;43398:231::-;43538:34;43534:1;43526:6;43522:14;43515:58;43607:14;43602:2;43594:6;43590:15;43583:39;43504:125;:::o;43635:227::-;43775:34;43771:1;43763:6;43759:14;43752:58;43844:10;43839:2;43831:6;43827:15;43820:35;43741:121;:::o;43868:220::-;44008:34;44004:1;43996:6;43992:14;43985:58;44077:3;44072:2;44064:6;44060:15;44053:28;43974:114;:::o;44094:122::-;44167:24;44185:5;44167:24;:::i;:::-;44160:5;44157:35;44147:2;;44206:1;44203;44196:12;44147:2;44137:79;:::o;44222:116::-;44292:21;44307:5;44292:21;:::i;:::-;44285:5;44282:32;44272:2;;44328:1;44325;44318:12;44272:2;44262:76;:::o;44344:120::-;44416:23;44433:5;44416:23;:::i;:::-;44409:5;44406:34;44396:2;;44454:1;44451;44444:12;44396:2;44386:78;:::o;44470:122::-;44543:24;44561:5;44543:24;:::i;:::-;44536:5;44533:35;44523:2;;44582:1;44579;44572:12;44523:2;44513:79;:::o

Swarm Source

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