Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
3,313 COMIC
Holders
1,126
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 COMICLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ComicMinter
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-11 */ // File: node_modules\@openzeppelin\contracts\utils\introspection\IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: node_modules\@openzeppelin\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: node_modules\@openzeppelin\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: node_modules\@openzeppelin\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: node_modules\@openzeppelin\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: node_modules\@openzeppelin\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: node_modules\@openzeppelin\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: node_modules\@openzeppelin\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: @openzeppelin\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: node_modules\@openzeppelin\contracts\token\ERC721\ERC721.sol pragma solidity ^0.8.0; // File: node_modules\@openzeppelin\contracts\token\ERC721\extensions\IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin\contracts\token\ERC721\extensions\ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin\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: @openzeppelin\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; } } // File: contracts\ComicMinter.sol // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; contract ComicMinter is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable { uint256 private _tokenIds; string constant public IPFS_HASH = "QmWS694ViHvkTms9UkKqocv1kWDm2MTQqYEJeYi6LsJbxK"; uint256 constant public ETH_PRICE = 0.2 ether; uint256 constant public MAX_PER_TX = 20; uint256 constant public MAX_SUPPLY = 10000; bool public burningEnabled = false; bool public mintingEnabled = false; address payable public pixel_vault; event Minted(address to, uint256 quantity); constructor() ERC721("PUNKS Comic", "COMIC") { pixel_vault = payable(address(0xaBF107de3E01c7c257e64E0a18d60A733Aad395d)); } function mint(uint256 quantity) public payable { require(msg.sender == pixel_vault || mintingEnabled, "minting is not enabled yet"); require(quantity <= MAX_PER_TX, "minting too many"); require(msg.value == getPrice(quantity), "wrong amount"); require(totalSupply() < MAX_SUPPLY, "sold out"); require(totalSupply() + quantity <= MAX_SUPPLY, "exceeds max supply"); for (uint i = 0; i < quantity; i++) { _tokenIds++; uint256 newTokenId = _tokenIds; _safeMint(msg.sender, newTokenId); _setTokenURI(newTokenId, IPFS_HASH); } emit Minted(msg.sender, quantity); } function getPrice(uint256 quantity) public pure returns(uint256) { return ETH_PRICE * quantity; } function withdraw() public { pixel_vault.transfer(address(this).balance); } function toggleBurningEnabled() public onlyOwner { burningEnabled = !burningEnabled; } function toggleMintingEnabled() public onlyOwner { mintingEnabled = !mintingEnabled; } function burn(uint256 tokenId) public virtual { require(burningEnabled, "burning is not yet enabled"); require(_isApprovedOrOwner(_msgSender(), tokenId), "caller is not owner nor approved"); _burn(tokenId); } function remainingSupply() public view returns(uint256) { return MAX_SUPPLY - totalSupply(); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function _baseURI() internal pure override returns (string memory) { return "ipfs://ipfs/"; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ETH_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IPFS_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burningEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixel_vault","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingSupply","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":"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":[],"name":"toggleBurningEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMintingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600b81526020017f50554e4b5320436f6d69630000000000000000000000000000000000000000008152506040518060400160405280600581526020017f434f4d49430000000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620001fc565b508060019080519060200190620000e5929190620001fc565b5050506000620000fa620001f460201b60201c565b905080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35073abf107de3e01c7c257e64e0a18d60a733aad395d600d60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000311565b600033905090565b8280546200020a90620002ac565b90600052602060002090601f0160209004810192826200022e57600085556200027a565b82601f106200024957805160ff19168380011785556200027a565b828001600101855582156200027a579182015b82811115620002795782518255916020019190600101906200025c565b5b5090506200028991906200028d565b5090565b5b80821115620002a85760008160009055506001016200028e565b5090565b60006002820490506001821680620002c557607f821691505b60208210811415620002dc57620002db620002e2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61465380620003216000396000f3fe6080604052600436106101ee5760003560e01c80636352211e1161010d578063a0712d68116100a0578063da0239a61161006f578063da0239a6146106ba578063e7572230146106e5578063e985e9c514610722578063f2fde38b1461075f578063f43a22dc14610788576101ee565b8063a0712d681461060f578063a22cb4651461062b578063b88d4fde14610654578063c87b56dd1461067d576101ee565b806389fe2a7e116100dc57806389fe2a7e146105635780638da5cb5b1461058e57806395d89b41146105b95780639fd6db12146105e4576101ee565b80636352211e146104a757806370a08231146104e4578063715018a6146105215780638832bc2914610538576101ee565b806332cb6b0c1161018557806342966c681161015457806342966c68146103ff5780634d754715146104285780634f6ccce7146104535780635196e06014610490576101ee565b806332cb6b0c1461037d5780633ccfd60b146103a85780633ee501b4146103bf57806342842e0e146103d6576101ee565b8063095ea7b3116101c1578063095ea7b3146102c357806318160ddd146102ec57806323b872dd146103175780632f745c5914610340576101ee565b806301ffc9a7146101f357806306fdde031461023057806307d3c74f1461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061312e565b6107b3565b6040516102279190613708565b60405180910390f35b34801561023c57600080fd5b506102456107c5565b6040516102529190613723565b60405180910390f35b34801561026757600080fd5b50610270610857565b60405161027d9190613678565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190613180565b61087d565b6040516102ba919061365d565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906130f2565b610902565b005b3480156102f857600080fd5b50610301610a1a565b60405161030e9190613aa5565b60405180910390f35b34801561032357600080fd5b5061033e60048036038101906103399190612fec565b610a27565b005b34801561034c57600080fd5b50610367600480360381019061036291906130f2565b610a87565b6040516103749190613aa5565b60405180910390f35b34801561038957600080fd5b50610392610b2c565b60405161039f9190613aa5565b60405180910390f35b3480156103b457600080fd5b506103bd610b32565b005b3480156103cb57600080fd5b506103d4610b9d565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190612fec565b610c45565b005b34801561040b57600080fd5b5061042660048036038101906104219190613180565b610c65565b005b34801561043457600080fd5b5061043d610d10565b60405161044a9190613708565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613180565b610d23565b6040516104879190613aa5565b60405180910390f35b34801561049c57600080fd5b506104a5610dba565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613180565b610e62565b6040516104db919061365d565b60405180910390f35b3480156104f057600080fd5b5061050b60048036038101906105069190612f87565b610f14565b6040516105189190613aa5565b60405180910390f35b34801561052d57600080fd5b50610536610fcc565b005b34801561054457600080fd5b5061054d611109565b60405161055a9190613aa5565b60405180910390f35b34801561056f57600080fd5b50610578611115565b6040516105859190613723565b60405180910390f35b34801561059a57600080fd5b506105a3611131565b6040516105b0919061365d565b60405180910390f35b3480156105c557600080fd5b506105ce61115b565b6040516105db9190613723565b60405180910390f35b3480156105f057600080fd5b506105f96111ed565b6040516106069190613708565b60405180910390f35b61062960048036038101906106249190613180565b611200565b005b34801561063757600080fd5b50610652600480360381019061064d91906130b6565b61147e565b005b34801561066057600080fd5b5061067b6004803603810190610676919061303b565b6115ff565b005b34801561068957600080fd5b506106a4600480360381019061069f9190613180565b611661565b6040516106b19190613723565b60405180910390f35b3480156106c657600080fd5b506106cf611673565b6040516106dc9190613aa5565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190613180565b61168f565b6040516107199190613aa5565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190612fb0565b6116ac565b6040516107569190613708565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190612f87565b611740565b005b34801561079457600080fd5b5061079d6118ec565b6040516107aa9190613aa5565b60405180910390f35b60006107be826118f1565b9050919050565b6060600080546107d490613d36565b80601f016020809104026020016040519081016040528092919081815260200182805461080090613d36565b801561084d5780601f106108225761010080835404028352916020019161084d565b820191906000526020600020905b81548152906001019060200180831161083057829003601f168201915b5050505050905090565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006108888261196b565b6108c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108be90613985565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090d82610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097590613a45565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661099d6119d7565b73ffffffffffffffffffffffffffffffffffffffff1614806109cc57506109cb816109c66119d7565b6116ac565b5b610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a02906138c5565b60405180910390fd5b610a1583836119df565b505050565b6000600880549050905090565b610a38610a326119d7565b82611a98565b610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e90613a65565b60405180910390fd5b610a82838383611b76565b505050565b6000610a9283610f14565b8210610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca90613765565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b9a573d6000803e3d6000fd5b50565b610ba56119d7565b73ffffffffffffffffffffffffffffffffffffffff16610bc3611131565b73ffffffffffffffffffffffffffffffffffffffff1614610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c10906139c5565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610c60838383604051806020016040528060008152506115ff565b505050565b600d60009054906101000a900460ff16610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab90613785565b60405180910390fd5b610cc5610cbf6119d7565b82611a98565b610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90613a25565b60405180910390fd5b610d0d81611dd2565b50565b600d60009054906101000a900460ff1681565b6000610d2d610a1a565b8210610d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6590613a85565b60405180910390fd5b60088281548110610da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610dc26119d7565b73ffffffffffffffffffffffffffffffffffffffff16610de0611131565b73ffffffffffffffffffffffffffffffffffffffff1614610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d906139c5565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290613905565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c906138e5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fd46119d7565b73ffffffffffffffffffffffffffffffffffffffff16610ff2611131565b73ffffffffffffffffffffffffffffffffffffffff1614611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f906139c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6702c68af0bb14000081565b6040518060600160405280602e81526020016145f0602e913981565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116a90613d36565b80601f016020809104026020016040519081016040528092919081815260200182805461119690613d36565b80156111e35780601f106111b8576101008083540402835291602001916111e3565b820191906000526020600020905b8154815290600101906020018083116111c657829003601f168201915b5050505050905090565b600d60019054906101000a900460ff1681565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112685750600d60019054906101000a900460ff165b6112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90613745565b60405180910390fd5b60148111156112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e2906139a5565b60405180910390fd5b6112f48161168f565b3414611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613805565b60405180910390fd5b612710611340610a1a565b10611380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137790613885565b60405180910390fd5b6127108161138c610a1a565b6113969190613b59565b11156113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce906138a5565b60405180910390fd5b60005b8181101561144157600c60008154809291906113f590613d99565b91905055506000600c54905061140b3382611dde565b61142d816040518060600160405280602e81526020016145f0602e9139611dfc565b50808061143990613d99565b9150506113da565b507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe33826040516114739291906136df565b60405180910390a150565b6114866119d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90613845565b60405180910390fd5b80600560006115016119d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ae6119d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f39190613708565b60405180910390a35050565b61161061160a6119d7565b83611a98565b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690613a65565b60405180910390fd5b61165b84848484611e70565b50505050565b606061166c82611ecc565b9050919050565b600061167d610a1a565b61271061168a9190613c3a565b905090565b6000816702c68af0bb1400006116a59190613be0565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117486119d7565b73ffffffffffffffffffffffffffffffffffffffff16611766611131565b73ffffffffffffffffffffffffffffffffffffffff16146117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b3906139c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561182c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611823906137c5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061196457506119638261201e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a5283610e62565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611aa38261196b565b611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990613865565b60405180910390fd5b6000611aed83610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b5c57508373ffffffffffffffffffffffffffffffffffffffff16611b448461087d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b6d5750611b6c81856116ac565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b9682610e62565b73ffffffffffffffffffffffffffffffffffffffff1614611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906139e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613825565b60405180910390fd5b611c67838383612100565b611c726000826119df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc29190613c3a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d199190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ddb81612110565b50565b611df8828260405180602001604052806000815250612163565b5050565b611e058261196b565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90613925565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611e6b929190612dd3565b505050565b611e7b848484611b76565b611e87848484846121be565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd906137a5565b60405180910390fd5b50505050565b6060611ed78261196b565b611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d90613965565b60405180910390fd5b6000600a60008481526020019081526020016000208054611f3690613d36565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6290613d36565b8015611faf5780601f10611f8457610100808354040283529160200191611faf565b820191906000526020600020905b815481529060010190602001808311611f9257829003601f168201915b505050505090506000611fc0612355565b9050600081511415611fd6578192505050612019565b60008251111561200b578082604051602001611ff3929190613639565b60405160208183030381529060405292505050612019565b61201484612392565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120e957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120f957506120f882612439565b5b9050919050565b61210b8383836124a3565b505050565b612119816125b7565b6000600a6000838152602001908152602001600020805461213990613d36565b90501461216057600a6000828152602001908152602001600020600061215f9190612e59565b5b50565b61216d83836126c8565b61217a60008484846121be565b6121b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b0906137a5565b60405180910390fd5b505050565b60006121df8473ffffffffffffffffffffffffffffffffffffffff16612896565b15612348578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122086119d7565b8786866040518563ffffffff1660e01b815260040161222a9493929190613693565b602060405180830381600087803b15801561224457600080fd5b505af192505050801561227557506040513d601f19601f820116820180604052508101906122729190613157565b60015b6122f8573d80600081146122a5576040519150601f19603f3d011682016040523d82523d6000602084013e6122aa565b606091505b506000815114156122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e7906137a5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061234d565b600190505b949350505050565b60606040518060400160405280600c81526020017f697066733a2f2f697066732f0000000000000000000000000000000000000000815250905090565b606061239d8261196b565b6123dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d390613a05565b60405180910390fd5b60006123e6612355565b905060008151116124065760405180602001604052806000815250612431565b80612410846128a9565b604051602001612421929190613639565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124ae838383612a56565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124f1576124ec81612a5b565b612530565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461252f5761252e8382612aa4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125735761256e81612c11565b6125b2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125b1576125b08282612d54565b5b5b505050565b60006125c282610e62565b90506125d081600084612100565b6125db6000836119df565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461262b9190613c3a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90613945565b60405180910390fd5b6127418161196b565b15612781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612778906137e5565b60405180910390fd5b61278d60008383612100565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127dd9190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606060008214156128f1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a51565b600082905060005b6000821461292357808061290c90613d99565b915050600a8261291c9190613baf565b91506128f9565b60008167ffffffffffffffff811115612965577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129975781602001600182028036833780820191505090505b5090505b60008514612a4a576001826129b09190613c3a565b9150600a856129bf9190613de2565b60306129cb9190613b59565b60f81b818381518110612a07577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a439190613baf565b945061299b565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ab184610f14565b612abb9190613c3a565b9050600060076000848152602001908152602001600020549050818114612ba0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c259190613c3a565b9050600060096000848152602001908152602001600020549050600060088381548110612c7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612d38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d5f83610f14565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612ddf90613d36565b90600052602060002090601f016020900481019282612e015760008555612e48565b82601f10612e1a57805160ff1916838001178555612e48565b82800160010185558215612e48579182015b82811115612e47578251825591602001919060010190612e2c565b5b509050612e559190612e99565b5090565b508054612e6590613d36565b6000825580601f10612e775750612e96565b601f016020900490600052602060002090810190612e959190612e99565b5b50565b5b80821115612eb2576000816000905550600101612e9a565b5090565b6000612ec9612ec484613ae5565b613ac0565b905082815260208101848484011115612ee157600080fd5b612eec848285613cf4565b509392505050565b600081359050612f0381614593565b92915050565b600081359050612f18816145aa565b92915050565b600081359050612f2d816145c1565b92915050565b600081519050612f42816145c1565b92915050565b600082601f830112612f5957600080fd5b8135612f69848260208601612eb6565b91505092915050565b600081359050612f81816145d8565b92915050565b600060208284031215612f9957600080fd5b6000612fa784828501612ef4565b91505092915050565b60008060408385031215612fc357600080fd5b6000612fd185828601612ef4565b9250506020612fe285828601612ef4565b9150509250929050565b60008060006060848603121561300157600080fd5b600061300f86828701612ef4565b935050602061302086828701612ef4565b925050604061303186828701612f72565b9150509250925092565b6000806000806080858703121561305157600080fd5b600061305f87828801612ef4565b945050602061307087828801612ef4565b935050604061308187828801612f72565b925050606085013567ffffffffffffffff81111561309e57600080fd5b6130aa87828801612f48565b91505092959194509250565b600080604083850312156130c957600080fd5b60006130d785828601612ef4565b92505060206130e885828601612f09565b9150509250929050565b6000806040838503121561310557600080fd5b600061311385828601612ef4565b925050602061312485828601612f72565b9150509250929050565b60006020828403121561314057600080fd5b600061314e84828501612f1e565b91505092915050565b60006020828403121561316957600080fd5b600061317784828501612f33565b91505092915050565b60006020828403121561319257600080fd5b60006131a084828501612f72565b91505092915050565b6131b281613c80565b82525050565b6131c181613c6e565b82525050565b6131d081613c92565b82525050565b60006131e182613b16565b6131eb8185613b2c565b93506131fb818560208601613d03565b61320481613ecf565b840191505092915050565b600061321a82613b21565b6132248185613b3d565b9350613234818560208601613d03565b61323d81613ecf565b840191505092915050565b600061325382613b21565b61325d8185613b4e565b935061326d818560208601613d03565b80840191505092915050565b6000613286601a83613b3d565b915061329182613ee0565b602082019050919050565b60006132a9602b83613b3d565b91506132b482613f09565b604082019050919050565b60006132cc601a83613b3d565b91506132d782613f58565b602082019050919050565b60006132ef603283613b3d565b91506132fa82613f81565b604082019050919050565b6000613312602683613b3d565b915061331d82613fd0565b604082019050919050565b6000613335601c83613b3d565b91506133408261401f565b602082019050919050565b6000613358600c83613b3d565b915061336382614048565b602082019050919050565b600061337b602483613b3d565b915061338682614071565b604082019050919050565b600061339e601983613b3d565b91506133a9826140c0565b602082019050919050565b60006133c1602c83613b3d565b91506133cc826140e9565b604082019050919050565b60006133e4600883613b3d565b91506133ef82614138565b602082019050919050565b6000613407601283613b3d565b915061341282614161565b602082019050919050565b600061342a603883613b3d565b91506134358261418a565b604082019050919050565b600061344d602a83613b3d565b9150613458826141d9565b604082019050919050565b6000613470602983613b3d565b915061347b82614228565b604082019050919050565b6000613493602e83613b3d565b915061349e82614277565b604082019050919050565b60006134b6602083613b3d565b91506134c1826142c6565b602082019050919050565b60006134d9603183613b3d565b91506134e4826142ef565b604082019050919050565b60006134fc602c83613b3d565b91506135078261433e565b604082019050919050565b600061351f601083613b3d565b915061352a8261438d565b602082019050919050565b6000613542602083613b3d565b915061354d826143b6565b602082019050919050565b6000613565602983613b3d565b9150613570826143df565b604082019050919050565b6000613588602f83613b3d565b91506135938261442e565b604082019050919050565b60006135ab602083613b3d565b91506135b68261447d565b602082019050919050565b60006135ce602183613b3d565b91506135d9826144a6565b604082019050919050565b60006135f1603183613b3d565b91506135fc826144f5565b604082019050919050565b6000613614602c83613b3d565b915061361f82614544565b604082019050919050565b61363381613cea565b82525050565b60006136458285613248565b91506136518284613248565b91508190509392505050565b600060208201905061367260008301846131b8565b92915050565b600060208201905061368d60008301846131a9565b92915050565b60006080820190506136a860008301876131b8565b6136b560208301866131b8565b6136c2604083018561362a565b81810360608301526136d481846131d6565b905095945050505050565b60006040820190506136f460008301856131b8565b613701602083018461362a565b9392505050565b600060208201905061371d60008301846131c7565b92915050565b6000602082019050818103600083015261373d818461320f565b905092915050565b6000602082019050818103600083015261375e81613279565b9050919050565b6000602082019050818103600083015261377e8161329c565b9050919050565b6000602082019050818103600083015261379e816132bf565b9050919050565b600060208201905081810360008301526137be816132e2565b9050919050565b600060208201905081810360008301526137de81613305565b9050919050565b600060208201905081810360008301526137fe81613328565b9050919050565b6000602082019050818103600083015261381e8161334b565b9050919050565b6000602082019050818103600083015261383e8161336e565b9050919050565b6000602082019050818103600083015261385e81613391565b9050919050565b6000602082019050818103600083015261387e816133b4565b9050919050565b6000602082019050818103600083015261389e816133d7565b9050919050565b600060208201905081810360008301526138be816133fa565b9050919050565b600060208201905081810360008301526138de8161341d565b9050919050565b600060208201905081810360008301526138fe81613440565b9050919050565b6000602082019050818103600083015261391e81613463565b9050919050565b6000602082019050818103600083015261393e81613486565b9050919050565b6000602082019050818103600083015261395e816134a9565b9050919050565b6000602082019050818103600083015261397e816134cc565b9050919050565b6000602082019050818103600083015261399e816134ef565b9050919050565b600060208201905081810360008301526139be81613512565b9050919050565b600060208201905081810360008301526139de81613535565b9050919050565b600060208201905081810360008301526139fe81613558565b9050919050565b60006020820190508181036000830152613a1e8161357b565b9050919050565b60006020820190508181036000830152613a3e8161359e565b9050919050565b60006020820190508181036000830152613a5e816135c1565b9050919050565b60006020820190508181036000830152613a7e816135e4565b9050919050565b60006020820190508181036000830152613a9e81613607565b9050919050565b6000602082019050613aba600083018461362a565b92915050565b6000613aca613adb565b9050613ad68282613d68565b919050565b6000604051905090565b600067ffffffffffffffff821115613b0057613aff613ea0565b5b613b0982613ecf565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b6482613cea565b9150613b6f83613cea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ba457613ba3613e13565b5b828201905092915050565b6000613bba82613cea565b9150613bc583613cea565b925082613bd557613bd4613e42565b5b828204905092915050565b6000613beb82613cea565b9150613bf683613cea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c2f57613c2e613e13565b5b828202905092915050565b6000613c4582613cea565b9150613c5083613cea565b925082821015613c6357613c62613e13565b5b828203905092915050565b6000613c7982613cca565b9050919050565b6000613c8b82613cca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d21578082015181840152602081019050613d06565b83811115613d30576000848401525b50505050565b60006002820490506001821680613d4e57607f821691505b60208210811415613d6257613d61613e71565b5b50919050565b613d7182613ecf565b810181811067ffffffffffffffff82111715613d9057613d8f613ea0565b5b80604052505050565b6000613da482613cea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dd757613dd6613e13565b5b600182019050919050565b6000613ded82613cea565b9150613df883613cea565b925082613e0857613e07613e42565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6d696e74696e67206973206e6f7420656e61626c656420796574000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f6275726e696e67206973206e6f742079657420656e61626c6564000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f65786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6d696e74696e6720746f6f206d616e7900000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61459c81613c6e565b81146145a757600080fd5b50565b6145b381613c92565b81146145be57600080fd5b50565b6145ca81613c9e565b81146145d557600080fd5b50565b6145e181613cea565b81146145ec57600080fd5b5056fe516d5753363934566948766b546d7339556b4b716f6376316b57446d324d54517159454a655969364c734a62784ba2646970667358221220c17f7be2b6bf8cb3b16fafd3bf6273fa5e37216ab7b9468fe540fab944305abe64736f6c63430008010033
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80636352211e1161010d578063a0712d68116100a0578063da0239a61161006f578063da0239a6146106ba578063e7572230146106e5578063e985e9c514610722578063f2fde38b1461075f578063f43a22dc14610788576101ee565b8063a0712d681461060f578063a22cb4651461062b578063b88d4fde14610654578063c87b56dd1461067d576101ee565b806389fe2a7e116100dc57806389fe2a7e146105635780638da5cb5b1461058e57806395d89b41146105b95780639fd6db12146105e4576101ee565b80636352211e146104a757806370a08231146104e4578063715018a6146105215780638832bc2914610538576101ee565b806332cb6b0c1161018557806342966c681161015457806342966c68146103ff5780634d754715146104285780634f6ccce7146104535780635196e06014610490576101ee565b806332cb6b0c1461037d5780633ccfd60b146103a85780633ee501b4146103bf57806342842e0e146103d6576101ee565b8063095ea7b3116101c1578063095ea7b3146102c357806318160ddd146102ec57806323b872dd146103175780632f745c5914610340576101ee565b806301ffc9a7146101f357806306fdde031461023057806307d3c74f1461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061312e565b6107b3565b6040516102279190613708565b60405180910390f35b34801561023c57600080fd5b506102456107c5565b6040516102529190613723565b60405180910390f35b34801561026757600080fd5b50610270610857565b60405161027d9190613678565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190613180565b61087d565b6040516102ba919061365d565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906130f2565b610902565b005b3480156102f857600080fd5b50610301610a1a565b60405161030e9190613aa5565b60405180910390f35b34801561032357600080fd5b5061033e60048036038101906103399190612fec565b610a27565b005b34801561034c57600080fd5b50610367600480360381019061036291906130f2565b610a87565b6040516103749190613aa5565b60405180910390f35b34801561038957600080fd5b50610392610b2c565b60405161039f9190613aa5565b60405180910390f35b3480156103b457600080fd5b506103bd610b32565b005b3480156103cb57600080fd5b506103d4610b9d565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190612fec565b610c45565b005b34801561040b57600080fd5b5061042660048036038101906104219190613180565b610c65565b005b34801561043457600080fd5b5061043d610d10565b60405161044a9190613708565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613180565b610d23565b6040516104879190613aa5565b60405180910390f35b34801561049c57600080fd5b506104a5610dba565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613180565b610e62565b6040516104db919061365d565b60405180910390f35b3480156104f057600080fd5b5061050b60048036038101906105069190612f87565b610f14565b6040516105189190613aa5565b60405180910390f35b34801561052d57600080fd5b50610536610fcc565b005b34801561054457600080fd5b5061054d611109565b60405161055a9190613aa5565b60405180910390f35b34801561056f57600080fd5b50610578611115565b6040516105859190613723565b60405180910390f35b34801561059a57600080fd5b506105a3611131565b6040516105b0919061365d565b60405180910390f35b3480156105c557600080fd5b506105ce61115b565b6040516105db9190613723565b60405180910390f35b3480156105f057600080fd5b506105f96111ed565b6040516106069190613708565b60405180910390f35b61062960048036038101906106249190613180565b611200565b005b34801561063757600080fd5b50610652600480360381019061064d91906130b6565b61147e565b005b34801561066057600080fd5b5061067b6004803603810190610676919061303b565b6115ff565b005b34801561068957600080fd5b506106a4600480360381019061069f9190613180565b611661565b6040516106b19190613723565b60405180910390f35b3480156106c657600080fd5b506106cf611673565b6040516106dc9190613aa5565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190613180565b61168f565b6040516107199190613aa5565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190612fb0565b6116ac565b6040516107569190613708565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190612f87565b611740565b005b34801561079457600080fd5b5061079d6118ec565b6040516107aa9190613aa5565b60405180910390f35b60006107be826118f1565b9050919050565b6060600080546107d490613d36565b80601f016020809104026020016040519081016040528092919081815260200182805461080090613d36565b801561084d5780601f106108225761010080835404028352916020019161084d565b820191906000526020600020905b81548152906001019060200180831161083057829003601f168201915b5050505050905090565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006108888261196b565b6108c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108be90613985565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090d82610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097590613a45565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661099d6119d7565b73ffffffffffffffffffffffffffffffffffffffff1614806109cc57506109cb816109c66119d7565b6116ac565b5b610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a02906138c5565b60405180910390fd5b610a1583836119df565b505050565b6000600880549050905090565b610a38610a326119d7565b82611a98565b610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e90613a65565b60405180910390fd5b610a82838383611b76565b505050565b6000610a9283610f14565b8210610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca90613765565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b9a573d6000803e3d6000fd5b50565b610ba56119d7565b73ffffffffffffffffffffffffffffffffffffffff16610bc3611131565b73ffffffffffffffffffffffffffffffffffffffff1614610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c10906139c5565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610c60838383604051806020016040528060008152506115ff565b505050565b600d60009054906101000a900460ff16610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab90613785565b60405180910390fd5b610cc5610cbf6119d7565b82611a98565b610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90613a25565b60405180910390fd5b610d0d81611dd2565b50565b600d60009054906101000a900460ff1681565b6000610d2d610a1a565b8210610d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6590613a85565b60405180910390fd5b60088281548110610da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610dc26119d7565b73ffffffffffffffffffffffffffffffffffffffff16610de0611131565b73ffffffffffffffffffffffffffffffffffffffff1614610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d906139c5565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290613905565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c906138e5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fd46119d7565b73ffffffffffffffffffffffffffffffffffffffff16610ff2611131565b73ffffffffffffffffffffffffffffffffffffffff1614611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f906139c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6702c68af0bb14000081565b6040518060600160405280602e81526020016145f0602e913981565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116a90613d36565b80601f016020809104026020016040519081016040528092919081815260200182805461119690613d36565b80156111e35780601f106111b8576101008083540402835291602001916111e3565b820191906000526020600020905b8154815290600101906020018083116111c657829003601f168201915b5050505050905090565b600d60019054906101000a900460ff1681565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112685750600d60019054906101000a900460ff165b6112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90613745565b60405180910390fd5b60148111156112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e2906139a5565b60405180910390fd5b6112f48161168f565b3414611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613805565b60405180910390fd5b612710611340610a1a565b10611380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137790613885565b60405180910390fd5b6127108161138c610a1a565b6113969190613b59565b11156113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce906138a5565b60405180910390fd5b60005b8181101561144157600c60008154809291906113f590613d99565b91905055506000600c54905061140b3382611dde565b61142d816040518060600160405280602e81526020016145f0602e9139611dfc565b50808061143990613d99565b9150506113da565b507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe33826040516114739291906136df565b60405180910390a150565b6114866119d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90613845565b60405180910390fd5b80600560006115016119d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ae6119d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f39190613708565b60405180910390a35050565b61161061160a6119d7565b83611a98565b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690613a65565b60405180910390fd5b61165b84848484611e70565b50505050565b606061166c82611ecc565b9050919050565b600061167d610a1a565b61271061168a9190613c3a565b905090565b6000816702c68af0bb1400006116a59190613be0565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117486119d7565b73ffffffffffffffffffffffffffffffffffffffff16611766611131565b73ffffffffffffffffffffffffffffffffffffffff16146117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b3906139c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561182c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611823906137c5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061196457506119638261201e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a5283610e62565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611aa38261196b565b611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990613865565b60405180910390fd5b6000611aed83610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b5c57508373ffffffffffffffffffffffffffffffffffffffff16611b448461087d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b6d5750611b6c81856116ac565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b9682610e62565b73ffffffffffffffffffffffffffffffffffffffff1614611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906139e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613825565b60405180910390fd5b611c67838383612100565b611c726000826119df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc29190613c3a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d199190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ddb81612110565b50565b611df8828260405180602001604052806000815250612163565b5050565b611e058261196b565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90613925565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611e6b929190612dd3565b505050565b611e7b848484611b76565b611e87848484846121be565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd906137a5565b60405180910390fd5b50505050565b6060611ed78261196b565b611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d90613965565b60405180910390fd5b6000600a60008481526020019081526020016000208054611f3690613d36565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6290613d36565b8015611faf5780601f10611f8457610100808354040283529160200191611faf565b820191906000526020600020905b815481529060010190602001808311611f9257829003601f168201915b505050505090506000611fc0612355565b9050600081511415611fd6578192505050612019565b60008251111561200b578082604051602001611ff3929190613639565b60405160208183030381529060405292505050612019565b61201484612392565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120e957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120f957506120f882612439565b5b9050919050565b61210b8383836124a3565b505050565b612119816125b7565b6000600a6000838152602001908152602001600020805461213990613d36565b90501461216057600a6000828152602001908152602001600020600061215f9190612e59565b5b50565b61216d83836126c8565b61217a60008484846121be565b6121b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b0906137a5565b60405180910390fd5b505050565b60006121df8473ffffffffffffffffffffffffffffffffffffffff16612896565b15612348578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122086119d7565b8786866040518563ffffffff1660e01b815260040161222a9493929190613693565b602060405180830381600087803b15801561224457600080fd5b505af192505050801561227557506040513d601f19601f820116820180604052508101906122729190613157565b60015b6122f8573d80600081146122a5576040519150601f19603f3d011682016040523d82523d6000602084013e6122aa565b606091505b506000815114156122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e7906137a5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061234d565b600190505b949350505050565b60606040518060400160405280600c81526020017f697066733a2f2f697066732f0000000000000000000000000000000000000000815250905090565b606061239d8261196b565b6123dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d390613a05565b60405180910390fd5b60006123e6612355565b905060008151116124065760405180602001604052806000815250612431565b80612410846128a9565b604051602001612421929190613639565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124ae838383612a56565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124f1576124ec81612a5b565b612530565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461252f5761252e8382612aa4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125735761256e81612c11565b6125b2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125b1576125b08282612d54565b5b5b505050565b60006125c282610e62565b90506125d081600084612100565b6125db6000836119df565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461262b9190613c3a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90613945565b60405180910390fd5b6127418161196b565b15612781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612778906137e5565b60405180910390fd5b61278d60008383612100565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127dd9190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606060008214156128f1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a51565b600082905060005b6000821461292357808061290c90613d99565b915050600a8261291c9190613baf565b91506128f9565b60008167ffffffffffffffff811115612965577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129975781602001600182028036833780820191505090505b5090505b60008514612a4a576001826129b09190613c3a565b9150600a856129bf9190613de2565b60306129cb9190613b59565b60f81b818381518110612a07577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a439190613baf565b945061299b565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ab184610f14565b612abb9190613c3a565b9050600060076000848152602001908152602001600020549050818114612ba0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c259190613c3a565b9050600060096000848152602001908152602001600020549050600060088381548110612c7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612d38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d5f83610f14565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612ddf90613d36565b90600052602060002090601f016020900481019282612e015760008555612e48565b82601f10612e1a57805160ff1916838001178555612e48565b82800160010185558215612e48579182015b82811115612e47578251825591602001919060010190612e2c565b5b509050612e559190612e99565b5090565b508054612e6590613d36565b6000825580601f10612e775750612e96565b601f016020900490600052602060002090810190612e959190612e99565b5b50565b5b80821115612eb2576000816000905550600101612e9a565b5090565b6000612ec9612ec484613ae5565b613ac0565b905082815260208101848484011115612ee157600080fd5b612eec848285613cf4565b509392505050565b600081359050612f0381614593565b92915050565b600081359050612f18816145aa565b92915050565b600081359050612f2d816145c1565b92915050565b600081519050612f42816145c1565b92915050565b600082601f830112612f5957600080fd5b8135612f69848260208601612eb6565b91505092915050565b600081359050612f81816145d8565b92915050565b600060208284031215612f9957600080fd5b6000612fa784828501612ef4565b91505092915050565b60008060408385031215612fc357600080fd5b6000612fd185828601612ef4565b9250506020612fe285828601612ef4565b9150509250929050565b60008060006060848603121561300157600080fd5b600061300f86828701612ef4565b935050602061302086828701612ef4565b925050604061303186828701612f72565b9150509250925092565b6000806000806080858703121561305157600080fd5b600061305f87828801612ef4565b945050602061307087828801612ef4565b935050604061308187828801612f72565b925050606085013567ffffffffffffffff81111561309e57600080fd5b6130aa87828801612f48565b91505092959194509250565b600080604083850312156130c957600080fd5b60006130d785828601612ef4565b92505060206130e885828601612f09565b9150509250929050565b6000806040838503121561310557600080fd5b600061311385828601612ef4565b925050602061312485828601612f72565b9150509250929050565b60006020828403121561314057600080fd5b600061314e84828501612f1e565b91505092915050565b60006020828403121561316957600080fd5b600061317784828501612f33565b91505092915050565b60006020828403121561319257600080fd5b60006131a084828501612f72565b91505092915050565b6131b281613c80565b82525050565b6131c181613c6e565b82525050565b6131d081613c92565b82525050565b60006131e182613b16565b6131eb8185613b2c565b93506131fb818560208601613d03565b61320481613ecf565b840191505092915050565b600061321a82613b21565b6132248185613b3d565b9350613234818560208601613d03565b61323d81613ecf565b840191505092915050565b600061325382613b21565b61325d8185613b4e565b935061326d818560208601613d03565b80840191505092915050565b6000613286601a83613b3d565b915061329182613ee0565b602082019050919050565b60006132a9602b83613b3d565b91506132b482613f09565b604082019050919050565b60006132cc601a83613b3d565b91506132d782613f58565b602082019050919050565b60006132ef603283613b3d565b91506132fa82613f81565b604082019050919050565b6000613312602683613b3d565b915061331d82613fd0565b604082019050919050565b6000613335601c83613b3d565b91506133408261401f565b602082019050919050565b6000613358600c83613b3d565b915061336382614048565b602082019050919050565b600061337b602483613b3d565b915061338682614071565b604082019050919050565b600061339e601983613b3d565b91506133a9826140c0565b602082019050919050565b60006133c1602c83613b3d565b91506133cc826140e9565b604082019050919050565b60006133e4600883613b3d565b91506133ef82614138565b602082019050919050565b6000613407601283613b3d565b915061341282614161565b602082019050919050565b600061342a603883613b3d565b91506134358261418a565b604082019050919050565b600061344d602a83613b3d565b9150613458826141d9565b604082019050919050565b6000613470602983613b3d565b915061347b82614228565b604082019050919050565b6000613493602e83613b3d565b915061349e82614277565b604082019050919050565b60006134b6602083613b3d565b91506134c1826142c6565b602082019050919050565b60006134d9603183613b3d565b91506134e4826142ef565b604082019050919050565b60006134fc602c83613b3d565b91506135078261433e565b604082019050919050565b600061351f601083613b3d565b915061352a8261438d565b602082019050919050565b6000613542602083613b3d565b915061354d826143b6565b602082019050919050565b6000613565602983613b3d565b9150613570826143df565b604082019050919050565b6000613588602f83613b3d565b91506135938261442e565b604082019050919050565b60006135ab602083613b3d565b91506135b68261447d565b602082019050919050565b60006135ce602183613b3d565b91506135d9826144a6565b604082019050919050565b60006135f1603183613b3d565b91506135fc826144f5565b604082019050919050565b6000613614602c83613b3d565b915061361f82614544565b604082019050919050565b61363381613cea565b82525050565b60006136458285613248565b91506136518284613248565b91508190509392505050565b600060208201905061367260008301846131b8565b92915050565b600060208201905061368d60008301846131a9565b92915050565b60006080820190506136a860008301876131b8565b6136b560208301866131b8565b6136c2604083018561362a565b81810360608301526136d481846131d6565b905095945050505050565b60006040820190506136f460008301856131b8565b613701602083018461362a565b9392505050565b600060208201905061371d60008301846131c7565b92915050565b6000602082019050818103600083015261373d818461320f565b905092915050565b6000602082019050818103600083015261375e81613279565b9050919050565b6000602082019050818103600083015261377e8161329c565b9050919050565b6000602082019050818103600083015261379e816132bf565b9050919050565b600060208201905081810360008301526137be816132e2565b9050919050565b600060208201905081810360008301526137de81613305565b9050919050565b600060208201905081810360008301526137fe81613328565b9050919050565b6000602082019050818103600083015261381e8161334b565b9050919050565b6000602082019050818103600083015261383e8161336e565b9050919050565b6000602082019050818103600083015261385e81613391565b9050919050565b6000602082019050818103600083015261387e816133b4565b9050919050565b6000602082019050818103600083015261389e816133d7565b9050919050565b600060208201905081810360008301526138be816133fa565b9050919050565b600060208201905081810360008301526138de8161341d565b9050919050565b600060208201905081810360008301526138fe81613440565b9050919050565b6000602082019050818103600083015261391e81613463565b9050919050565b6000602082019050818103600083015261393e81613486565b9050919050565b6000602082019050818103600083015261395e816134a9565b9050919050565b6000602082019050818103600083015261397e816134cc565b9050919050565b6000602082019050818103600083015261399e816134ef565b9050919050565b600060208201905081810360008301526139be81613512565b9050919050565b600060208201905081810360008301526139de81613535565b9050919050565b600060208201905081810360008301526139fe81613558565b9050919050565b60006020820190508181036000830152613a1e8161357b565b9050919050565b60006020820190508181036000830152613a3e8161359e565b9050919050565b60006020820190508181036000830152613a5e816135c1565b9050919050565b60006020820190508181036000830152613a7e816135e4565b9050919050565b60006020820190508181036000830152613a9e81613607565b9050919050565b6000602082019050613aba600083018461362a565b92915050565b6000613aca613adb565b9050613ad68282613d68565b919050565b6000604051905090565b600067ffffffffffffffff821115613b0057613aff613ea0565b5b613b0982613ecf565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b6482613cea565b9150613b6f83613cea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ba457613ba3613e13565b5b828201905092915050565b6000613bba82613cea565b9150613bc583613cea565b925082613bd557613bd4613e42565b5b828204905092915050565b6000613beb82613cea565b9150613bf683613cea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c2f57613c2e613e13565b5b828202905092915050565b6000613c4582613cea565b9150613c5083613cea565b925082821015613c6357613c62613e13565b5b828203905092915050565b6000613c7982613cca565b9050919050565b6000613c8b82613cca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d21578082015181840152602081019050613d06565b83811115613d30576000848401525b50505050565b60006002820490506001821680613d4e57607f821691505b60208210811415613d6257613d61613e71565b5b50919050565b613d7182613ecf565b810181811067ffffffffffffffff82111715613d9057613d8f613ea0565b5b80604052505050565b6000613da482613cea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dd757613dd6613e13565b5b600182019050919050565b6000613ded82613cea565b9150613df883613cea565b925082613e0857613e07613e42565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6d696e74696e67206973206e6f7420656e61626c656420796574000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f6275726e696e67206973206e6f742079657420656e61626c6564000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f65786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6d696e74696e6720746f6f206d616e7900000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61459c81613c6e565b81146145a757600080fd5b50565b6145b381613c92565b81146145be57600080fd5b50565b6145ca81613c9e565b81146145d557600080fd5b50565b6145e181613cea565b81146145ec57600080fd5b5056fe516d5753363934566948766b546d7339556b4b716f6376316b57446d324d54517159454a655969364c734a62784ba2646970667358221220c17f7be2b6bf8cb3b16fafd3bf6273fa5e37216ab7b9468fe540fab944305abe64736f6c63430008010033
Deployed Bytecode Sourcemap
44980:3064:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47714:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21602:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45423:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23062:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22599:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35169:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23952:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34837:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45292:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46490:89;;;;;;;;;;;;;:::i;:::-;;46591:100;;;;;;;;;;;;;:::i;:::-;;24328:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46807:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45341:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35359:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46699:100;;;;;;;;;;;;;:::i;:::-;;21296:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21026:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44313:148;;;;;;;;;;;;;:::i;:::-;;45194:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45103:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43662:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21771:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45382:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45663:700;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23355:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24550:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47510:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47059:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46371:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23721:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44616:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45246:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47714:212;47853:4;47882:36;47906:11;47882:23;:36::i;:::-;47875:43;;47714:212;;;:::o;21602:100::-;21656:13;21689:5;21682:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21602:100;:::o;45423:34::-;;;;;;;;;;;;;:::o;23062:221::-;23138:7;23166:16;23174:7;23166;:16::i;:::-;23158:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23251:15;:24;23267:7;23251:24;;;;;;;;;;;;;;;;;;;;;23244:31;;23062:221;;;:::o;22599:397::-;22680:13;22696:23;22711:7;22696:14;:23::i;:::-;22680:39;;22744:5;22738:11;;:2;:11;;;;22730:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22824:5;22808:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22833:37;22850:5;22857:12;:10;:12::i;:::-;22833:16;:37::i;:::-;22808:62;22800:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22967:21;22976:2;22980:7;22967:8;:21::i;:::-;22599:397;;;:::o;35169:113::-;35230:7;35257:10;:17;;;;35250:24;;35169:113;:::o;23952:305::-;24113:41;24132:12;:10;:12::i;:::-;24146:7;24113:18;:41::i;:::-;24105:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24221:28;24231:4;24237:2;24241:7;24221:9;:28::i;:::-;23952:305;;;:::o;34837:256::-;34934:7;34970:23;34987:5;34970:16;:23::i;:::-;34962:5;:31;34954:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35059:12;:19;35072:5;35059:19;;;;;;;;;;;;;;;:26;35079:5;35059:26;;;;;;;;;;;;35052:33;;34837:256;;;;:::o;45292:42::-;45329:5;45292:42;:::o;46490:89::-;46528:11;;;;;;;;;;;:20;;:43;46549:21;46528:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46490:89::o;46591:100::-;43893:12;:10;:12::i;:::-;43882:23;;:7;:5;:7::i;:::-;:23;;;43874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46669:14:::1;;;;;;;;;;;46668:15;46651:14;;:32;;;;;;;;;;;;;;;;;;46591:100::o:0;24328:151::-;24432:39;24449:4;24455:2;24459:7;24432:39;;;;;;;;;;;;:16;:39::i;:::-;24328:151;;;:::o;46807:240::-;46872:14;;;;;;;;;;;46864:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;46936:41;46955:12;:10;:12::i;:::-;46969:7;46936:18;:41::i;:::-;46928:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;47025:14;47031:7;47025:5;:14::i;:::-;46807:240;:::o;45341:34::-;;;;;;;;;;;;;:::o;35359:233::-;35434:7;35470:30;:28;:30::i;:::-;35462:5;:38;35454:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35567:10;35578:5;35567:17;;;;;;;;;;;;;;;;;;;;;;;;35560:24;;35359:233;;;:::o;46699:100::-;43893:12;:10;:12::i;:::-;43882:23;;:7;:5;:7::i;:::-;:23;;;43874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46777:14:::1;;;;;;;;;;;46776:15;46759:14;;:32;;;;;;;;;;;;;;;;;;46699:100::o:0;21296:239::-;21368:7;21388:13;21404:7;:16;21412:7;21404:16;;;;;;;;;;;;;;;;;;;;;21388:32;;21456:1;21439:19;;:5;:19;;;;21431:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21522:5;21515:12;;;21296:239;;;:::o;21026:208::-;21098:7;21143:1;21126:19;;:5;:19;;;;21118:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21210:9;:16;21220:5;21210:16;;;;;;;;;;;;;;;;21203:23;;21026:208;;;:::o;44313:148::-;43893:12;:10;:12::i;:::-;43882:23;;:7;:5;:7::i;:::-;:23;;;43874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44420:1:::1;44383:40;;44404:6;;;;;;;;;;;44383:40;;;;;;;;;;;;44451:1;44434:6;;:19;;;;;;;;;;;;;;;;;;44313:148::o:0;45194:45::-;45230:9;45194:45;:::o;45103:84::-;;;;;;;;;;;;;;;;;;;:::o;43662:87::-;43708:7;43735:6;;;;;;;;;;;43728:13;;43662:87;:::o;21771:104::-;21827:13;21860:7;21853:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21771:104;:::o;45382:34::-;;;;;;;;;;;;;:::o;45663:700::-;45743:11;;;;;;;;;;;45729:25;;:10;:25;;;:43;;;;45758:14;;;;;;;;;;;45729:43;45721:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;45283:2;45822:8;:22;;45814:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;45897:18;45906:8;45897;:18::i;:::-;45884:9;:31;45876:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;45329:5;45951:13;:11;:13::i;:::-;:26;45943:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;45329:5;46025:8;46009:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;46001:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;46096:6;46091:219;46112:8;46108:1;:12;46091:219;;;46142:9;;:11;;;;;;;;;:::i;:::-;;;;;;46170:18;46191:9;;46170:30;;46215:33;46225:10;46237;46215:9;:33::i;:::-;46263:35;46276:10;46288:9;;;;;;;;;;;;;;;;;46263:12;:35::i;:::-;46091:219;46122:3;;;;;:::i;:::-;;;;46091:219;;;;46327:28;46334:10;46346:8;46327:28;;;;;;;:::i;:::-;;;;;;;;45663:700;:::o;23355:295::-;23470:12;:10;:12::i;:::-;23458:24;;:8;:24;;;;23450:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23570:8;23525:18;:32;23544:12;:10;:12::i;:::-;23525:32;;;;;;;;;;;;;;;:42;23558:8;23525:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23623:8;23594:48;;23609:12;:10;:12::i;:::-;23594:48;;;23633:8;23594:48;;;;;;:::i;:::-;;;;;;;;23355:295;;:::o;24550:285::-;24682:41;24701:12;:10;:12::i;:::-;24715:7;24682:18;:41::i;:::-;24674:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24788:39;24802:4;24808:2;24812:7;24821:5;24788:13;:39::i;:::-;24550:285;;;;:::o;47510:196::-;47637:13;47675:23;47690:7;47675:14;:23::i;:::-;47668:30;;47510:196;;;:::o;47059:108::-;47106:7;47146:13;:11;:13::i;:::-;45329:5;47133:26;;;;:::i;:::-;47126:33;;47059:108;:::o;46371:111::-;46427:7;46466:8;45230:9;46454:20;;;;:::i;:::-;46447:27;;46371:111;;;:::o;23721:164::-;23818:4;23842:18;:25;23861:5;23842:25;;;;;;;;;;;;;;;:35;23868:8;23842:35;;;;;;;;;;;;;;;;;;;;;;;;;23835:42;;23721:164;;;;:::o;44616:244::-;43893:12;:10;:12::i;:::-;43882:23;;:7;:5;:7::i;:::-;:23;;;43874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44725:1:::1;44705:22;;:8;:22;;;;44697:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44815:8;44786:38;;44807:6;;;;;;;;;;;44786:38;;;;;;;;;;;;44844:8;44835:6;;:17;;;;;;;;;;;;;;;;;;44616:244:::0;:::o;45246:39::-;45283:2;45246:39;:::o;34516:237::-;34618:4;34657:35;34642:50;;;:11;:50;;;;:103;;;;34709:36;34733:11;34709:23;:36::i;:::-;34642:103;34635:110;;34516:237;;;:::o;26302:127::-;26367:4;26419:1;26391:30;;:7;:16;26399:7;26391:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26384:37;;26302:127;;;:::o;15932:98::-;15985:7;16012:10;16005:17;;15932:98;:::o;30179:174::-;30281:2;30254:15;:24;30270:7;30254:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30337:7;30333:2;30299:46;;30308:23;30323:7;30308:14;:23::i;:::-;30299:46;;;;;;;;;;;;30179:174;;:::o;26596:348::-;26689:4;26714:16;26722:7;26714;:16::i;:::-;26706:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26790:13;26806:23;26821:7;26806:14;:23::i;:::-;26790:39;;26859:5;26848:16;;:7;:16;;;:51;;;;26892:7;26868:31;;:20;26880:7;26868:11;:20::i;:::-;:31;;;26848:51;:87;;;;26903:32;26920:5;26927:7;26903:16;:32::i;:::-;26848:87;26840:96;;;26596:348;;;;:::o;29517:544::-;29642:4;29615:31;;:23;29630:7;29615:14;:23::i;:::-;:31;;;29607:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29725:1;29711:16;;:2;:16;;;;29703:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29781:39;29802:4;29808:2;29812:7;29781:20;:39::i;:::-;29885:29;29902:1;29906:7;29885:8;:29::i;:::-;29946:1;29927:9;:15;29937:4;29927:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29975:1;29958:9;:13;29968:2;29958:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30006:2;29987:7;:16;29995:7;29987:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30045:7;30041:2;30026:27;;30035:4;30026:27;;;;;;;;;;;;29517:544;;;:::o;47387:115::-;47474:20;47486:7;47474:11;:20::i;:::-;47387:115;:::o;27286:110::-;27362:26;27372:2;27376:7;27362:26;;;;;;;;;;;;:9;:26::i;:::-;27286:110;;:::o;41909:217::-;42009:16;42017:7;42009;:16::i;:::-;42001:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;42109:9;42087:10;:19;42098:7;42087:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;41909:217;;:::o;25717:272::-;25831:28;25841:4;25847:2;25851:7;25831:9;:28::i;:::-;25878:48;25901:4;25907:2;25911:7;25920:5;25878:22;:48::i;:::-;25870:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25717:272;;;;:::o;41074:679::-;41147:13;41181:16;41189:7;41181;:16::i;:::-;41173:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;41264:23;41290:10;:19;41301:7;41290:19;;;;;;;;;;;41264:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41320:18;41341:10;:8;:10::i;:::-;41320:31;;41449:1;41433:4;41427:18;:23;41423:72;;;41474:9;41467:16;;;;;;41423:72;41625:1;41605:9;41599:23;:27;41595:108;;;41674:4;41680:9;41657:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41643:48;;;;;;41595:108;41722:23;41737:7;41722:14;:23::i;:::-;41715:30;;;;41074:679;;;;:::o;20670:292::-;20772:4;20811:25;20796:40;;;:11;:40;;;;:105;;;;20868:33;20853:48;;;:11;:48;;;;20796:105;:158;;;;20918:36;20942:11;20918:23;:36::i;:::-;20796:158;20789:165;;20670:292;;;:::o;47175:204::-;47326:45;47353:4;47359:2;47363:7;47326:26;:45::i;:::-;47175:204;;;:::o;42355:206::-;42424:20;42436:7;42424:11;:20::i;:::-;42498:1;42467:10;:19;42478:7;42467:19;;;;;;;;;;;42461:33;;;;;:::i;:::-;;;:38;42457:97;;42523:10;:19;42534:7;42523:19;;;;;;;;;;;;42516:26;;;;:::i;:::-;42457:97;42355:206;:::o;27623:250::-;27719:18;27725:2;27729:7;27719:5;:18::i;:::-;27756:54;27787:1;27791:2;27795:7;27804:5;27756:22;:54::i;:::-;27748:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27623:250;;;:::o;30918:843::-;31039:4;31065:15;:2;:13;;;:15::i;:::-;31061:693;;;31117:2;31101:36;;;31138:12;:10;:12::i;:::-;31152:4;31158:7;31167:5;31101:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31097:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31364:1;31347:6;:13;:18;31343:341;;;31390:60;;;;;;;;;;:::i;:::-;;;;;;;;31343:341;31634:6;31628:13;31619:6;31615:2;31611:15;31604:38;31097:602;31234:45;;;31224:55;;;:6;:55;;;;31217:62;;;;;31061:693;31738:4;31731:11;;30918:843;;;;;;;:::o;47934:107::-;47986:13;48012:21;;;;;;;;;;;;;;;;;;;47934:107;:::o;21946:360::-;22019:13;22053:16;22061:7;22053;:16::i;:::-;22045:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22134:21;22158:10;:8;:10::i;:::-;22134:34;;22210:1;22192:7;22186:21;:25;:112;;;;;;;;;;;;;;;;;22251:7;22260:18;:7;:16;:18::i;:::-;22234:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22186:112;22179:119;;;21946:360;;;:::o;19168:157::-;19253:4;19292:25;19277:40;;;:11;:40;;;;19270:47;;19168:157;;;:::o;36205:555::-;36315:45;36342:4;36348:2;36352:7;36315:26;:45::i;:::-;36393:1;36377:18;;:4;:18;;;36373:187;;;36412:40;36444:7;36412:31;:40::i;:::-;36373:187;;;36482:2;36474:10;;:4;:10;;;36470:90;;36501:47;36534:4;36540:7;36501:32;:47::i;:::-;36470:90;36373:187;36588:1;36574:16;;:2;:16;;;36570:183;;;36607:45;36644:7;36607:36;:45::i;:::-;36570:183;;;36680:4;36674:10;;:2;:10;;;36670:83;;36701:40;36729:2;36733:7;36701:27;:40::i;:::-;36670:83;36570:183;36205:555;;;:::o;28820:360::-;28880:13;28896:23;28911:7;28896:14;:23::i;:::-;28880:39;;28932:48;28953:5;28968:1;28972:7;28932:20;:48::i;:::-;29021:29;29038:1;29042:7;29021:8;:29::i;:::-;29083:1;29063:9;:16;29073:5;29063:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29102:7;:16;29110:7;29102:16;;;;;;;;;;;;29095:23;;;;;;;;;;;29164:7;29160:1;29136:36;;29145:5;29136:36;;;;;;;;;;;;28820:360;;:::o;28209:382::-;28303:1;28289:16;;:2;:16;;;;28281:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28362:16;28370:7;28362;:16::i;:::-;28361:17;28353:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28424:45;28453:1;28457:2;28461:7;28424:20;:45::i;:::-;28499:1;28482:9;:13;28492:2;28482:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28530:2;28511:7;:16;28519:7;28511:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28575:7;28571:2;28550:33;;28567:1;28550:33;;;;;;;;;;;;28209:382;;:::o;8036:422::-;8096:4;8304:12;8415:7;8403:20;8395:28;;8449:1;8442:4;:8;8435:15;;;8036:422;;;:::o;16600:723::-;16656:13;16886:1;16877:5;:10;16873:53;;;16904:10;;;;;;;;;;;;;;;;;;;;;16873:53;16936:12;16951:5;16936:20;;16967:14;16992:78;17007:1;16999:4;:9;16992:78;;17025:8;;;;;:::i;:::-;;;;17056:2;17048:10;;;;;:::i;:::-;;;16992:78;;;17080:19;17112:6;17102:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17080:39;;17130:154;17146:1;17137:5;:10;17130:154;;17174:1;17164:11;;;;;:::i;:::-;;;17241:2;17233:5;:10;;;;:::i;:::-;17220:2;:24;;;;:::i;:::-;17207:39;;17190:6;17197;17190:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17270:2;17261:11;;;;;:::i;:::-;;;17130:154;;;17308:6;17294:21;;;;;16600:723;;;;:::o;32374:93::-;;;;:::o;37483:164::-;37587:10;:17;;;;37560:15;:24;37576:7;37560:24;;;;;;;;;;;:44;;;;37615:10;37631:7;37615:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37483:164;:::o;38274:988::-;38540:22;38590:1;38565:22;38582:4;38565:16;:22::i;:::-;:26;;;;:::i;:::-;38540:51;;38602:18;38623:17;:26;38641:7;38623:26;;;;;;;;;;;;38602:47;;38770:14;38756:10;:28;38752:328;;38801:19;38823:12;:18;38836:4;38823:18;;;;;;;;;;;;;;;:34;38842:14;38823:34;;;;;;;;;;;;38801:56;;38907:11;38874:12;:18;38887:4;38874:18;;;;;;;;;;;;;;;:30;38893:10;38874:30;;;;;;;;;;;:44;;;;39024:10;38991:17;:30;39009:11;38991:30;;;;;;;;;;;:43;;;;38752:328;;39176:17;:26;39194:7;39176:26;;;;;;;;;;;39169:33;;;39220:12;:18;39233:4;39220:18;;;;;;;;;;;;;;;:34;39239:14;39220:34;;;;;;;;;;;39213:41;;;38274:988;;;;:::o;39557:1079::-;39810:22;39855:1;39835:10;:17;;;;:21;;;;:::i;:::-;39810:46;;39867:18;39888:15;:24;39904:7;39888:24;;;;;;;;;;;;39867:45;;40239:19;40261:10;40272:14;40261:26;;;;;;;;;;;;;;;;;;;;;;;;40239:48;;40325:11;40300:10;40311;40300:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40436:10;40405:15;:28;40421:11;40405:28;;;;;;;;;;;:41;;;;40577:15;:24;40593:7;40577:24;;;;;;;;;;;40570:31;;;40612:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39557:1079;;;;:::o;37061:221::-;37146:14;37163:20;37180:2;37163:16;:20::i;:::-;37146:37;;37221:7;37194:12;:16;37207:2;37194:16;;;;;;;;;;;;;;;:24;37211:6;37194:24;;;;;;;;;;;:34;;;;37268:6;37239:17;:26;37257:7;37239:26;;;;;;;;;;;:35;;;;37061:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:262::-;;1473:2;1461:9;1452:7;1448:23;1444:32;1441:2;;;1489:1;1486;1479:12;1441:2;1532:1;1557:53;1602:7;1593:6;1582:9;1578:22;1557:53;:::i;:::-;1547:63;;1503:117;1431:196;;;;:::o;1633:407::-;;;1758:2;1746:9;1737:7;1733:23;1729:32;1726:2;;;1774:1;1771;1764:12;1726:2;1817:1;1842:53;1887:7;1878:6;1867:9;1863:22;1842:53;:::i;:::-;1832:63;;1788:117;1944:2;1970:53;2015:7;2006:6;1995:9;1991:22;1970:53;:::i;:::-;1960:63;;1915:118;1716:324;;;;;:::o;2046:552::-;;;;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2204:1;2201;2194:12;2156:2;2247:1;2272:53;2317:7;2308:6;2297:9;2293:22;2272:53;:::i;:::-;2262:63;;2218:117;2374:2;2400:53;2445:7;2436:6;2425:9;2421:22;2400:53;:::i;:::-;2390:63;;2345:118;2502:2;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;:::i;:::-;2518:63;;2473:118;2146:452;;;;;:::o;2604:809::-;;;;;2772:3;2760:9;2751:7;2747:23;2743:33;2740:2;;;2789:1;2786;2779:12;2740:2;2832:1;2857:53;2902:7;2893:6;2882:9;2878:22;2857:53;:::i;:::-;2847:63;;2803:117;2959:2;2985:53;3030:7;3021:6;3010:9;3006:22;2985:53;:::i;:::-;2975:63;;2930:118;3087:2;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3058:118;3243:2;3232:9;3228:18;3215:32;3274:18;3266:6;3263:30;3260:2;;;3306:1;3303;3296:12;3260:2;3334:62;3388:7;3379:6;3368:9;3364:22;3334:62;:::i;:::-;3324:72;;3186:220;2730:683;;;;;;;:::o;3419:401::-;;;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;3557:1;3554;3547:12;3509:2;3600:1;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3571:117;3727:2;3753:50;3795:7;3786:6;3775:9;3771:22;3753:50;:::i;:::-;3743:60;;3698:115;3499:321;;;;;:::o;3826:407::-;;;3951:2;3939:9;3930:7;3926:23;3922:32;3919:2;;;3967:1;3964;3957:12;3919:2;4010:1;4035:53;4080:7;4071:6;4060:9;4056:22;4035:53;:::i;:::-;4025:63;;3981:117;4137:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4108:118;3909:324;;;;;:::o;4239:260::-;;4346:2;4334:9;4325:7;4321:23;4317:32;4314:2;;;4362:1;4359;4352:12;4314:2;4405:1;4430:52;4474:7;4465:6;4454:9;4450:22;4430:52;:::i;:::-;4420:62;;4376:116;4304:195;;;;:::o;4505:282::-;;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;4682:1;4707:63;4762:7;4753:6;4742:9;4738:22;4707:63;:::i;:::-;4697:73;;4653:127;4581:206;;;;:::o;4793:262::-;;4901:2;4889:9;4880:7;4876:23;4872:32;4869:2;;;4917:1;4914;4907:12;4869:2;4960:1;4985:53;5030:7;5021:6;5010:9;5006:22;4985:53;:::i;:::-;4975:63;;4931:117;4859:196;;;;:::o;5061:142::-;5164:32;5190:5;5164:32;:::i;:::-;5159:3;5152:45;5142:61;;:::o;5209:118::-;5296:24;5314:5;5296:24;:::i;:::-;5291:3;5284:37;5274:53;;:::o;5333:109::-;5414:21;5429:5;5414:21;:::i;:::-;5409:3;5402:34;5392:50;;:::o;5448:360::-;;5562:38;5594:5;5562:38;:::i;:::-;5616:70;5679:6;5674:3;5616:70;:::i;:::-;5609:77;;5695:52;5740:6;5735:3;5728:4;5721:5;5717:16;5695:52;:::i;:::-;5772:29;5794:6;5772:29;:::i;:::-;5767:3;5763:39;5756:46;;5538:270;;;;;:::o;5814:364::-;;5930:39;5963:5;5930:39;:::i;:::-;5985:71;6049:6;6044:3;5985:71;:::i;:::-;5978:78;;6065:52;6110:6;6105:3;6098:4;6091:5;6087:16;6065:52;:::i;:::-;6142:29;6164:6;6142:29;:::i;:::-;6137:3;6133:39;6126:46;;5906:272;;;;;:::o;6184:377::-;;6318:39;6351:5;6318:39;:::i;:::-;6373:89;6455:6;6450:3;6373:89;:::i;:::-;6366:96;;6471:52;6516:6;6511:3;6504:4;6497:5;6493:16;6471:52;:::i;:::-;6548:6;6543:3;6539:16;6532:23;;6294:267;;;;;:::o;6567:366::-;;6730:67;6794:2;6789:3;6730:67;:::i;:::-;6723:74;;6806:93;6895:3;6806:93;:::i;:::-;6924:2;6919:3;6915:12;6908:19;;6713:220;;;:::o;6939:366::-;;7102:67;7166:2;7161:3;7102:67;:::i;:::-;7095:74;;7178:93;7267:3;7178:93;:::i;:::-;7296:2;7291:3;7287:12;7280:19;;7085:220;;;:::o;7311:366::-;;7474:67;7538:2;7533:3;7474:67;:::i;:::-;7467:74;;7550:93;7639:3;7550:93;:::i;:::-;7668:2;7663:3;7659:12;7652:19;;7457:220;;;:::o;7683:366::-;;7846:67;7910:2;7905:3;7846:67;:::i;:::-;7839:74;;7922:93;8011:3;7922:93;:::i;:::-;8040:2;8035:3;8031:12;8024:19;;7829:220;;;:::o;8055:366::-;;8218:67;8282:2;8277:3;8218:67;:::i;:::-;8211:74;;8294:93;8383:3;8294:93;:::i;:::-;8412:2;8407:3;8403:12;8396:19;;8201:220;;;:::o;8427:366::-;;8590:67;8654:2;8649:3;8590:67;:::i;:::-;8583:74;;8666:93;8755:3;8666:93;:::i;:::-;8784:2;8779:3;8775:12;8768:19;;8573:220;;;:::o;8799:366::-;;8962:67;9026:2;9021:3;8962:67;:::i;:::-;8955:74;;9038:93;9127:3;9038:93;:::i;:::-;9156:2;9151:3;9147:12;9140:19;;8945:220;;;:::o;9171:366::-;;9334:67;9398:2;9393:3;9334:67;:::i;:::-;9327:74;;9410:93;9499:3;9410:93;:::i;:::-;9528:2;9523:3;9519:12;9512:19;;9317:220;;;:::o;9543:366::-;;9706:67;9770:2;9765:3;9706:67;:::i;:::-;9699:74;;9782:93;9871:3;9782:93;:::i;:::-;9900:2;9895:3;9891:12;9884:19;;9689:220;;;:::o;9915:366::-;;10078:67;10142:2;10137:3;10078:67;:::i;:::-;10071:74;;10154:93;10243:3;10154:93;:::i;:::-;10272:2;10267:3;10263:12;10256:19;;10061:220;;;:::o;10287:365::-;;10450:66;10514:1;10509:3;10450:66;:::i;:::-;10443:73;;10525:93;10614:3;10525:93;:::i;:::-;10643:2;10638:3;10634:12;10627:19;;10433:219;;;:::o;10658:366::-;;10821:67;10885:2;10880:3;10821:67;:::i;:::-;10814:74;;10897:93;10986:3;10897:93;:::i;:::-;11015:2;11010:3;11006:12;10999:19;;10804:220;;;:::o;11030:366::-;;11193:67;11257:2;11252:3;11193:67;:::i;:::-;11186:74;;11269:93;11358:3;11269:93;:::i;:::-;11387:2;11382:3;11378:12;11371:19;;11176:220;;;:::o;11402:366::-;;11565:67;11629:2;11624:3;11565:67;:::i;:::-;11558:74;;11641:93;11730:3;11641:93;:::i;:::-;11759:2;11754:3;11750:12;11743:19;;11548:220;;;:::o;11774:366::-;;11937:67;12001:2;11996:3;11937:67;:::i;:::-;11930:74;;12013:93;12102:3;12013:93;:::i;:::-;12131:2;12126:3;12122:12;12115:19;;11920:220;;;:::o;12146:366::-;;12309:67;12373:2;12368:3;12309:67;:::i;:::-;12302:74;;12385:93;12474:3;12385:93;:::i;:::-;12503:2;12498:3;12494:12;12487:19;;12292:220;;;:::o;12518:366::-;;12681:67;12745:2;12740:3;12681:67;:::i;:::-;12674:74;;12757:93;12846:3;12757:93;:::i;:::-;12875:2;12870:3;12866:12;12859:19;;12664:220;;;:::o;12890:366::-;;13053:67;13117:2;13112:3;13053:67;:::i;:::-;13046:74;;13129:93;13218:3;13129:93;:::i;:::-;13247:2;13242:3;13238:12;13231:19;;13036:220;;;:::o;13262:366::-;;13425:67;13489:2;13484:3;13425:67;:::i;:::-;13418:74;;13501:93;13590:3;13501:93;:::i;:::-;13619:2;13614:3;13610:12;13603:19;;13408:220;;;:::o;13634:366::-;;13797:67;13861:2;13856:3;13797:67;:::i;:::-;13790:74;;13873:93;13962:3;13873:93;:::i;:::-;13991:2;13986:3;13982:12;13975:19;;13780:220;;;:::o;14006:366::-;;14169:67;14233:2;14228:3;14169:67;:::i;:::-;14162:74;;14245:93;14334:3;14245:93;:::i;:::-;14363:2;14358:3;14354:12;14347:19;;14152:220;;;:::o;14378:366::-;;14541:67;14605:2;14600:3;14541:67;:::i;:::-;14534:74;;14617:93;14706:3;14617:93;:::i;:::-;14735:2;14730:3;14726:12;14719:19;;14524:220;;;:::o;14750:366::-;;14913:67;14977:2;14972:3;14913:67;:::i;:::-;14906:74;;14989:93;15078:3;14989:93;:::i;:::-;15107:2;15102:3;15098:12;15091:19;;14896:220;;;:::o;15122:366::-;;15285:67;15349:2;15344:3;15285:67;:::i;:::-;15278:74;;15361:93;15450:3;15361:93;:::i;:::-;15479:2;15474:3;15470:12;15463:19;;15268:220;;;:::o;15494:366::-;;15657:67;15721:2;15716:3;15657:67;:::i;:::-;15650:74;;15733:93;15822:3;15733:93;:::i;:::-;15851:2;15846:3;15842:12;15835:19;;15640:220;;;:::o;15866:366::-;;16029:67;16093:2;16088:3;16029:67;:::i;:::-;16022:74;;16105:93;16194:3;16105:93;:::i;:::-;16223:2;16218:3;16214:12;16207:19;;16012:220;;;:::o;16238:366::-;;16401:67;16465:2;16460:3;16401:67;:::i;:::-;16394:74;;16477:93;16566:3;16477:93;:::i;:::-;16595:2;16590:3;16586:12;16579:19;;16384:220;;;:::o;16610:118::-;16697:24;16715:5;16697:24;:::i;:::-;16692:3;16685:37;16675:53;;:::o;16734:435::-;;16936:95;17027:3;17018:6;16936:95;:::i;:::-;16929:102;;17048:95;17139:3;17130:6;17048:95;:::i;:::-;17041:102;;17160:3;17153:10;;16918:251;;;;;:::o;17175:222::-;;17306:2;17295:9;17291:18;17283:26;;17319:71;17387:1;17376:9;17372:17;17363:6;17319:71;:::i;:::-;17273:124;;;;:::o;17403:254::-;;17550:2;17539:9;17535:18;17527:26;;17563:87;17647:1;17636:9;17632:17;17623:6;17563:87;:::i;:::-;17517:140;;;;:::o;17663:640::-;;17896:3;17885:9;17881:19;17873:27;;17910:71;17978:1;17967:9;17963:17;17954:6;17910:71;:::i;:::-;17991:72;18059:2;18048:9;18044:18;18035:6;17991:72;:::i;:::-;18073;18141:2;18130:9;18126:18;18117:6;18073:72;:::i;:::-;18192:9;18186:4;18182:20;18177:2;18166:9;18162:18;18155:48;18220:76;18291:4;18282:6;18220:76;:::i;:::-;18212:84;;17863:440;;;;;;;:::o;18309:332::-;;18468:2;18457:9;18453:18;18445:26;;18481:71;18549:1;18538:9;18534:17;18525:6;18481:71;:::i;:::-;18562:72;18630:2;18619:9;18615:18;18606:6;18562:72;:::i;:::-;18435:206;;;;;:::o;18647:210::-;;18772:2;18761:9;18757:18;18749:26;;18785:65;18847:1;18836:9;18832:17;18823:6;18785:65;:::i;:::-;18739:118;;;;:::o;18863:313::-;;19014:2;19003:9;18999:18;18991:26;;19063:9;19057:4;19053:20;19049:1;19038:9;19034:17;19027:47;19091:78;19164:4;19155:6;19091:78;:::i;:::-;19083:86;;18981:195;;;;:::o;19182:419::-;;19386:2;19375:9;19371:18;19363:26;;19435:9;19429:4;19425:20;19421:1;19410:9;19406:17;19399:47;19463:131;19589:4;19463:131;:::i;:::-;19455:139;;19353:248;;;:::o;19607:419::-;;19811:2;19800:9;19796:18;19788:26;;19860:9;19854:4;19850:20;19846:1;19835:9;19831:17;19824:47;19888:131;20014:4;19888:131;:::i;:::-;19880:139;;19778:248;;;:::o;20032:419::-;;20236:2;20225:9;20221:18;20213:26;;20285:9;20279:4;20275:20;20271:1;20260:9;20256:17;20249:47;20313:131;20439:4;20313:131;:::i;:::-;20305:139;;20203:248;;;:::o;20457:419::-;;20661:2;20650:9;20646:18;20638:26;;20710:9;20704:4;20700:20;20696:1;20685:9;20681:17;20674:47;20738:131;20864:4;20738:131;:::i;:::-;20730:139;;20628:248;;;:::o;20882:419::-;;21086:2;21075:9;21071:18;21063:26;;21135:9;21129:4;21125:20;21121:1;21110:9;21106:17;21099:47;21163:131;21289:4;21163:131;:::i;:::-;21155:139;;21053:248;;;:::o;21307:419::-;;21511:2;21500:9;21496:18;21488:26;;21560:9;21554:4;21550:20;21546:1;21535:9;21531:17;21524:47;21588:131;21714:4;21588:131;:::i;:::-;21580:139;;21478:248;;;:::o;21732:419::-;;21936:2;21925:9;21921:18;21913:26;;21985:9;21979:4;21975:20;21971:1;21960:9;21956:17;21949:47;22013:131;22139:4;22013:131;:::i;:::-;22005:139;;21903:248;;;:::o;22157:419::-;;22361:2;22350:9;22346:18;22338:26;;22410:9;22404:4;22400:20;22396:1;22385:9;22381:17;22374:47;22438:131;22564:4;22438:131;:::i;:::-;22430:139;;22328:248;;;:::o;22582:419::-;;22786:2;22775:9;22771:18;22763:26;;22835:9;22829:4;22825:20;22821:1;22810:9;22806:17;22799:47;22863:131;22989:4;22863:131;:::i;:::-;22855:139;;22753:248;;;:::o;23007:419::-;;23211:2;23200:9;23196:18;23188:26;;23260:9;23254:4;23250:20;23246:1;23235:9;23231:17;23224:47;23288:131;23414:4;23288:131;:::i;:::-;23280:139;;23178:248;;;:::o;23432:419::-;;23636:2;23625:9;23621:18;23613:26;;23685:9;23679:4;23675:20;23671:1;23660:9;23656:17;23649:47;23713:131;23839:4;23713:131;:::i;:::-;23705:139;;23603:248;;;:::o;23857:419::-;;24061:2;24050:9;24046:18;24038:26;;24110:9;24104:4;24100:20;24096:1;24085:9;24081:17;24074:47;24138:131;24264:4;24138:131;:::i;:::-;24130:139;;24028:248;;;:::o;24282:419::-;;24486:2;24475:9;24471:18;24463:26;;24535:9;24529:4;24525:20;24521:1;24510:9;24506:17;24499:47;24563:131;24689:4;24563:131;:::i;:::-;24555:139;;24453:248;;;:::o;24707:419::-;;24911:2;24900:9;24896:18;24888:26;;24960:9;24954:4;24950:20;24946:1;24935:9;24931:17;24924:47;24988:131;25114:4;24988:131;:::i;:::-;24980:139;;24878:248;;;:::o;25132:419::-;;25336:2;25325:9;25321:18;25313:26;;25385:9;25379:4;25375:20;25371:1;25360:9;25356:17;25349:47;25413:131;25539:4;25413:131;:::i;:::-;25405:139;;25303:248;;;:::o;25557:419::-;;25761:2;25750:9;25746:18;25738:26;;25810:9;25804:4;25800:20;25796:1;25785:9;25781:17;25774:47;25838:131;25964:4;25838:131;:::i;:::-;25830:139;;25728:248;;;:::o;25982:419::-;;26186:2;26175:9;26171:18;26163:26;;26235:9;26229:4;26225:20;26221:1;26210:9;26206:17;26199:47;26263:131;26389:4;26263:131;:::i;:::-;26255:139;;26153:248;;;:::o;26407:419::-;;26611:2;26600:9;26596:18;26588:26;;26660:9;26654:4;26650:20;26646:1;26635:9;26631:17;26624:47;26688:131;26814:4;26688:131;:::i;:::-;26680:139;;26578:248;;;:::o;26832:419::-;;27036:2;27025:9;27021:18;27013:26;;27085:9;27079:4;27075:20;27071:1;27060:9;27056:17;27049:47;27113:131;27239:4;27113:131;:::i;:::-;27105:139;;27003:248;;;:::o;27257:419::-;;27461:2;27450:9;27446:18;27438:26;;27510:9;27504:4;27500:20;27496:1;27485:9;27481:17;27474:47;27538:131;27664:4;27538:131;:::i;:::-;27530:139;;27428:248;;;:::o;27682:419::-;;27886:2;27875:9;27871:18;27863:26;;27935:9;27929:4;27925:20;27921:1;27910:9;27906:17;27899:47;27963:131;28089:4;27963:131;:::i;:::-;27955:139;;27853:248;;;:::o;28107:419::-;;28311:2;28300:9;28296:18;28288:26;;28360:9;28354:4;28350:20;28346:1;28335:9;28331:17;28324:47;28388:131;28514:4;28388:131;:::i;:::-;28380:139;;28278:248;;;:::o;28532:419::-;;28736:2;28725:9;28721:18;28713:26;;28785:9;28779:4;28775:20;28771:1;28760:9;28756:17;28749:47;28813:131;28939:4;28813:131;:::i;:::-;28805:139;;28703:248;;;:::o;28957:419::-;;29161:2;29150:9;29146:18;29138:26;;29210:9;29204:4;29200:20;29196:1;29185:9;29181:17;29174:47;29238:131;29364:4;29238:131;:::i;:::-;29230:139;;29128:248;;;:::o;29382:419::-;;29586:2;29575:9;29571:18;29563:26;;29635:9;29629:4;29625:20;29621:1;29610:9;29606:17;29599:47;29663:131;29789:4;29663:131;:::i;:::-;29655:139;;29553:248;;;:::o;29807:419::-;;30011:2;30000:9;29996:18;29988:26;;30060:9;30054:4;30050:20;30046:1;30035:9;30031:17;30024:47;30088:131;30214:4;30088:131;:::i;:::-;30080:139;;29978:248;;;:::o;30232:419::-;;30436:2;30425:9;30421:18;30413:26;;30485:9;30479:4;30475:20;30471:1;30460:9;30456:17;30449:47;30513:131;30639:4;30513:131;:::i;:::-;30505:139;;30403:248;;;:::o;30657:222::-;;30788:2;30777:9;30773:18;30765:26;;30801:71;30869:1;30858:9;30854:17;30845:6;30801:71;:::i;:::-;30755:124;;;;:::o;30885:129::-;;30946:20;;:::i;:::-;30936:30;;30975:33;31003:4;30995:6;30975:33;:::i;:::-;30926:88;;;:::o;31020:75::-;;31086:2;31080:9;31070:19;;31060:35;:::o;31101:307::-;;31252:18;31244:6;31241:30;31238:2;;;31274:18;;:::i;:::-;31238:2;31312:29;31334:6;31312:29;:::i;:::-;31304:37;;31396:4;31390;31386:15;31378:23;;31167:241;;;:::o;31414:98::-;;31499:5;31493:12;31483:22;;31472:40;;;:::o;31518:99::-;;31604:5;31598:12;31588:22;;31577:40;;;:::o;31623:168::-;;31740:6;31735:3;31728:19;31780:4;31775:3;31771:14;31756:29;;31718:73;;;;:::o;31797:169::-;;31915:6;31910:3;31903:19;31955:4;31950:3;31946:14;31931:29;;31893:73;;;;:::o;31972:148::-;;32111:3;32096:18;;32086:34;;;;:::o;32126:305::-;;32185:20;32203:1;32185:20;:::i;:::-;32180:25;;32219:20;32237:1;32219:20;:::i;:::-;32214:25;;32373:1;32305:66;32301:74;32298:1;32295:81;32292:2;;;32379:18;;:::i;:::-;32292:2;32423:1;32420;32416:9;32409:16;;32170:261;;;;:::o;32437:185::-;;32494:20;32512:1;32494:20;:::i;:::-;32489:25;;32528:20;32546:1;32528:20;:::i;:::-;32523:25;;32567:1;32557:2;;32572:18;;:::i;:::-;32557:2;32614:1;32611;32607:9;32602:14;;32479:143;;;;:::o;32628:348::-;;32691:20;32709:1;32691:20;:::i;:::-;32686:25;;32725:20;32743:1;32725:20;:::i;:::-;32720:25;;32913:1;32845:66;32841:74;32838:1;32835:81;32830:1;32823:9;32816:17;32812:105;32809:2;;;32920:18;;:::i;:::-;32809:2;32968:1;32965;32961:9;32950:20;;32676:300;;;;:::o;32982:191::-;;33042:20;33060:1;33042:20;:::i;:::-;33037:25;;33076:20;33094:1;33076:20;:::i;:::-;33071:25;;33115:1;33112;33109:8;33106:2;;;33120:18;;:::i;:::-;33106:2;33165:1;33162;33158:9;33150:17;;33027:146;;;;:::o;33179:96::-;;33245:24;33263:5;33245:24;:::i;:::-;33234:35;;33224:51;;;:::o;33281:104::-;;33355:24;33373:5;33355:24;:::i;:::-;33344:35;;33334:51;;;:::o;33391:90::-;;33468:5;33461:13;33454:21;33443:32;;33433:48;;;:::o;33487:149::-;;33563:66;33556:5;33552:78;33541:89;;33531:105;;;:::o;33642:126::-;;33719:42;33712:5;33708:54;33697:65;;33687:81;;;:::o;33774:77::-;;33840:5;33829:16;;33819:32;;;:::o;33857:154::-;33941:6;33936:3;33931;33918:30;34003:1;33994:6;33989:3;33985:16;33978:27;33908:103;;;:::o;34017:307::-;34085:1;34095:113;34109:6;34106:1;34103:13;34095:113;;;34194:1;34189:3;34185:11;34179:18;34175:1;34170:3;34166:11;34159:39;34131:2;34128:1;34124:10;34119:15;;34095:113;;;34226:6;34223:1;34220:13;34217:2;;;34306:1;34297:6;34292:3;34288:16;34281:27;34217:2;34066:258;;;;:::o;34330:320::-;;34411:1;34405:4;34401:12;34391:22;;34458:1;34452:4;34448:12;34479:18;34469:2;;34535:4;34527:6;34523:17;34513:27;;34469:2;34597;34589:6;34586:14;34566:18;34563:38;34560:2;;;34616:18;;:::i;:::-;34560:2;34381:269;;;;:::o;34656:281::-;34739:27;34761:4;34739:27;:::i;:::-;34731:6;34727:40;34869:6;34857:10;34854:22;34833:18;34821:10;34818:34;34815:62;34812:2;;;34880:18;;:::i;:::-;34812:2;34920:10;34916:2;34909:22;34699:238;;;:::o;34943:233::-;;35005:24;35023:5;35005:24;:::i;:::-;34996:33;;35051:66;35044:5;35041:77;35038:2;;;35121:18;;:::i;:::-;35038:2;35168:1;35161:5;35157:13;35150:20;;34986:190;;;:::o;35182:176::-;;35231:20;35249:1;35231:20;:::i;:::-;35226:25;;35265:20;35283:1;35265:20;:::i;:::-;35260:25;;35304:1;35294:2;;35309:18;;:::i;:::-;35294:2;35350:1;35347;35343:9;35338:14;;35216:142;;;;:::o;35364:180::-;35412:77;35409:1;35402:88;35509:4;35506:1;35499:15;35533:4;35530:1;35523:15;35550:180;35598:77;35595:1;35588:88;35695:4;35692:1;35685:15;35719:4;35716:1;35709:15;35736:180;35784:77;35781:1;35774:88;35881:4;35878:1;35871:15;35905:4;35902:1;35895:15;35922:180;35970:77;35967:1;35960:88;36067:4;36064:1;36057:15;36091:4;36088:1;36081:15;36108:102;;36200:2;36196:7;36191:2;36184:5;36180:14;36176:28;36166:38;;36156:54;;;:::o;36216:176::-;36356:28;36352:1;36344:6;36340:14;36333:52;36322:70;:::o;36398:230::-;36538:34;36534:1;36526:6;36522:14;36515:58;36607:13;36602:2;36594:6;36590:15;36583:38;36504:124;:::o;36634:176::-;36774:28;36770:1;36762:6;36758:14;36751:52;36740:70;:::o;36816:237::-;36956:34;36952:1;36944:6;36940:14;36933:58;37025:20;37020:2;37012:6;37008:15;37001:45;36922:131;:::o;37059:225::-;37199:34;37195:1;37187:6;37183:14;37176:58;37268:8;37263:2;37255:6;37251:15;37244:33;37165:119;:::o;37290:178::-;37430:30;37426:1;37418:6;37414:14;37407:54;37396:72;:::o;37474:162::-;37614:14;37610:1;37602:6;37598:14;37591:38;37580:56;:::o;37642:223::-;37782:34;37778:1;37770:6;37766:14;37759:58;37851:6;37846:2;37838:6;37834:15;37827:31;37748:117;:::o;37871:175::-;38011:27;38007:1;37999:6;37995:14;37988:51;37977:69;:::o;38052:231::-;38192:34;38188:1;38180:6;38176:14;38169:58;38261:14;38256:2;38248:6;38244:15;38237:39;38158:125;:::o;38289:158::-;38429:10;38425:1;38417:6;38413:14;38406:34;38395:52;:::o;38453:168::-;38593:20;38589:1;38581:6;38577:14;38570:44;38559:62;:::o;38627:243::-;38767:34;38763:1;38755:6;38751:14;38744:58;38836:26;38831:2;38823:6;38819:15;38812:51;38733:137;:::o;38876:229::-;39016:34;39012:1;39004:6;39000:14;38993:58;39085:12;39080:2;39072:6;39068:15;39061:37;38982:123;:::o;39111:228::-;39251:34;39247:1;39239:6;39235:14;39228:58;39320:11;39315:2;39307:6;39303:15;39296:36;39217:122;:::o;39345:233::-;39485:34;39481:1;39473:6;39469:14;39462:58;39554:16;39549:2;39541:6;39537:15;39530:41;39451:127;:::o;39584:182::-;39724:34;39720:1;39712:6;39708:14;39701:58;39690:76;:::o;39772:236::-;39912:34;39908:1;39900:6;39896:14;39889:58;39981:19;39976:2;39968:6;39964:15;39957:44;39878:130;:::o;40014:231::-;40154:34;40150:1;40142:6;40138:14;40131:58;40223:14;40218:2;40210:6;40206:15;40199:39;40120:125;:::o;40251:166::-;40391:18;40387:1;40379:6;40375:14;40368:42;40357:60;:::o;40423:182::-;40563:34;40559:1;40551:6;40547:14;40540:58;40529:76;:::o;40611:228::-;40751:34;40747:1;40739:6;40735:14;40728:58;40820:11;40815:2;40807:6;40803:15;40796:36;40717:122;:::o;40845:234::-;40985:34;40981:1;40973:6;40969:14;40962:58;41054:17;41049:2;41041:6;41037:15;41030:42;40951:128;:::o;41085:182::-;41225:34;41221:1;41213:6;41209:14;41202:58;41191:76;:::o;41273:220::-;41413:34;41409:1;41401:6;41397:14;41390:58;41482:3;41477:2;41469:6;41465:15;41458:28;41379:114;:::o;41499:236::-;41639:34;41635:1;41627:6;41623:14;41616:58;41708:19;41703:2;41695:6;41691:15;41684:44;41605:130;:::o;41741:231::-;41881:34;41877:1;41869:6;41865:14;41858:58;41950:14;41945:2;41937:6;41933:15;41926:39;41847:125;:::o;41978:122::-;42051:24;42069:5;42051:24;:::i;:::-;42044:5;42041:35;42031:2;;42090:1;42087;42080:12;42031:2;42021:79;:::o;42106:116::-;42176:21;42191:5;42176:21;:::i;:::-;42169:5;42166:32;42156:2;;42212:1;42209;42202:12;42156:2;42146:76;:::o;42228:120::-;42300:23;42317:5;42300:23;:::i;:::-;42293:5;42290:34;42280:2;;42338:1;42335;42328:12;42280:2;42270:78;:::o;42354:122::-;42427:24;42445:5;42427:24;:::i;:::-;42420:5;42417:35;42407:2;;42466:1;42463;42456:12;42407:2;42397:79;:::o
Swarm Source
ipfs://c17f7be2b6bf8cb3b16fafd3bf6273fa5e37216ab7b9468fe540fab944305abe
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.