Token
CoolNFT (CNFT)
ERC-721
Overview
Max Total Supply
0 CNFT
Holders
2
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
0 CNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
CoolNFT
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at mumbai.polygonscan.com on 2021-09-19 */ pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // 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}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. 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.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /** * @dev {ERC721} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * - token ID and URI autogeneration * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. */ contract ERC721CustomPresetMinterPauserAutoId is Context, AccessControlEnumerable, ERC721Enumerable, ERC721Burnable, ERC721Pausable { using Counters for Counters.Counter; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); Counters.Counter private _tokenIdTracker; string private _baseTokenURI; /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * Token URIs will be autogenerated based on `baseURI` and their token IDs. * See {ERC721-tokenURI}. */ constructor( string memory name, string memory symbol, string memory baseTokenURI ) ERC721(name, symbol) { _baseTokenURI = baseTokenURI; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } /** * @dev Creates a new token for `to`. Its token ID will be automatically * assigned (and available on the emitted {IERC721-Transfer} event), and the token * URI autogenerated based on the base URI passed at construction. * * See {ERC721-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC721CustomPresetMinterPauserAutoId: must have minter role to mint"); require((_tokenIdTracker.current() <= 10), "Maximum ammount of tokens will be allways 10"); // We cannot just use balanceOf to create the new tokenId because tokens // can be burned (destroyed), so we need a separate counter. _mint(to, _tokenIdTracker.current()); _tokenIdTracker.increment(); } /** * @dev Pauses all token transfers. * * See {ERC721Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721CustomPresetMinterPauserAutoId: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC721Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721CustomPresetMinterPauserAutoId: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } } contract CoolNFT is ERC721CustomPresetMinterPauserAutoId { constructor() ERC721CustomPresetMinterPauserAutoId("CoolNFT","CNFT","http://locomotion.com/id?={id}") { for(uint i = 1; i <= 10; i++){ mint(msg.sender); } } function bye() public{ require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "You must to have the admin role to destroy this contract."); address payable addr = payable(msg.sender); selfdestruct(addr); } }
[{"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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"bye","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":[{"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600781526020017f436f6f6c4e4654000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f434e4654000000000000000000000000000000000000000000000000000000008152506040518060400160405280601e81526020017f687474703a2f2f6c6f636f6d6f74696f6e2e636f6d2f69643f3d7b69647d000081525082828160029080519060200190620000ce92919062000e78565b508060039080519060200190620000e792919062000e78565b5050506000600c60006101000a81548160ff02191690831515021790555080600e90805190602001906200011d92919062000e78565b50620001426000801b620001366200020560201b60201c565b6200020d60201b60201c565b620001837f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001776200020560201b60201c565b6200020d60201b60201c565b620001c47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001b86200020560201b60201c565b6200020d60201b60201c565b5050506000600190505b600a8111620001fe57620001e8336200025560201b60201c565b8080620001f59062001327565b915050620001ce565b50620013d3565b600033905090565b6200022482826200037760201b620013dd1760201c565b6200025081600160008581526020019081526020016000206200038d60201b620013eb1790919060201c565b505050565b620002967f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66200028a6200020560201b60201c565b620003c560201b60201c565b620002d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002cf9062001194565b60405180910390fd5b600a620002f1600d6200042f60201b6200141b1760201c565b111562000335576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200032c906200121c565b60405180910390fd5b6200035d8162000351600d6200042f60201b6200141b1760201c565b6200043d60201b60201c565b62000374600d6200062360201b620014291760201c565b50565b6200038982826200063960201b60201c565b5050565b6000620003bd836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200072a60201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004b0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004a790620011fa565b60405180910390fd5b620004c181620007a460201b60201c565b1562000504576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004fb90620011b6565b60405180910390fd5b62000518600083836200081060201b60201c565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200056a91906200124f565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001816000016000828254019250508190555050565b6200064b8282620003c560201b60201c565b6200072657600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620006cb6200020560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200073e83836200082d60201b60201c565b620007995782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200079e565b600090505b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620008288383836200085060201b6200143f1760201c565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b62000868838383620008c060201b620014971760201c565b6200087862000a0760201b60201c565b15620008bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008b29062001172565b60405180910390fd5b505050565b620008d883838362000a1e60201b620015ab1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000925576200091f8162000a2360201b60201c565b6200096d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146200096c576200096b838262000a6c60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620009ba57620009b48162000be960201b60201c565b62000a02565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000a015762000a00828262000d3160201b60201c565b5b5b505050565b6000600c60009054906101000a900460ff16905090565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000a868462000dbd60201b62000d4a1760201c565b62000a929190620012ac565b905060006009600084815260200190815260200160002054905081811462000b78576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a8054905062000bff9190620012ac565b90506000600b60008481526020019081526020016000205490506000600a838154811062000c56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a838154811062000c9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548062000d15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000d498362000dbd60201b62000d4a1760201c565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e2890620011d8565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000e8690620012f1565b90600052602060002090601f01602090048101928262000eaa576000855562000ef6565b82601f1062000ec557805160ff191683800117855562000ef6565b8280016001018555821562000ef6579182015b8281111562000ef557825182559160200191906001019062000ed8565b5b50905062000f05919062000f09565b5090565b5b8082111562000f2457600081600090555060010162000f0a565b5090565b600062000f37602b836200123e565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b600062000f9f6043836200123e565b91507f455243373231437573746f6d5072657365744d696e746572506175736572417560008301527f746f49643a206d7573742068617665206d696e74657220726f6c6520746f206d60208301527f696e7400000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b60006200102d601c836200123e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006200106f602a836200123e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000620010d76020836200123e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600062001119602c836200123e565b91507f4d6178696d756d20616d6d6f756e74206f6620746f6b656e732077696c6c206260008301527f6520616c6c7761797320313000000000000000000000000000000000000000006020830152604082019050919050565b600060208201905081810360008301526200118d8162000f28565b9050919050565b60006020820190508181036000830152620011af8162000f90565b9050919050565b60006020820190508181036000830152620011d1816200101e565b9050919050565b60006020820190508181036000830152620011f38162001060565b9050919050565b600060208201905081810360008301526200121581620010c8565b9050919050565b6000602082019050818103600083015262001237816200110a565b9050919050565b600082825260208201905092915050565b60006200125c82620012e7565b91506200126983620012e7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620012a157620012a062001375565b5b828201905092915050565b6000620012b982620012e7565b9150620012c683620012e7565b925082821015620012dc57620012db62001375565b5b828203905092915050565b6000819050919050565b600060028204905060018216806200130a57607f821691505b60208210811415620013215762001320620013a4565b5b50919050565b60006200133482620012e7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200136a576200136962001375565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614a7e80620013e36000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80636a6278421161010f578063b88d4fde116100a2578063d547741f11610071578063d547741f146105c9578063e63ab1e9146105e5578063e71b8b9314610603578063e985e9c51461060d576101f0565b8063b88d4fde1461052f578063c87b56dd1461054b578063ca15c8731461057b578063d5391393146105ab576101f0565b806391d14854116100de57806391d14854146104a757806395d89b41146104d7578063a217fddf146104f5578063a22cb46514610513576101f0565b80636a6278421461042157806370a082311461043d5780638456cb591461046d5780639010d07c14610477576101f0565b80632f745c591161018757806342966c681161015657806342966c68146103875780634f6ccce7146103a35780635c975abb146103d35780636352211e146103f1576101f0565b80632f745c591461031557806336568abe146103455780633f4ba83a1461036157806342842e0e1461036b576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad578063248a9ca3146102c95780632f2ff15d146102f9576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a91906134f7565b61063d565b60405161021c91906141e6565b60405180910390f35b61022d61064f565b60405161023a919061421c565b60405180910390f35b61025d60048036038101906102589190613549565b6106e1565b60405161026a919061417f565b60405180910390f35b61028d6004803603810190610288919061341a565b610766565b005b61029761087e565b6040516102a4919061459e565b60405180910390f35b6102c760048036038101906102c29190613314565b61088b565b005b6102e360048036038101906102de9190613456565b6108eb565b6040516102f09190614201565b60405180910390f35b610313600480360381019061030e919061347f565b61090a565b005b61032f600480360381019061032a919061341a565b61093e565b60405161033c919061459e565b60405180910390f35b61035f600480360381019061035a919061347f565b6109e3565b005b610369610a17565b005b61038560048036038101906103809190613314565b610a91565b005b6103a1600480360381019061039c9190613549565b610ab1565b005b6103bd60048036038101906103b89190613549565b610b0d565b6040516103ca919061459e565b60405180910390f35b6103db610ba4565b6040516103e891906141e6565b60405180910390f35b61040b60048036038101906104069190613549565b610bbb565b604051610418919061417f565b60405180910390f35b61043b600480360381019061043691906132af565b610c6d565b005b610457600480360381019061045291906132af565b610d4a565b604051610464919061459e565b60405180910390f35b610475610e02565b005b610491600480360381019061048c91906134bb565b610e7c565b60405161049e919061417f565b60405180910390f35b6104c160048036038101906104bc919061347f565b610eab565b6040516104ce91906141e6565b60405180910390f35b6104df610f15565b6040516104ec919061421c565b60405180910390f35b6104fd610fa7565b60405161050a9190614201565b60405180910390f35b61052d600480360381019061052891906133de565b610fae565b005b61054960048036038101906105449190613363565b61112f565b005b61056560048036038101906105609190613549565b611191565b604051610572919061421c565b60405180910390f35b61059560048036038101906105909190613456565b611238565b6040516105a2919061459e565b60405180910390f35b6105b361125c565b6040516105c09190614201565b60405180910390f35b6105e360048036038101906105de919061347f565b611280565b005b6105ed6112b4565b6040516105fa9190614201565b60405180910390f35b61060b6112d8565b005b610627600480360381019061062291906132d8565b611349565b60405161063491906141e6565b60405180910390f35b6000610648826115b0565b9050919050565b60606002805461065e9061485c565b80601f016020809104026020016040519081016040528092919081815260200182805461068a9061485c565b80156106d75780601f106106ac576101008083540402835291602001916106d7565b820191906000526020600020905b8154815290600101906020018083116106ba57829003601f168201915b5050505050905090565b60006106ec8261162a565b61072b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107229061445e565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077182610bbb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d9906144de565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610801611696565b73ffffffffffffffffffffffffffffffffffffffff161480610830575061082f8161082a611696565b611349565b5b61086f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610866906143be565b60405180910390fd5b610879838361169e565b505050565b6000600a80549050905090565b61089c610896611696565b82611757565b6108db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d2906144fe565b60405180910390fd5b6108e6838383611835565b505050565b6000806000838152602001908152602001600020600101549050919050565b6109148282611a91565b61093981600160008581526020019081526020016000206113eb90919063ffffffff16565b505050565b600061094983610d4a565b821061098a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610981906142be565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109ed8282611aba565b610a128160016000858152602001908152602001600020611b3d90919063ffffffff16565b505050565b610a487f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a43611696565b610eab565b610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e906144be565b60405180910390fd5b610a8f611b6d565b565b610aac8383836040518060200160405280600081525061112f565b505050565b610ac2610abc611696565b82611757565b610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af89061453e565b60405180910390fd5b610b0a81611c0f565b50565b6000610b1761087e565b8210610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f9061451e565b60405180910390fd5b600a8281548110610b92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600c60009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143fe565b60405180910390fd5b80915050919050565b610c9e7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610c99611696565b610eab565b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd4906142fe565b60405180910390fd5b600a610ce9600d61141b565b1115610d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d219061455e565b60405180910390fd5b610d3d81610d38600d61141b565b611d20565b610d47600d611429565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db2906143de565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e337f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e2e611696565b610eab565b610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e699061429e565b60405180910390fd5b610e7a611eee565b565b6000610ea38260016000868152602001908152602001600020611f9190919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610f249061485c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f509061485c565b8015610f9d5780601f10610f7257610100808354040283529160200191610f9d565b820191906000526020600020905b815481529060010190602001808311610f8057829003601f168201915b5050505050905090565b6000801b81565b610fb6611696565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101b9061435e565b60405180910390fd5b8060076000611031611696565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110de611696565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161112391906141e6565b60405180910390a35050565b61114061113a611696565b83611757565b61117f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611176906144fe565b60405180910390fd5b61118b84848484611fab565b50505050565b606061119c8261162a565b6111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d29061449e565b60405180910390fd5b60006111e5612007565b905060008151116112055760405180602001604052806000815250611230565b8061120f84612099565b604051602001611220929190614121565b6040516020818303038152906040525b915050919050565b600061125560016000848152602001908152602001600020612246565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61128a828261225b565b6112af8160016000858152602001908152602001600020611b3d90919063ffffffff16565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6112ec6000801b6112e7611696565b610eab565b61132b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113229061441e565b60405180910390fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff16ff5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113e78282612284565b5050565b6000611413836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612364565b905092915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61144a838383611497565b611452610ba4565b15611492576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114899061425e565b60405180910390fd5b505050565b6114a28383836115ab565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114e5576114e0816123d4565b611524565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461152357611522838261241d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611567576115628161258a565b6115a6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146115a5576115a482826126cd565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061162357506116228261274c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661171183610bbb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117628261162a565b6117a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117989061437e565b60405180910390fd5b60006117ac83610bbb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061181b57508373ffffffffffffffffffffffffffffffffffffffff16611803846106e1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061182c575061182b8185611349565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661185582610bbb565b73ffffffffffffffffffffffffffffffffffffffff16146118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a29061447e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561191b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119129061433e565b60405180910390fd5b61192683838361282e565b61193160008261169e565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611981919061473e565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119d8919061465d565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a9a826108eb565b611aab81611aa6611696565b61283e565b611ab58383612284565b505050565b611ac2611696565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b269061457e565b60405180910390fd5b611b3982826128db565b5050565b6000611b65836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6129bc565b905092915050565b611b75610ba4565b611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab9061427e565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611bf8611696565b604051611c05919061417f565b60405180910390a1565b6000611c1a82610bbb565b9050611c288160008461282e565b611c3360008361169e565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c83919061473e565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d879061443e565b60405180910390fd5b611d998161162a565b15611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd09061431e565b60405180910390fd5b611de56000838361282e565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e35919061465d565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611ef6610ba4565b15611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061439e565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f7a611696565b604051611f87919061417f565b60405180910390a1565b6000611fa08360000183612b42565b60001c905092915050565b611fb6848484611835565b611fc284848484612b93565b612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff8906142de565b60405180910390fd5b50505050565b6060600e80546120169061485c565b80601f01602080910402602001604051908101604052809291908181526020018280546120429061485c565b801561208f5780601f106120645761010080835404028352916020019161208f565b820191906000526020600020905b81548152906001019060200180831161207257829003601f168201915b5050505050905090565b606060008214156120e1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612241565b600082905060005b600082146121135780806120fc9061488e565b915050600a8261210c91906146b3565b91506120e9565b60008167ffffffffffffffff811115612155577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121875781602001600182028036833780820191505090505b5090505b6000851461223a576001826121a0919061473e565b9150600a856121af91906148d7565b60306121bb919061465d565b60f81b8183815181106121f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561223391906146b3565b945061218b565b8093505050505b919050565b600061225482600001612d2a565b9050919050565b612264826108eb565b61227581612270611696565b61283e565b61227f83836128db565b505050565b61228e8282610eab565b61236057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612305611696565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006123708383612d3b565b6123c95782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506123ce565b600090505b92915050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161242a84610d4a565b612434919061473e565b9050600060096000848152602001908152602001600020549050818114612519576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a8054905061259e919061473e565b90506000600b60008481526020019081526020016000205490506000600a83815481106125f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a838154811061263c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a8054806126b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006126d883610d4a565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061281757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612827575061282682612d5e565b5b9050919050565b61283983838361143f565b505050565b6128488282610eab565b6128d75761286d8173ffffffffffffffffffffffffffffffffffffffff166014612dd8565b61287b8360001c6020612dd8565b60405160200161288c929190614145565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ce919061421c565b60405180910390fd5b5050565b6128e58282610eab565b156129b857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061295d611696565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612b365760006001826129ee919061473e565b9050600060018660000180549050612a06919061473e565b9050818114612ac1576000866000018281548110612a4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612a97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612afb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612b3c565b60009150505b92915050565b6000826000018281548110612b80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b6000612bb48473ffffffffffffffffffffffffffffffffffffffff166130d2565b15612d1d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bdd611696565b8786866040518563ffffffff1660e01b8152600401612bff949392919061419a565b602060405180830381600087803b158015612c1957600080fd5b505af1925050508015612c4a57506040513d601f19601f82011682018060405250810190612c479190613520565b60015b612ccd573d8060008114612c7a576040519150601f19603f3d011682016040523d82523d6000602084013e612c7f565b606091505b50600081511415612cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbc906142de565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d22565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612dd15750612dd0826130e5565b5b9050919050565b606060006002836002612deb91906146e4565b612df5919061465d565b67ffffffffffffffff811115612e34577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e665781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612ec4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612f4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612f8e91906146e4565b612f98919061465d565b90505b6001811115613084577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613000577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811061303d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061307d90614832565b9050612f9b565b50600084146130c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bf9061423e565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061315857506131578261315f565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006131dc6131d7846145ea565b6145b9565b9050828152602081018484840111156131f457600080fd5b6131ff8482856147f0565b509392505050565b600081359050613216816149d5565b92915050565b60008135905061322b816149ec565b92915050565b60008135905061324081614a03565b92915050565b60008135905061325581614a1a565b92915050565b60008151905061326a81614a1a565b92915050565b600082601f83011261328157600080fd5b81356132918482602086016131c9565b91505092915050565b6000813590506132a981614a31565b92915050565b6000602082840312156132c157600080fd5b60006132cf84828501613207565b91505092915050565b600080604083850312156132eb57600080fd5b60006132f985828601613207565b925050602061330a85828601613207565b9150509250929050565b60008060006060848603121561332957600080fd5b600061333786828701613207565b935050602061334886828701613207565b92505060406133598682870161329a565b9150509250925092565b6000806000806080858703121561337957600080fd5b600061338787828801613207565b945050602061339887828801613207565b93505060406133a98782880161329a565b925050606085013567ffffffffffffffff8111156133c657600080fd5b6133d287828801613270565b91505092959194509250565b600080604083850312156133f157600080fd5b60006133ff85828601613207565b92505060206134108582860161321c565b9150509250929050565b6000806040838503121561342d57600080fd5b600061343b85828601613207565b925050602061344c8582860161329a565b9150509250929050565b60006020828403121561346857600080fd5b600061347684828501613231565b91505092915050565b6000806040838503121561349257600080fd5b60006134a085828601613231565b92505060206134b185828601613207565b9150509250929050565b600080604083850312156134ce57600080fd5b60006134dc85828601613231565b92505060206134ed8582860161329a565b9150509250929050565b60006020828403121561350957600080fd5b600061351784828501613246565b91505092915050565b60006020828403121561353257600080fd5b60006135408482850161325b565b91505092915050565b60006020828403121561355b57600080fd5b60006135698482850161329a565b91505092915050565b61357b81614772565b82525050565b61358a81614784565b82525050565b61359981614790565b82525050565b60006135aa8261461a565b6135b48185614630565b93506135c48185602086016147ff565b6135cd816149c4565b840191505092915050565b60006135e382614625565b6135ed8185614641565b93506135fd8185602086016147ff565b613606816149c4565b840191505092915050565b600061361c82614625565b6136268185614652565b93506136368185602086016147ff565b80840191505092915050565b600061364f602083614641565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b600061368f602b83614641565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006136f5601483614641565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613735604483614641565b91507f455243373231437573746f6d5072657365744d696e746572506175736572417560008301527f746f49643a206d75737420686176652070617573657220726f6c6520746f207060208301527f61757365000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b60006137c1602b83614641565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613827603283614641565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061388d604383614641565b91507f455243373231437573746f6d5072657365744d696e746572506175736572417560008301527f746f49643a206d7573742068617665206d696e74657220726f6c6520746f206d60208301527f696e7400000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613919601c83614641565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613959602483614641565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139bf601983614641565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006139ff602c83614641565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a65601083614641565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613aa5603883614641565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613b0b602a83614641565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b71602983614641565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bd7603983614641565b91507f596f75206d75737420746f2068617665207468652061646d696e20726f6c652060008301527f746f2064657374726f79207468697320636f6e74726163742e000000000000006020830152604082019050919050565b6000613c3d602083614641565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613c7d602c83614641565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ce3602983614641565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d49602f83614641565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613daf604683614641565b91507f455243373231437573746f6d5072657365744d696e746572506175736572417560008301527f746f49643a206d75737420686176652070617573657220726f6c6520746f207560208301527f6e706175736500000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613e3b602183614641565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ea1603183614641565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613f07602c83614641565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613f6d601783614652565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b6000613fad603083614641565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b6000614013602c83614641565b91507f4d6178696d756d20616d6d6f756e74206f6620746f6b656e732077696c6c206260008301527f6520616c6c7761797320313000000000000000000000000000000000000000006020830152604082019050919050565b6000614079601183614652565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006140b9602f83614641565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61411b816147e6565b82525050565b600061412d8285613611565b91506141398284613611565b91508190509392505050565b600061415082613f60565b915061415c8285613611565b91506141678261406c565b91506141738284613611565b91508190509392505050565b60006020820190506141946000830184613572565b92915050565b60006080820190506141af6000830187613572565b6141bc6020830186613572565b6141c96040830185614112565b81810360608301526141db818461359f565b905095945050505050565b60006020820190506141fb6000830184613581565b92915050565b60006020820190506142166000830184613590565b92915050565b6000602082019050818103600083015261423681846135d8565b905092915050565b6000602082019050818103600083015261425781613642565b9050919050565b6000602082019050818103600083015261427781613682565b9050919050565b60006020820190508181036000830152614297816136e8565b9050919050565b600060208201905081810360008301526142b781613728565b9050919050565b600060208201905081810360008301526142d7816137b4565b9050919050565b600060208201905081810360008301526142f78161381a565b9050919050565b6000602082019050818103600083015261431781613880565b9050919050565b600060208201905081810360008301526143378161390c565b9050919050565b600060208201905081810360008301526143578161394c565b9050919050565b60006020820190508181036000830152614377816139b2565b9050919050565b60006020820190508181036000830152614397816139f2565b9050919050565b600060208201905081810360008301526143b781613a58565b9050919050565b600060208201905081810360008301526143d781613a98565b9050919050565b600060208201905081810360008301526143f781613afe565b9050919050565b6000602082019050818103600083015261441781613b64565b9050919050565b6000602082019050818103600083015261443781613bca565b9050919050565b6000602082019050818103600083015261445781613c30565b9050919050565b6000602082019050818103600083015261447781613c70565b9050919050565b6000602082019050818103600083015261449781613cd6565b9050919050565b600060208201905081810360008301526144b781613d3c565b9050919050565b600060208201905081810360008301526144d781613da2565b9050919050565b600060208201905081810360008301526144f781613e2e565b9050919050565b6000602082019050818103600083015261451781613e94565b9050919050565b6000602082019050818103600083015261453781613efa565b9050919050565b6000602082019050818103600083015261455781613fa0565b9050919050565b6000602082019050818103600083015261457781614006565b9050919050565b60006020820190508181036000830152614597816140ac565b9050919050565b60006020820190506145b36000830184614112565b92915050565b6000604051905081810181811067ffffffffffffffff821117156145e0576145df614995565b5b8060405250919050565b600067ffffffffffffffff82111561460557614604614995565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614668826147e6565b9150614673836147e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146a8576146a7614908565b5b828201905092915050565b60006146be826147e6565b91506146c9836147e6565b9250826146d9576146d8614937565b5b828204905092915050565b60006146ef826147e6565b91506146fa836147e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561473357614732614908565b5b828202905092915050565b6000614749826147e6565b9150614754836147e6565b92508282101561476757614766614908565b5b828203905092915050565b600061477d826147c6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561481d578082015181840152602081019050614802565b8381111561482c576000848401525b50505050565b600061483d826147e6565b9150600082141561485157614850614908565b5b600182039050919050565b6000600282049050600182168061487457607f821691505b6020821081141561488857614887614966565b5b50919050565b6000614899826147e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148cc576148cb614908565b5b600182019050919050565b60006148e2826147e6565b91506148ed836147e6565b9250826148fd576148fc614937565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6149de81614772565b81146149e957600080fd5b50565b6149f581614784565b8114614a0057600080fd5b50565b614a0c81614790565b8114614a1757600080fd5b50565b614a238161479a565b8114614a2e57600080fd5b50565b614a3a816147e6565b8114614a4557600080fd5b5056fea2646970667358221220fb2bcd6debc0614d6b6285516d8766d58515413b123eae0dca968f43432536a164736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80636a6278421161010f578063b88d4fde116100a2578063d547741f11610071578063d547741f146105c9578063e63ab1e9146105e5578063e71b8b9314610603578063e985e9c51461060d576101f0565b8063b88d4fde1461052f578063c87b56dd1461054b578063ca15c8731461057b578063d5391393146105ab576101f0565b806391d14854116100de57806391d14854146104a757806395d89b41146104d7578063a217fddf146104f5578063a22cb46514610513576101f0565b80636a6278421461042157806370a082311461043d5780638456cb591461046d5780639010d07c14610477576101f0565b80632f745c591161018757806342966c681161015657806342966c68146103875780634f6ccce7146103a35780635c975abb146103d35780636352211e146103f1576101f0565b80632f745c591461031557806336568abe146103455780633f4ba83a1461036157806342842e0e1461036b576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad578063248a9ca3146102c95780632f2ff15d146102f9576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a91906134f7565b61063d565b60405161021c91906141e6565b60405180910390f35b61022d61064f565b60405161023a919061421c565b60405180910390f35b61025d60048036038101906102589190613549565b6106e1565b60405161026a919061417f565b60405180910390f35b61028d6004803603810190610288919061341a565b610766565b005b61029761087e565b6040516102a4919061459e565b60405180910390f35b6102c760048036038101906102c29190613314565b61088b565b005b6102e360048036038101906102de9190613456565b6108eb565b6040516102f09190614201565b60405180910390f35b610313600480360381019061030e919061347f565b61090a565b005b61032f600480360381019061032a919061341a565b61093e565b60405161033c919061459e565b60405180910390f35b61035f600480360381019061035a919061347f565b6109e3565b005b610369610a17565b005b61038560048036038101906103809190613314565b610a91565b005b6103a1600480360381019061039c9190613549565b610ab1565b005b6103bd60048036038101906103b89190613549565b610b0d565b6040516103ca919061459e565b60405180910390f35b6103db610ba4565b6040516103e891906141e6565b60405180910390f35b61040b60048036038101906104069190613549565b610bbb565b604051610418919061417f565b60405180910390f35b61043b600480360381019061043691906132af565b610c6d565b005b610457600480360381019061045291906132af565b610d4a565b604051610464919061459e565b60405180910390f35b610475610e02565b005b610491600480360381019061048c91906134bb565b610e7c565b60405161049e919061417f565b60405180910390f35b6104c160048036038101906104bc919061347f565b610eab565b6040516104ce91906141e6565b60405180910390f35b6104df610f15565b6040516104ec919061421c565b60405180910390f35b6104fd610fa7565b60405161050a9190614201565b60405180910390f35b61052d600480360381019061052891906133de565b610fae565b005b61054960048036038101906105449190613363565b61112f565b005b61056560048036038101906105609190613549565b611191565b604051610572919061421c565b60405180910390f35b61059560048036038101906105909190613456565b611238565b6040516105a2919061459e565b60405180910390f35b6105b361125c565b6040516105c09190614201565b60405180910390f35b6105e360048036038101906105de919061347f565b611280565b005b6105ed6112b4565b6040516105fa9190614201565b60405180910390f35b61060b6112d8565b005b610627600480360381019061062291906132d8565b611349565b60405161063491906141e6565b60405180910390f35b6000610648826115b0565b9050919050565b60606002805461065e9061485c565b80601f016020809104026020016040519081016040528092919081815260200182805461068a9061485c565b80156106d75780601f106106ac576101008083540402835291602001916106d7565b820191906000526020600020905b8154815290600101906020018083116106ba57829003601f168201915b5050505050905090565b60006106ec8261162a565b61072b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107229061445e565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077182610bbb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d9906144de565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610801611696565b73ffffffffffffffffffffffffffffffffffffffff161480610830575061082f8161082a611696565b611349565b5b61086f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610866906143be565b60405180910390fd5b610879838361169e565b505050565b6000600a80549050905090565b61089c610896611696565b82611757565b6108db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d2906144fe565b60405180910390fd5b6108e6838383611835565b505050565b6000806000838152602001908152602001600020600101549050919050565b6109148282611a91565b61093981600160008581526020019081526020016000206113eb90919063ffffffff16565b505050565b600061094983610d4a565b821061098a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610981906142be565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109ed8282611aba565b610a128160016000858152602001908152602001600020611b3d90919063ffffffff16565b505050565b610a487f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a43611696565b610eab565b610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e906144be565b60405180910390fd5b610a8f611b6d565b565b610aac8383836040518060200160405280600081525061112f565b505050565b610ac2610abc611696565b82611757565b610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af89061453e565b60405180910390fd5b610b0a81611c0f565b50565b6000610b1761087e565b8210610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f9061451e565b60405180910390fd5b600a8281548110610b92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600c60009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143fe565b60405180910390fd5b80915050919050565b610c9e7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610c99611696565b610eab565b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd4906142fe565b60405180910390fd5b600a610ce9600d61141b565b1115610d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d219061455e565b60405180910390fd5b610d3d81610d38600d61141b565b611d20565b610d47600d611429565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db2906143de565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e337f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e2e611696565b610eab565b610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e699061429e565b60405180910390fd5b610e7a611eee565b565b6000610ea38260016000868152602001908152602001600020611f9190919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610f249061485c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f509061485c565b8015610f9d5780601f10610f7257610100808354040283529160200191610f9d565b820191906000526020600020905b815481529060010190602001808311610f8057829003601f168201915b5050505050905090565b6000801b81565b610fb6611696565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101b9061435e565b60405180910390fd5b8060076000611031611696565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110de611696565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161112391906141e6565b60405180910390a35050565b61114061113a611696565b83611757565b61117f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611176906144fe565b60405180910390fd5b61118b84848484611fab565b50505050565b606061119c8261162a565b6111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d29061449e565b60405180910390fd5b60006111e5612007565b905060008151116112055760405180602001604052806000815250611230565b8061120f84612099565b604051602001611220929190614121565b6040516020818303038152906040525b915050919050565b600061125560016000848152602001908152602001600020612246565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61128a828261225b565b6112af8160016000858152602001908152602001600020611b3d90919063ffffffff16565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6112ec6000801b6112e7611696565b610eab565b61132b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113229061441e565b60405180910390fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff16ff5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113e78282612284565b5050565b6000611413836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612364565b905092915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61144a838383611497565b611452610ba4565b15611492576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114899061425e565b60405180910390fd5b505050565b6114a28383836115ab565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114e5576114e0816123d4565b611524565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461152357611522838261241d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611567576115628161258a565b6115a6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146115a5576115a482826126cd565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061162357506116228261274c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661171183610bbb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117628261162a565b6117a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117989061437e565b60405180910390fd5b60006117ac83610bbb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061181b57508373ffffffffffffffffffffffffffffffffffffffff16611803846106e1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061182c575061182b8185611349565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661185582610bbb565b73ffffffffffffffffffffffffffffffffffffffff16146118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a29061447e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561191b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119129061433e565b60405180910390fd5b61192683838361282e565b61193160008261169e565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611981919061473e565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119d8919061465d565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a9a826108eb565b611aab81611aa6611696565b61283e565b611ab58383612284565b505050565b611ac2611696565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b269061457e565b60405180910390fd5b611b3982826128db565b5050565b6000611b65836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6129bc565b905092915050565b611b75610ba4565b611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab9061427e565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611bf8611696565b604051611c05919061417f565b60405180910390a1565b6000611c1a82610bbb565b9050611c288160008461282e565b611c3360008361169e565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c83919061473e565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d879061443e565b60405180910390fd5b611d998161162a565b15611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd09061431e565b60405180910390fd5b611de56000838361282e565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e35919061465d565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611ef6610ba4565b15611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061439e565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f7a611696565b604051611f87919061417f565b60405180910390a1565b6000611fa08360000183612b42565b60001c905092915050565b611fb6848484611835565b611fc284848484612b93565b612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff8906142de565b60405180910390fd5b50505050565b6060600e80546120169061485c565b80601f01602080910402602001604051908101604052809291908181526020018280546120429061485c565b801561208f5780601f106120645761010080835404028352916020019161208f565b820191906000526020600020905b81548152906001019060200180831161207257829003601f168201915b5050505050905090565b606060008214156120e1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612241565b600082905060005b600082146121135780806120fc9061488e565b915050600a8261210c91906146b3565b91506120e9565b60008167ffffffffffffffff811115612155577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121875781602001600182028036833780820191505090505b5090505b6000851461223a576001826121a0919061473e565b9150600a856121af91906148d7565b60306121bb919061465d565b60f81b8183815181106121f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561223391906146b3565b945061218b565b8093505050505b919050565b600061225482600001612d2a565b9050919050565b612264826108eb565b61227581612270611696565b61283e565b61227f83836128db565b505050565b61228e8282610eab565b61236057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612305611696565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006123708383612d3b565b6123c95782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506123ce565b600090505b92915050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161242a84610d4a565b612434919061473e565b9050600060096000848152602001908152602001600020549050818114612519576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a8054905061259e919061473e565b90506000600b60008481526020019081526020016000205490506000600a83815481106125f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a838154811061263c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a8054806126b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006126d883610d4a565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061281757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612827575061282682612d5e565b5b9050919050565b61283983838361143f565b505050565b6128488282610eab565b6128d75761286d8173ffffffffffffffffffffffffffffffffffffffff166014612dd8565b61287b8360001c6020612dd8565b60405160200161288c929190614145565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ce919061421c565b60405180910390fd5b5050565b6128e58282610eab565b156129b857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061295d611696565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612b365760006001826129ee919061473e565b9050600060018660000180549050612a06919061473e565b9050818114612ac1576000866000018281548110612a4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612a97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612afb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612b3c565b60009150505b92915050565b6000826000018281548110612b80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b6000612bb48473ffffffffffffffffffffffffffffffffffffffff166130d2565b15612d1d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bdd611696565b8786866040518563ffffffff1660e01b8152600401612bff949392919061419a565b602060405180830381600087803b158015612c1957600080fd5b505af1925050508015612c4a57506040513d601f19601f82011682018060405250810190612c479190613520565b60015b612ccd573d8060008114612c7a576040519150601f19603f3d011682016040523d82523d6000602084013e612c7f565b606091505b50600081511415612cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbc906142de565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d22565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612dd15750612dd0826130e5565b5b9050919050565b606060006002836002612deb91906146e4565b612df5919061465d565b67ffffffffffffffff811115612e34577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e665781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612ec4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612f4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612f8e91906146e4565b612f98919061465d565b90505b6001811115613084577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613000577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811061303d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061307d90614832565b9050612f9b565b50600084146130c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bf9061423e565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061315857506131578261315f565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006131dc6131d7846145ea565b6145b9565b9050828152602081018484840111156131f457600080fd5b6131ff8482856147f0565b509392505050565b600081359050613216816149d5565b92915050565b60008135905061322b816149ec565b92915050565b60008135905061324081614a03565b92915050565b60008135905061325581614a1a565b92915050565b60008151905061326a81614a1a565b92915050565b600082601f83011261328157600080fd5b81356132918482602086016131c9565b91505092915050565b6000813590506132a981614a31565b92915050565b6000602082840312156132c157600080fd5b60006132cf84828501613207565b91505092915050565b600080604083850312156132eb57600080fd5b60006132f985828601613207565b925050602061330a85828601613207565b9150509250929050565b60008060006060848603121561332957600080fd5b600061333786828701613207565b935050602061334886828701613207565b92505060406133598682870161329a565b9150509250925092565b6000806000806080858703121561337957600080fd5b600061338787828801613207565b945050602061339887828801613207565b93505060406133a98782880161329a565b925050606085013567ffffffffffffffff8111156133c657600080fd5b6133d287828801613270565b91505092959194509250565b600080604083850312156133f157600080fd5b60006133ff85828601613207565b92505060206134108582860161321c565b9150509250929050565b6000806040838503121561342d57600080fd5b600061343b85828601613207565b925050602061344c8582860161329a565b9150509250929050565b60006020828403121561346857600080fd5b600061347684828501613231565b91505092915050565b6000806040838503121561349257600080fd5b60006134a085828601613231565b92505060206134b185828601613207565b9150509250929050565b600080604083850312156134ce57600080fd5b60006134dc85828601613231565b92505060206134ed8582860161329a565b9150509250929050565b60006020828403121561350957600080fd5b600061351784828501613246565b91505092915050565b60006020828403121561353257600080fd5b60006135408482850161325b565b91505092915050565b60006020828403121561355b57600080fd5b60006135698482850161329a565b91505092915050565b61357b81614772565b82525050565b61358a81614784565b82525050565b61359981614790565b82525050565b60006135aa8261461a565b6135b48185614630565b93506135c48185602086016147ff565b6135cd816149c4565b840191505092915050565b60006135e382614625565b6135ed8185614641565b93506135fd8185602086016147ff565b613606816149c4565b840191505092915050565b600061361c82614625565b6136268185614652565b93506136368185602086016147ff565b80840191505092915050565b600061364f602083614641565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b600061368f602b83614641565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006136f5601483614641565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613735604483614641565b91507f455243373231437573746f6d5072657365744d696e746572506175736572417560008301527f746f49643a206d75737420686176652070617573657220726f6c6520746f207060208301527f61757365000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b60006137c1602b83614641565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613827603283614641565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061388d604383614641565b91507f455243373231437573746f6d5072657365744d696e746572506175736572417560008301527f746f49643a206d7573742068617665206d696e74657220726f6c6520746f206d60208301527f696e7400000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613919601c83614641565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613959602483614641565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139bf601983614641565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006139ff602c83614641565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a65601083614641565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613aa5603883614641565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613b0b602a83614641565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b71602983614641565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bd7603983614641565b91507f596f75206d75737420746f2068617665207468652061646d696e20726f6c652060008301527f746f2064657374726f79207468697320636f6e74726163742e000000000000006020830152604082019050919050565b6000613c3d602083614641565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613c7d602c83614641565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ce3602983614641565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d49602f83614641565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613daf604683614641565b91507f455243373231437573746f6d5072657365744d696e746572506175736572417560008301527f746f49643a206d75737420686176652070617573657220726f6c6520746f207560208301527f6e706175736500000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613e3b602183614641565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ea1603183614641565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613f07602c83614641565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613f6d601783614652565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b6000613fad603083614641565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b6000614013602c83614641565b91507f4d6178696d756d20616d6d6f756e74206f6620746f6b656e732077696c6c206260008301527f6520616c6c7761797320313000000000000000000000000000000000000000006020830152604082019050919050565b6000614079601183614652565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006140b9602f83614641565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61411b816147e6565b82525050565b600061412d8285613611565b91506141398284613611565b91508190509392505050565b600061415082613f60565b915061415c8285613611565b91506141678261406c565b91506141738284613611565b91508190509392505050565b60006020820190506141946000830184613572565b92915050565b60006080820190506141af6000830187613572565b6141bc6020830186613572565b6141c96040830185614112565b81810360608301526141db818461359f565b905095945050505050565b60006020820190506141fb6000830184613581565b92915050565b60006020820190506142166000830184613590565b92915050565b6000602082019050818103600083015261423681846135d8565b905092915050565b6000602082019050818103600083015261425781613642565b9050919050565b6000602082019050818103600083015261427781613682565b9050919050565b60006020820190508181036000830152614297816136e8565b9050919050565b600060208201905081810360008301526142b781613728565b9050919050565b600060208201905081810360008301526142d7816137b4565b9050919050565b600060208201905081810360008301526142f78161381a565b9050919050565b6000602082019050818103600083015261431781613880565b9050919050565b600060208201905081810360008301526143378161390c565b9050919050565b600060208201905081810360008301526143578161394c565b9050919050565b60006020820190508181036000830152614377816139b2565b9050919050565b60006020820190508181036000830152614397816139f2565b9050919050565b600060208201905081810360008301526143b781613a58565b9050919050565b600060208201905081810360008301526143d781613a98565b9050919050565b600060208201905081810360008301526143f781613afe565b9050919050565b6000602082019050818103600083015261441781613b64565b9050919050565b6000602082019050818103600083015261443781613bca565b9050919050565b6000602082019050818103600083015261445781613c30565b9050919050565b6000602082019050818103600083015261447781613c70565b9050919050565b6000602082019050818103600083015261449781613cd6565b9050919050565b600060208201905081810360008301526144b781613d3c565b9050919050565b600060208201905081810360008301526144d781613da2565b9050919050565b600060208201905081810360008301526144f781613e2e565b9050919050565b6000602082019050818103600083015261451781613e94565b9050919050565b6000602082019050818103600083015261453781613efa565b9050919050565b6000602082019050818103600083015261455781613fa0565b9050919050565b6000602082019050818103600083015261457781614006565b9050919050565b60006020820190508181036000830152614597816140ac565b9050919050565b60006020820190506145b36000830184614112565b92915050565b6000604051905081810181811067ffffffffffffffff821117156145e0576145df614995565b5b8060405250919050565b600067ffffffffffffffff82111561460557614604614995565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614668826147e6565b9150614673836147e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146a8576146a7614908565b5b828201905092915050565b60006146be826147e6565b91506146c9836147e6565b9250826146d9576146d8614937565b5b828204905092915050565b60006146ef826147e6565b91506146fa836147e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561473357614732614908565b5b828202905092915050565b6000614749826147e6565b9150614754836147e6565b92508282101561476757614766614908565b5b828203905092915050565b600061477d826147c6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561481d578082015181840152602081019050614802565b8381111561482c576000848401525b50505050565b600061483d826147e6565b9150600082141561485157614850614908565b5b600182039050919050565b6000600282049050600182168061487457607f821691505b6020821081141561488857614887614966565b5b50919050565b6000614899826147e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148cc576148cb614908565b5b600182019050919050565b60006148e2826147e6565b91506148ed836147e6565b9250826148fd576148fc614937565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6149de81614772565b81146149e957600080fd5b50565b6149f581614784565b8114614a0057600080fd5b50565b614a0c81614790565b8114614a1757600080fd5b50565b614a238161479a565b8114614a2e57600080fd5b50565b614a3a816147e6565b8114614a4557600080fd5b5056fea2646970667358221220fb2bcd6debc0614d6b6285516d8766d58515413b123eae0dca968f43432536a164736f6c63430008000033
Deployed Bytecode Sourcemap
74921:502:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74660:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20753:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22312:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21835:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34261:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23202:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51105:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68469:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33929:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69054:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74150:191;;;:::i;:::-;;23612:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40112:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34451:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41347:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20447:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73019:512;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20177:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73746:185;;;:::i;:::-;;67924:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49990:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20922:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49081:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22605:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23868:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21097:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68243:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71682:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68758:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71751:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75187:233;;;:::i;:::-;;22971:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74660:254;74841:4;74870:36;74894:11;74870:23;:36::i;:::-;74863:43;;74660:254;;;:::o;20753:100::-;20807:13;20840:5;20833:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20753:100;:::o;22312:221::-;22388:7;22416:16;22424:7;22416;:16::i;:::-;22408:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22501:15;:24;22517:7;22501:24;;;;;;;;;;;;;;;;;;;;;22494:31;;22312:221;;;:::o;21835:411::-;21916:13;21932:23;21947:7;21932:14;:23::i;:::-;21916:39;;21980:5;21974:11;;:2;:11;;;;21966:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22074:5;22058:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22083:37;22100:5;22107:12;:10;:12::i;:::-;22083:16;:37::i;:::-;22058:62;22036:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22217:21;22226:2;22230:7;22217:8;:21::i;:::-;21835:411;;;:::o;34261:113::-;34322:7;34349:10;:17;;;;34342:24;;34261:113;:::o;23202:339::-;23397:41;23416:12;:10;:12::i;:::-;23430:7;23397:18;:41::i;:::-;23389:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23505:28;23515:4;23521:2;23525:7;23505:9;:28::i;:::-;23202:339;;;:::o;51105:123::-;51171:7;51198:6;:12;51205:4;51198:12;;;;;;;;;;;:22;;;51191:29;;51105:123;;;:::o;68469:196::-;68585:30;68601:4;68607:7;68585:15;:30::i;:::-;68626:31;68649:7;68626:12;:18;68639:4;68626:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;68469:196;;:::o;33929:256::-;34026:7;34062:23;34079:5;34062:16;:23::i;:::-;34054:5;:31;34046:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34151:12;:19;34164:5;34151:19;;;;;;;;;;;;;;;:26;34171:5;34151:26;;;;;;;;;;;;34144:33;;33929:256;;;;:::o;69054:205::-;69173:33;69192:4;69198:7;69173:18;:33::i;:::-;69217:34;69243:7;69217:12;:18;69230:4;69217:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;69054:205;;:::o;74150:191::-;74203:34;71789:24;74224:12;:10;:12::i;:::-;74203:7;:34::i;:::-;74195:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;74323:10;:8;:10::i;:::-;74150:191::o;23612:185::-;23750:39;23767:4;23773:2;23777:7;23750:39;;;;;;;;;;;;:16;:39::i;:::-;23612:185;;;:::o;40112:245::-;40230:41;40249:12;:10;:12::i;:::-;40263:7;40230:18;:41::i;:::-;40222:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;40335:14;40341:7;40335:5;:14::i;:::-;40112:245;:::o;34451:233::-;34526:7;34562:30;:28;:30::i;:::-;34554:5;:38;34546:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34659:10;34670:5;34659:17;;;;;;;;;;;;;;;;;;;;;;;;34652:24;;34451:233;;;:::o;41347:86::-;41394:4;41418:7;;;;;;;;;;;41411:14;;41347:86;:::o;20447:239::-;20519:7;20539:13;20555:7;:16;20563:7;20555:16;;;;;;;;;;;;;;;;;;;;;20539:32;;20607:1;20590:19;;:5;:19;;;;20582:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20673:5;20666:12;;;20447:239;;;:::o;73019:512::-;73079:34;71720:24;73100:12;:10;:12::i;:::-;73079:7;:34::i;:::-;73071:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;73234:2;73205:25;:15;:23;:25::i;:::-;:31;;73196:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;73449:36;73455:2;73459:25;:15;:23;:25::i;:::-;73449:5;:36::i;:::-;73496:27;:15;:25;:27::i;:::-;73019:512;:::o;20177:208::-;20249:7;20294:1;20277:19;;:5;:19;;;;20269:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20361:9;:16;20371:5;20361:16;;;;;;;;;;;;;;;;20354:23;;20177:208;;;:::o;73746:185::-;73797:34;71789:24;73818:12;:10;:12::i;:::-;73797:7;:34::i;:::-;73789:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;73915:8;:6;:8::i;:::-;73746:185::o;67924:145::-;68006:7;68033:28;68055:5;68033:12;:18;68046:4;68033:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;68026:35;;67924:145;;;;:::o;49990:139::-;50068:4;50092:6;:12;50099:4;50092:12;;;;;;;;;;;:20;;:29;50113:7;50092:29;;;;;;;;;;;;;;;;;;;;;;;;;50085:36;;49990:139;;;;:::o;20922:104::-;20978:13;21011:7;21004:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20922:104;:::o;49081:49::-;49126:4;49081:49;;;:::o;22605:295::-;22720:12;:10;:12::i;:::-;22708:24;;:8;:24;;;;22700:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22820:8;22775:18;:32;22794:12;:10;:12::i;:::-;22775:32;;;;;;;;;;;;;;;:42;22808:8;22775:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22873:8;22844:48;;22859:12;:10;:12::i;:::-;22844:48;;;22883:8;22844:48;;;;;;:::i;:::-;;;;;;;;22605:295;;:::o;23868:328::-;24043:41;24062:12;:10;:12::i;:::-;24076:7;24043:18;:41::i;:::-;24035:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24149:39;24163:4;24169:2;24173:7;24182:5;24149:13;:39::i;:::-;23868:328;;;;:::o;21097:334::-;21170:13;21204:16;21212:7;21204;:16::i;:::-;21196:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21285:21;21309:10;:8;:10::i;:::-;21285:34;;21361:1;21343:7;21337:21;:25;:86;;;;;;;;;;;;;;;;;21389:7;21398:18;:7;:16;:18::i;:::-;21372:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21337:86;21330:93;;;21097:334;;;:::o;68243:134::-;68315:7;68342:27;:12;:18;68355:4;68342:18;;;;;;;;;;;:25;:27::i;:::-;68335:34;;68243:134;;;:::o;71682:62::-;71720:24;71682:62;:::o;68758:201::-;68875:31;68892:4;68898:7;68875:16;:31::i;:::-;68917:34;68943:7;68917:12;:18;68930:4;68917:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;68758:201;;:::o;71751:62::-;71789:24;71751:62;:::o;75187:233::-;75227:41;49126:4;75235:18;;75255:12;:10;:12::i;:::-;75227:7;:41::i;:::-;75219:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;75341:20;75372:10;75341:42;;75407:4;75394:18;;;22971:164;23068:4;23092:18;:25;23111:5;23092:25;;;;;;;;;;;;;;;:35;23118:8;23092:35;;;;;;;;;;;;;;;;;;;;;;;;;23085:42;;22971:164;;;;:::o;53339:112::-;53418:25;53429:4;53435:7;53418:10;:25::i;:::-;53339:112;;:::o;62021:152::-;62091:4;62115:50;62120:3;:10;;62156:5;62140:23;;62132:32;;62115:4;:50::i;:::-;62108:57;;62021:152;;;;:::o;70259:114::-;70324:7;70351;:14;;;70344:21;;70259:114;;;:::o;70381:127::-;70488:1;70470:7;:14;;;:19;;;;;;;;;;;70381:127;:::o;43018:275::-;43162:45;43189:4;43195:2;43199:7;43162:26;:45::i;:::-;43229:8;:6;:8::i;:::-;43228:9;43220:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43018:275;;;:::o;35297:589::-;35441:45;35468:4;35474:2;35478:7;35441:26;:45::i;:::-;35519:1;35503:18;;:4;:18;;;35499:187;;;35538:40;35570:7;35538:31;:40::i;:::-;35499:187;;;35608:2;35600:10;;:4;:10;;;35596:90;;35627:47;35660:4;35666:7;35627:32;:47::i;:::-;35596:90;35499:187;35714:1;35700:16;;:2;:16;;;35696:183;;;35733:45;35770:7;35733:36;:45::i;:::-;35696:183;;;35806:4;35800:10;;:2;:10;;;35796:83;;35827:40;35855:2;35859:7;35827:27;:40::i;:::-;35796:83;35696:183;35297:589;;;:::o;31798:126::-;;;;:::o;33621:224::-;33723:4;33762:35;33747:50;;;:11;:50;;;;:90;;;;33801:36;33825:11;33801:23;:36::i;:::-;33747:90;33740:97;;33621:224;;;:::o;25706:127::-;25771:4;25823:1;25795:30;;:7;:16;25803:7;25795:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25788:37;;25706:127;;;:::o;15520:98::-;15573:7;15600:10;15593:17;;15520:98;:::o;29688:174::-;29790:2;29763:15;:24;29779:7;29763:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29846:7;29842:2;29808:46;;29817:23;29832:7;29817:14;:23::i;:::-;29808:46;;;;;;;;;;;;29688:174;;:::o;26000:348::-;26093:4;26118:16;26126:7;26118;:16::i;:::-;26110:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26194:13;26210:23;26225:7;26210:14;:23::i;:::-;26194:39;;26263:5;26252:16;;:7;:16;;;:51;;;;26296:7;26272:31;;:20;26284:7;26272:11;:20::i;:::-;:31;;;26252:51;:87;;;;26307:32;26324:5;26331:7;26307:16;:32::i;:::-;26252:87;26244:96;;;26000:348;;;;:::o;28992:578::-;29151:4;29124:31;;:23;29139:7;29124:14;:23::i;:::-;:31;;;29116:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29234:1;29220:16;;:2;:16;;;;29212:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29290:39;29311:4;29317:2;29321:7;29290:20;:39::i;:::-;29394:29;29411:1;29415:7;29394:8;:29::i;:::-;29455:1;29436:9;:15;29446:4;29436:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29484:1;29467:9;:13;29477:2;29467:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29515:2;29496:7;:16;29504:7;29496:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29554:7;29550:2;29535:27;;29544:4;29535:27;;;;;;;;;;;;28992:578;;;:::o;51490:147::-;51573:18;51586:4;51573:12;:18::i;:::-;49572:30;49583:4;49589:12;:10;:12::i;:::-;49572:10;:30::i;:::-;51604:25:::1;51615:4;51621:7;51604:10;:25::i;:::-;51490:147:::0;;;:::o;52538:218::-;52645:12;:10;:12::i;:::-;52634:23;;:7;:23;;;52626:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52722:26;52734:4;52740:7;52722:11;:26::i;:::-;52538:218;;:::o;62349:158::-;62422:4;62446:53;62454:3;:10;;62490:5;62474:23;;62466:32;;62446:7;:53::i;:::-;62439:60;;62349:158;;;;:::o;42406:120::-;41950:8;:6;:8::i;:::-;41942:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;42475:5:::1;42465:7;;:15;;;;;;;;;;;;;;;;;;42496:22;42505:12;:10;:12::i;:::-;42496:22;;;;;;:::i;:::-;;;;;;;;42406:120::o:0;28295:360::-;28355:13;28371:23;28386:7;28371:14;:23::i;:::-;28355:39;;28407:48;28428:5;28443:1;28447:7;28407:20;:48::i;:::-;28496:29;28513:1;28517:7;28496:8;:29::i;:::-;28558:1;28538:9;:16;28548:5;28538:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28577:7;:16;28585:7;28577:16;;;;;;;;;;;;28570:23;;;;;;;;;;;28639:7;28635:1;28611:36;;28620:5;28611:36;;;;;;;;;;;;28295:360;;:::o;27684:382::-;27778:1;27764:16;;:2;:16;;;;27756:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27837:16;27845:7;27837;:16::i;:::-;27836:17;27828:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27899:45;27928:1;27932:2;27936:7;27899:20;:45::i;:::-;27974:1;27957:9;:13;27967:2;27957:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28005:2;27986:7;:16;27994:7;27986:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28050:7;28046:2;28025:33;;28042:1;28025:33;;;;;;;;;;;;27684:382;;:::o;42147:118::-;41673:8;:6;:8::i;:::-;41672:9;41664:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;42217:4:::1;42207:7;;:14;;;;;;;;;;;;;;;;;;42237:20;42244:12;:10;:12::i;:::-;42237:20;;;;;;:::i;:::-;;;;;;;;42147:118::o:0;63317:158::-;63391:7;63442:22;63446:3;:10;;63458:5;63442:3;:22::i;:::-;63434:31;;63411:56;;63317:158;;;;:::o;25078:315::-;25235:28;25245:4;25251:2;25255:7;25235:9;:28::i;:::-;25282:48;25305:4;25311:2;25315:7;25324:5;25282:22;:48::i;:::-;25274:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25078:315;;;;:::o;72517:114::-;72577:13;72610;72603:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72517:114;:::o;15960:723::-;16016:13;16246:1;16237:5;:10;16233:53;;;16264:10;;;;;;;;;;;;;;;;;;;;;16233:53;16296:12;16311:5;16296:20;;16327:14;16352:78;16367:1;16359:4;:9;16352:78;;16385:8;;;;;:::i;:::-;;;;16416:2;16408:10;;;;;:::i;:::-;;;16352:78;;;16440:19;16472:6;16462:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16440:39;;16490:154;16506:1;16497:5;:10;16490:154;;16534:1;16524:11;;;;;:::i;:::-;;;16601:2;16593:5;:10;;;;:::i;:::-;16580:2;:24;;;;:::i;:::-;16567:39;;16550:6;16557;16550:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16630:2;16621:11;;;;;:::i;:::-;;;16490:154;;;16668:6;16654:21;;;;;15960:723;;;;:::o;62846:117::-;62909:7;62936:19;62944:3;:10;;62936:7;:19::i;:::-;62929:26;;62846:117;;;:::o;51882:149::-;51966:18;51979:4;51966:12;:18::i;:::-;49572:30;49583:4;49589:12;:10;:12::i;:::-;49572:10;:30::i;:::-;51997:26:::1;52009:4;52015:7;51997:11;:26::i;:::-;51882:149:::0;;;:::o;53842:229::-;53917:22;53925:4;53931:7;53917;:22::i;:::-;53912:152;;53988:4;53956:6;:12;53963:4;53956:12;;;;;;;;;;;:20;;:29;53977:7;53956:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;54039:12;:10;:12::i;:::-;54012:40;;54030:7;54012:40;;54024:4;54012:40;;;;;;;;;;53912:152;53842:229;;:::o;55936:414::-;55999:4;56021:21;56031:3;56036:5;56021:9;:21::i;:::-;56016:327;;56059:3;:11;;56076:5;56059:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56242:3;:11;;:18;;;;56220:3;:12;;:19;56233:5;56220:19;;;;;;;;;;;:40;;;;56282:4;56275:11;;;;56016:327;56326:5;56319:12;;55936:414;;;;;:::o;36609:164::-;36713:10;:17;;;;36686:15;:24;36702:7;36686:24;;;;;;;;;;;:44;;;;36741:10;36757:7;36741:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36609:164;:::o;37400:988::-;37666:22;37716:1;37691:22;37708:4;37691:16;:22::i;:::-;:26;;;;:::i;:::-;37666:51;;37728:18;37749:17;:26;37767:7;37749:26;;;;;;;;;;;;37728:47;;37896:14;37882:10;:28;37878:328;;37927:19;37949:12;:18;37962:4;37949:18;;;;;;;;;;;;;;;:34;37968:14;37949:34;;;;;;;;;;;;37927:56;;38033:11;38000:12;:18;38013:4;38000:18;;;;;;;;;;;;;;;:30;38019:10;38000:30;;;;;;;;;;;:44;;;;38150:10;38117:17;:30;38135:11;38117:30;;;;;;;;;;;:43;;;;37878:328;;38302:17;:26;38320:7;38302:26;;;;;;;;;;;38295:33;;;38346:12;:18;38359:4;38346:18;;;;;;;;;;;;;;;:34;38365:14;38346:34;;;;;;;;;;;38339:41;;;37400:988;;;;:::o;38683:1079::-;38936:22;38981:1;38961:10;:17;;;;:21;;;;:::i;:::-;38936:46;;38993:18;39014:15;:24;39030:7;39014:24;;;;;;;;;;;;38993:45;;39365:19;39387:10;39398:14;39387:26;;;;;;;;;;;;;;;;;;;;;;;;39365:48;;39451:11;39426:10;39437;39426:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39562:10;39531:15;:28;39547:11;39531:28;;;;;;;;;;;:41;;;;39703:15;:24;39719:7;39703:24;;;;;;;;;;;39696:31;;;39738:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38683:1079;;;;:::o;36187:221::-;36272:14;36289:20;36306:2;36289:16;:20::i;:::-;36272:37;;36347:7;36320:12;:16;36333:2;36320:16;;;;;;;;;;;;;;;:24;36337:6;36320:24;;;;;;;;;;;:34;;;;36394:6;36365:17;:26;36383:7;36365:26;;;;;;;;;;;:35;;;;36187:221;;;:::o;19808:305::-;19910:4;19962:25;19947:40;;;:11;:40;;;;:105;;;;20019:33;20004:48;;;:11;:48;;;;19947:105;:158;;;;20069:36;20093:11;20069:23;:36::i;:::-;19947:158;19927:178;;19808:305;;;:::o;74349:239::-;74535:45;74562:4;74568:2;74572:7;74535:26;:45::i;:::-;74349:239;;;:::o;50419:497::-;50500:22;50508:4;50514:7;50500;:22::i;:::-;50495:414;;50688:41;50716:7;50688:41;;50726:2;50688:19;:41::i;:::-;50802:38;50830:4;50822:13;;50837:2;50802:19;:38::i;:::-;50593:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50539:358;;;;;;;;;;;:::i;:::-;;;;;;;;50495:414;50419:497;;:::o;54079:230::-;54154:22;54162:4;54168:7;54154;:22::i;:::-;54150:152;;;54225:5;54193:6;:12;54200:4;54193:12;;;;;;;;;;;:20;;:29;54214:7;54193:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;54277:12;:10;:12::i;:::-;54250:40;;54268:7;54250:40;;54262:4;54250:40;;;;;;;;;;54150:152;54079:230;;:::o;56526:1420::-;56592:4;56710:18;56731:3;:12;;:19;56744:5;56731:19;;;;;;;;;;;;56710:40;;56781:1;56767:10;:15;56763:1176;;57142:21;57179:1;57166:10;:14;;;;:::i;:::-;57142:38;;57195:17;57236:1;57215:3;:11;;:18;;;;:22;;;;:::i;:::-;57195:42;;57271:13;57258:9;:26;57254:405;;57305:17;57325:3;:11;;57337:9;57325:22;;;;;;;;;;;;;;;;;;;;;;;;57305:42;;57479:9;57450:3;:11;;57462:13;57450:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;57590:10;57564:3;:12;;:23;57577:9;57564:23;;;;;;;;;;;:36;;;;57254:405;;57740:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57835:3;:12;;:19;57848:5;57835:19;;;;;;;;;;;57828:26;;;57878:4;57871:11;;;;;;;56763:1176;57922:5;57915:12;;;56526:1420;;;;;:::o;58710:120::-;58777:7;58804:3;:11;;58816:5;58804:18;;;;;;;;;;;;;;;;;;;;;;;;58797:25;;58710:120;;;;:::o;30427:799::-;30582:4;30603:15;:2;:13;;;:15::i;:::-;30599:620;;;30655:2;30639:36;;;30676:12;:10;:12::i;:::-;30690:4;30696:7;30705:5;30639:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30635:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30898:1;30881:6;:13;:18;30877:272;;;30924:60;;;;;;;;;;:::i;:::-;;;;;;;;30877:272;31099:6;31093:13;31084:6;31080:2;31076:15;31069:38;30635:529;30772:41;;;30762:51;;;:6;:51;;;;30755:58;;;;;30599:620;31203:4;31196:11;;30427:799;;;;;;;:::o;58247:109::-;58303:7;58330:3;:11;;:18;;;;58323:25;;58247:109;;;:::o;58032:129::-;58105:4;58152:1;58129:3;:12;;:19;58142:5;58129:19;;;;;;;;;;;;:24;;58122:31;;58032:129;;;;:::o;67111:214::-;67196:4;67235:42;67220:57;;;:11;:57;;;;:97;;;;67281:36;67305:11;67281:23;:36::i;:::-;67220:97;67213:104;;67111:214;;;:::o;17261:451::-;17336:13;17362:19;17407:1;17398:6;17394:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17384:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17362:47;;17420:15;:6;17427:1;17420:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;17446;:6;17453:1;17446:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;17477:9;17502:1;17493:6;17489:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17477:26;;17472:135;17509:1;17505;:5;17472:135;;;17544:12;17565:3;17557:5;:11;17544:25;;;;;;;;;;;;;;;;;;17532:6;17539:1;17532:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;17594:1;17584:11;;;;;17512:3;;;;:::i;:::-;;;17472:135;;;;17634:1;17625:5;:10;17617:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17697:6;17683:21;;;17261:451;;;;:::o;7649:387::-;7709:4;7917:12;7984:7;7972:20;7964:28;;8027:1;8020:4;:8;8013:15;;;7649:387;;;:::o;49694:204::-;49779:4;49818:32;49803:47;;;:11;:47;;;;:87;;;;49854:36;49878:11;49854:23;:36::i;:::-;49803:87;49796:94;;49694:204;;;:::o;18417:157::-;18502:4;18541:25;18526:40;;;:11;:40;;;;18519:47;;18417:157;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:139::-;;723:6;710:20;701:29;;739:33;766:5;739:33;:::i;:::-;691:87;;;;:::o;784:137::-;;867:6;854:20;845:29;;883:32;909:5;883:32;:::i;:::-;835:86;;;;:::o;927:141::-;;1014:6;1008:13;999:22;;1030:32;1056:5;1030:32;:::i;:::-;989:79;;;;:::o;1087:271::-;;1191:3;1184:4;1176:6;1172:17;1168:27;1158:2;;1209:1;1206;1199:12;1158:2;1249:6;1236:20;1274:78;1348:3;1340:6;1333:4;1325:6;1321:17;1274:78;:::i;:::-;1265:87;;1148:210;;;;;:::o;1364:139::-;;1448:6;1435:20;1426:29;;1464:33;1491:5;1464:33;:::i;:::-;1416:87;;;;:::o;1509:262::-;;1617:2;1605:9;1596:7;1592:23;1588:32;1585:2;;;1633:1;1630;1623:12;1585:2;1676:1;1701:53;1746:7;1737:6;1726:9;1722:22;1701:53;:::i;:::-;1691:63;;1647:117;1575:196;;;;:::o;1777:407::-;;;1902:2;1890:9;1881:7;1877:23;1873:32;1870:2;;;1918:1;1915;1908:12;1870:2;1961:1;1986:53;2031:7;2022:6;2011:9;2007:22;1986:53;:::i;:::-;1976:63;;1932:117;2088:2;2114:53;2159:7;2150:6;2139:9;2135:22;2114:53;:::i;:::-;2104:63;;2059:118;1860:324;;;;;:::o;2190:552::-;;;;2332:2;2320:9;2311:7;2307:23;2303:32;2300:2;;;2348:1;2345;2338:12;2300:2;2391:1;2416:53;2461:7;2452:6;2441:9;2437:22;2416:53;:::i;:::-;2406:63;;2362:117;2518:2;2544:53;2589:7;2580:6;2569:9;2565:22;2544:53;:::i;:::-;2534:63;;2489:118;2646:2;2672:53;2717:7;2708:6;2697:9;2693:22;2672:53;:::i;:::-;2662:63;;2617:118;2290:452;;;;;:::o;2748:809::-;;;;;2916:3;2904:9;2895:7;2891:23;2887:33;2884:2;;;2933:1;2930;2923:12;2884:2;2976:1;3001:53;3046:7;3037:6;3026:9;3022:22;3001:53;:::i;:::-;2991:63;;2947:117;3103:2;3129:53;3174:7;3165:6;3154:9;3150:22;3129:53;:::i;:::-;3119:63;;3074:118;3231:2;3257:53;3302:7;3293:6;3282:9;3278:22;3257:53;:::i;:::-;3247:63;;3202:118;3387:2;3376:9;3372:18;3359:32;3418:18;3410:6;3407:30;3404:2;;;3450:1;3447;3440:12;3404:2;3478:62;3532:7;3523:6;3512:9;3508:22;3478:62;:::i;:::-;3468:72;;3330:220;2874:683;;;;;;;:::o;3563:401::-;;;3685:2;3673:9;3664:7;3660:23;3656:32;3653:2;;;3701:1;3698;3691:12;3653:2;3744:1;3769:53;3814:7;3805:6;3794:9;3790:22;3769:53;:::i;:::-;3759:63;;3715:117;3871:2;3897:50;3939:7;3930:6;3919:9;3915:22;3897:50;:::i;:::-;3887:60;;3842:115;3643:321;;;;;:::o;3970:407::-;;;4095:2;4083:9;4074:7;4070:23;4066:32;4063:2;;;4111:1;4108;4101:12;4063:2;4154:1;4179:53;4224:7;4215:6;4204:9;4200:22;4179:53;:::i;:::-;4169:63;;4125:117;4281:2;4307:53;4352:7;4343:6;4332:9;4328:22;4307:53;:::i;:::-;4297:63;;4252:118;4053:324;;;;;:::o;4383:262::-;;4491:2;4479:9;4470:7;4466:23;4462:32;4459:2;;;4507:1;4504;4497:12;4459:2;4550:1;4575:53;4620:7;4611:6;4600:9;4596:22;4575:53;:::i;:::-;4565:63;;4521:117;4449:196;;;;:::o;4651:407::-;;;4776:2;4764:9;4755:7;4751:23;4747:32;4744:2;;;4792:1;4789;4782:12;4744:2;4835:1;4860:53;4905:7;4896:6;4885:9;4881:22;4860:53;:::i;:::-;4850:63;;4806:117;4962:2;4988:53;5033:7;5024:6;5013:9;5009:22;4988:53;:::i;:::-;4978:63;;4933:118;4734:324;;;;;:::o;5064:407::-;;;5189:2;5177:9;5168:7;5164:23;5160:32;5157:2;;;5205:1;5202;5195:12;5157:2;5248:1;5273:53;5318:7;5309:6;5298:9;5294:22;5273:53;:::i;:::-;5263:63;;5219:117;5375:2;5401:53;5446:7;5437:6;5426:9;5422:22;5401:53;:::i;:::-;5391:63;;5346:118;5147:324;;;;;:::o;5477:260::-;;5584:2;5572:9;5563:7;5559:23;5555:32;5552:2;;;5600:1;5597;5590:12;5552:2;5643:1;5668:52;5712:7;5703:6;5692:9;5688:22;5668:52;:::i;:::-;5658:62;;5614:116;5542:195;;;;:::o;5743:282::-;;5861:2;5849:9;5840:7;5836:23;5832:32;5829:2;;;5877:1;5874;5867:12;5829:2;5920:1;5945:63;6000:7;5991:6;5980:9;5976:22;5945:63;:::i;:::-;5935:73;;5891:127;5819:206;;;;:::o;6031:262::-;;6139:2;6127:9;6118:7;6114:23;6110:32;6107:2;;;6155:1;6152;6145:12;6107:2;6198:1;6223:53;6268:7;6259:6;6248:9;6244:22;6223:53;:::i;:::-;6213:63;;6169:117;6097:196;;;;:::o;6299:118::-;6386:24;6404:5;6386:24;:::i;:::-;6381:3;6374:37;6364:53;;:::o;6423:109::-;6504:21;6519:5;6504:21;:::i;:::-;6499:3;6492:34;6482:50;;:::o;6538:118::-;6625:24;6643:5;6625:24;:::i;:::-;6620:3;6613:37;6603:53;;:::o;6662:360::-;;6776:38;6808:5;6776:38;:::i;:::-;6830:70;6893:6;6888:3;6830:70;:::i;:::-;6823:77;;6909:52;6954:6;6949:3;6942:4;6935:5;6931:16;6909:52;:::i;:::-;6986:29;7008:6;6986:29;:::i;:::-;6981:3;6977:39;6970:46;;6752:270;;;;;:::o;7028:364::-;;7144:39;7177:5;7144:39;:::i;:::-;7199:71;7263:6;7258:3;7199:71;:::i;:::-;7192:78;;7279:52;7324:6;7319:3;7312:4;7305:5;7301:16;7279:52;:::i;:::-;7356:29;7378:6;7356:29;:::i;:::-;7351:3;7347:39;7340:46;;7120:272;;;;;:::o;7398:377::-;;7532:39;7565:5;7532:39;:::i;:::-;7587:89;7669:6;7664:3;7587:89;:::i;:::-;7580:96;;7685:52;7730:6;7725:3;7718:4;7711:5;7707:16;7685:52;:::i;:::-;7762:6;7757:3;7753:16;7746:23;;7508:267;;;;;:::o;7781:330::-;;7944:67;8008:2;8003:3;7944:67;:::i;:::-;7937:74;;8041:34;8037:1;8032:3;8028:11;8021:55;8102:2;8097:3;8093:12;8086:19;;7927:184;;;:::o;8117:375::-;;8280:67;8344:2;8339:3;8280:67;:::i;:::-;8273:74;;8377:34;8373:1;8368:3;8364:11;8357:55;8443:13;8438:2;8433:3;8429:12;8422:35;8483:2;8478:3;8474:12;8467:19;;8263:229;;;:::o;8498:318::-;;8661:67;8725:2;8720:3;8661:67;:::i;:::-;8654:74;;8758:22;8754:1;8749:3;8745:11;8738:43;8807:2;8802:3;8798:12;8791:19;;8644:172;;;:::o;8822:434::-;;8985:67;9049:2;9044:3;8985:67;:::i;:::-;8978:74;;9082:34;9078:1;9073:3;9069:11;9062:55;9148:34;9143:2;9138:3;9134:12;9127:56;9214:6;9209:2;9204:3;9200:12;9193:28;9247:2;9242:3;9238:12;9231:19;;8968:288;;;:::o;9262:375::-;;9425:67;9489:2;9484:3;9425:67;:::i;:::-;9418:74;;9522:34;9518:1;9513:3;9509:11;9502:55;9588:13;9583:2;9578:3;9574:12;9567:35;9628:2;9623:3;9619:12;9612:19;;9408:229;;;:::o;9643:382::-;;9806:67;9870:2;9865:3;9806:67;:::i;:::-;9799:74;;9903:34;9899:1;9894:3;9890:11;9883:55;9969:20;9964:2;9959:3;9955:12;9948:42;10016:2;10011:3;10007:12;10000:19;;9789:236;;;:::o;10031:433::-;;10194:67;10258:2;10253:3;10194:67;:::i;:::-;10187:74;;10291:34;10287:1;10282:3;10278:11;10271:55;10357:34;10352:2;10347:3;10343:12;10336:56;10423:5;10418:2;10413:3;10409:12;10402:27;10455:2;10450:3;10446:12;10439:19;;10177:287;;;:::o;10470:326::-;;10633:67;10697:2;10692:3;10633:67;:::i;:::-;10626:74;;10730:30;10726:1;10721:3;10717:11;10710:51;10787:2;10782:3;10778:12;10771:19;;10616:180;;;:::o;10802:368::-;;10965:67;11029:2;11024:3;10965:67;:::i;:::-;10958:74;;11062:34;11058:1;11053:3;11049:11;11042:55;11128:6;11123:2;11118:3;11114:12;11107:28;11161:2;11156:3;11152:12;11145:19;;10948:222;;;:::o;11176:323::-;;11339:67;11403:2;11398:3;11339:67;:::i;:::-;11332:74;;11436:27;11432:1;11427:3;11423:11;11416:48;11490:2;11485:3;11481:12;11474:19;;11322:177;;;:::o;11505:376::-;;11668:67;11732:2;11727:3;11668:67;:::i;:::-;11661:74;;11765:34;11761:1;11756:3;11752:11;11745:55;11831:14;11826:2;11821:3;11817:12;11810:36;11872:2;11867:3;11863:12;11856:19;;11651:230;;;:::o;11887:314::-;;12050:67;12114:2;12109:3;12050:67;:::i;:::-;12043:74;;12147:18;12143:1;12138:3;12134:11;12127:39;12192:2;12187:3;12183:12;12176:19;;12033:168;;;:::o;12207:388::-;;12370:67;12434:2;12429:3;12370:67;:::i;:::-;12363:74;;12467:34;12463:1;12458:3;12454:11;12447:55;12533:26;12528:2;12523:3;12519:12;12512:48;12586:2;12581:3;12577:12;12570:19;;12353:242;;;:::o;12601:374::-;;12764:67;12828:2;12823:3;12764:67;:::i;:::-;12757:74;;12861:34;12857:1;12852:3;12848:11;12841:55;12927:12;12922:2;12917:3;12913:12;12906:34;12966:2;12961:3;12957:12;12950:19;;12747:228;;;:::o;12981:373::-;;13144:67;13208:2;13203:3;13144:67;:::i;:::-;13137:74;;13241:34;13237:1;13232:3;13228:11;13221:55;13307:11;13302:2;13297:3;13293:12;13286:33;13345:2;13340:3;13336:12;13329:19;;13127:227;;;:::o;13360:389::-;;13523:67;13587:2;13582:3;13523:67;:::i;:::-;13516:74;;13620:34;13616:1;13611:3;13607:11;13600:55;13686:27;13681:2;13676:3;13672:12;13665:49;13740:2;13735:3;13731:12;13724:19;;13506:243;;;:::o;13755:330::-;;13918:67;13982:2;13977:3;13918:67;:::i;:::-;13911:74;;14015:34;14011:1;14006:3;14002:11;13995:55;14076:2;14071:3;14067:12;14060:19;;13901:184;;;:::o;14091:376::-;;14254:67;14318:2;14313:3;14254:67;:::i;:::-;14247:74;;14351:34;14347:1;14342:3;14338:11;14331:55;14417:14;14412:2;14407:3;14403:12;14396:36;14458:2;14453:3;14449:12;14442:19;;14237:230;;;:::o;14473:373::-;;14636:67;14700:2;14695:3;14636:67;:::i;:::-;14629:74;;14733:34;14729:1;14724:3;14720:11;14713:55;14799:11;14794:2;14789:3;14785:12;14778:33;14837:2;14832:3;14828:12;14821:19;;14619:227;;;:::o;14852:379::-;;15015:67;15079:2;15074:3;15015:67;:::i;:::-;15008:74;;15112:34;15108:1;15103:3;15099:11;15092:55;15178:17;15173:2;15168:3;15164:12;15157:39;15222:2;15217:3;15213:12;15206:19;;14998:233;;;:::o;15237:436::-;;15400:67;15464:2;15459:3;15400:67;:::i;:::-;15393:74;;15497:34;15493:1;15488:3;15484:11;15477:55;15563:34;15558:2;15553:3;15549:12;15542:56;15629:8;15624:2;15619:3;15615:12;15608:30;15664:2;15659:3;15655:12;15648:19;;15383:290;;;:::o;15679:365::-;;15842:67;15906:2;15901:3;15842:67;:::i;:::-;15835:74;;15939:34;15935:1;15930:3;15926:11;15919:55;16005:3;16000:2;15995:3;15991:12;15984:25;16035:2;16030:3;16026:12;16019:19;;15825:219;;;:::o;16050:381::-;;16213:67;16277:2;16272:3;16213:67;:::i;:::-;16206:74;;16310:34;16306:1;16301:3;16297:11;16290:55;16376:19;16371:2;16366:3;16362:12;16355:41;16422:2;16417:3;16413:12;16406:19;;16196:235;;;:::o;16437:376::-;;16600:67;16664:2;16659:3;16600:67;:::i;:::-;16593:74;;16697:34;16693:1;16688:3;16684:11;16677:55;16763:14;16758:2;16753:3;16749:12;16742:36;16804:2;16799:3;16795:12;16788:19;;16583:230;;;:::o;16819:357::-;;17000:85;17082:2;17077:3;17000:85;:::i;:::-;16993:92;;17115:25;17111:1;17106:3;17102:11;17095:46;17167:2;17162:3;17158:12;17151:19;;16983:193;;;:::o;17182:380::-;;17345:67;17409:2;17404:3;17345:67;:::i;:::-;17338:74;;17442:34;17438:1;17433:3;17429:11;17422:55;17508:18;17503:2;17498:3;17494:12;17487:40;17553:2;17548:3;17544:12;17537:19;;17328:234;;;:::o;17568:376::-;;17731:67;17795:2;17790:3;17731:67;:::i;:::-;17724:74;;17828:34;17824:1;17819:3;17815:11;17808:55;17894:14;17889:2;17884:3;17880:12;17873:36;17935:2;17930:3;17926:12;17919:19;;17714:230;;;:::o;17950:351::-;;18131:85;18213:2;18208:3;18131:85;:::i;:::-;18124:92;;18246:19;18242:1;18237:3;18233:11;18226:40;18292:2;18287:3;18283:12;18276:19;;18114:187;;;:::o;18307:379::-;;18470:67;18534:2;18529:3;18470:67;:::i;:::-;18463:74;;18567:34;18563:1;18558:3;18554:11;18547:55;18633:17;18628:2;18623:3;18619:12;18612:39;18677:2;18672:3;18668:12;18661:19;;18453:233;;;:::o;18692:118::-;18779:24;18797:5;18779:24;:::i;:::-;18774:3;18767:37;18757:53;;:::o;18816:435::-;;19018:95;19109:3;19100:6;19018:95;:::i;:::-;19011:102;;19130:95;19221:3;19212:6;19130:95;:::i;:::-;19123:102;;19242:3;19235:10;;19000:251;;;;;:::o;19257:967::-;;19661:148;19805:3;19661:148;:::i;:::-;19654:155;;19826:95;19917:3;19908:6;19826:95;:::i;:::-;19819:102;;19938:148;20082:3;19938:148;:::i;:::-;19931:155;;20103:95;20194:3;20185:6;20103:95;:::i;:::-;20096:102;;20215:3;20208:10;;19643:581;;;;;:::o;20230:222::-;;20361:2;20350:9;20346:18;20338:26;;20374:71;20442:1;20431:9;20427:17;20418:6;20374:71;:::i;:::-;20328:124;;;;:::o;20458:640::-;;20691:3;20680:9;20676:19;20668:27;;20705:71;20773:1;20762:9;20758:17;20749:6;20705:71;:::i;:::-;20786:72;20854:2;20843:9;20839:18;20830:6;20786:72;:::i;:::-;20868;20936:2;20925:9;20921:18;20912:6;20868:72;:::i;:::-;20987:9;20981:4;20977:20;20972:2;20961:9;20957:18;20950:48;21015:76;21086:4;21077:6;21015:76;:::i;:::-;21007:84;;20658:440;;;;;;;:::o;21104:210::-;;21229:2;21218:9;21214:18;21206:26;;21242:65;21304:1;21293:9;21289:17;21280:6;21242:65;:::i;:::-;21196:118;;;;:::o;21320:222::-;;21451:2;21440:9;21436:18;21428:26;;21464:71;21532:1;21521:9;21517:17;21508:6;21464:71;:::i;:::-;21418:124;;;;:::o;21548:313::-;;21699:2;21688:9;21684:18;21676:26;;21748:9;21742:4;21738:20;21734:1;21723:9;21719:17;21712:47;21776:78;21849:4;21840:6;21776:78;:::i;:::-;21768:86;;21666:195;;;;:::o;21867:419::-;;22071:2;22060:9;22056:18;22048:26;;22120:9;22114:4;22110:20;22106:1;22095:9;22091:17;22084:47;22148:131;22274:4;22148:131;:::i;:::-;22140:139;;22038:248;;;:::o;22292:419::-;;22496:2;22485:9;22481:18;22473:26;;22545:9;22539:4;22535:20;22531:1;22520:9;22516:17;22509:47;22573:131;22699:4;22573:131;:::i;:::-;22565:139;;22463:248;;;:::o;22717:419::-;;22921:2;22910:9;22906:18;22898:26;;22970:9;22964:4;22960:20;22956:1;22945:9;22941:17;22934:47;22998:131;23124:4;22998:131;:::i;:::-;22990:139;;22888:248;;;:::o;23142:419::-;;23346:2;23335:9;23331:18;23323:26;;23395:9;23389:4;23385:20;23381:1;23370:9;23366:17;23359:47;23423:131;23549:4;23423:131;:::i;:::-;23415:139;;23313:248;;;:::o;23567:419::-;;23771:2;23760:9;23756:18;23748:26;;23820:9;23814:4;23810:20;23806:1;23795:9;23791:17;23784:47;23848:131;23974:4;23848:131;:::i;:::-;23840:139;;23738:248;;;:::o;23992:419::-;;24196:2;24185:9;24181:18;24173:26;;24245:9;24239:4;24235:20;24231:1;24220:9;24216:17;24209:47;24273:131;24399:4;24273:131;:::i;:::-;24265:139;;24163:248;;;:::o;24417:419::-;;24621:2;24610:9;24606:18;24598:26;;24670:9;24664:4;24660:20;24656:1;24645:9;24641:17;24634:47;24698:131;24824:4;24698:131;:::i;:::-;24690:139;;24588:248;;;:::o;24842:419::-;;25046:2;25035:9;25031:18;25023:26;;25095:9;25089:4;25085:20;25081:1;25070:9;25066:17;25059:47;25123:131;25249:4;25123:131;:::i;:::-;25115:139;;25013:248;;;:::o;25267:419::-;;25471:2;25460:9;25456:18;25448:26;;25520:9;25514:4;25510:20;25506:1;25495:9;25491:17;25484:47;25548:131;25674:4;25548:131;:::i;:::-;25540:139;;25438:248;;;:::o;25692:419::-;;25896:2;25885:9;25881:18;25873:26;;25945:9;25939:4;25935:20;25931:1;25920:9;25916:17;25909:47;25973:131;26099:4;25973:131;:::i;:::-;25965:139;;25863:248;;;:::o;26117:419::-;;26321:2;26310:9;26306:18;26298:26;;26370:9;26364:4;26360:20;26356:1;26345:9;26341:17;26334:47;26398:131;26524:4;26398:131;:::i;:::-;26390:139;;26288:248;;;:::o;26542:419::-;;26746:2;26735:9;26731:18;26723:26;;26795:9;26789:4;26785:20;26781:1;26770:9;26766:17;26759:47;26823:131;26949:4;26823:131;:::i;:::-;26815:139;;26713:248;;;:::o;26967:419::-;;27171:2;27160:9;27156:18;27148:26;;27220:9;27214:4;27210:20;27206:1;27195:9;27191:17;27184:47;27248:131;27374:4;27248:131;:::i;:::-;27240:139;;27138:248;;;:::o;27392:419::-;;27596:2;27585:9;27581:18;27573:26;;27645:9;27639:4;27635:20;27631:1;27620:9;27616:17;27609:47;27673:131;27799:4;27673:131;:::i;:::-;27665:139;;27563:248;;;:::o;27817:419::-;;28021:2;28010:9;28006:18;27998:26;;28070:9;28064:4;28060:20;28056:1;28045:9;28041:17;28034:47;28098:131;28224:4;28098:131;:::i;:::-;28090:139;;27988:248;;;:::o;28242:419::-;;28446:2;28435:9;28431:18;28423:26;;28495:9;28489:4;28485:20;28481:1;28470:9;28466:17;28459:47;28523:131;28649:4;28523:131;:::i;:::-;28515:139;;28413:248;;;:::o;28667:419::-;;28871:2;28860:9;28856:18;28848:26;;28920:9;28914:4;28910:20;28906:1;28895:9;28891:17;28884:47;28948:131;29074:4;28948:131;:::i;:::-;28940:139;;28838:248;;;:::o;29092:419::-;;29296:2;29285:9;29281:18;29273:26;;29345:9;29339:4;29335:20;29331:1;29320:9;29316:17;29309:47;29373:131;29499:4;29373:131;:::i;:::-;29365:139;;29263:248;;;:::o;29517:419::-;;29721:2;29710:9;29706:18;29698:26;;29770:9;29764:4;29760:20;29756:1;29745:9;29741:17;29734:47;29798:131;29924:4;29798:131;:::i;:::-;29790:139;;29688:248;;;:::o;29942:419::-;;30146:2;30135:9;30131:18;30123:26;;30195:9;30189:4;30185:20;30181:1;30170:9;30166:17;30159:47;30223:131;30349:4;30223:131;:::i;:::-;30215:139;;30113:248;;;:::o;30367:419::-;;30571:2;30560:9;30556:18;30548:26;;30620:9;30614:4;30610:20;30606:1;30595:9;30591:17;30584:47;30648:131;30774:4;30648:131;:::i;:::-;30640:139;;30538:248;;;:::o;30792:419::-;;30996:2;30985:9;30981:18;30973:26;;31045:9;31039:4;31035:20;31031:1;31020:9;31016:17;31009:47;31073:131;31199:4;31073:131;:::i;:::-;31065:139;;30963:248;;;:::o;31217:419::-;;31421:2;31410:9;31406:18;31398:26;;31470:9;31464:4;31460:20;31456:1;31445:9;31441:17;31434:47;31498:131;31624:4;31498:131;:::i;:::-;31490:139;;31388:248;;;:::o;31642:419::-;;31846:2;31835:9;31831:18;31823:26;;31895:9;31889:4;31885:20;31881:1;31870:9;31866:17;31859:47;31923:131;32049:4;31923:131;:::i;:::-;31915:139;;31813:248;;;:::o;32067:419::-;;32271:2;32260:9;32256:18;32248:26;;32320:9;32314:4;32310:20;32306:1;32295:9;32291:17;32284:47;32348:131;32474:4;32348:131;:::i;:::-;32340:139;;32238:248;;;:::o;32492:419::-;;32696:2;32685:9;32681:18;32673:26;;32745:9;32739:4;32735:20;32731:1;32720:9;32716:17;32709:47;32773:131;32899:4;32773:131;:::i;:::-;32765:139;;32663:248;;;:::o;32917:419::-;;33121:2;33110:9;33106:18;33098:26;;33170:9;33164:4;33160:20;33156:1;33145:9;33141:17;33134:47;33198:131;33324:4;33198:131;:::i;:::-;33190:139;;33088:248;;;:::o;33342:222::-;;33473:2;33462:9;33458:18;33450:26;;33486:71;33554:1;33543:9;33539:17;33530:6;33486:71;:::i;:::-;33440:124;;;;:::o;33570:283::-;;33636:2;33630:9;33620:19;;33678:4;33670:6;33666:17;33785:6;33773:10;33770:22;33749:18;33737:10;33734:34;33731:62;33728:2;;;33796:18;;:::i;:::-;33728:2;33836:10;33832:2;33825:22;33610:243;;;;:::o;33859:331::-;;34010:18;34002:6;33999:30;33996:2;;;34032:18;;:::i;:::-;33996:2;34117:4;34113:9;34106:4;34098:6;34094:17;34090:33;34082:41;;34178:4;34172;34168:15;34160:23;;33925:265;;;:::o;34196:98::-;;34281:5;34275:12;34265:22;;34254:40;;;:::o;34300:99::-;;34386:5;34380:12;34370:22;;34359:40;;;:::o;34405:168::-;;34522:6;34517:3;34510:19;34562:4;34557:3;34553:14;34538:29;;34500:73;;;;:::o;34579:169::-;;34697:6;34692:3;34685:19;34737:4;34732:3;34728:14;34713:29;;34675:73;;;;:::o;34754:148::-;;34893:3;34878:18;;34868:34;;;;:::o;34908:305::-;;34967:20;34985:1;34967:20;:::i;:::-;34962:25;;35001:20;35019:1;35001:20;:::i;:::-;34996:25;;35155:1;35087:66;35083:74;35080:1;35077:81;35074:2;;;35161:18;;:::i;:::-;35074:2;35205:1;35202;35198:9;35191:16;;34952:261;;;;:::o;35219:185::-;;35276:20;35294:1;35276:20;:::i;:::-;35271:25;;35310:20;35328:1;35310:20;:::i;:::-;35305:25;;35349:1;35339:2;;35354:18;;:::i;:::-;35339:2;35396:1;35393;35389:9;35384:14;;35261:143;;;;:::o;35410:348::-;;35473:20;35491:1;35473:20;:::i;:::-;35468:25;;35507:20;35525:1;35507:20;:::i;:::-;35502:25;;35695:1;35627:66;35623:74;35620:1;35617:81;35612:1;35605:9;35598:17;35594:105;35591:2;;;35702:18;;:::i;:::-;35591:2;35750:1;35747;35743:9;35732:20;;35458:300;;;;:::o;35764:191::-;;35824:20;35842:1;35824:20;:::i;:::-;35819:25;;35858:20;35876:1;35858:20;:::i;:::-;35853:25;;35897:1;35894;35891:8;35888:2;;;35902:18;;:::i;:::-;35888:2;35947:1;35944;35940:9;35932:17;;35809:146;;;;:::o;35961:96::-;;36027:24;36045:5;36027:24;:::i;:::-;36016:35;;36006:51;;;:::o;36063:90::-;;36140:5;36133:13;36126:21;36115:32;;36105:48;;;:::o;36159:77::-;;36225:5;36214:16;;36204:32;;;:::o;36242:149::-;;36318:66;36311:5;36307:78;36296:89;;36286:105;;;:::o;36397:126::-;;36474:42;36467:5;36463:54;36452:65;;36442:81;;;:::o;36529:77::-;;36595:5;36584:16;;36574:32;;;:::o;36612:154::-;36696:6;36691:3;36686;36673:30;36758:1;36749:6;36744:3;36740:16;36733:27;36663:103;;;:::o;36772:307::-;36840:1;36850:113;36864:6;36861:1;36858:13;36850:113;;;36949:1;36944:3;36940:11;36934:18;36930:1;36925:3;36921:11;36914:39;36886:2;36883:1;36879:10;36874:15;;36850:113;;;36981:6;36978:1;36975:13;36972:2;;;37061:1;37052:6;37047:3;37043:16;37036:27;36972:2;36821:258;;;;:::o;37085:171::-;;37147:24;37165:5;37147:24;:::i;:::-;37138:33;;37193:4;37186:5;37183:15;37180:2;;;37201:18;;:::i;:::-;37180:2;37248:1;37241:5;37237:13;37230:20;;37128:128;;;:::o;37262:320::-;;37343:1;37337:4;37333:12;37323:22;;37390:1;37384:4;37380:12;37411:18;37401:2;;37467:4;37459:6;37455:17;37445:27;;37401:2;37529;37521:6;37518:14;37498:18;37495:38;37492:2;;;37548:18;;:::i;:::-;37492:2;37313:269;;;;:::o;37588:233::-;;37650:24;37668:5;37650:24;:::i;:::-;37641:33;;37696:66;37689:5;37686:77;37683:2;;;37766:18;;:::i;:::-;37683:2;37813:1;37806:5;37802:13;37795:20;;37631:190;;;:::o;37827:176::-;;37876:20;37894:1;37876:20;:::i;:::-;37871:25;;37910:20;37928:1;37910:20;:::i;:::-;37905:25;;37949:1;37939:2;;37954:18;;:::i;:::-;37939:2;37995:1;37992;37988:9;37983:14;;37861:142;;;;:::o;38009:180::-;38057:77;38054:1;38047:88;38154:4;38151:1;38144:15;38178:4;38175:1;38168:15;38195:180;38243:77;38240:1;38233:88;38340:4;38337:1;38330:15;38364:4;38361:1;38354:15;38381:180;38429:77;38426:1;38419:88;38526:4;38523:1;38516:15;38550:4;38547:1;38540:15;38567:180;38615:77;38612:1;38605:88;38712:4;38709:1;38702:15;38736:4;38733:1;38726:15;38753:102;;38845:2;38841:7;38836:2;38829:5;38825:14;38821:28;38811:38;;38801:54;;;:::o;38861:122::-;38934:24;38952:5;38934:24;:::i;:::-;38927:5;38924:35;38914:2;;38973:1;38970;38963:12;38914:2;38904:79;:::o;38989:116::-;39059:21;39074:5;39059:21;:::i;:::-;39052:5;39049:32;39039:2;;39095:1;39092;39085:12;39039:2;39029:76;:::o;39111:122::-;39184:24;39202:5;39184:24;:::i;:::-;39177:5;39174:35;39164:2;;39223:1;39220;39213:12;39164:2;39154:79;:::o;39239:120::-;39311:23;39328:5;39311:23;:::i;:::-;39304:5;39301:34;39291:2;;39349:1;39346;39339:12;39291:2;39281:78;:::o;39365:122::-;39438:24;39456:5;39438:24;:::i;:::-;39431:5;39428:35;39418:2;;39477:1;39474;39467:12;39418:2;39408:79;:::o
Swarm Source
ipfs://fb2bcd6debc0614d6b6285516d8766d58515413b123eae0dca968f43432536a1
[ 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.