ETH Price: $3,063.32 (+1.96%)
Gas: 4 Gwei

Token

Generative Alchemy Lab (KKEY)
 

Overview

Max Total Supply

800 KKEY

Holders

363

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 KKEY
0x1Bf32181E831DBc781EeB850d58F801495c4C93d
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:
GenAlcLab

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-07
*/

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

/**
 *Submitted for verification at Etherscan.io on 2021-08-31
*/

// Sources flattened with hardhat v2.5.0 https://hardhat.org
 
// File contracts/utils/introspection/IERC165.sol
 
// 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);
}
 
 
// File contracts/token/ERC721/IERC721.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @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;
}
 
 
// File contracts/token/ERC721/IERC721Receiver.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @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);
}
 
 
// File contracts/token/ERC721/extensions/IERC721Metadata.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @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);
}
 
 
// File contracts/utils/Address.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.
 
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");
 
        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");
 
        // solhint-disable-next-line avoid-low-level-calls
        (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");
 
        // solhint-disable-next-line avoid-low-level-calls
        (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");
 
        // solhint-disable-next-line avoid-low-level-calls
        (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
 
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
 
// File contracts/utils/Context.sol
 
 
 
pragma solidity ^0.8.0;
 
/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
 
    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
 
 
// File contracts/utils/Strings.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
 
}
 
 
// File contracts/utils/introspection/ERC165.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
 
 
// File contracts/token/ERC721/ERC721.sol
 
 
 
pragma solidity ^0.8.0;
 
 
 
 
 
 
 
/**
 * @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;
 
    // 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;
 
    /**
     * @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(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
 
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0
            ? string(abi.encodePacked(baseURI, tokenId.toString()))
            : '';
    }
 
    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }
 
    /**
     * @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 {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}
 
 
// File contracts/token/ERC721/extensions/ERC721URIStorage.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;
 
    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;
 
    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
 
        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
 
        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
 
        return super.tokenURI(tokenId);
    }
 
    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
 
    /**
     * @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 override {
        super._burn(tokenId);
 
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}
 
 
// File contracts/access/Ownable.sol
 
 
 
pragma solidity ^0.8.0;
 
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;
 
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
 
 
 
pragma solidity ^0.8.0;
 
 
 
contract GenAlcLab is ERC721URIStorage, Ownable{

    event MintGenApe (address indexed minter, uint256 startWith, uint256 times);
   
    
    uint256 public totalGenApe;
    uint256 public totalCount = 2500; // Total
    uint256 public presaleMax = 520; 
    uint256 public maxBatch = 10; // Batch
    uint256 public price = 50000000000000000; // 0.05 eth
    string public baseURI;
    bool public started;
    bool public whiteListStart;
    mapping(address => uint256) whiteListMintCount;
    uint addressRegistryCount;
    
    constructor(string memory name_, string memory symbol_, string memory baseURI_) ERC721(name_, symbol_) {
        baseURI = baseURI_;
    }
    
    modifier canWhitelistMint() {
        require(whiteListStart, "Hang on boys, youll get in soon");
        _; 
    }

    modifier mintEnabled() {
        require(started, "not started");
        _;
    }
 
    function totalSupply() public view virtual returns (uint256) {
        return totalGenApe;
       
    }
 
    function _baseURI() internal view virtual override returns (string memory){
        return baseURI;
    }
 
    function setBaseURI(string memory _newURI) public onlyOwner {
        baseURI = _newURI;
    }
 
    function changePrice(uint256 _newPrice) public onlyOwner {
        price = _newPrice;
    }
    
 
    function setTokenURI(uint256 _tokenId, string memory _tokenURI) public onlyOwner {
        _setTokenURI(_tokenId, _tokenURI);
    }
 
    function setNormalStart(bool _start) public onlyOwner {
        started = _start;
    }
    
    function setWhiteListStart(bool _start) public onlyOwner {
        whiteListStart = _start;
    }
    
    function getWhitelistMintAmount(address _addr) public view virtual returns (uint256) {
        return whiteListMintCount[_addr];
    }
 
    function mintKhemKoalas(uint256 _times) payable public mintEnabled {
       
        require(_times >0 && _times <= maxBatch, "mint wrong number");
        require(totalGenApe + _times <= totalCount, "too much");
        require(msg.value == _times * price, "value error");
        payable(owner()).transfer(msg.value);
        emit MintGenApe(_msgSender(), totalGenApe+1, _times);
        for(uint256 i=0; i< _times; i++){
            _mint(_msgSender(), 1 + totalGenApe++);
        }
    } 
    
    function adminMint(uint256 _times) public onlyOwner {
        require(_times >0 && _times <= maxBatch, "mint wrong number");
        require(totalGenApe + _times <= totalCount, "too much");
        emit MintGenApe(_msgSender(), totalGenApe+1, _times);
        for(uint256 i=0; i< _times; i++){
            _mint(_msgSender(), 1 + totalGenApe++);
        }
    }
    
    
    function whitelistMint(uint _times) payable public canWhitelistMint {
        if (whiteListMintCount[msg.sender]==0)  {
            whiteListMintCount[msg.sender] = 4;
        }
        require(whiteListMintCount[msg.sender] - _times >= 1, "Over mint limit for address.");
        require(totalGenApe + _times <= presaleMax, "Mint amount will exceed total presale amount.");
        require(msg.value == _times * price, "Incorrect transaction value.");
        payable(owner()).transfer(msg.value);
        whiteListMintCount[_msgSender()] -= _times;
        emit MintGenApe(_msgSender(), totalGenApe+1, _times);
        for(uint256 i=0; i< _times; i++){
            _mint(_msgSender(), 1 + totalGenApe++);
        }
    }
    
    
    function adminMintGiveaways(address _addr) public onlyOwner {
        require(totalGenApe + 1 <= totalCount, "Mint amount will exceed total collection amount.");
        emit MintGenApe(_addr, totalGenApe+1, 1);
        _mint(_addr, 1 + totalGenApe++);
    } 
    
    
    
    
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"}],"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":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"startWith","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"times","type":"uint256"}],"name":"MintGenApe","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":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"adminMintGiveaways","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changePrice","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":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getWhitelistMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"maxBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"mintKhemKoalas","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":"presaleMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_start","type":"bool"}],"name":"setNormalStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_start","type":"bool"}],"name":"setWhiteListStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGenApe","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":"whiteListStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526109c4600955610208600a55600a600b5566b1a2bc2ec50000600c553480156200002d57600080fd5b5060405162004c0f38038062004c0f833981810160405281019062000053919062000292565b828281600090805190602001906200006d92919062000164565b5080600190805190602001906200008692919062000164565b50505060006200009b6200015c60201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600d90805190602001906200015292919062000164565b50505050620004cf565b600033905090565b8280546200017290620003e0565b90600052602060002090601f016020900481019282620001965760008555620001e2565b82601f10620001b157805160ff1916838001178555620001e2565b82800160010185558215620001e2579182015b82811115620001e1578251825591602001919060010190620001c4565b5b509050620001f19190620001f5565b5090565b5b8082111562000210576000816000905550600101620001f6565b5090565b60006200022b620002258462000374565b6200034b565b9050828152602081018484840111156200024a5762000249620004af565b5b62000257848285620003aa565b509392505050565b600082601f830112620002775762000276620004aa565b5b81516200028984826020860162000214565b91505092915050565b600080600060608486031215620002ae57620002ad620004b9565b5b600084015167ffffffffffffffff811115620002cf57620002ce620004b4565b5b620002dd868287016200025f565b935050602084015167ffffffffffffffff811115620003015762000300620004b4565b5b6200030f868287016200025f565b925050604084015167ffffffffffffffff811115620003335762000332620004b4565b5b62000341868287016200025f565b9150509250925092565b6000620003576200036a565b905062000365828262000416565b919050565b6000604051905090565b600067ffffffffffffffff8211156200039257620003916200047b565b5b6200039d82620004be565b9050602081019050919050565b60005b83811015620003ca578082015181840152602081019050620003ad565b83811115620003da576000848401525b50505050565b60006002820490506001821680620003f957607f821691505b6020821081141562000410576200040f6200044c565b5b50919050565b6200042182620004be565b810181811067ffffffffffffffff821117156200044357620004426200047b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61473080620004df6000396000f3fe6080604052600436106102045760003560e01c806370a0823111610118578063a22cb465116100a0578063c1f261231161006f578063c1f2612314610725578063c87b56dd1461074e578063e985e9c51461078b578063f2fde38b146107c8578063f34acb7c146107f157610204565b8063a22cb4651461068e578063a2b40d19146106b7578063b43d8db4146106e0578063b88d4fde146106fc57610204565b80638da5cb5b116100e75780638da5cb5b146105a7578063917bb57f146105d257806395d89b41146105fb5780639afdf2f314610626578063a035b1fe1461066357610204565b806370a082311461050c578063715018a614610549578063868ff4a21461056057806388eae7051461057c57610204565b80632cb35b901161019b57806355f804b31161016a57806355f804b3146104275780635f4f603d146104505780636352211e1461047957806367765b87146104b65780636c0360eb146104e157610204565b80632cb35b901461037f57806334eafb11146103aa5780633c49a8a9146103d557806342842e0e146103fe57610204565b8063162094c4116101d7578063162094c4146102d757806318160ddd146103005780631f2698ab1461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613106565b61081c565b60405161023d919061374d565b60405180910390f35b34801561025257600080fd5b5061025b6108fe565b6040516102689190613768565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906131a9565b610990565b6040516102a591906136e6565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613099565b610a15565b005b3480156102e357600080fd5b506102fe60048036038101906102f991906131d6565b610b2d565b005b34801561030c57600080fd5b50610315610bb7565b6040516103229190613aea565b60405180910390f35b34801561033757600080fd5b50610340610bc1565b60405161034d919061374d565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612f83565b610bd4565b005b34801561038b57600080fd5b50610394610c34565b6040516103a19190613aea565b60405180910390f35b3480156103b657600080fd5b506103bf610c3a565b6040516103cc9190613aea565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190612f16565b610c40565b005b34801561040a57600080fd5b5061042560048036038101906104209190612f83565b610d9d565b005b34801561043357600080fd5b5061044e60048036038101906104499190613160565b610dbd565b005b34801561045c57600080fd5b50610477600480360381019061047291906130d9565b610e53565b005b34801561048557600080fd5b506104a0600480360381019061049b91906131a9565b610eec565b6040516104ad91906136e6565b60405180910390f35b3480156104c257600080fd5b506104cb610f9e565b6040516104d89190613aea565b60405180910390f35b3480156104ed57600080fd5b506104f6610fa4565b6040516105039190613768565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190612f16565b611032565b6040516105409190613aea565b60405180910390f35b34801561055557600080fd5b5061055e6110ea565b005b61057a600480360381019061057591906131a9565b611227565b005b34801561058857600080fd5b50610591611598565b60405161059e919061374d565b60405180910390f35b3480156105b357600080fd5b506105bc6115ab565b6040516105c991906136e6565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f491906130d9565b6115d5565b005b34801561060757600080fd5b5061061061166e565b60405161061d9190613768565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190612f16565b611700565b60405161065a9190613aea565b60405180910390f35b34801561066f57600080fd5b50610678611749565b6040516106859190613aea565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613059565b61174f565b005b3480156106c357600080fd5b506106de60048036038101906106d991906131a9565b6118d0565b005b6106fa60048036038101906106f591906131a9565b611956565b005b34801561070857600080fd5b50610723600480360381019061071e9190612fd6565b611b9f565b005b34801561073157600080fd5b5061074c600480360381019061074791906131a9565b611c01565b005b34801561075a57600080fd5b50610775600480360381019061077091906131a9565b611dda565b6040516107829190613768565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad9190612f43565b611f2c565b6040516107bf919061374d565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190612f16565b611fc0565b005b3480156107fd57600080fd5b5061080661216c565b6040516108139190613aea565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108f757506108f682612172565b5b9050919050565b60606000805461090d90613dfe565b80601f016020809104026020016040519081016040528092919081815260200182805461093990613dfe565b80156109865780601f1061095b57610100808354040283529160200191610986565b820191906000526020600020905b81548152906001019060200180831161096957829003601f168201915b5050505050905090565b600061099b826121dc565b6109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d1906139aa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2082610eec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613a2a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab0612248565b73ffffffffffffffffffffffffffffffffffffffff161480610adf5750610ade81610ad9612248565b611f2c565b5b610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906138ca565b60405180910390fd5b610b288383612250565b505050565b610b35612248565b73ffffffffffffffffffffffffffffffffffffffff16610b536115ab565b73ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906139ca565b60405180910390fd5b610bb38282612309565b5050565b6000600854905090565b600e60009054906101000a900460ff1681565b610be5610bdf612248565b8261237d565b610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90613a4a565b60405180910390fd5b610c2f83838361245b565b505050565b60085481565b60095481565b610c48612248565b73ffffffffffffffffffffffffffffffffffffffff16610c666115ab565b73ffffffffffffffffffffffffffffffffffffffff1614610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb3906139ca565b60405180910390fd5b6009546001600854610cce9190613c21565b1115610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690613a6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167ffa8a9e4278757ba47911ada59318bd102b948844b554cef5d90f067db7ed021c6001600854610d569190613c21565b6001604051610d66929190613b05565b60405180910390a2610d9a8160086000815480929190610d8590613e61565b919050556001610d959190613c21565b6126b7565b50565b610db883838360405180602001604052806000815250611b9f565b505050565b610dc5612248565b73ffffffffffffffffffffffffffffffffffffffff16610de36115ab565b73ffffffffffffffffffffffffffffffffffffffff1614610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e30906139ca565b60405180910390fd5b80600d9080519060200190610e4f929190612d2a565b5050565b610e5b612248565b73ffffffffffffffffffffffffffffffffffffffff16610e796115ab565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec6906139ca565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c9061390a565b60405180910390fd5b80915050919050565b600b5481565b600d8054610fb190613dfe565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdd90613dfe565b801561102a5780601f10610fff5761010080835404028352916020019161102a565b820191906000526020600020905b81548152906001019060200180831161100d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a906138ea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110f2612248565b73ffffffffffffffffffffffffffffffffffffffff166111106115ab565b73ffffffffffffffffffffffffffffffffffffffff1614611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d906139ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600e60019054906101000a900460ff16611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90613aaa565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611304576004600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600181600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113519190613d02565b1015611392576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113899061386a565b60405180910390fd5b600a54816008546113a39190613c21565b11156113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db906138aa565b60405180910390fd5b600c54816113f29190613ca8565b3414611433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142a9061394a565b60405180910390fd5b61143b6115ab565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611480573d6000803e3d6000fd5b5080600f600061148e612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114d79190613d02565b925050819055506114e6612248565b73ffffffffffffffffffffffffffffffffffffffff167ffa8a9e4278757ba47911ada59318bd102b948844b554cef5d90f067db7ed021c600160085461152c9190613c21565b8360405161153b929190613b2e565b60405180910390a260005b8181101561159457611581611559612248565b6008600081548092919061156c90613e61565b91905055600161157c9190613c21565b6126b7565b808061158c90613e61565b915050611546565b5050565b600e60019054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115dd612248565b73ffffffffffffffffffffffffffffffffffffffff166115fb6115ab565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906139ca565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b60606001805461167d90613dfe565b80601f01602080910402602001604051908101604052809291908181526020018280546116a990613dfe565b80156116f65780601f106116cb576101008083540402835291602001916116f6565b820191906000526020600020905b8154815290600101906020018083116116d957829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c5481565b611757612248565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc9061384a565b60405180910390fd5b80600560006117d2612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661187f612248565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c4919061374d565b60405180910390a35050565b6118d8612248565b73ffffffffffffffffffffffffffffffffffffffff166118f66115ab565b73ffffffffffffffffffffffffffffffffffffffff161461194c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611943906139ca565b60405180910390fd5b80600c8190555050565b600e60009054906101000a900460ff166119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c90613a8a565b60405180910390fd5b6000811180156119b75750600b548111155b6119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed9061380a565b60405180910390fd5b60095481600854611a079190613c21565b1115611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f9061378a565b60405180910390fd5b600c5481611a569190613ca8565b3414611a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8e90613aca565b60405180910390fd5b611a9f6115ab565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611ae4573d6000803e3d6000fd5b50611aed612248565b73ffffffffffffffffffffffffffffffffffffffff167ffa8a9e4278757ba47911ada59318bd102b948844b554cef5d90f067db7ed021c6001600854611b339190613c21565b83604051611b42929190613b2e565b60405180910390a260005b81811015611b9b57611b88611b60612248565b60086000815480929190611b7390613e61565b919050556001611b839190613c21565b6126b7565b8080611b9390613e61565b915050611b4d565b5050565b611bb0611baa612248565b8361237d565b611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690613a4a565b60405180910390fd5b611bfb84848484612885565b50505050565b611c09612248565b73ffffffffffffffffffffffffffffffffffffffff16611c276115ab565b73ffffffffffffffffffffffffffffffffffffffff1614611c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c74906139ca565b60405180910390fd5b600081118015611c8f5750600b548111155b611cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc59061380a565b60405180910390fd5b60095481600854611cdf9190613c21565b1115611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d179061378a565b60405180910390fd5b611d28612248565b73ffffffffffffffffffffffffffffffffffffffff167ffa8a9e4278757ba47911ada59318bd102b948844b554cef5d90f067db7ed021c6001600854611d6e9190613c21565b83604051611d7d929190613b2e565b60405180910390a260005b81811015611dd657611dc3611d9b612248565b60086000815480929190611dae90613e61565b919050556001611dbe9190613c21565b6126b7565b8080611dce90613e61565b915050611d88565b5050565b6060611de5826121dc565b611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b9061398a565b60405180910390fd5b6000600660008481526020019081526020016000208054611e4490613dfe565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7090613dfe565b8015611ebd5780601f10611e9257610100808354040283529160200191611ebd565b820191906000526020600020905b815481529060010190602001808311611ea057829003601f168201915b505050505090506000611ece6128e1565b9050600081511415611ee4578192505050611f27565b600082511115611f19578082604051602001611f019291906136c2565b60405160208183030381529060405292505050611f27565b611f2284612973565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fc8612248565b73ffffffffffffffffffffffffffffffffffffffff16611fe66115ab565b73ffffffffffffffffffffffffffffffffffffffff161461203c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612033906139ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a3906137ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c383610eec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612312826121dc565b612351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123489061392a565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612378929190612d2a565b505050565b6000612388826121dc565b6123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be9061388a565b60405180910390fd5b60006123d283610eec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061244157508373ffffffffffffffffffffffffffffffffffffffff1661242984610990565b73ffffffffffffffffffffffffffffffffffffffff16145b8061245257506124518185611f2c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661247b82610eec565b73ffffffffffffffffffffffffffffffffffffffff16146124d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c8906139ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125389061382a565b60405180910390fd5b61254c838383612a1a565b612557600082612250565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a79190613d02565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125fe9190613c21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e9061396a565b60405180910390fd5b612730816121dc565b15612770576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612767906137ea565b60405180910390fd5b61277c60008383612a1a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127cc9190613c21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61289084848461245b565b61289c84848484612a1f565b6128db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d2906137aa565b60405180910390fd5b50505050565b6060600d80546128f090613dfe565b80601f016020809104026020016040519081016040528092919081815260200182805461291c90613dfe565b80156129695780601f1061293e57610100808354040283529160200191612969565b820191906000526020600020905b81548152906001019060200180831161294c57829003601f168201915b5050505050905090565b606061297e826121dc565b6129bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b490613a0a565b60405180910390fd5b60006129c76128e1565b905060008151116129e75760405180602001604052806000815250612a12565b806129f184612bb6565b604051602001612a029291906136c2565b6040516020818303038152906040525b915050919050565b505050565b6000612a408473ffffffffffffffffffffffffffffffffffffffff16612d17565b15612ba9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a69612248565b8786866040518563ffffffff1660e01b8152600401612a8b9493929190613701565b602060405180830381600087803b158015612aa557600080fd5b505af1925050508015612ad657506040513d601f19601f82011682018060405250810190612ad39190613133565b60015b612b59573d8060008114612b06576040519150601f19603f3d011682016040523d82523d6000602084013e612b0b565b606091505b50600081511415612b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b48906137aa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bae565b600190505b949350505050565b60606000821415612bfe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d12565b600082905060005b60008214612c30578080612c1990613e61565b915050600a82612c299190613c77565b9150612c06565b60008167ffffffffffffffff811115612c4c57612c4b613f97565b5b6040519080825280601f01601f191660200182016040528015612c7e5781602001600182028036833780820191505090505b5090505b60008514612d0b57600182612c979190613d02565b9150600a85612ca69190613eaa565b6030612cb29190613c21565b60f81b818381518110612cc857612cc7613f68565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d049190613c77565b9450612c82565b8093505050505b919050565b600080823b905060008111915050919050565b828054612d3690613dfe565b90600052602060002090601f016020900481019282612d585760008555612d9f565b82601f10612d7157805160ff1916838001178555612d9f565b82800160010185558215612d9f579182015b82811115612d9e578251825591602001919060010190612d83565b5b509050612dac9190612db0565b5090565b5b80821115612dc9576000816000905550600101612db1565b5090565b6000612de0612ddb84613b7c565b613b57565b905082815260208101848484011115612dfc57612dfb613fcb565b5b612e07848285613dbc565b509392505050565b6000612e22612e1d84613bad565b613b57565b905082815260208101848484011115612e3e57612e3d613fcb565b5b612e49848285613dbc565b509392505050565b600081359050612e608161469e565b92915050565b600081359050612e75816146b5565b92915050565b600081359050612e8a816146cc565b92915050565b600081519050612e9f816146cc565b92915050565b600082601f830112612eba57612eb9613fc6565b5b8135612eca848260208601612dcd565b91505092915050565b600082601f830112612ee857612ee7613fc6565b5b8135612ef8848260208601612e0f565b91505092915050565b600081359050612f10816146e3565b92915050565b600060208284031215612f2c57612f2b613fd5565b5b6000612f3a84828501612e51565b91505092915050565b60008060408385031215612f5a57612f59613fd5565b5b6000612f6885828601612e51565b9250506020612f7985828601612e51565b9150509250929050565b600080600060608486031215612f9c57612f9b613fd5565b5b6000612faa86828701612e51565b9350506020612fbb86828701612e51565b9250506040612fcc86828701612f01565b9150509250925092565b60008060008060808587031215612ff057612fef613fd5565b5b6000612ffe87828801612e51565b945050602061300f87828801612e51565b935050604061302087828801612f01565b925050606085013567ffffffffffffffff81111561304157613040613fd0565b5b61304d87828801612ea5565b91505092959194509250565b600080604083850312156130705761306f613fd5565b5b600061307e85828601612e51565b925050602061308f85828601612e66565b9150509250929050565b600080604083850312156130b0576130af613fd5565b5b60006130be85828601612e51565b92505060206130cf85828601612f01565b9150509250929050565b6000602082840312156130ef576130ee613fd5565b5b60006130fd84828501612e66565b91505092915050565b60006020828403121561311c5761311b613fd5565b5b600061312a84828501612e7b565b91505092915050565b60006020828403121561314957613148613fd5565b5b600061315784828501612e90565b91505092915050565b60006020828403121561317657613175613fd5565b5b600082013567ffffffffffffffff81111561319457613193613fd0565b5b6131a084828501612ed3565b91505092915050565b6000602082840312156131bf576131be613fd5565b5b60006131cd84828501612f01565b91505092915050565b600080604083850312156131ed576131ec613fd5565b5b60006131fb85828601612f01565b925050602083013567ffffffffffffffff81111561321c5761321b613fd0565b5b61322885828601612ed3565b9150509250929050565b61323b81613d36565b82525050565b61324a81613d48565b82525050565b600061325b82613bde565b6132658185613bf4565b9350613275818560208601613dcb565b61327e81613fda565b840191505092915050565b61329281613daa565b82525050565b60006132a382613be9565b6132ad8185613c05565b93506132bd818560208601613dcb565b6132c681613fda565b840191505092915050565b60006132dc82613be9565b6132e68185613c16565b93506132f6818560208601613dcb565b80840191505092915050565b600061330f600883613c05565b915061331a82613feb565b602082019050919050565b6000613332603283613c05565b915061333d82614014565b604082019050919050565b6000613355602683613c05565b915061336082614063565b604082019050919050565b6000613378601c83613c05565b9150613383826140b2565b602082019050919050565b600061339b601183613c05565b91506133a6826140db565b602082019050919050565b60006133be602483613c05565b91506133c982614104565b604082019050919050565b60006133e1601983613c05565b91506133ec82614153565b602082019050919050565b6000613404601c83613c05565b915061340f8261417c565b602082019050919050565b6000613427602c83613c05565b9150613432826141a5565b604082019050919050565b600061344a602d83613c05565b9150613455826141f4565b604082019050919050565b600061346d603883613c05565b915061347882614243565b604082019050919050565b6000613490602a83613c05565b915061349b82614292565b604082019050919050565b60006134b3602983613c05565b91506134be826142e1565b604082019050919050565b60006134d6602e83613c05565b91506134e182614330565b604082019050919050565b60006134f9601c83613c05565b91506135048261437f565b602082019050919050565b600061351c602083613c05565b9150613527826143a8565b602082019050919050565b600061353f603183613c05565b915061354a826143d1565b604082019050919050565b6000613562602c83613c05565b915061356d82614420565b604082019050919050565b6000613585602083613c05565b91506135908261446f565b602082019050919050565b60006135a8602983613c05565b91506135b382614498565b604082019050919050565b60006135cb602f83613c05565b91506135d6826144e7565b604082019050919050565b60006135ee602183613c05565b91506135f982614536565b604082019050919050565b6000613611603183613c05565b915061361c82614585565b604082019050919050565b6000613634603083613c05565b915061363f826145d4565b604082019050919050565b6000613657600b83613c05565b915061366282614623565b602082019050919050565b600061367a601f83613c05565b91506136858261464c565b602082019050919050565b600061369d600b83613c05565b91506136a882614675565b602082019050919050565b6136bc81613da0565b82525050565b60006136ce82856132d1565b91506136da82846132d1565b91508190509392505050565b60006020820190506136fb6000830184613232565b92915050565b60006080820190506137166000830187613232565b6137236020830186613232565b61373060408301856136b3565b81810360608301526137428184613250565b905095945050505050565b60006020820190506137626000830184613241565b92915050565b600060208201905081810360008301526137828184613298565b905092915050565b600060208201905081810360008301526137a381613302565b9050919050565b600060208201905081810360008301526137c381613325565b9050919050565b600060208201905081810360008301526137e381613348565b9050919050565b600060208201905081810360008301526138038161336b565b9050919050565b600060208201905081810360008301526138238161338e565b9050919050565b60006020820190508181036000830152613843816133b1565b9050919050565b60006020820190508181036000830152613863816133d4565b9050919050565b60006020820190508181036000830152613883816133f7565b9050919050565b600060208201905081810360008301526138a38161341a565b9050919050565b600060208201905081810360008301526138c38161343d565b9050919050565b600060208201905081810360008301526138e381613460565b9050919050565b6000602082019050818103600083015261390381613483565b9050919050565b60006020820190508181036000830152613923816134a6565b9050919050565b60006020820190508181036000830152613943816134c9565b9050919050565b60006020820190508181036000830152613963816134ec565b9050919050565b600060208201905081810360008301526139838161350f565b9050919050565b600060208201905081810360008301526139a381613532565b9050919050565b600060208201905081810360008301526139c381613555565b9050919050565b600060208201905081810360008301526139e381613578565b9050919050565b60006020820190508181036000830152613a038161359b565b9050919050565b60006020820190508181036000830152613a23816135be565b9050919050565b60006020820190508181036000830152613a43816135e1565b9050919050565b60006020820190508181036000830152613a6381613604565b9050919050565b60006020820190508181036000830152613a8381613627565b9050919050565b60006020820190508181036000830152613aa38161364a565b9050919050565b60006020820190508181036000830152613ac38161366d565b9050919050565b60006020820190508181036000830152613ae381613690565b9050919050565b6000602082019050613aff60008301846136b3565b92915050565b6000604082019050613b1a60008301856136b3565b613b276020830184613289565b9392505050565b6000604082019050613b4360008301856136b3565b613b5060208301846136b3565b9392505050565b6000613b61613b72565b9050613b6d8282613e30565b919050565b6000604051905090565b600067ffffffffffffffff821115613b9757613b96613f97565b5b613ba082613fda565b9050602081019050919050565b600067ffffffffffffffff821115613bc857613bc7613f97565b5b613bd182613fda565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2c82613da0565b9150613c3783613da0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6c57613c6b613edb565b5b828201905092915050565b6000613c8282613da0565b9150613c8d83613da0565b925082613c9d57613c9c613f0a565b5b828204905092915050565b6000613cb382613da0565b9150613cbe83613da0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cf757613cf6613edb565b5b828202905092915050565b6000613d0d82613da0565b9150613d1883613da0565b925082821015613d2b57613d2a613edb565b5b828203905092915050565b6000613d4182613d80565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613db582613da0565b9050919050565b82818337600083830152505050565b60005b83811015613de9578082015181840152602081019050613dce565b83811115613df8576000848401525b50505050565b60006002820490506001821680613e1657607f821691505b60208210811415613e2a57613e29613f39565b5b50919050565b613e3982613fda565b810181811067ffffffffffffffff82111715613e5857613e57613f97565b5b80604052505050565b6000613e6c82613da0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e9f57613e9e613edb565b5b600182019050919050565b6000613eb582613da0565b9150613ec083613da0565b925082613ed057613ecf613f0a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f746f6f206d756368000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d696e742077726f6e67206e756d626572000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f766572206d696e74206c696d697420666f7220616464726573732e00000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742077696c6c2065786365656420746f74616c20707260008201527f6573616c6520616d6f756e742e00000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f496e636f7272656374207472616e73616374696f6e2076616c75652e00000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742077696c6c2065786365656420746f74616c20636f60008201527f6c6c656374696f6e20616d6f756e742e00000000000000000000000000000000602082015250565b7f6e6f742073746172746564000000000000000000000000000000000000000000600082015250565b7f48616e67206f6e20626f79732c20796f756c6c2067657420696e20736f6f6e00600082015250565b7f76616c7565206572726f72000000000000000000000000000000000000000000600082015250565b6146a781613d36565b81146146b257600080fd5b50565b6146be81613d48565b81146146c957600080fd5b50565b6146d581613d54565b81146146e057600080fd5b50565b6146ec81613da0565b81146146f757600080fd5b5056fea2646970667358221220c41c8702040b18575c21d46268184249d9bfe4df40b5af8808d472bef0e4a01d64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001647656e6572617469766520416c6368656d79204c61620000000000000000000000000000000000000000000000000000000000000000000000000000000000044b4b4559000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102045760003560e01c806370a0823111610118578063a22cb465116100a0578063c1f261231161006f578063c1f2612314610725578063c87b56dd1461074e578063e985e9c51461078b578063f2fde38b146107c8578063f34acb7c146107f157610204565b8063a22cb4651461068e578063a2b40d19146106b7578063b43d8db4146106e0578063b88d4fde146106fc57610204565b80638da5cb5b116100e75780638da5cb5b146105a7578063917bb57f146105d257806395d89b41146105fb5780639afdf2f314610626578063a035b1fe1461066357610204565b806370a082311461050c578063715018a614610549578063868ff4a21461056057806388eae7051461057c57610204565b80632cb35b901161019b57806355f804b31161016a57806355f804b3146104275780635f4f603d146104505780636352211e1461047957806367765b87146104b65780636c0360eb146104e157610204565b80632cb35b901461037f57806334eafb11146103aa5780633c49a8a9146103d557806342842e0e146103fe57610204565b8063162094c4116101d7578063162094c4146102d757806318160ddd146103005780631f2698ab1461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613106565b61081c565b60405161023d919061374d565b60405180910390f35b34801561025257600080fd5b5061025b6108fe565b6040516102689190613768565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906131a9565b610990565b6040516102a591906136e6565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613099565b610a15565b005b3480156102e357600080fd5b506102fe60048036038101906102f991906131d6565b610b2d565b005b34801561030c57600080fd5b50610315610bb7565b6040516103229190613aea565b60405180910390f35b34801561033757600080fd5b50610340610bc1565b60405161034d919061374d565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612f83565b610bd4565b005b34801561038b57600080fd5b50610394610c34565b6040516103a19190613aea565b60405180910390f35b3480156103b657600080fd5b506103bf610c3a565b6040516103cc9190613aea565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190612f16565b610c40565b005b34801561040a57600080fd5b5061042560048036038101906104209190612f83565b610d9d565b005b34801561043357600080fd5b5061044e60048036038101906104499190613160565b610dbd565b005b34801561045c57600080fd5b50610477600480360381019061047291906130d9565b610e53565b005b34801561048557600080fd5b506104a0600480360381019061049b91906131a9565b610eec565b6040516104ad91906136e6565b60405180910390f35b3480156104c257600080fd5b506104cb610f9e565b6040516104d89190613aea565b60405180910390f35b3480156104ed57600080fd5b506104f6610fa4565b6040516105039190613768565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190612f16565b611032565b6040516105409190613aea565b60405180910390f35b34801561055557600080fd5b5061055e6110ea565b005b61057a600480360381019061057591906131a9565b611227565b005b34801561058857600080fd5b50610591611598565b60405161059e919061374d565b60405180910390f35b3480156105b357600080fd5b506105bc6115ab565b6040516105c991906136e6565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f491906130d9565b6115d5565b005b34801561060757600080fd5b5061061061166e565b60405161061d9190613768565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190612f16565b611700565b60405161065a9190613aea565b60405180910390f35b34801561066f57600080fd5b50610678611749565b6040516106859190613aea565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613059565b61174f565b005b3480156106c357600080fd5b506106de60048036038101906106d991906131a9565b6118d0565b005b6106fa60048036038101906106f591906131a9565b611956565b005b34801561070857600080fd5b50610723600480360381019061071e9190612fd6565b611b9f565b005b34801561073157600080fd5b5061074c600480360381019061074791906131a9565b611c01565b005b34801561075a57600080fd5b50610775600480360381019061077091906131a9565b611dda565b6040516107829190613768565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad9190612f43565b611f2c565b6040516107bf919061374d565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190612f16565b611fc0565b005b3480156107fd57600080fd5b5061080661216c565b6040516108139190613aea565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108f757506108f682612172565b5b9050919050565b60606000805461090d90613dfe565b80601f016020809104026020016040519081016040528092919081815260200182805461093990613dfe565b80156109865780601f1061095b57610100808354040283529160200191610986565b820191906000526020600020905b81548152906001019060200180831161096957829003601f168201915b5050505050905090565b600061099b826121dc565b6109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d1906139aa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2082610eec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613a2a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab0612248565b73ffffffffffffffffffffffffffffffffffffffff161480610adf5750610ade81610ad9612248565b611f2c565b5b610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906138ca565b60405180910390fd5b610b288383612250565b505050565b610b35612248565b73ffffffffffffffffffffffffffffffffffffffff16610b536115ab565b73ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906139ca565b60405180910390fd5b610bb38282612309565b5050565b6000600854905090565b600e60009054906101000a900460ff1681565b610be5610bdf612248565b8261237d565b610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90613a4a565b60405180910390fd5b610c2f83838361245b565b505050565b60085481565b60095481565b610c48612248565b73ffffffffffffffffffffffffffffffffffffffff16610c666115ab565b73ffffffffffffffffffffffffffffffffffffffff1614610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb3906139ca565b60405180910390fd5b6009546001600854610cce9190613c21565b1115610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690613a6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167ffa8a9e4278757ba47911ada59318bd102b948844b554cef5d90f067db7ed021c6001600854610d569190613c21565b6001604051610d66929190613b05565b60405180910390a2610d9a8160086000815480929190610d8590613e61565b919050556001610d959190613c21565b6126b7565b50565b610db883838360405180602001604052806000815250611b9f565b505050565b610dc5612248565b73ffffffffffffffffffffffffffffffffffffffff16610de36115ab565b73ffffffffffffffffffffffffffffffffffffffff1614610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e30906139ca565b60405180910390fd5b80600d9080519060200190610e4f929190612d2a565b5050565b610e5b612248565b73ffffffffffffffffffffffffffffffffffffffff16610e796115ab565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec6906139ca565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c9061390a565b60405180910390fd5b80915050919050565b600b5481565b600d8054610fb190613dfe565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdd90613dfe565b801561102a5780601f10610fff5761010080835404028352916020019161102a565b820191906000526020600020905b81548152906001019060200180831161100d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a906138ea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110f2612248565b73ffffffffffffffffffffffffffffffffffffffff166111106115ab565b73ffffffffffffffffffffffffffffffffffffffff1614611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d906139ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600e60019054906101000a900460ff16611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90613aaa565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611304576004600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600181600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113519190613d02565b1015611392576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113899061386a565b60405180910390fd5b600a54816008546113a39190613c21565b11156113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db906138aa565b60405180910390fd5b600c54816113f29190613ca8565b3414611433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142a9061394a565b60405180910390fd5b61143b6115ab565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611480573d6000803e3d6000fd5b5080600f600061148e612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114d79190613d02565b925050819055506114e6612248565b73ffffffffffffffffffffffffffffffffffffffff167ffa8a9e4278757ba47911ada59318bd102b948844b554cef5d90f067db7ed021c600160085461152c9190613c21565b8360405161153b929190613b2e565b60405180910390a260005b8181101561159457611581611559612248565b6008600081548092919061156c90613e61565b91905055600161157c9190613c21565b6126b7565b808061158c90613e61565b915050611546565b5050565b600e60019054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115dd612248565b73ffffffffffffffffffffffffffffffffffffffff166115fb6115ab565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906139ca565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b60606001805461167d90613dfe565b80601f01602080910402602001604051908101604052809291908181526020018280546116a990613dfe565b80156116f65780601f106116cb576101008083540402835291602001916116f6565b820191906000526020600020905b8154815290600101906020018083116116d957829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c5481565b611757612248565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc9061384a565b60405180910390fd5b80600560006117d2612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661187f612248565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c4919061374d565b60405180910390a35050565b6118d8612248565b73ffffffffffffffffffffffffffffffffffffffff166118f66115ab565b73ffffffffffffffffffffffffffffffffffffffff161461194c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611943906139ca565b60405180910390fd5b80600c8190555050565b600e60009054906101000a900460ff166119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c90613a8a565b60405180910390fd5b6000811180156119b75750600b548111155b6119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed9061380a565b60405180910390fd5b60095481600854611a079190613c21565b1115611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f9061378a565b60405180910390fd5b600c5481611a569190613ca8565b3414611a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8e90613aca565b60405180910390fd5b611a9f6115ab565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611ae4573d6000803e3d6000fd5b50611aed612248565b73ffffffffffffffffffffffffffffffffffffffff167ffa8a9e4278757ba47911ada59318bd102b948844b554cef5d90f067db7ed021c6001600854611b339190613c21565b83604051611b42929190613b2e565b60405180910390a260005b81811015611b9b57611b88611b60612248565b60086000815480929190611b7390613e61565b919050556001611b839190613c21565b6126b7565b8080611b9390613e61565b915050611b4d565b5050565b611bb0611baa612248565b8361237d565b611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690613a4a565b60405180910390fd5b611bfb84848484612885565b50505050565b611c09612248565b73ffffffffffffffffffffffffffffffffffffffff16611c276115ab565b73ffffffffffffffffffffffffffffffffffffffff1614611c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c74906139ca565b60405180910390fd5b600081118015611c8f5750600b548111155b611cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc59061380a565b60405180910390fd5b60095481600854611cdf9190613c21565b1115611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d179061378a565b60405180910390fd5b611d28612248565b73ffffffffffffffffffffffffffffffffffffffff167ffa8a9e4278757ba47911ada59318bd102b948844b554cef5d90f067db7ed021c6001600854611d6e9190613c21565b83604051611d7d929190613b2e565b60405180910390a260005b81811015611dd657611dc3611d9b612248565b60086000815480929190611dae90613e61565b919050556001611dbe9190613c21565b6126b7565b8080611dce90613e61565b915050611d88565b5050565b6060611de5826121dc565b611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b9061398a565b60405180910390fd5b6000600660008481526020019081526020016000208054611e4490613dfe565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7090613dfe565b8015611ebd5780601f10611e9257610100808354040283529160200191611ebd565b820191906000526020600020905b815481529060010190602001808311611ea057829003601f168201915b505050505090506000611ece6128e1565b9050600081511415611ee4578192505050611f27565b600082511115611f19578082604051602001611f019291906136c2565b60405160208183030381529060405292505050611f27565b611f2284612973565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fc8612248565b73ffffffffffffffffffffffffffffffffffffffff16611fe66115ab565b73ffffffffffffffffffffffffffffffffffffffff161461203c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612033906139ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a3906137ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c383610eec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612312826121dc565b612351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123489061392a565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612378929190612d2a565b505050565b6000612388826121dc565b6123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be9061388a565b60405180910390fd5b60006123d283610eec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061244157508373ffffffffffffffffffffffffffffffffffffffff1661242984610990565b73ffffffffffffffffffffffffffffffffffffffff16145b8061245257506124518185611f2c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661247b82610eec565b73ffffffffffffffffffffffffffffffffffffffff16146124d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c8906139ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125389061382a565b60405180910390fd5b61254c838383612a1a565b612557600082612250565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a79190613d02565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125fe9190613c21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e9061396a565b60405180910390fd5b612730816121dc565b15612770576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612767906137ea565b60405180910390fd5b61277c60008383612a1a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127cc9190613c21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61289084848461245b565b61289c84848484612a1f565b6128db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d2906137aa565b60405180910390fd5b50505050565b6060600d80546128f090613dfe565b80601f016020809104026020016040519081016040528092919081815260200182805461291c90613dfe565b80156129695780601f1061293e57610100808354040283529160200191612969565b820191906000526020600020905b81548152906001019060200180831161294c57829003601f168201915b5050505050905090565b606061297e826121dc565b6129bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b490613a0a565b60405180910390fd5b60006129c76128e1565b905060008151116129e75760405180602001604052806000815250612a12565b806129f184612bb6565b604051602001612a029291906136c2565b6040516020818303038152906040525b915050919050565b505050565b6000612a408473ffffffffffffffffffffffffffffffffffffffff16612d17565b15612ba9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a69612248565b8786866040518563ffffffff1660e01b8152600401612a8b9493929190613701565b602060405180830381600087803b158015612aa557600080fd5b505af1925050508015612ad657506040513d601f19601f82011682018060405250810190612ad39190613133565b60015b612b59573d8060008114612b06576040519150601f19603f3d011682016040523d82523d6000602084013e612b0b565b606091505b50600081511415612b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b48906137aa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bae565b600190505b949350505050565b60606000821415612bfe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d12565b600082905060005b60008214612c30578080612c1990613e61565b915050600a82612c299190613c77565b9150612c06565b60008167ffffffffffffffff811115612c4c57612c4b613f97565b5b6040519080825280601f01601f191660200182016040528015612c7e5781602001600182028036833780820191505090505b5090505b60008514612d0b57600182612c979190613d02565b9150600a85612ca69190613eaa565b6030612cb29190613c21565b60f81b818381518110612cc857612cc7613f68565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d049190613c77565b9450612c82565b8093505050505b919050565b600080823b905060008111915050919050565b828054612d3690613dfe565b90600052602060002090601f016020900481019282612d585760008555612d9f565b82601f10612d7157805160ff1916838001178555612d9f565b82800160010185558215612d9f579182015b82811115612d9e578251825591602001919060010190612d83565b5b509050612dac9190612db0565b5090565b5b80821115612dc9576000816000905550600101612db1565b5090565b6000612de0612ddb84613b7c565b613b57565b905082815260208101848484011115612dfc57612dfb613fcb565b5b612e07848285613dbc565b509392505050565b6000612e22612e1d84613bad565b613b57565b905082815260208101848484011115612e3e57612e3d613fcb565b5b612e49848285613dbc565b509392505050565b600081359050612e608161469e565b92915050565b600081359050612e75816146b5565b92915050565b600081359050612e8a816146cc565b92915050565b600081519050612e9f816146cc565b92915050565b600082601f830112612eba57612eb9613fc6565b5b8135612eca848260208601612dcd565b91505092915050565b600082601f830112612ee857612ee7613fc6565b5b8135612ef8848260208601612e0f565b91505092915050565b600081359050612f10816146e3565b92915050565b600060208284031215612f2c57612f2b613fd5565b5b6000612f3a84828501612e51565b91505092915050565b60008060408385031215612f5a57612f59613fd5565b5b6000612f6885828601612e51565b9250506020612f7985828601612e51565b9150509250929050565b600080600060608486031215612f9c57612f9b613fd5565b5b6000612faa86828701612e51565b9350506020612fbb86828701612e51565b9250506040612fcc86828701612f01565b9150509250925092565b60008060008060808587031215612ff057612fef613fd5565b5b6000612ffe87828801612e51565b945050602061300f87828801612e51565b935050604061302087828801612f01565b925050606085013567ffffffffffffffff81111561304157613040613fd0565b5b61304d87828801612ea5565b91505092959194509250565b600080604083850312156130705761306f613fd5565b5b600061307e85828601612e51565b925050602061308f85828601612e66565b9150509250929050565b600080604083850312156130b0576130af613fd5565b5b60006130be85828601612e51565b92505060206130cf85828601612f01565b9150509250929050565b6000602082840312156130ef576130ee613fd5565b5b60006130fd84828501612e66565b91505092915050565b60006020828403121561311c5761311b613fd5565b5b600061312a84828501612e7b565b91505092915050565b60006020828403121561314957613148613fd5565b5b600061315784828501612e90565b91505092915050565b60006020828403121561317657613175613fd5565b5b600082013567ffffffffffffffff81111561319457613193613fd0565b5b6131a084828501612ed3565b91505092915050565b6000602082840312156131bf576131be613fd5565b5b60006131cd84828501612f01565b91505092915050565b600080604083850312156131ed576131ec613fd5565b5b60006131fb85828601612f01565b925050602083013567ffffffffffffffff81111561321c5761321b613fd0565b5b61322885828601612ed3565b9150509250929050565b61323b81613d36565b82525050565b61324a81613d48565b82525050565b600061325b82613bde565b6132658185613bf4565b9350613275818560208601613dcb565b61327e81613fda565b840191505092915050565b61329281613daa565b82525050565b60006132a382613be9565b6132ad8185613c05565b93506132bd818560208601613dcb565b6132c681613fda565b840191505092915050565b60006132dc82613be9565b6132e68185613c16565b93506132f6818560208601613dcb565b80840191505092915050565b600061330f600883613c05565b915061331a82613feb565b602082019050919050565b6000613332603283613c05565b915061333d82614014565b604082019050919050565b6000613355602683613c05565b915061336082614063565b604082019050919050565b6000613378601c83613c05565b9150613383826140b2565b602082019050919050565b600061339b601183613c05565b91506133a6826140db565b602082019050919050565b60006133be602483613c05565b91506133c982614104565b604082019050919050565b60006133e1601983613c05565b91506133ec82614153565b602082019050919050565b6000613404601c83613c05565b915061340f8261417c565b602082019050919050565b6000613427602c83613c05565b9150613432826141a5565b604082019050919050565b600061344a602d83613c05565b9150613455826141f4565b604082019050919050565b600061346d603883613c05565b915061347882614243565b604082019050919050565b6000613490602a83613c05565b915061349b82614292565b604082019050919050565b60006134b3602983613c05565b91506134be826142e1565b604082019050919050565b60006134d6602e83613c05565b91506134e182614330565b604082019050919050565b60006134f9601c83613c05565b91506135048261437f565b602082019050919050565b600061351c602083613c05565b9150613527826143a8565b602082019050919050565b600061353f603183613c05565b915061354a826143d1565b604082019050919050565b6000613562602c83613c05565b915061356d82614420565b604082019050919050565b6000613585602083613c05565b91506135908261446f565b602082019050919050565b60006135a8602983613c05565b91506135b382614498565b604082019050919050565b60006135cb602f83613c05565b91506135d6826144e7565b604082019050919050565b60006135ee602183613c05565b91506135f982614536565b604082019050919050565b6000613611603183613c05565b915061361c82614585565b604082019050919050565b6000613634603083613c05565b915061363f826145d4565b604082019050919050565b6000613657600b83613c05565b915061366282614623565b602082019050919050565b600061367a601f83613c05565b91506136858261464c565b602082019050919050565b600061369d600b83613c05565b91506136a882614675565b602082019050919050565b6136bc81613da0565b82525050565b60006136ce82856132d1565b91506136da82846132d1565b91508190509392505050565b60006020820190506136fb6000830184613232565b92915050565b60006080820190506137166000830187613232565b6137236020830186613232565b61373060408301856136b3565b81810360608301526137428184613250565b905095945050505050565b60006020820190506137626000830184613241565b92915050565b600060208201905081810360008301526137828184613298565b905092915050565b600060208201905081810360008301526137a381613302565b9050919050565b600060208201905081810360008301526137c381613325565b9050919050565b600060208201905081810360008301526137e381613348565b9050919050565b600060208201905081810360008301526138038161336b565b9050919050565b600060208201905081810360008301526138238161338e565b9050919050565b60006020820190508181036000830152613843816133b1565b9050919050565b60006020820190508181036000830152613863816133d4565b9050919050565b60006020820190508181036000830152613883816133f7565b9050919050565b600060208201905081810360008301526138a38161341a565b9050919050565b600060208201905081810360008301526138c38161343d565b9050919050565b600060208201905081810360008301526138e381613460565b9050919050565b6000602082019050818103600083015261390381613483565b9050919050565b60006020820190508181036000830152613923816134a6565b9050919050565b60006020820190508181036000830152613943816134c9565b9050919050565b60006020820190508181036000830152613963816134ec565b9050919050565b600060208201905081810360008301526139838161350f565b9050919050565b600060208201905081810360008301526139a381613532565b9050919050565b600060208201905081810360008301526139c381613555565b9050919050565b600060208201905081810360008301526139e381613578565b9050919050565b60006020820190508181036000830152613a038161359b565b9050919050565b60006020820190508181036000830152613a23816135be565b9050919050565b60006020820190508181036000830152613a43816135e1565b9050919050565b60006020820190508181036000830152613a6381613604565b9050919050565b60006020820190508181036000830152613a8381613627565b9050919050565b60006020820190508181036000830152613aa38161364a565b9050919050565b60006020820190508181036000830152613ac38161366d565b9050919050565b60006020820190508181036000830152613ae381613690565b9050919050565b6000602082019050613aff60008301846136b3565b92915050565b6000604082019050613b1a60008301856136b3565b613b276020830184613289565b9392505050565b6000604082019050613b4360008301856136b3565b613b5060208301846136b3565b9392505050565b6000613b61613b72565b9050613b6d8282613e30565b919050565b6000604051905090565b600067ffffffffffffffff821115613b9757613b96613f97565b5b613ba082613fda565b9050602081019050919050565b600067ffffffffffffffff821115613bc857613bc7613f97565b5b613bd182613fda565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2c82613da0565b9150613c3783613da0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6c57613c6b613edb565b5b828201905092915050565b6000613c8282613da0565b9150613c8d83613da0565b925082613c9d57613c9c613f0a565b5b828204905092915050565b6000613cb382613da0565b9150613cbe83613da0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cf757613cf6613edb565b5b828202905092915050565b6000613d0d82613da0565b9150613d1883613da0565b925082821015613d2b57613d2a613edb565b5b828203905092915050565b6000613d4182613d80565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613db582613da0565b9050919050565b82818337600083830152505050565b60005b83811015613de9578082015181840152602081019050613dce565b83811115613df8576000848401525b50505050565b60006002820490506001821680613e1657607f821691505b60208210811415613e2a57613e29613f39565b5b50919050565b613e3982613fda565b810181811067ffffffffffffffff82111715613e5857613e57613f97565b5b80604052505050565b6000613e6c82613da0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e9f57613e9e613edb565b5b600182019050919050565b6000613eb582613da0565b9150613ec083613da0565b925082613ed057613ecf613f0a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f746f6f206d756368000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d696e742077726f6e67206e756d626572000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f766572206d696e74206c696d697420666f7220616464726573732e00000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742077696c6c2065786365656420746f74616c20707260008201527f6573616c6520616d6f756e742e00000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f496e636f7272656374207472616e73616374696f6e2076616c75652e00000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742077696c6c2065786365656420746f74616c20636f60008201527f6c6c656374696f6e20616d6f756e742e00000000000000000000000000000000602082015250565b7f6e6f742073746172746564000000000000000000000000000000000000000000600082015250565b7f48616e67206f6e20626f79732c20796f756c6c2067657420696e20736f6f6e00600082015250565b7f76616c7565206572726f72000000000000000000000000000000000000000000600082015250565b6146a781613d36565b81146146b257600080fd5b50565b6146be81613d48565b81146146c957600080fd5b50565b6146d581613d54565b81146146e057600080fd5b50565b6146ec81613da0565b81146146f757600080fd5b5056fea2646970667358221220c41c8702040b18575c21d46268184249d9bfe4df40b5af8808d472bef0e4a01d64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001647656e6572617469766520416c6368656d79204c61620000000000000000000000000000000000000000000000000000000000000000000000000000000000044b4b4559000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Generative Alchemy Lab
Arg [1] : symbol_ (string): KKEY
Arg [2] : baseURI_ (string):

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [4] : 47656e6572617469766520416c6368656d79204c616200000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4b4b455900000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

36886:3815:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20778:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21713:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23181:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22715:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38253:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37808:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37286:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24076:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37035:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37068:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40405:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24454:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38040:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38496:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21406:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37155:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37258:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21135:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36290:148;;;;;;;;;;;;;:::i;:::-;;39652:735;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37312:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35637:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38395:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21883:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38607:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37199:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23476:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38145:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38752:501;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24677:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39266:368;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33047:682;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23844:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36594:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37116:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20778:292;20880:4;20919:25;20904:40;;;:11;:40;;;;:105;;;;20976:33;20961:48;;;:11;:48;;;;20904:105;:158;;;;21026:36;21050:11;21026:23;:36::i;:::-;20904:158;20897:165;;20778:292;;;:::o;21713:100::-;21767:13;21800:5;21793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21713:100;:::o;23181:222::-;23257:7;23285:16;23293:7;23285;:16::i;:::-;23277:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23371:15;:24;23387:7;23371:24;;;;;;;;;;;;;;;;;;;;;23364:31;;23181:222;;;:::o;22715:399::-;22796:13;22812:23;22827:7;22812:14;:23::i;:::-;22796:39;;22860:5;22854:11;;:2;:11;;;;22846:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22941:5;22925:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22950:37;22967:5;22974:12;:10;:12::i;:::-;22950:16;:37::i;:::-;22925:62;22917:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;23085:21;23094:2;23098:7;23085:8;:21::i;:::-;22785:329;22715:399;;:::o;38253:133::-;35869:12;:10;:12::i;:::-;35858:23;;:7;:5;:7::i;:::-;:23;;;35850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38345:33:::1;38358:8;38368:9;38345:12;:33::i;:::-;38253:133:::0;;:::o;37808:107::-;37860:7;37887:11;;37880:18;;37808:107;:::o;37286:19::-;;;;;;;;;;;;;:::o;24076:306::-;24237:41;24256:12;:10;:12::i;:::-;24270:7;24237:18;:41::i;:::-;24229:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24346:28;24356:4;24362:2;24366:7;24346:9;:28::i;:::-;24076:306;;;:::o;37035:26::-;;;;:::o;37068:32::-;;;;:::o;40405:262::-;35869:12;:10;:12::i;:::-;35858:23;;:7;:5;:7::i;:::-;:23;;;35850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40503:10:::1;;40498:1;40484:11;;:15;;;;:::i;:::-;:29;;40476:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;40593:5;40582:35;;;40612:1;40600:11;;:13;;;;:::i;:::-;40615:1;40582:35;;;;;;;:::i;:::-;;;;;;;;40628:31;40634:5;40645:11;;:13;;;;;;;;;:::i;:::-;;;;;40641:1;:17;;;;:::i;:::-;40628:5;:31::i;:::-;40405:262:::0;:::o;24454:151::-;24558:39;24575:4;24581:2;24585:7;24558:39;;;;;;;;;;;;:16;:39::i;:::-;24454:151;;;:::o;38040:96::-;35869:12;:10;:12::i;:::-;35858:23;;:7;:5;:7::i;:::-;:23;;;35850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38121:7:::1;38111;:17;;;;;;;;;;;;:::i;:::-;;38040:96:::0;:::o;38496:99::-;35869:12;:10;:12::i;:::-;35858:23;;:7;:5;:7::i;:::-;:23;;;35850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38581:6:::1;38564:14;;:23;;;;;;;;;;;;;;;;;;38496:99:::0;:::o;21406:239::-;21478:7;21498:13;21514:7;:16;21522:7;21514:16;;;;;;;;;;;;;;;;;;;;;21498:32;;21566:1;21549:19;;:5;:19;;;;21541:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21632:5;21625:12;;;21406:239;;;:::o;37155:28::-;;;;:::o;37258:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21135:208::-;21207:7;21252:1;21235:19;;:5;:19;;;;21227:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21319:9;:16;21329:5;21319:16;;;;;;;;;;;;;;;;21312:23;;21135:208;;;:::o;36290:148::-;35869:12;:10;:12::i;:::-;35858:23;;:7;:5;:7::i;:::-;:23;;;35850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36397:1:::1;36360:40;;36381:6;;;;;;;;;;;36360:40;;;;;;;;;;;;36428:1;36411:6;;:19;;;;;;;;;;;;;;;;;;36290:148::o:0;39652:735::-;37635:14;;;;;;;;;;;37627:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39767:1:::1;39735:18;:30;39754:10;39735:30;;;;;;;;;;;;;;;;:33;39731:101;;;39819:1;39786:18;:30;39805:10;39786:30;;;;;;;;;;;;;;;:34;;;;39731:101;39893:1;39883:6;39850:18;:30;39869:10;39850:30;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:44;;39842:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39970:10;;39960:6;39946:11;;:20;;;;:::i;:::-;:34;;39938:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;40071:5;;40062:6;:14;;;;:::i;:::-;40049:9;:27;40041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40128:7;:5;:7::i;:::-;40120:25;;:36;40146:9;40120:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;40203:6;40167:18;:32;40186:12;:10;:12::i;:::-;40167:32;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;40236:12;:10;:12::i;:::-;40225:47;;;40262:1;40250:11;;:13;;;;:::i;:::-;40265:6;40225:47;;;;;;;:::i;:::-;;;;;;;;40287:9;40283:97;40303:6;40300:1;:9;40283:97;;;40330:38;40336:12;:10;:12::i;:::-;40354:11;;:13;;;;;;;;;:::i;:::-;;;;;40350:1;:17;;;;:::i;:::-;40330:5;:38::i;:::-;40311:3;;;;;:::i;:::-;;;;40283:97;;;;39652:735:::0;:::o;37312:26::-;;;;;;;;;;;;;:::o;35637:87::-;35683:7;35710:6;;;;;;;;;;;35703:13;;35637:87;:::o;38395:89::-;35869:12;:10;:12::i;:::-;35858:23;;:7;:5;:7::i;:::-;:23;;;35850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38470:6:::1;38460:7;;:16;;;;;;;;;;;;;;;;;;38395:89:::0;:::o;21883:104::-;21939:13;21972:7;21965:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21883:104;:::o;38607:136::-;38683:7;38710:18;:25;38729:5;38710:25;;;;;;;;;;;;;;;;38703:32;;38607:136;;;:::o;37199:40::-;;;;:::o;23476:296::-;23591:12;:10;:12::i;:::-;23579:24;;:8;:24;;;;23571:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23692:8;23647:18;:32;23666:12;:10;:12::i;:::-;23647:32;;;;;;;;;;;;;;;:42;23680:8;23647:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23745:8;23716:48;;23731:12;:10;:12::i;:::-;23716:48;;;23755:8;23716:48;;;;;;:::i;:::-;;;;;;;;23476:296;;:::o;38145:93::-;35869:12;:10;:12::i;:::-;35858:23;;:7;:5;:7::i;:::-;:23;;;35850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38221:9:::1;38213:5;:17;;;;38145:93:::0;:::o;38752:501::-;37756:7;;;;;;;;;;;37748:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;38855:1:::1;38847:6;:9;:31;;;;;38870:8;;38860:6;:18;;38847:31;38839:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38943:10;;38933:6;38919:11;;:20;;;;:::i;:::-;:34;;38911:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39007:5;;38998:6;:14;;;;:::i;:::-;38985:9;:27;38977:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;39047:7;:5;:7::i;:::-;39039:25;;:36;39065:9;39039:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;39102:12;:10;:12::i;:::-;39091:47;;;39128:1;39116:11;;:13;;;;:::i;:::-;39131:6;39091:47;;;;;;;:::i;:::-;;;;;;;;39153:9;39149:97;39169:6;39166:1;:9;39149:97;;;39196:38;39202:12;:10;:12::i;:::-;39220:11;;:13;;;;;;;;;:::i;:::-;;;;;39216:1;:17;;;;:::i;:::-;39196:5;:38::i;:::-;39177:3;;;;;:::i;:::-;;;;39149:97;;;;38752:501:::0;:::o;24677:285::-;24809:41;24828:12;:10;:12::i;:::-;24842:7;24809:18;:41::i;:::-;24801:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24915:39;24929:4;24935:2;24939:7;24948:5;24915:13;:39::i;:::-;24677:285;;;;:::o;39266:368::-;35869:12;:10;:12::i;:::-;35858:23;;:7;:5;:7::i;:::-;:23;;;35850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39345:1:::1;39337:6;:9;:31;;;;;39360:8;;39350:6;:18;;39337:31;39329:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39433:10;;39423:6;39409:11;;:20;;;;:::i;:::-;:34;;39401:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39483:12;:10;:12::i;:::-;39472:47;;;39509:1;39497:11;;:13;;;;:::i;:::-;39512:6;39472:47;;;;;;;:::i;:::-;;;;;;;;39534:9;39530:97;39550:6;39547:1;:9;39530:97;;;39577:38;39583:12;:10;:12::i;:::-;39601:11;;:13;;;;;;;;;:::i;:::-;;;;;39597:1;:17;;;;:::i;:::-;39577:5;:38::i;:::-;39558:3;;;;;:::i;:::-;;;;39530:97;;;;39266:368:::0;:::o;33047:682::-;33120:13;33154:16;33162:7;33154;:16::i;:::-;33146:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;33238:23;33264:10;:19;33275:7;33264:19;;;;;;;;;;;33238:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33294:18;33315:10;:8;:10::i;:::-;33294:31;;33424:1;33408:4;33402:18;:23;33398:72;;;33449:9;33442:16;;;;;;33398:72;33600:1;33580:9;33574:23;:27;33570:108;;;33649:4;33655:9;33632:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33618:48;;;;;;33570:108;33698:23;33713:7;33698:14;:23::i;:::-;33691:30;;;;33047:682;;;;:::o;23844:164::-;23941:4;23965:18;:25;23984:5;23965:25;;;;;;;;;;;;;;;:35;23991:8;23965:35;;;;;;;;;;;;;;;;;;;;;;;;;23958:42;;23844:164;;;;:::o;36594:244::-;35869:12;:10;:12::i;:::-;35858:23;;:7;:5;:7::i;:::-;:23;;;35850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36703:1:::1;36683:22;;:8;:22;;;;36675:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36793:8;36764:38;;36785:6;;;;;;;;;;;36764:38;;;;;;;;;;;;36822:8;36813:6;;:17;;;;;;;;;;;;;;;;;;36594:244:::0;:::o;37116:31::-;;;;:::o;19271:157::-;19356:4;19395:25;19380:40;;;:11;:40;;;;19373:47;;19271:157;;;:::o;26431:127::-;26496:4;26548:1;26520:30;;:7;:16;26528:7;26520:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26513:37;;26431:127;;;:::o;16071:98::-;16124:7;16151:10;16144:17;;16071:98;:::o;30326:174::-;30428:2;30401:15;:24;30417:7;30401:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30484:7;30480:2;30446:46;;30455:23;30470:7;30455:14;:23::i;:::-;30446:46;;;;;;;;;;;;30326:174;;:::o;33886:217::-;33986:16;33994:7;33986;:16::i;:::-;33978:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;34086:9;34064:10;:19;34075:7;34064:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;33886:217;;:::o;26726:348::-;26819:4;26844:16;26852:7;26844;:16::i;:::-;26836:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26920:13;26936:23;26951:7;26936:14;:23::i;:::-;26920:39;;26989:5;26978:16;;:7;:16;;;:51;;;;27022:7;26998:31;;:20;27010:7;26998:11;:20::i;:::-;:31;;;26978:51;:87;;;;27033:32;27050:5;27057:7;27033:16;:32::i;:::-;26978:87;26970:96;;;26726:348;;;;:::o;29659:548::-;29784:4;29757:31;;:23;29772:7;29757:14;:23::i;:::-;:31;;;29749:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29867:1;29853:16;;:2;:16;;;;29845:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29924:39;29945:4;29951:2;29955:7;29924:20;:39::i;:::-;30029:29;30046:1;30050:7;30029:8;:29::i;:::-;30091:1;30072:9;:15;30082:4;30072:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30120:1;30103:9;:13;30113:2;30103:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30151:2;30132:7;:16;30140:7;30132:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30191:7;30187:2;30172:27;;30181:4;30172:27;;;;;;;;;;;;29659:548;;;:::o;28342:385::-;28436:1;28422:16;;:2;:16;;;;28414:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28495:16;28503:7;28495;:16::i;:::-;28494:17;28486:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28558:45;28587:1;28591:2;28595:7;28558:20;:45::i;:::-;28634:1;28617:9;:13;28627:2;28617:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28665:2;28646:7;:16;28654:7;28646:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28711:7;28707:2;28686:33;;28703:1;28686:33;;;;;;;;;;;;28342:385;;:::o;25845:272::-;25959:28;25969:4;25975:2;25979:7;25959:9;:28::i;:::-;26006:48;26029:4;26035:2;26039:7;26048:5;26006:22;:48::i;:::-;25998:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25845:272;;;;:::o;37924:107::-;37984:13;38016:7;38009:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37924:107;:::o;22059:361::-;22132:13;22166:16;22174:7;22166;:16::i;:::-;22158:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22248:21;22272:10;:8;:10::i;:::-;22248:34;;22324:1;22306:7;22300:21;:25;:112;;;;;;;;;;;;;;;;;22365:7;22374:18;:7;:16;:18::i;:::-;22348:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22300:112;22293:119;;;22059:361;;;:::o;32523:93::-;;;;:::o;31066:843::-;31187:4;31213:15;:2;:13;;;:15::i;:::-;31209:693;;;31265:2;31249:36;;;31286:12;:10;:12::i;:::-;31300:4;31306:7;31315:5;31249:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31245:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31512:1;31495:6;:13;:18;31491:341;;;31538:60;;;;;;;;;;:::i;:::-;;;;;;;;31491:341;31782:6;31776:13;31767:6;31763:2;31759:15;31752:38;31245:602;31382:45;;;31372:55;;;:6;:55;;;;31365:62;;;;;31209:693;31886:4;31879:11;;31066:843;;;;;;;:::o;16721:724::-;16777:13;17008:1;16999:5;:10;16995:53;;;17026:10;;;;;;;;;;;;;;;;;;;;;16995:53;17058:12;17073:5;17058:20;;17089:14;17114:78;17129:1;17121:4;:9;17114:78;;17147:8;;;;;:::i;:::-;;;;17178:2;17170:10;;;;;:::i;:::-;;;17114:78;;;17202:19;17234:6;17224:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17202:39;;17252:154;17268:1;17259:5;:10;17252:154;;17296:1;17286:11;;;;;:::i;:::-;;;17363:2;17355:5;:10;;;;:::i;:::-;17342:2;:24;;;;:::i;:::-;17329:39;;17312:6;17319;17312:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17392:2;17383:11;;;;;:::i;:::-;;;17252:154;;;17430:6;17416:21;;;;;16721:724;;;;:::o;8179:423::-;8239:4;8448:12;8559:7;8547:20;8539:28;;8593:1;8586:4;:8;8579:15;;;8179:423;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410: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:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:654::-;7565:6;7573;7622:2;7610:9;7601:7;7597:23;7593:32;7590:119;;;7628:79;;:::i;:::-;7590:119;7748:1;7773:53;7818:7;7809:6;7798:9;7794:22;7773:53;:::i;:::-;7763:63;;7719:117;7903:2;7892:9;7888:18;7875:32;7934:18;7926:6;7923:30;7920:117;;;7956:79;;:::i;:::-;7920:117;8061:63;8116:7;8107:6;8096:9;8092:22;8061:63;:::i;:::-;8051:73;;7846:288;7487:654;;;;;:::o;8147:118::-;8234:24;8252:5;8234:24;:::i;:::-;8229:3;8222:37;8147:118;;:::o;8271:109::-;8352:21;8367:5;8352:21;:::i;:::-;8347:3;8340:34;8271:109;;:::o;8386:360::-;8472:3;8500:38;8532:5;8500:38;:::i;:::-;8554:70;8617:6;8612:3;8554:70;:::i;:::-;8547:77;;8633:52;8678:6;8673:3;8666:4;8659:5;8655:16;8633:52;:::i;:::-;8710:29;8732:6;8710:29;:::i;:::-;8705:3;8701:39;8694:46;;8476:270;8386:360;;;;:::o;8752:147::-;8847:45;8886:5;8847:45;:::i;:::-;8842:3;8835:58;8752:147;;:::o;8905:364::-;8993:3;9021:39;9054:5;9021:39;:::i;:::-;9076:71;9140:6;9135:3;9076:71;:::i;:::-;9069:78;;9156:52;9201:6;9196:3;9189:4;9182:5;9178:16;9156:52;:::i;:::-;9233:29;9255:6;9233:29;:::i;:::-;9228:3;9224:39;9217:46;;8997:272;8905:364;;;;:::o;9275:377::-;9381:3;9409:39;9442:5;9409:39;:::i;:::-;9464:89;9546:6;9541:3;9464:89;:::i;:::-;9457:96;;9562:52;9607:6;9602:3;9595:4;9588:5;9584:16;9562:52;:::i;:::-;9639:6;9634:3;9630:16;9623:23;;9385:267;9275:377;;;;:::o;9658:365::-;9800:3;9821:66;9885:1;9880:3;9821:66;:::i;:::-;9814:73;;9896:93;9985:3;9896:93;:::i;:::-;10014:2;10009:3;10005:12;9998:19;;9658:365;;;:::o;10029:366::-;10171:3;10192:67;10256:2;10251:3;10192:67;:::i;:::-;10185:74;;10268:93;10357:3;10268:93;:::i;:::-;10386:2;10381:3;10377:12;10370:19;;10029:366;;;:::o;10401:::-;10543:3;10564:67;10628:2;10623:3;10564:67;:::i;:::-;10557:74;;10640:93;10729:3;10640:93;:::i;:::-;10758:2;10753:3;10749:12;10742:19;;10401:366;;;:::o;10773:::-;10915:3;10936:67;11000:2;10995:3;10936:67;:::i;:::-;10929:74;;11012:93;11101:3;11012:93;:::i;:::-;11130:2;11125:3;11121:12;11114:19;;10773:366;;;:::o;11145:::-;11287:3;11308:67;11372:2;11367:3;11308:67;:::i;:::-;11301:74;;11384:93;11473:3;11384:93;:::i;:::-;11502:2;11497:3;11493:12;11486:19;;11145:366;;;:::o;11517:::-;11659:3;11680:67;11744:2;11739:3;11680:67;:::i;:::-;11673:74;;11756:93;11845:3;11756:93;:::i;:::-;11874:2;11869:3;11865:12;11858:19;;11517:366;;;:::o;11889:::-;12031:3;12052:67;12116:2;12111:3;12052:67;:::i;:::-;12045:74;;12128:93;12217:3;12128:93;:::i;:::-;12246:2;12241:3;12237:12;12230:19;;11889:366;;;:::o;12261:::-;12403:3;12424:67;12488:2;12483:3;12424:67;:::i;:::-;12417:74;;12500:93;12589:3;12500:93;:::i;:::-;12618:2;12613:3;12609:12;12602:19;;12261:366;;;:::o;12633:::-;12775:3;12796:67;12860:2;12855:3;12796:67;:::i;:::-;12789:74;;12872:93;12961:3;12872:93;:::i;:::-;12990:2;12985:3;12981:12;12974:19;;12633:366;;;:::o;13005:::-;13147:3;13168:67;13232:2;13227:3;13168:67;:::i;:::-;13161:74;;13244:93;13333:3;13244:93;:::i;:::-;13362:2;13357:3;13353:12;13346:19;;13005:366;;;:::o;13377:::-;13519:3;13540:67;13604:2;13599:3;13540:67;:::i;:::-;13533:74;;13616:93;13705:3;13616:93;:::i;:::-;13734:2;13729:3;13725:12;13718:19;;13377:366;;;:::o;13749:::-;13891:3;13912:67;13976:2;13971:3;13912:67;:::i;:::-;13905:74;;13988:93;14077:3;13988:93;:::i;:::-;14106:2;14101:3;14097:12;14090:19;;13749:366;;;:::o;14121:::-;14263:3;14284:67;14348:2;14343:3;14284:67;:::i;:::-;14277:74;;14360:93;14449:3;14360:93;:::i;:::-;14478:2;14473:3;14469:12;14462:19;;14121:366;;;:::o;14493:::-;14635:3;14656:67;14720:2;14715:3;14656:67;:::i;:::-;14649:74;;14732:93;14821:3;14732:93;:::i;:::-;14850:2;14845:3;14841:12;14834:19;;14493:366;;;:::o;14865:::-;15007:3;15028:67;15092:2;15087:3;15028:67;:::i;:::-;15021:74;;15104:93;15193:3;15104:93;:::i;:::-;15222:2;15217:3;15213:12;15206:19;;14865:366;;;:::o;15237:::-;15379:3;15400:67;15464:2;15459:3;15400:67;:::i;:::-;15393:74;;15476:93;15565:3;15476:93;:::i;:::-;15594:2;15589:3;15585:12;15578:19;;15237:366;;;:::o;15609:::-;15751:3;15772:67;15836:2;15831:3;15772:67;:::i;:::-;15765:74;;15848:93;15937:3;15848:93;:::i;:::-;15966:2;15961:3;15957:12;15950:19;;15609:366;;;:::o;15981:::-;16123:3;16144:67;16208:2;16203:3;16144:67;:::i;:::-;16137:74;;16220:93;16309:3;16220:93;:::i;:::-;16338:2;16333:3;16329:12;16322:19;;15981:366;;;:::o;16353:::-;16495:3;16516:67;16580:2;16575:3;16516:67;:::i;:::-;16509:74;;16592:93;16681:3;16592:93;:::i;:::-;16710:2;16705:3;16701:12;16694:19;;16353:366;;;:::o;16725:::-;16867:3;16888:67;16952:2;16947:3;16888:67;:::i;:::-;16881:74;;16964:93;17053:3;16964:93;:::i;:::-;17082:2;17077:3;17073:12;17066:19;;16725:366;;;:::o;17097:::-;17239:3;17260:67;17324:2;17319:3;17260:67;:::i;:::-;17253:74;;17336:93;17425:3;17336:93;:::i;:::-;17454:2;17449:3;17445:12;17438:19;;17097:366;;;:::o;17469:::-;17611:3;17632:67;17696:2;17691:3;17632:67;:::i;:::-;17625:74;;17708:93;17797:3;17708:93;:::i;:::-;17826:2;17821:3;17817:12;17810:19;;17469:366;;;:::o;17841:::-;17983:3;18004:67;18068:2;18063:3;18004:67;:::i;:::-;17997:74;;18080:93;18169:3;18080:93;:::i;:::-;18198:2;18193:3;18189:12;18182:19;;17841:366;;;:::o;18213:::-;18355:3;18376:67;18440:2;18435:3;18376:67;:::i;:::-;18369:74;;18452:93;18541:3;18452:93;:::i;:::-;18570:2;18565:3;18561:12;18554:19;;18213:366;;;:::o;18585:::-;18727:3;18748:67;18812:2;18807:3;18748:67;:::i;:::-;18741:74;;18824:93;18913:3;18824:93;:::i;:::-;18942:2;18937:3;18933:12;18926:19;;18585:366;;;:::o;18957:::-;19099:3;19120:67;19184:2;19179:3;19120:67;:::i;:::-;19113:74;;19196:93;19285:3;19196:93;:::i;:::-;19314:2;19309:3;19305:12;19298:19;;18957:366;;;:::o;19329:::-;19471:3;19492:67;19556:2;19551:3;19492:67;:::i;:::-;19485:74;;19568:93;19657:3;19568:93;:::i;:::-;19686:2;19681:3;19677:12;19670:19;;19329:366;;;:::o;19701:118::-;19788:24;19806:5;19788:24;:::i;:::-;19783:3;19776:37;19701:118;;:::o;19825:435::-;20005:3;20027:95;20118:3;20109:6;20027:95;:::i;:::-;20020:102;;20139:95;20230:3;20221:6;20139:95;:::i;:::-;20132:102;;20251:3;20244:10;;19825:435;;;;;:::o;20266:222::-;20359:4;20397:2;20386:9;20382:18;20374:26;;20410:71;20478:1;20467:9;20463:17;20454:6;20410:71;:::i;:::-;20266:222;;;;:::o;20494:640::-;20689:4;20727:3;20716:9;20712:19;20704:27;;20741:71;20809:1;20798:9;20794:17;20785:6;20741:71;:::i;:::-;20822:72;20890:2;20879:9;20875:18;20866:6;20822:72;:::i;:::-;20904;20972:2;20961:9;20957:18;20948:6;20904:72;:::i;:::-;21023:9;21017:4;21013:20;21008:2;20997:9;20993:18;20986:48;21051:76;21122:4;21113:6;21051:76;:::i;:::-;21043:84;;20494:640;;;;;;;:::o;21140:210::-;21227:4;21265:2;21254:9;21250:18;21242:26;;21278:65;21340:1;21329:9;21325:17;21316:6;21278:65;:::i;:::-;21140:210;;;;:::o;21356:313::-;21469:4;21507:2;21496:9;21492:18;21484:26;;21556:9;21550:4;21546:20;21542:1;21531:9;21527:17;21520:47;21584:78;21657:4;21648:6;21584:78;:::i;:::-;21576:86;;21356:313;;;;:::o;21675:419::-;21841:4;21879:2;21868:9;21864:18;21856:26;;21928:9;21922:4;21918:20;21914:1;21903:9;21899:17;21892:47;21956:131;22082:4;21956:131;:::i;:::-;21948:139;;21675:419;;;:::o;22100:::-;22266:4;22304:2;22293:9;22289:18;22281:26;;22353:9;22347:4;22343:20;22339:1;22328:9;22324:17;22317:47;22381:131;22507:4;22381:131;:::i;:::-;22373:139;;22100:419;;;:::o;22525:::-;22691:4;22729:2;22718:9;22714:18;22706:26;;22778:9;22772:4;22768:20;22764:1;22753:9;22749:17;22742:47;22806:131;22932:4;22806:131;:::i;:::-;22798:139;;22525:419;;;:::o;22950:::-;23116:4;23154:2;23143:9;23139:18;23131:26;;23203:9;23197:4;23193:20;23189:1;23178:9;23174:17;23167:47;23231:131;23357:4;23231:131;:::i;:::-;23223:139;;22950:419;;;:::o;23375:::-;23541:4;23579:2;23568:9;23564:18;23556:26;;23628:9;23622:4;23618:20;23614:1;23603:9;23599:17;23592:47;23656:131;23782:4;23656:131;:::i;:::-;23648:139;;23375:419;;;:::o;23800:::-;23966:4;24004:2;23993:9;23989:18;23981:26;;24053:9;24047:4;24043:20;24039:1;24028:9;24024:17;24017:47;24081:131;24207:4;24081:131;:::i;:::-;24073:139;;23800:419;;;:::o;24225:::-;24391:4;24429:2;24418:9;24414:18;24406:26;;24478:9;24472:4;24468:20;24464:1;24453:9;24449:17;24442:47;24506:131;24632:4;24506:131;:::i;:::-;24498:139;;24225:419;;;:::o;24650:::-;24816:4;24854:2;24843:9;24839:18;24831:26;;24903:9;24897:4;24893:20;24889:1;24878:9;24874:17;24867:47;24931:131;25057:4;24931:131;:::i;:::-;24923:139;;24650:419;;;:::o;25075:::-;25241:4;25279:2;25268:9;25264:18;25256:26;;25328:9;25322:4;25318:20;25314:1;25303:9;25299:17;25292:47;25356:131;25482:4;25356:131;:::i;:::-;25348:139;;25075:419;;;:::o;25500:::-;25666:4;25704:2;25693:9;25689:18;25681:26;;25753:9;25747:4;25743:20;25739:1;25728:9;25724:17;25717:47;25781:131;25907:4;25781:131;:::i;:::-;25773:139;;25500:419;;;:::o;25925:::-;26091:4;26129:2;26118:9;26114:18;26106:26;;26178:9;26172:4;26168:20;26164:1;26153:9;26149:17;26142:47;26206:131;26332:4;26206:131;:::i;:::-;26198:139;;25925:419;;;:::o;26350:::-;26516:4;26554:2;26543:9;26539:18;26531:26;;26603:9;26597:4;26593:20;26589:1;26578:9;26574:17;26567:47;26631:131;26757:4;26631:131;:::i;:::-;26623:139;;26350:419;;;:::o;26775:::-;26941:4;26979:2;26968:9;26964:18;26956:26;;27028:9;27022:4;27018:20;27014:1;27003:9;26999:17;26992:47;27056:131;27182:4;27056:131;:::i;:::-;27048:139;;26775:419;;;:::o;27200:::-;27366:4;27404:2;27393:9;27389:18;27381:26;;27453:9;27447:4;27443:20;27439:1;27428:9;27424:17;27417:47;27481:131;27607:4;27481:131;:::i;:::-;27473:139;;27200:419;;;:::o;27625:::-;27791:4;27829:2;27818:9;27814:18;27806:26;;27878:9;27872:4;27868:20;27864:1;27853:9;27849:17;27842:47;27906:131;28032:4;27906:131;:::i;:::-;27898:139;;27625:419;;;:::o;28050:::-;28216:4;28254:2;28243:9;28239:18;28231:26;;28303:9;28297:4;28293:20;28289:1;28278:9;28274:17;28267:47;28331:131;28457:4;28331:131;:::i;:::-;28323:139;;28050:419;;;:::o;28475:::-;28641:4;28679:2;28668:9;28664:18;28656:26;;28728:9;28722:4;28718:20;28714:1;28703:9;28699:17;28692:47;28756:131;28882:4;28756:131;:::i;:::-;28748:139;;28475:419;;;:::o;28900:::-;29066:4;29104:2;29093:9;29089:18;29081:26;;29153:9;29147:4;29143:20;29139:1;29128:9;29124:17;29117:47;29181:131;29307:4;29181:131;:::i;:::-;29173:139;;28900:419;;;:::o;29325:::-;29491:4;29529:2;29518:9;29514:18;29506:26;;29578:9;29572:4;29568:20;29564:1;29553:9;29549:17;29542:47;29606:131;29732:4;29606:131;:::i;:::-;29598:139;;29325:419;;;:::o;29750:::-;29916:4;29954:2;29943:9;29939:18;29931:26;;30003:9;29997:4;29993:20;29989:1;29978:9;29974:17;29967:47;30031:131;30157:4;30031:131;:::i;:::-;30023:139;;29750:419;;;:::o;30175:::-;30341:4;30379:2;30368:9;30364:18;30356:26;;30428:9;30422:4;30418:20;30414:1;30403:9;30399:17;30392:47;30456:131;30582:4;30456:131;:::i;:::-;30448:139;;30175:419;;;:::o;30600:::-;30766:4;30804:2;30793:9;30789:18;30781:26;;30853:9;30847:4;30843:20;30839:1;30828:9;30824:17;30817:47;30881:131;31007:4;30881:131;:::i;:::-;30873:139;;30600:419;;;:::o;31025:::-;31191:4;31229:2;31218:9;31214:18;31206:26;;31278:9;31272:4;31268:20;31264:1;31253:9;31249:17;31242:47;31306:131;31432:4;31306:131;:::i;:::-;31298:139;;31025:419;;;:::o;31450:::-;31616:4;31654:2;31643:9;31639:18;31631:26;;31703:9;31697:4;31693:20;31689:1;31678:9;31674:17;31667:47;31731:131;31857:4;31731:131;:::i;:::-;31723:139;;31450:419;;;:::o;31875:::-;32041:4;32079:2;32068:9;32064:18;32056:26;;32128:9;32122:4;32118:20;32114:1;32103:9;32099:17;32092:47;32156:131;32282:4;32156:131;:::i;:::-;32148:139;;31875:419;;;:::o;32300:::-;32466:4;32504:2;32493:9;32489:18;32481:26;;32553:9;32547:4;32543:20;32539:1;32528:9;32524:17;32517:47;32581:131;32707:4;32581:131;:::i;:::-;32573:139;;32300:419;;;:::o;32725:::-;32891:4;32929:2;32918:9;32914:18;32906:26;;32978:9;32972:4;32968:20;32964:1;32953:9;32949:17;32942:47;33006:131;33132:4;33006:131;:::i;:::-;32998:139;;32725:419;;;:::o;33150:222::-;33243:4;33281:2;33270:9;33266:18;33258:26;;33294:71;33362:1;33351:9;33347:17;33338:6;33294:71;:::i;:::-;33150:222;;;;:::o;33378:348::-;33507:4;33545:2;33534:9;33530:18;33522:26;;33558:71;33626:1;33615:9;33611:17;33602:6;33558:71;:::i;:::-;33639:80;33715:2;33704:9;33700:18;33691:6;33639:80;:::i;:::-;33378:348;;;;;:::o;33732:332::-;33853:4;33891:2;33880:9;33876:18;33868:26;;33904:71;33972:1;33961:9;33957:17;33948:6;33904:71;:::i;:::-;33985:72;34053:2;34042:9;34038:18;34029:6;33985:72;:::i;:::-;33732:332;;;;;:::o;34070:129::-;34104:6;34131:20;;:::i;:::-;34121:30;;34160:33;34188:4;34180:6;34160:33;:::i;:::-;34070:129;;;:::o;34205:75::-;34238:6;34271:2;34265:9;34255:19;;34205:75;:::o;34286:307::-;34347:4;34437:18;34429:6;34426:30;34423:56;;;34459:18;;:::i;:::-;34423:56;34497:29;34519:6;34497:29;:::i;:::-;34489:37;;34581:4;34575;34571:15;34563:23;;34286:307;;;:::o;34599:308::-;34661:4;34751:18;34743:6;34740:30;34737:56;;;34773:18;;:::i;:::-;34737:56;34811:29;34833:6;34811:29;:::i;:::-;34803:37;;34895:4;34889;34885:15;34877:23;;34599:308;;;:::o;34913:98::-;34964:6;34998:5;34992:12;34982:22;;34913:98;;;:::o;35017:99::-;35069:6;35103:5;35097:12;35087:22;;35017:99;;;:::o;35122:168::-;35205:11;35239:6;35234:3;35227:19;35279:4;35274:3;35270:14;35255:29;;35122:168;;;;:::o;35296:169::-;35380:11;35414:6;35409:3;35402:19;35454:4;35449:3;35445:14;35430:29;;35296:169;;;;:::o;35471:148::-;35573:11;35610:3;35595:18;;35471:148;;;;:::o;35625:305::-;35665:3;35684:20;35702:1;35684:20;:::i;:::-;35679:25;;35718:20;35736:1;35718:20;:::i;:::-;35713:25;;35872:1;35804:66;35800:74;35797:1;35794:81;35791:107;;;35878:18;;:::i;:::-;35791:107;35922:1;35919;35915:9;35908:16;;35625:305;;;;:::o;35936:185::-;35976:1;35993:20;36011:1;35993:20;:::i;:::-;35988:25;;36027:20;36045:1;36027:20;:::i;:::-;36022:25;;36066:1;36056:35;;36071:18;;:::i;:::-;36056:35;36113:1;36110;36106:9;36101:14;;35936:185;;;;:::o;36127:348::-;36167:7;36190:20;36208:1;36190:20;:::i;:::-;36185:25;;36224:20;36242:1;36224:20;:::i;:::-;36219:25;;36412:1;36344:66;36340:74;36337:1;36334:81;36329:1;36322:9;36315:17;36311:105;36308:131;;;36419:18;;:::i;:::-;36308:131;36467:1;36464;36460:9;36449:20;;36127:348;;;;:::o;36481:191::-;36521:4;36541:20;36559:1;36541:20;:::i;:::-;36536:25;;36575:20;36593:1;36575:20;:::i;:::-;36570:25;;36614:1;36611;36608:8;36605:34;;;36619:18;;:::i;:::-;36605:34;36664:1;36661;36657:9;36649:17;;36481:191;;;;:::o;36678:96::-;36715:7;36744:24;36762:5;36744:24;:::i;:::-;36733:35;;36678:96;;;:::o;36780:90::-;36814:7;36857:5;36850:13;36843:21;36832:32;;36780:90;;;:::o;36876:149::-;36912:7;36952:66;36945:5;36941:78;36930:89;;36876:149;;;:::o;37031:126::-;37068:7;37108:42;37101:5;37097:54;37086:65;;37031:126;;;:::o;37163:77::-;37200:7;37229:5;37218:16;;37163:77;;;:::o;37246:121::-;37304:9;37337:24;37355:5;37337:24;:::i;:::-;37324:37;;37246:121;;;:::o;37373:154::-;37457:6;37452:3;37447;37434:30;37519:1;37510:6;37505:3;37501:16;37494:27;37373:154;;;:::o;37533:307::-;37601:1;37611:113;37625:6;37622:1;37619:13;37611:113;;;37710:1;37705:3;37701:11;37695:18;37691:1;37686:3;37682:11;37675:39;37647:2;37644:1;37640:10;37635:15;;37611:113;;;37742:6;37739:1;37736:13;37733:101;;;37822:1;37813:6;37808:3;37804:16;37797:27;37733:101;37582:258;37533:307;;;:::o;37846:320::-;37890:6;37927:1;37921:4;37917:12;37907:22;;37974:1;37968:4;37964:12;37995:18;37985:81;;38051:4;38043:6;38039:17;38029:27;;37985:81;38113:2;38105:6;38102:14;38082:18;38079:38;38076:84;;;38132:18;;:::i;:::-;38076:84;37897:269;37846:320;;;:::o;38172:281::-;38255:27;38277:4;38255:27;:::i;:::-;38247:6;38243:40;38385:6;38373:10;38370:22;38349:18;38337:10;38334:34;38331:62;38328:88;;;38396:18;;:::i;:::-;38328:88;38436:10;38432:2;38425:22;38215:238;38172:281;;:::o;38459:233::-;38498:3;38521:24;38539:5;38521:24;:::i;:::-;38512:33;;38567:66;38560:5;38557:77;38554:103;;;38637:18;;:::i;:::-;38554:103;38684:1;38677:5;38673:13;38666:20;;38459:233;;;:::o;38698:176::-;38730:1;38747:20;38765:1;38747:20;:::i;:::-;38742:25;;38781:20;38799:1;38781:20;:::i;:::-;38776:25;;38820:1;38810:35;;38825:18;;:::i;:::-;38810:35;38866:1;38863;38859:9;38854:14;;38698:176;;;;:::o;38880:180::-;38928:77;38925:1;38918:88;39025:4;39022:1;39015:15;39049:4;39046:1;39039:15;39066:180;39114:77;39111:1;39104:88;39211:4;39208:1;39201:15;39235:4;39232:1;39225:15;39252:180;39300:77;39297:1;39290:88;39397:4;39394:1;39387:15;39421:4;39418:1;39411:15;39438:180;39486:77;39483:1;39476:88;39583:4;39580:1;39573:15;39607:4;39604:1;39597:15;39624:180;39672:77;39669:1;39662:88;39769:4;39766:1;39759:15;39793:4;39790:1;39783:15;39810:117;39919:1;39916;39909:12;39933:117;40042:1;40039;40032:12;40056:117;40165:1;40162;40155:12;40179:117;40288:1;40285;40278:12;40302:102;40343:6;40394:2;40390:7;40385:2;40378:5;40374:14;40370:28;40360:38;;40302:102;;;:::o;40410:158::-;40550:10;40546:1;40538:6;40534:14;40527:34;40410:158;:::o;40574:237::-;40714:34;40710:1;40702:6;40698:14;40691:58;40783:20;40778:2;40770:6;40766:15;40759:45;40574:237;:::o;40817:225::-;40957:34;40953:1;40945:6;40941:14;40934:58;41026:8;41021:2;41013:6;41009:15;41002:33;40817:225;:::o;41048:178::-;41188:30;41184:1;41176:6;41172:14;41165:54;41048:178;:::o;41232:167::-;41372:19;41368:1;41360:6;41356:14;41349:43;41232:167;:::o;41405:223::-;41545:34;41541:1;41533:6;41529:14;41522:58;41614:6;41609:2;41601:6;41597:15;41590:31;41405:223;:::o;41634:175::-;41774:27;41770:1;41762:6;41758:14;41751:51;41634:175;:::o;41815:178::-;41955:30;41951:1;41943:6;41939:14;41932:54;41815:178;:::o;41999:231::-;42139:34;42135:1;42127:6;42123:14;42116:58;42208:14;42203:2;42195:6;42191:15;42184:39;41999:231;:::o;42236:232::-;42376:34;42372:1;42364:6;42360:14;42353:58;42445:15;42440:2;42432:6;42428:15;42421:40;42236:232;:::o;42474:243::-;42614:34;42610:1;42602:6;42598:14;42591:58;42683:26;42678:2;42670:6;42666:15;42659:51;42474:243;:::o;42723:229::-;42863:34;42859:1;42851:6;42847:14;42840:58;42932:12;42927:2;42919:6;42915:15;42908:37;42723:229;:::o;42958:228::-;43098:34;43094:1;43086:6;43082:14;43075:58;43167:11;43162:2;43154:6;43150:15;43143:36;42958:228;:::o;43192:233::-;43332:34;43328:1;43320:6;43316:14;43309:58;43401:16;43396:2;43388:6;43384:15;43377:41;43192:233;:::o;43431:178::-;43571:30;43567:1;43559:6;43555:14;43548:54;43431:178;:::o;43615:182::-;43755:34;43751:1;43743:6;43739:14;43732:58;43615:182;:::o;43803:236::-;43943:34;43939:1;43931:6;43927:14;43920:58;44012:19;44007:2;43999:6;43995:15;43988:44;43803:236;:::o;44045:231::-;44185:34;44181:1;44173:6;44169:14;44162:58;44254:14;44249:2;44241:6;44237:15;44230:39;44045:231;:::o;44282:182::-;44422:34;44418:1;44410:6;44406:14;44399:58;44282:182;:::o;44470:228::-;44610:34;44606:1;44598:6;44594:14;44587:58;44679:11;44674:2;44666:6;44662:15;44655:36;44470:228;:::o;44704:234::-;44844:34;44840:1;44832:6;44828:14;44821:58;44913:17;44908:2;44900:6;44896:15;44889:42;44704:234;:::o;44944:220::-;45084:34;45080:1;45072:6;45068:14;45061:58;45153:3;45148:2;45140:6;45136:15;45129:28;44944:220;:::o;45170:236::-;45310:34;45306:1;45298:6;45294:14;45287:58;45379:19;45374:2;45366:6;45362:15;45355:44;45170:236;:::o;45412:235::-;45552:34;45548:1;45540:6;45536:14;45529:58;45621:18;45616:2;45608:6;45604:15;45597:43;45412:235;:::o;45653:161::-;45793:13;45789:1;45781:6;45777:14;45770:37;45653:161;:::o;45820:181::-;45960:33;45956:1;45948:6;45944:14;45937:57;45820:181;:::o;46007:161::-;46147:13;46143:1;46135:6;46131:14;46124:37;46007:161;:::o;46174:122::-;46247:24;46265:5;46247:24;:::i;:::-;46240:5;46237:35;46227:63;;46286:1;46283;46276:12;46227:63;46174:122;:::o;46302:116::-;46372:21;46387:5;46372:21;:::i;:::-;46365:5;46362:32;46352:60;;46408:1;46405;46398:12;46352:60;46302:116;:::o;46424:120::-;46496:23;46513:5;46496:23;:::i;:::-;46489:5;46486:34;46476:62;;46534:1;46531;46524:12;46476:62;46424:120;:::o;46550:122::-;46623:24;46641:5;46623:24;:::i;:::-;46616:5;46613:35;46603:63;;46662:1;46659;46652:12;46603:63;46550:122;:::o

Swarm Source

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