Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
5,000 CLEM
Holders
67
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 0 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ClementineNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-19 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @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); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ClementineNFT.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenByIndex(uint256 index) public view override returns (uint256) { uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (!ownership.burned) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert TokenIndexOutOfBounds(); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds(); uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } // Execution should never reach this point. revert(); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity ^0.8.4; contract ClementineNFT is ERC721A, Ownable { using Strings for uint256; string baseURI; string public baseExtension = ".json"; uint256 public cost = 0.25 ether; uint256 public maxSupply = 5000; uint256 public maxMintAmount = 1; bool public paused = false; bool public revealed = false; string public notRevealedUri; // 0 - No Hall Pass // 1 - Has Hall Pass // 2 - Redeemed mapping(address => uint8) public hallPass; constructor( string memory _initNotRevealedUri ) ERC721A("Clementine's Nightmare", "CLEM") { setNotRevealedURI(_initNotRevealedUri); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // public function mint(uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(!paused); require(_mintAmount > 0); require(supply + _mintAmount <= maxSupply); if (msg.sender != owner()) { require(hallPass[msg.sender] == 1); require(_mintAmount <= maxMintAmount); require(msg.value >= cost * _mintAmount); hallPass[msg.sender] = 2; } _safeMint(msg.sender, _mintAmount); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721AMetadata: URI query for nonexistent token" ); if (revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } // owner function reveal() public onlyOwner { revealed = true; } function seedHallPass(address[] memory addresses) public onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { hallPass[addresses[i]] = 1; } } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hallPass","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"addresses","type":"address[]"}],"name":"seedHallPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a9080519060200190620000519291906200034d565b506703782dace9d90000600b55611388600c556001600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff021916908315150217905550348015620000ac57600080fd5b50604051620045b4380380620045b48339818101604052810190620000d291906200047b565b6040518060400160405280601681526020017f436c656d656e74696e652773204e696768746d617265000000000000000000008152506040518060400160405280600481526020017f434c454d000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001569291906200034d565b5080600390805190602001906200016f9291906200034d565b5050506200019262000186620001aa60201b60201c565b620001b260201b60201c565b620001a3816200027860201b60201c565b50620006d3565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000288620001aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ae6200032360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000307576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fe90620004f3565b60405180910390fd5b80600f90805190602001906200031f9291906200034d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200035b90620005bb565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000620004146200040e846200053e565b62000515565b9050828152602081018484840111156200043357620004326200068a565b5b6200044084828562000585565b509392505050565b600082601f83011262000460576200045f62000685565b5b815162000472848260208601620003fd565b91505092915050565b60006020828403121562000494576200049362000694565b5b600082015167ffffffffffffffff811115620004b557620004b46200068f565b5b620004c38482850162000448565b91505092915050565b6000620004db60208362000574565b9150620004e882620006aa565b602082019050919050565b600060208201905081810360008301526200050e81620004cc565b9050919050565b60006200052162000534565b90506200052f8282620005f1565b919050565b6000604051905090565b600067ffffffffffffffff8211156200055c576200055b62000656565b5b620005678262000699565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005a557808201518184015260208101905062000588565b83811115620005b5576000848401525b50505050565b60006002820490506001821680620005d457607f821691505b60208210811415620005eb57620005ea62000627565b5b50919050565b620005fc8262000699565b810181811067ffffffffffffffff821117156200061e576200061d62000656565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613ed180620006e36000396000f3fe6080604052600436106102045760003560e01c80635c975abb11610118578063a475b5dd116100a0578063d5abeb011161006f578063d5abeb011461074f578063dc6536c21461077a578063e985e9c5146107a3578063f2c4ce1e146107e0578063f2fde38b1461080957610204565b8063a475b5dd146106a7578063b88d4fde146106be578063c6682862146106e7578063c87b56dd1461071257610204565b80637c78d9e0116100e75780637c78d9e0146105cf5780638da5cb5b1461060c57806395d89b4114610637578063a0712d6814610662578063a22cb4651461067e57610204565b80635c975abb146105135780636352211e1461053e57806370a082311461057b578063715018a6146105b857610204565b8063239c70ae1161019b57806342842e0e1161016a57806342842e0e1461041c578063438b6300146104455780634f6ccce71461048257806351830227146104bf57806355f804b3146104ea57610204565b8063239c70ae1461038157806323b872dd146103ac5780632f745c59146103d55780633ccfd60b1461041257610204565b8063081c8c44116101d7578063081c8c44146102d7578063095ea7b31461030257806313faede61461032b57806318160ddd1461035657610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061337b565b610832565b60405161023d9190613789565b60405180910390f35b34801561025257600080fd5b5061026d6004803603810190610268919061334e565b61097c565b005b34801561027b57600080fd5b50610284610a15565b60405161029191906137a4565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc919061341e565b610aa7565b6040516102ce9190613700565b60405180910390f35b3480156102e357600080fd5b506102ec610b23565b6040516102f991906137a4565b60405180910390f35b34801561030e57600080fd5b50610329600480360381019061032491906132c5565b610bb1565b005b34801561033757600080fd5b50610340610cbc565b60405161034d9190613826565b60405180910390f35b34801561036257600080fd5b5061036b610cc2565b6040516103789190613826565b60405180910390f35b34801561038d57600080fd5b50610396610cd0565b6040516103a39190613826565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce91906131af565b610cd6565b005b3480156103e157600080fd5b506103fc60048036038101906103f791906132c5565b610ce6565b6040516104099190613826565b60405180910390f35b61041a610ebf565b005b34801561042857600080fd5b50610443600480360381019061043e91906131af565b610fbb565b005b34801561045157600080fd5b5061046c60048036038101906104679190613142565b610fdb565b6040516104799190613767565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a4919061341e565b611089565b6040516104b69190613826565b60405180910390f35b3480156104cb57600080fd5b506104d46111ce565b6040516104e19190613789565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c91906133d5565b6111e1565b005b34801561051f57600080fd5b50610528611277565b6040516105359190613789565b60405180910390f35b34801561054a57600080fd5b506105656004803603810190610560919061341e565b61128a565b6040516105729190613700565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d9190613142565b6112a0565b6040516105af9190613826565b60405180910390f35b3480156105c457600080fd5b506105cd611370565b005b3480156105db57600080fd5b506105f660048036038101906105f19190613142565b6113f8565b6040516106039190613841565b60405180910390f35b34801561061857600080fd5b50610621611418565b60405161062e9190613700565b60405180910390f35b34801561064357600080fd5b5061064c611442565b60405161065991906137a4565b60405180910390f35b61067c6004803603810190610677919061341e565b6114d4565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613285565b611648565b005b3480156106b357600080fd5b506106bc6117c0565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190613202565b611859565b005b3480156106f357600080fd5b506106fc6118ac565b60405161070991906137a4565b60405180910390f35b34801561071e57600080fd5b506107396004803603810190610734919061341e565b61193a565b60405161074691906137a4565b60405180910390f35b34801561075b57600080fd5b50610764611a93565b6040516107719190613826565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c9190613305565b611a99565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061316f565b611bab565b6040516107d79190613789565b60405180910390f35b3480156107ec57600080fd5b50610807600480360381019061080291906133d5565b611c3f565b005b34801561081557600080fd5b50610830600480360381019061082b9190613142565b611cd5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108fd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061096557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610975575061097482611dcd565b5b9050919050565b610984611e37565b73ffffffffffffffffffffffffffffffffffffffff166109a2611418565b73ffffffffffffffffffffffffffffffffffffffff16146109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613806565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b606060028054610a2490613b83565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5090613b83565b8015610a9d5780601f10610a7257610100808354040283529160200191610a9d565b820191906000526020600020905b815481529060010190602001808311610a8057829003601f168201915b5050505050905090565b6000610ab282611e3f565b610ae8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f8054610b3090613b83565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c90613b83565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b505050505081565b6000610bbc8261128a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c24576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c43611e37565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c755750610c7381610c6e611e37565b611bab565b155b15610cac576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb7838383611e79565b505050565b600b5481565b600060015460005403905090565b600d5481565b610ce1838383611f2b565b505050565b6000610cf1836112a0565b8210610d29576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610eb3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610e125750610ea6565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e5257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ea45786841415610e9b578195505050505050610eb9565b83806001019450505b505b8080600101915050610d35565b50600080fd5b92915050565b610ec7611e37565b73ffffffffffffffffffffffffffffffffffffffff16610ee5611418565b73ffffffffffffffffffffffffffffffffffffffff1614610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290613806565b60405180910390fd5b6000610f45611418565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f68906136eb565b60006040518083038185875af1925050503d8060008114610fa5576040519150601f19603f3d011682016040523d82523d6000602084013e610faa565b606091505b5050905080610fb857600080fd5b50565b610fd683838360405180602001604052806000815250611859565b505050565b60606000610fe8836112a0565b905060008167ffffffffffffffff81111561100657611005613d1c565b5b6040519080825280602002602001820160405280156110345781602001602082028036833780820191505090505b50905060005b8281101561107e5761104c8582610ce6565b82828151811061105f5761105e613ced565b5b602002602001018181525050808061107690613be6565b91505061103a565b508092505050919050565b60008060005490506000805b82811015611196576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611188578583141561117f57819450505050506111c9565b82806001019350505b508080600101915050611095565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600e60019054906101000a900460ff1681565b6111e9611e37565b73ffffffffffffffffffffffffffffffffffffffff16611207611418565b73ffffffffffffffffffffffffffffffffffffffff161461125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613806565b60405180910390fd5b8060099080519060200190611273929190612e75565b5050565b600e60009054906101000a900460ff1681565b60006112958261241c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611308576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611378611e37565b73ffffffffffffffffffffffffffffffffffffffff16611396611418565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390613806565b60405180910390fd5b6113f66000612698565b565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461145190613b83565b80601f016020809104026020016040519081016040528092919081815260200182805461147d90613b83565b80156114ca5780601f1061149f576101008083540402835291602001916114ca565b820191906000526020600020905b8154815290600101906020018083116114ad57829003601f168201915b5050505050905090565b60006114de610cc2565b9050600e60009054906101000a900460ff16156114fa57600080fd5b6000821161150757600080fd5b600c54828261151691906139ab565b111561152157600080fd5b611529611418565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461163a576001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16146115b757600080fd5b600d548211156115c657600080fd5b81600b546115d49190613a32565b3410156115e057600080fd5b6002601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b611644338361275e565b5050565b611650611e37565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116c2611e37565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661176f611e37565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117b49190613789565b60405180910390a35050565b6117c8611e37565b73ffffffffffffffffffffffffffffffffffffffff166117e6611418565b73ffffffffffffffffffffffffffffffffffffffff161461183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390613806565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b611864848484611f2b565b6118708484848461277c565b6118a6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600a80546118b990613b83565b80601f01602080910402602001604051908101604052809291908181526020018280546118e590613b83565b80156119325780601f1061190757610100808354040283529160200191611932565b820191906000526020600020905b81548152906001019060200180831161191557829003601f168201915b505050505081565b606061194582611e3f565b611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b906137c6565b60405180910390fd5b60001515600e60019054906101000a900460ff1615151415611a3257600f80546119ad90613b83565b80601f01602080910402602001604051908101604052809291908181526020018280546119d990613b83565b8015611a265780601f106119fb57610100808354040283529160200191611a26565b820191906000526020600020905b815481529060010190602001808311611a0957829003601f168201915b50505050509050611a8e565b6000611a3c61290a565b90506000815111611a5c5760405180602001604052806000815250611a8a565b80611a668461299c565b600a604051602001611a7a939291906136ba565b6040516020818303038152906040525b9150505b919050565b600c5481565b611aa1611e37565b73ffffffffffffffffffffffffffffffffffffffff16611abf611418565b73ffffffffffffffffffffffffffffffffffffffff1614611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90613806565b60405180910390fd5b60005b8151811015611ba757600160106000848481518110611b3a57611b39613ced565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611b9f90613be6565b915050611b18565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c47611e37565b73ffffffffffffffffffffffffffffffffffffffff16611c65611418565b73ffffffffffffffffffffffffffffffffffffffff1614611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290613806565b60405180910390fd5b80600f9080519060200190611cd1929190612e75565b5050565b611cdd611e37565b73ffffffffffffffffffffffffffffffffffffffff16611cfb611418565b73ffffffffffffffffffffffffffffffffffffffff1614611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613806565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db8906137e6565b60405180910390fd5b611dca81612698565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482108015611e72575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f368261241c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611f5d611e37565b73ffffffffffffffffffffffffffffffffffffffff161480611f905750611f8f8260000151611f8a611e37565b611bab565b5b80611fd55750611f9e611e37565b73ffffffffffffffffffffffffffffffffffffffff16611fbd84610aa7565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061200e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612077576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120de576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120eb8585856001612afd565b6120fb6000848460000151611e79565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123ac576000548110156123ab5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124158585856001612b03565b5050505050565b612424612efb565b6000829050600054811015612661576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161265f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612543578092505050612693565b5b60011561265e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612659578092505050612693565b612544565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612778828260405180602001604052806000815250612b09565b5050565b600061279d8473ffffffffffffffffffffffffffffffffffffffff16612b1b565b156128fd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127c6611e37565b8786866040518563ffffffff1660e01b81526004016127e8949392919061371b565b602060405180830381600087803b15801561280257600080fd5b505af192505050801561283357506040513d601f19601f8201168201806040525081019061283091906133a8565b60015b6128ad573d8060008114612863576040519150601f19603f3d011682016040523d82523d6000602084013e612868565b606091505b506000815114156128a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612902565b600190505b949350505050565b60606009805461291990613b83565b80601f016020809104026020016040519081016040528092919081815260200182805461294590613b83565b80156129925780601f1061296757610100808354040283529160200191612992565b820191906000526020600020905b81548152906001019060200180831161297557829003601f168201915b5050505050905090565b606060008214156129e4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612af8565b600082905060005b60008214612a165780806129ff90613be6565b915050600a82612a0f9190613a01565b91506129ec565b60008167ffffffffffffffff811115612a3257612a31613d1c565b5b6040519080825280601f01601f191660200182016040528015612a645781602001600182028036833780820191505090505b5090505b60008514612af157600182612a7d9190613a8c565b9150600a85612a8c9190613c2f565b6030612a9891906139ab565b60f81b818381518110612aae57612aad613ced565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612aea9190613a01565b9450612a68565b8093505050505b919050565b50505050565b50505050565b612b168383836001612b3e565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612bab576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612be6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bf36000868387612afd565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612e5857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612e0c5750612e0a600088848861277c565b155b15612e43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612d91565b508060008190555050612e6e6000868387612b03565b5050505050565b828054612e8190613b83565b90600052602060002090601f016020900481019282612ea35760008555612eea565b82601f10612ebc57805160ff1916838001178555612eea565b82800160010185558215612eea579182015b82811115612ee9578251825591602001919060010190612ece565b5b509050612ef79190612f3e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612f57576000816000905550600101612f3f565b5090565b6000612f6e612f6984613881565b61385c565b90508083825260208201905082856020860282011115612f9157612f90613d50565b5b60005b85811015612fc15781612fa7888261304f565b845260208401935060208301925050600181019050612f94565b5050509392505050565b6000612fde612fd9846138ad565b61385c565b905082815260208101848484011115612ffa57612ff9613d55565b5b613005848285613b41565b509392505050565b600061302061301b846138de565b61385c565b90508281526020810184848401111561303c5761303b613d55565b5b613047848285613b41565b509392505050565b60008135905061305e81613e3f565b92915050565b600082601f83011261307957613078613d4b565b5b8135613089848260208601612f5b565b91505092915050565b6000813590506130a181613e56565b92915050565b6000813590506130b681613e6d565b92915050565b6000815190506130cb81613e6d565b92915050565b600082601f8301126130e6576130e5613d4b565b5b81356130f6848260208601612fcb565b91505092915050565b600082601f83011261311457613113613d4b565b5b813561312484826020860161300d565b91505092915050565b60008135905061313c81613e84565b92915050565b60006020828403121561315857613157613d5f565b5b60006131668482850161304f565b91505092915050565b6000806040838503121561318657613185613d5f565b5b60006131948582860161304f565b92505060206131a58582860161304f565b9150509250929050565b6000806000606084860312156131c8576131c7613d5f565b5b60006131d68682870161304f565b93505060206131e78682870161304f565b92505060406131f88682870161312d565b9150509250925092565b6000806000806080858703121561321c5761321b613d5f565b5b600061322a8782880161304f565b945050602061323b8782880161304f565b935050604061324c8782880161312d565b925050606085013567ffffffffffffffff81111561326d5761326c613d5a565b5b613279878288016130d1565b91505092959194509250565b6000806040838503121561329c5761329b613d5f565b5b60006132aa8582860161304f565b92505060206132bb85828601613092565b9150509250929050565b600080604083850312156132dc576132db613d5f565b5b60006132ea8582860161304f565b92505060206132fb8582860161312d565b9150509250929050565b60006020828403121561331b5761331a613d5f565b5b600082013567ffffffffffffffff81111561333957613338613d5a565b5b61334584828501613064565b91505092915050565b60006020828403121561336457613363613d5f565b5b600061337284828501613092565b91505092915050565b60006020828403121561339157613390613d5f565b5b600061339f848285016130a7565b91505092915050565b6000602082840312156133be576133bd613d5f565b5b60006133cc848285016130bc565b91505092915050565b6000602082840312156133eb576133ea613d5f565b5b600082013567ffffffffffffffff81111561340957613408613d5a565b5b613415848285016130ff565b91505092915050565b60006020828403121561343457613433613d5f565b5b60006134428482850161312d565b91505092915050565b6000613457838361368d565b60208301905092915050565b61346c81613ac0565b82525050565b600061347d82613934565b6134878185613962565b93506134928361390f565b8060005b838110156134c35781516134aa888261344b565b97506134b583613955565b925050600181019050613496565b5085935050505092915050565b6134d981613ad2565b82525050565b60006134ea8261393f565b6134f48185613973565b9350613504818560208601613b50565b61350d81613d64565b840191505092915050565b60006135238261394a565b61352d818561398f565b935061353d818560208601613b50565b61354681613d64565b840191505092915050565b600061355c8261394a565b61356681856139a0565b9350613576818560208601613b50565b80840191505092915050565b6000815461358f81613b83565b61359981866139a0565b945060018216600081146135b457600181146135c5576135f8565b60ff198316865281860193506135f8565b6135ce8561391f565b60005b838110156135f0578154818901526001820191506020810190506135d1565b838801955050505b50505092915050565b600061360e60308361398f565b915061361982613d75565b604082019050919050565b600061363160268361398f565b915061363c82613dc4565b604082019050919050565b600061365460208361398f565b915061365f82613e13565b602082019050919050565b6000613677600083613984565b915061368282613e3c565b600082019050919050565b61369681613b2a565b82525050565b6136a581613b2a565b82525050565b6136b481613b34565b82525050565b60006136c68286613551565b91506136d28285613551565b91506136de8284613582565b9150819050949350505050565b60006136f68261366a565b9150819050919050565b60006020820190506137156000830184613463565b92915050565b60006080820190506137306000830187613463565b61373d6020830186613463565b61374a604083018561369c565b818103606083015261375c81846134df565b905095945050505050565b600060208201905081810360008301526137818184613472565b905092915050565b600060208201905061379e60008301846134d0565b92915050565b600060208201905081810360008301526137be8184613518565b905092915050565b600060208201905081810360008301526137df81613601565b9050919050565b600060208201905081810360008301526137ff81613624565b9050919050565b6000602082019050818103600083015261381f81613647565b9050919050565b600060208201905061383b600083018461369c565b92915050565b600060208201905061385660008301846136ab565b92915050565b6000613866613877565b90506138728282613bb5565b919050565b6000604051905090565b600067ffffffffffffffff82111561389c5761389b613d1c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156138c8576138c7613d1c565b5b6138d182613d64565b9050602081019050919050565b600067ffffffffffffffff8211156138f9576138f8613d1c565b5b61390282613d64565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139b682613b2a565b91506139c183613b2a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139f6576139f5613c60565b5b828201905092915050565b6000613a0c82613b2a565b9150613a1783613b2a565b925082613a2757613a26613c8f565b5b828204905092915050565b6000613a3d82613b2a565b9150613a4883613b2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a8157613a80613c60565b5b828202905092915050565b6000613a9782613b2a565b9150613aa283613b2a565b925082821015613ab557613ab4613c60565b5b828203905092915050565b6000613acb82613b0a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613b6e578082015181840152602081019050613b53565b83811115613b7d576000848401525b50505050565b60006002820490506001821680613b9b57607f821691505b60208210811415613baf57613bae613cbe565b5b50919050565b613bbe82613d64565b810181811067ffffffffffffffff82111715613bdd57613bdc613d1c565b5b80604052505050565b6000613bf182613b2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c2457613c23613c60565b5b600182019050919050565b6000613c3a82613b2a565b9150613c4583613b2a565b925082613c5557613c54613c8f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b613e4881613ac0565b8114613e5357600080fd5b50565b613e5f81613ad2565b8114613e6a57600080fd5b50565b613e7681613ade565b8114613e8157600080fd5b50565b613e8d81613b2a565b8114613e9857600080fd5b5056fea264697066735822122087f5eddaf983e192de3a6a2391bbb1148586ec5a63e7de66a4dc22ec3ace96a864736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102045760003560e01c80635c975abb11610118578063a475b5dd116100a0578063d5abeb011161006f578063d5abeb011461074f578063dc6536c21461077a578063e985e9c5146107a3578063f2c4ce1e146107e0578063f2fde38b1461080957610204565b8063a475b5dd146106a7578063b88d4fde146106be578063c6682862146106e7578063c87b56dd1461071257610204565b80637c78d9e0116100e75780637c78d9e0146105cf5780638da5cb5b1461060c57806395d89b4114610637578063a0712d6814610662578063a22cb4651461067e57610204565b80635c975abb146105135780636352211e1461053e57806370a082311461057b578063715018a6146105b857610204565b8063239c70ae1161019b57806342842e0e1161016a57806342842e0e1461041c578063438b6300146104455780634f6ccce71461048257806351830227146104bf57806355f804b3146104ea57610204565b8063239c70ae1461038157806323b872dd146103ac5780632f745c59146103d55780633ccfd60b1461041257610204565b8063081c8c44116101d7578063081c8c44146102d7578063095ea7b31461030257806313faede61461032b57806318160ddd1461035657610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061337b565b610832565b60405161023d9190613789565b60405180910390f35b34801561025257600080fd5b5061026d6004803603810190610268919061334e565b61097c565b005b34801561027b57600080fd5b50610284610a15565b60405161029191906137a4565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc919061341e565b610aa7565b6040516102ce9190613700565b60405180910390f35b3480156102e357600080fd5b506102ec610b23565b6040516102f991906137a4565b60405180910390f35b34801561030e57600080fd5b50610329600480360381019061032491906132c5565b610bb1565b005b34801561033757600080fd5b50610340610cbc565b60405161034d9190613826565b60405180910390f35b34801561036257600080fd5b5061036b610cc2565b6040516103789190613826565b60405180910390f35b34801561038d57600080fd5b50610396610cd0565b6040516103a39190613826565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce91906131af565b610cd6565b005b3480156103e157600080fd5b506103fc60048036038101906103f791906132c5565b610ce6565b6040516104099190613826565b60405180910390f35b61041a610ebf565b005b34801561042857600080fd5b50610443600480360381019061043e91906131af565b610fbb565b005b34801561045157600080fd5b5061046c60048036038101906104679190613142565b610fdb565b6040516104799190613767565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a4919061341e565b611089565b6040516104b69190613826565b60405180910390f35b3480156104cb57600080fd5b506104d46111ce565b6040516104e19190613789565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c91906133d5565b6111e1565b005b34801561051f57600080fd5b50610528611277565b6040516105359190613789565b60405180910390f35b34801561054a57600080fd5b506105656004803603810190610560919061341e565b61128a565b6040516105729190613700565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d9190613142565b6112a0565b6040516105af9190613826565b60405180910390f35b3480156105c457600080fd5b506105cd611370565b005b3480156105db57600080fd5b506105f660048036038101906105f19190613142565b6113f8565b6040516106039190613841565b60405180910390f35b34801561061857600080fd5b50610621611418565b60405161062e9190613700565b60405180910390f35b34801561064357600080fd5b5061064c611442565b60405161065991906137a4565b60405180910390f35b61067c6004803603810190610677919061341e565b6114d4565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613285565b611648565b005b3480156106b357600080fd5b506106bc6117c0565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190613202565b611859565b005b3480156106f357600080fd5b506106fc6118ac565b60405161070991906137a4565b60405180910390f35b34801561071e57600080fd5b506107396004803603810190610734919061341e565b61193a565b60405161074691906137a4565b60405180910390f35b34801561075b57600080fd5b50610764611a93565b6040516107719190613826565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c9190613305565b611a99565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061316f565b611bab565b6040516107d79190613789565b60405180910390f35b3480156107ec57600080fd5b50610807600480360381019061080291906133d5565b611c3f565b005b34801561081557600080fd5b50610830600480360381019061082b9190613142565b611cd5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108fd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061096557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610975575061097482611dcd565b5b9050919050565b610984611e37565b73ffffffffffffffffffffffffffffffffffffffff166109a2611418565b73ffffffffffffffffffffffffffffffffffffffff16146109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613806565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b606060028054610a2490613b83565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5090613b83565b8015610a9d5780601f10610a7257610100808354040283529160200191610a9d565b820191906000526020600020905b815481529060010190602001808311610a8057829003601f168201915b5050505050905090565b6000610ab282611e3f565b610ae8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f8054610b3090613b83565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c90613b83565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b505050505081565b6000610bbc8261128a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c24576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c43611e37565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c755750610c7381610c6e611e37565b611bab565b155b15610cac576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb7838383611e79565b505050565b600b5481565b600060015460005403905090565b600d5481565b610ce1838383611f2b565b505050565b6000610cf1836112a0565b8210610d29576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610eb3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610e125750610ea6565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e5257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ea45786841415610e9b578195505050505050610eb9565b83806001019450505b505b8080600101915050610d35565b50600080fd5b92915050565b610ec7611e37565b73ffffffffffffffffffffffffffffffffffffffff16610ee5611418565b73ffffffffffffffffffffffffffffffffffffffff1614610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290613806565b60405180910390fd5b6000610f45611418565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f68906136eb565b60006040518083038185875af1925050503d8060008114610fa5576040519150601f19603f3d011682016040523d82523d6000602084013e610faa565b606091505b5050905080610fb857600080fd5b50565b610fd683838360405180602001604052806000815250611859565b505050565b60606000610fe8836112a0565b905060008167ffffffffffffffff81111561100657611005613d1c565b5b6040519080825280602002602001820160405280156110345781602001602082028036833780820191505090505b50905060005b8281101561107e5761104c8582610ce6565b82828151811061105f5761105e613ced565b5b602002602001018181525050808061107690613be6565b91505061103a565b508092505050919050565b60008060005490506000805b82811015611196576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611188578583141561117f57819450505050506111c9565b82806001019350505b508080600101915050611095565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600e60019054906101000a900460ff1681565b6111e9611e37565b73ffffffffffffffffffffffffffffffffffffffff16611207611418565b73ffffffffffffffffffffffffffffffffffffffff161461125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613806565b60405180910390fd5b8060099080519060200190611273929190612e75565b5050565b600e60009054906101000a900460ff1681565b60006112958261241c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611308576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611378611e37565b73ffffffffffffffffffffffffffffffffffffffff16611396611418565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390613806565b60405180910390fd5b6113f66000612698565b565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461145190613b83565b80601f016020809104026020016040519081016040528092919081815260200182805461147d90613b83565b80156114ca5780601f1061149f576101008083540402835291602001916114ca565b820191906000526020600020905b8154815290600101906020018083116114ad57829003601f168201915b5050505050905090565b60006114de610cc2565b9050600e60009054906101000a900460ff16156114fa57600080fd5b6000821161150757600080fd5b600c54828261151691906139ab565b111561152157600080fd5b611529611418565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461163a576001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16146115b757600080fd5b600d548211156115c657600080fd5b81600b546115d49190613a32565b3410156115e057600080fd5b6002601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b611644338361275e565b5050565b611650611e37565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116c2611e37565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661176f611e37565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117b49190613789565b60405180910390a35050565b6117c8611e37565b73ffffffffffffffffffffffffffffffffffffffff166117e6611418565b73ffffffffffffffffffffffffffffffffffffffff161461183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390613806565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b611864848484611f2b565b6118708484848461277c565b6118a6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600a80546118b990613b83565b80601f01602080910402602001604051908101604052809291908181526020018280546118e590613b83565b80156119325780601f1061190757610100808354040283529160200191611932565b820191906000526020600020905b81548152906001019060200180831161191557829003601f168201915b505050505081565b606061194582611e3f565b611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b906137c6565b60405180910390fd5b60001515600e60019054906101000a900460ff1615151415611a3257600f80546119ad90613b83565b80601f01602080910402602001604051908101604052809291908181526020018280546119d990613b83565b8015611a265780601f106119fb57610100808354040283529160200191611a26565b820191906000526020600020905b815481529060010190602001808311611a0957829003601f168201915b50505050509050611a8e565b6000611a3c61290a565b90506000815111611a5c5760405180602001604052806000815250611a8a565b80611a668461299c565b600a604051602001611a7a939291906136ba565b6040516020818303038152906040525b9150505b919050565b600c5481565b611aa1611e37565b73ffffffffffffffffffffffffffffffffffffffff16611abf611418565b73ffffffffffffffffffffffffffffffffffffffff1614611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90613806565b60405180910390fd5b60005b8151811015611ba757600160106000848481518110611b3a57611b39613ced565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611b9f90613be6565b915050611b18565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c47611e37565b73ffffffffffffffffffffffffffffffffffffffff16611c65611418565b73ffffffffffffffffffffffffffffffffffffffff1614611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290613806565b60405180910390fd5b80600f9080519060200190611cd1929190612e75565b5050565b611cdd611e37565b73ffffffffffffffffffffffffffffffffffffffff16611cfb611418565b73ffffffffffffffffffffffffffffffffffffffff1614611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613806565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db8906137e6565b60405180910390fd5b611dca81612698565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482108015611e72575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f368261241c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611f5d611e37565b73ffffffffffffffffffffffffffffffffffffffff161480611f905750611f8f8260000151611f8a611e37565b611bab565b5b80611fd55750611f9e611e37565b73ffffffffffffffffffffffffffffffffffffffff16611fbd84610aa7565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061200e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612077576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120de576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120eb8585856001612afd565b6120fb6000848460000151611e79565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123ac576000548110156123ab5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124158585856001612b03565b5050505050565b612424612efb565b6000829050600054811015612661576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161265f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612543578092505050612693565b5b60011561265e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612659578092505050612693565b612544565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612778828260405180602001604052806000815250612b09565b5050565b600061279d8473ffffffffffffffffffffffffffffffffffffffff16612b1b565b156128fd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127c6611e37565b8786866040518563ffffffff1660e01b81526004016127e8949392919061371b565b602060405180830381600087803b15801561280257600080fd5b505af192505050801561283357506040513d601f19601f8201168201806040525081019061283091906133a8565b60015b6128ad573d8060008114612863576040519150601f19603f3d011682016040523d82523d6000602084013e612868565b606091505b506000815114156128a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612902565b600190505b949350505050565b60606009805461291990613b83565b80601f016020809104026020016040519081016040528092919081815260200182805461294590613b83565b80156129925780601f1061296757610100808354040283529160200191612992565b820191906000526020600020905b81548152906001019060200180831161297557829003601f168201915b5050505050905090565b606060008214156129e4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612af8565b600082905060005b60008214612a165780806129ff90613be6565b915050600a82612a0f9190613a01565b91506129ec565b60008167ffffffffffffffff811115612a3257612a31613d1c565b5b6040519080825280601f01601f191660200182016040528015612a645781602001600182028036833780820191505090505b5090505b60008514612af157600182612a7d9190613a8c565b9150600a85612a8c9190613c2f565b6030612a9891906139ab565b60f81b818381518110612aae57612aad613ced565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612aea9190613a01565b9450612a68565b8093505050505b919050565b50505050565b50505050565b612b168383836001612b3e565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612bab576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612be6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bf36000868387612afd565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612e5857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612e0c5750612e0a600088848861277c565b155b15612e43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612d91565b508060008190555050612e6e6000868387612b03565b5050505050565b828054612e8190613b83565b90600052602060002090601f016020900481019282612ea35760008555612eea565b82601f10612ebc57805160ff1916838001178555612eea565b82800160010185558215612eea579182015b82811115612ee9578251825591602001919060010190612ece565b5b509050612ef79190612f3e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612f57576000816000905550600101612f3f565b5090565b6000612f6e612f6984613881565b61385c565b90508083825260208201905082856020860282011115612f9157612f90613d50565b5b60005b85811015612fc15781612fa7888261304f565b845260208401935060208301925050600181019050612f94565b5050509392505050565b6000612fde612fd9846138ad565b61385c565b905082815260208101848484011115612ffa57612ff9613d55565b5b613005848285613b41565b509392505050565b600061302061301b846138de565b61385c565b90508281526020810184848401111561303c5761303b613d55565b5b613047848285613b41565b509392505050565b60008135905061305e81613e3f565b92915050565b600082601f83011261307957613078613d4b565b5b8135613089848260208601612f5b565b91505092915050565b6000813590506130a181613e56565b92915050565b6000813590506130b681613e6d565b92915050565b6000815190506130cb81613e6d565b92915050565b600082601f8301126130e6576130e5613d4b565b5b81356130f6848260208601612fcb565b91505092915050565b600082601f83011261311457613113613d4b565b5b813561312484826020860161300d565b91505092915050565b60008135905061313c81613e84565b92915050565b60006020828403121561315857613157613d5f565b5b60006131668482850161304f565b91505092915050565b6000806040838503121561318657613185613d5f565b5b60006131948582860161304f565b92505060206131a58582860161304f565b9150509250929050565b6000806000606084860312156131c8576131c7613d5f565b5b60006131d68682870161304f565b93505060206131e78682870161304f565b92505060406131f88682870161312d565b9150509250925092565b6000806000806080858703121561321c5761321b613d5f565b5b600061322a8782880161304f565b945050602061323b8782880161304f565b935050604061324c8782880161312d565b925050606085013567ffffffffffffffff81111561326d5761326c613d5a565b5b613279878288016130d1565b91505092959194509250565b6000806040838503121561329c5761329b613d5f565b5b60006132aa8582860161304f565b92505060206132bb85828601613092565b9150509250929050565b600080604083850312156132dc576132db613d5f565b5b60006132ea8582860161304f565b92505060206132fb8582860161312d565b9150509250929050565b60006020828403121561331b5761331a613d5f565b5b600082013567ffffffffffffffff81111561333957613338613d5a565b5b61334584828501613064565b91505092915050565b60006020828403121561336457613363613d5f565b5b600061337284828501613092565b91505092915050565b60006020828403121561339157613390613d5f565b5b600061339f848285016130a7565b91505092915050565b6000602082840312156133be576133bd613d5f565b5b60006133cc848285016130bc565b91505092915050565b6000602082840312156133eb576133ea613d5f565b5b600082013567ffffffffffffffff81111561340957613408613d5a565b5b613415848285016130ff565b91505092915050565b60006020828403121561343457613433613d5f565b5b60006134428482850161312d565b91505092915050565b6000613457838361368d565b60208301905092915050565b61346c81613ac0565b82525050565b600061347d82613934565b6134878185613962565b93506134928361390f565b8060005b838110156134c35781516134aa888261344b565b97506134b583613955565b925050600181019050613496565b5085935050505092915050565b6134d981613ad2565b82525050565b60006134ea8261393f565b6134f48185613973565b9350613504818560208601613b50565b61350d81613d64565b840191505092915050565b60006135238261394a565b61352d818561398f565b935061353d818560208601613b50565b61354681613d64565b840191505092915050565b600061355c8261394a565b61356681856139a0565b9350613576818560208601613b50565b80840191505092915050565b6000815461358f81613b83565b61359981866139a0565b945060018216600081146135b457600181146135c5576135f8565b60ff198316865281860193506135f8565b6135ce8561391f565b60005b838110156135f0578154818901526001820191506020810190506135d1565b838801955050505b50505092915050565b600061360e60308361398f565b915061361982613d75565b604082019050919050565b600061363160268361398f565b915061363c82613dc4565b604082019050919050565b600061365460208361398f565b915061365f82613e13565b602082019050919050565b6000613677600083613984565b915061368282613e3c565b600082019050919050565b61369681613b2a565b82525050565b6136a581613b2a565b82525050565b6136b481613b34565b82525050565b60006136c68286613551565b91506136d28285613551565b91506136de8284613582565b9150819050949350505050565b60006136f68261366a565b9150819050919050565b60006020820190506137156000830184613463565b92915050565b60006080820190506137306000830187613463565b61373d6020830186613463565b61374a604083018561369c565b818103606083015261375c81846134df565b905095945050505050565b600060208201905081810360008301526137818184613472565b905092915050565b600060208201905061379e60008301846134d0565b92915050565b600060208201905081810360008301526137be8184613518565b905092915050565b600060208201905081810360008301526137df81613601565b9050919050565b600060208201905081810360008301526137ff81613624565b9050919050565b6000602082019050818103600083015261381f81613647565b9050919050565b600060208201905061383b600083018461369c565b92915050565b600060208201905061385660008301846136ab565b92915050565b6000613866613877565b90506138728282613bb5565b919050565b6000604051905090565b600067ffffffffffffffff82111561389c5761389b613d1c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156138c8576138c7613d1c565b5b6138d182613d64565b9050602081019050919050565b600067ffffffffffffffff8211156138f9576138f8613d1c565b5b61390282613d64565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139b682613b2a565b91506139c183613b2a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139f6576139f5613c60565b5b828201905092915050565b6000613a0c82613b2a565b9150613a1783613b2a565b925082613a2757613a26613c8f565b5b828204905092915050565b6000613a3d82613b2a565b9150613a4883613b2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a8157613a80613c60565b5b828202905092915050565b6000613a9782613b2a565b9150613aa283613b2a565b925082821015613ab557613ab4613c60565b5b828203905092915050565b6000613acb82613b0a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613b6e578082015181840152602081019050613b53565b83811115613b7d576000848401525b50505050565b60006002820490506001821680613b9b57607f821691505b60208210811415613baf57613bae613cbe565b5b50919050565b613bbe82613d64565b810181811067ffffffffffffffff82111715613bdd57613bdc613d1c565b5b80604052505050565b6000613bf182613b2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c2457613c23613c60565b5b600182019050919050565b6000613c3a82613b2a565b9150613c4583613b2a565b925082613c5557613c54613c8f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b613e4881613ac0565b8114613e5357600080fd5b50565b613e5f81613ad2565b8114613e6a57600080fd5b50565b613e7681613ade565b8114613e8157600080fd5b50565b613e8d81613b2a565b8114613e9857600080fd5b5056fea264697066735822122087f5eddaf983e192de3a6a2391bbb1148586ec5a63e7de66a4dc22ec3ace96a864736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initNotRevealedUri (string):
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
46174:3232:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29695:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49161:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32305:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33808:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46507:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33371:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46323:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26932:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46400:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34665:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28518:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49248:155;;;:::i;:::-;;34906:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47499:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27505:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46472:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49049:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46439:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32114:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30131:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;46616:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32474:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46984:507;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34084:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48645:69;;;;;;;;;;;;;:::i;:::-;;35162:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46279:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47897:726;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46362:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48722:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34434:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48915:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29695:372;29797:4;29849:25;29834:40;;;:11;:40;;;;:105;;;;29906:33;29891:48;;;:11;:48;;;;29834:105;:172;;;;29971:35;29956:50;;;:11;:50;;;;29834:172;:225;;;;30023:36;30047:11;30023:23;:36::i;:::-;29834:225;29814:245;;29695:372;;;:::o;49161:79::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49226:6:::1;49217;;:15;;;;;;;;;;;;;;;;;;49161:79:::0;:::o;32305:100::-;32359:13;32392:5;32385:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32305:100;:::o;33808:204::-;33876:7;33901:16;33909:7;33901;:16::i;:::-;33896:64;;33926:34;;;;;;;;;;;;;;33896:64;33980:15;:24;33996:7;33980:24;;;;;;;;;;;;;;;;;;;;;33973:31;;33808:204;;;:::o;46507:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33371:371::-;33444:13;33460:24;33476:7;33460:15;:24::i;:::-;33444:40;;33505:5;33499:11;;:2;:11;;;33495:48;;;33519:24;;;;;;;;;;;;;;33495:48;33576:5;33560:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33586:37;33603:5;33610:12;:10;:12::i;:::-;33586:16;:37::i;:::-;33585:38;33560:63;33556:138;;;33647:35;;;;;;;;;;;;;;33556:138;33706:28;33715:2;33719:7;33728:5;33706:8;:28::i;:::-;33433:309;33371:371;;:::o;46323:32::-;;;;:::o;26932:280::-;26985:7;27177:12;;27161:13;;:28;27154:35;;26932:280;:::o;46400:32::-;;;;:::o;34665:170::-;34799:28;34809:4;34815:2;34819:7;34799:9;:28::i;:::-;34665:170;;;:::o;28518:1105::-;28607:7;28640:16;28650:5;28640:9;:16::i;:::-;28631:5;:25;28627:61;;28665:23;;;;;;;;;;;;;;28627:61;28699:22;28724:13;;28699:38;;28748:19;28778:25;28979:9;28974:557;28994:14;28990:1;:18;28974:557;;;29034:31;29068:11;:14;29080:1;29068:14;;;;;;;;;;;29034:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29105:9;:16;;;29101:73;;;29146:8;;;29101:73;29222:1;29196:28;;:9;:14;;;:28;;;29192:111;;29269:9;:14;;;29249:34;;29192:111;29346:5;29325:26;;:17;:26;;;29321:195;;;29395:5;29380:11;:20;29376:85;;;29436:1;29429:8;;;;;;;;;29376:85;29483:13;;;;;;;29321:195;29015:516;28974:557;29010:3;;;;;;;28974:557;;;;29607:8;;;28518:1105;;;;;:::o;49248:155::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49305:7:::1;49326;:5;:7::i;:::-;49318:21;;49347;49318:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49304:69;;;49392:2;49384:11;;;::::0;::::1;;49293:110;49248:155::o:0;34906:185::-;35044:39;35061:4;35067:2;35071:7;35044:39;;;;;;;;;;;;:16;:39::i;:::-;34906:185;;;:::o;47499:390::-;47586:16;47620:23;47646:17;47656:6;47646:9;:17::i;:::-;47620:43;;47674:25;47716:15;47702:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47674:58;;47748:9;47743:113;47763:15;47759:1;:19;47743:113;;;47814:30;47834:6;47842:1;47814:19;:30::i;:::-;47800:8;47809:1;47800:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;47780:3;;;;;:::i;:::-;;;;47743:113;;;;47873:8;47866:15;;;;47499:390;;;:::o;27505:713::-;27572:7;27592:22;27617:13;;27592:38;;27641:19;27836:9;27831:328;27851:14;27847:1;:18;27831:328;;;27891:31;27925:11;:14;27937:1;27925:14;;;;;;;;;;;27891:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27963:9;:16;;;27958:186;;28023:5;28008:11;:20;28004:85;;;28064:1;28057:8;;;;;;;;28004:85;28111:13;;;;;;;27958:186;27872:287;27867:3;;;;;;;27831:328;;;;28187:23;;;;;;;;;;;;;;27505:713;;;;:::o;46472:28::-;;;;;;;;;;;;;:::o;49049:104::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49134:11:::1;49124:7;:21;;;;;;;;;;;;:::i;:::-;;49049:104:::0;:::o;46439:26::-;;;;;;;;;;;;;:::o;32114:124::-;32178:7;32205:20;32217:7;32205:11;:20::i;:::-;:25;;;32198:32;;32114:124;;;:::o;30131:206::-;30195:7;30236:1;30219:19;;:5;:19;;;30215:60;;;30247:28;;;;;;;;;;;;;;30215:60;30301:12;:19;30314:5;30301:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30293:36;;30286:43;;30131:206;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;46616:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;32474:104::-;32530:13;32563:7;32556:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32474:104;:::o;46984:507::-;47045:14;47062:13;:11;:13::i;:::-;47045:30;;47095:6;;;;;;;;;;;47094:7;47086:16;;;;;;47135:1;47121:11;:15;47113:24;;;;;;47180:9;;47165:11;47156:6;:20;;;;:::i;:::-;:33;;47148:42;;;;;;47221:7;:5;:7::i;:::-;47207:21;;:10;:21;;;47203:234;;47277:1;47253:8;:20;47262:10;47253:20;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;47245:34;;;;;;47317:13;;47302:11;:28;;47294:37;;;;;;47374:11;47367:4;;:18;;;;:::i;:::-;47354:9;:31;;47346:40;;;;;;47424:1;47401:8;:20;47410:10;47401:20;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;47203:234;47449:34;47459:10;47471:11;47449:9;:34::i;:::-;47034:457;46984:507;:::o;34084:279::-;34187:12;:10;:12::i;:::-;34175:24;;:8;:24;;;34171:54;;;34208:17;;;;;;;;;;;;;;34171:54;34283:8;34238:18;:32;34257:12;:10;:12::i;:::-;34238:32;;;;;;;;;;;;;;;:42;34271:8;34238:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34336:8;34307:48;;34322:12;:10;:12::i;:::-;34307:48;;;34346:8;34307:48;;;;;;:::i;:::-;;;;;;;;34084:279;;:::o;48645:69::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48702:4:::1;48691:8;;:15;;;;;;;;;;;;;;;;;;48645:69::o:0;35162:342::-;35329:28;35339:4;35345:2;35349:7;35329:9;:28::i;:::-;35373:48;35396:4;35402:2;35406:7;35415:5;35373:22;:48::i;:::-;35368:129;;35445:40;;;;;;;;;;;;;;35368:129;35162:342;;;;:::o;46279:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47897:726::-;48015:13;48068:16;48076:7;48068;:16::i;:::-;48046:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;48189:5;48177:17;;:8;;;;;;;;;;;:17;;;48173:71;;;48218:14;48211:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48173:71;48256:28;48287:10;:8;:10::i;:::-;48256:41;;48359:1;48334:14;48328:28;:32;:287;;;;;;;;;;;;;;;;;48452:14;48493:18;:7;:16;:18::i;:::-;48538:13;48409:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48328:287;48308:307;;;47897:726;;;;:::o;46362:31::-;;;;:::o;48722:185::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48805:9:::1;48800:100;48824:9;:16;48820:1;:20;48800:100;;;48887:1;48862:8;:22;48871:9;48881:1;48871:12;;;;;;;;:::i;:::-;;;;;;;;48862:22;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;48842:3;;;;;:::i;:::-;;;;48800:100;;;;48722:185:::0;:::o;34434:164::-;34531:4;34555:18;:25;34574:5;34555:25;;;;;;;;;;;;;;;:35;34581:8;34555:35;;;;;;;;;;;;;;;;;;;;;;;;;34548:42;;34434:164;;;;:::o;48915:126::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49018:15:::1;49001:14;:32;;;;;;;;;;;;:::i;:::-;;48915:126:::0;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;16863:157::-;16948:4;16987:25;16972:40;;;:11;:40;;;;16965:47;;16863:157;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;35759:144::-;35816:4;35850:13;;35840:7;:23;:55;;;;;35868:11;:20;35880:7;35868:20;;;;;;;;;;;:27;;;;;;;;;;;;35867:28;35840:55;35833:62;;35759:144;;;:::o;42965:196::-;43107:2;43080:15;:24;43096:7;43080:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43145:7;43141:2;43125:28;;43134:5;43125:28;;;;;;;;;;;;42965:196;;;:::o;38466:2112::-;38581:35;38619:20;38631:7;38619:11;:20::i;:::-;38581:58;;38652:22;38694:13;:18;;;38678:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;38729:50;38746:13;:18;;;38766:12;:10;:12::i;:::-;38729:16;:50::i;:::-;38678:101;:154;;;;38820:12;:10;:12::i;:::-;38796:36;;:20;38808:7;38796:11;:20::i;:::-;:36;;;38678:154;38652:181;;38851:17;38846:66;;38877:35;;;;;;;;;;;;;;38846:66;38949:4;38927:26;;:13;:18;;;:26;;;38923:67;;38962:28;;;;;;;;;;;;;;38923:67;39019:1;39005:16;;:2;:16;;;39001:52;;;39030:23;;;;;;;;;;;;;;39001:52;39066:43;39088:4;39094:2;39098:7;39107:1;39066:21;:43::i;:::-;39174:49;39191:1;39195:7;39204:13;:18;;;39174:8;:49::i;:::-;39549:1;39519:12;:18;39532:4;39519:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39593:1;39565:12;:16;39578:2;39565:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39639:2;39611:11;:20;39623:7;39611:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;39701:15;39656:11;:20;39668:7;39656:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;39969:19;40001:1;39991:7;:11;39969:33;;40062:1;40021:43;;:11;:24;40033:11;40021:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40017:445;;;40246:13;;40232:11;:27;40228:219;;;40316:13;:18;;;40284:11;:24;40296:11;40284:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40399:13;:28;;;40357:11;:24;40369:11;40357:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40228:219;40017:445;39494:979;40509:7;40505:2;40490:27;;40499:4;40490:27;;;;;;;;;;;;40528:42;40549:4;40555:2;40559:7;40568:1;40528:20;:42::i;:::-;38570:2008;;38466:2112;;;:::o;30969:1083::-;31030:21;;:::i;:::-;31064:12;31079:7;31064:22;;31135:13;;31128:4;:20;31124:861;;;31169:31;31203:11;:17;31215:4;31203:17;;;;;;;;;;;31169:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31244:9;:16;;;31239:731;;31315:1;31289:28;;:9;:14;;;:28;;;31285:101;;31353:9;31346:16;;;;;;31285:101;31690:261;31697:4;31690:261;;;31730:6;;;;;;;;31775:11;:17;31787:4;31775:17;;;;;;;;;;;31763:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31849:1;31823:28;;:9;:14;;;:28;;;31819:109;;31891:9;31884:16;;;;;;31819:109;31690:261;;;31239:731;31150:835;31124:861;32013:31;;;;;;;;;;;;;;30969:1083;;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;35911:104::-;35980:27;35990:2;35994:8;35980:27;;;;;;;;;;;;:9;:27::i;:::-;35911:104;;:::o;43726:790::-;43881:4;43902:15;:2;:13;;;:15::i;:::-;43898:611;;;43954:2;43938:36;;;43975:12;:10;:12::i;:::-;43989:4;43995:7;44004:5;43938:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43934:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44201:1;44184:6;:13;:18;44180:259;;;44234:40;;;;;;;;;;;;;;44180:259;44389:6;44383:13;44374:6;44370:2;44366:15;44359:38;43934:520;44071:45;;;44061:55;;;:6;:55;;;;44054:62;;;;;43898:611;44493:4;44486:11;;43726:790;;;;;;;:::o;46853:108::-;46913:13;46946:7;46939:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46853:108;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;45164:159::-;;;;;:::o;45982:158::-;;;;;:::o;36378:163::-;36501:32;36507:2;36511:8;36521:5;36528:4;36501:5;:32::i;:::-;36378:163;;;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;36800:1412::-;36939:20;36962:13;;36939:36;;37004:1;36990:16;;:2;:16;;;36986:48;;;37015:19;;;;;;;;;;;;;;36986:48;37061:1;37049:8;:13;37045:44;;;37071:18;;;;;;;;;;;;;;37045:44;37102:61;37132:1;37136:2;37140:12;37154:8;37102:21;:61::i;:::-;37475:8;37440:12;:16;37453:2;37440:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37539:8;37499:12;:16;37512:2;37499:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37598:2;37565:11;:25;37577:12;37565:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37665:15;37615:11;:25;37627:12;37615:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37698:20;37721:12;37698:35;;37755:9;37750:328;37770:8;37766:1;:12;37750:328;;;37834:12;37830:2;37809:38;;37826:1;37809:38;;;;;;;;;;;;37870:4;:68;;;;;37879:59;37910:1;37914:2;37918:12;37932:5;37879:22;:59::i;:::-;37878:60;37870:68;37866:164;;;37970:40;;;;;;;;;;;;;;37866:164;38048:14;;;;;;;37780:3;;;;;;;37750:328;;;;38110:12;38094:13;:28;;;;37415:719;38144:60;38173:1;38177:2;38181:12;38195:8;38144:20;:60::i;:::-;36928:1284;36800:1412;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:323::-;7359:6;7408:2;7396:9;7387:7;7383:23;7379:32;7376:119;;;7414:79;;:::i;:::-;7376:119;7534:1;7559:50;7601:7;7592:6;7581:9;7577:22;7559:50;:::i;:::-;7549:60;;7505:114;7303:323;;;;:::o;7632:327::-;7690:6;7739:2;7727:9;7718:7;7714:23;7710:32;7707:119;;;7745:79;;:::i;:::-;7707:119;7865:1;7890:52;7934:7;7925:6;7914:9;7910:22;7890:52;:::i;:::-;7880:62;;7836:116;7632:327;;;;:::o;7965:349::-;8034:6;8083:2;8071:9;8062:7;8058:23;8054:32;8051:119;;;8089:79;;:::i;:::-;8051:119;8209:1;8234:63;8289:7;8280:6;8269:9;8265:22;8234:63;:::i;:::-;8224:73;;8180:127;7965:349;;;;:::o;8320:509::-;8389:6;8438:2;8426:9;8417:7;8413:23;8409:32;8406:119;;;8444:79;;:::i;:::-;8406:119;8592:1;8581:9;8577:17;8564:31;8622:18;8614:6;8611:30;8608:117;;;8644:79;;:::i;:::-;8608:117;8749:63;8804:7;8795:6;8784:9;8780:22;8749:63;:::i;:::-;8739:73;;8535:287;8320:509;;;;:::o;8835:329::-;8894:6;8943:2;8931:9;8922:7;8918:23;8914:32;8911:119;;;8949:79;;:::i;:::-;8911:119;9069:1;9094:53;9139:7;9130:6;9119:9;9115:22;9094:53;:::i;:::-;9084:63;;9040:117;8835:329;;;;:::o;9170:179::-;9239:10;9260:46;9302:3;9294:6;9260:46;:::i;:::-;9338:4;9333:3;9329:14;9315:28;;9170:179;;;;:::o;9355:118::-;9442:24;9460:5;9442:24;:::i;:::-;9437:3;9430:37;9355:118;;:::o;9509:732::-;9628:3;9657:54;9705:5;9657:54;:::i;:::-;9727:86;9806:6;9801:3;9727:86;:::i;:::-;9720:93;;9837:56;9887:5;9837:56;:::i;:::-;9916:7;9947:1;9932:284;9957:6;9954:1;9951:13;9932:284;;;10033:6;10027:13;10060:63;10119:3;10104:13;10060:63;:::i;:::-;10053:70;;10146:60;10199:6;10146:60;:::i;:::-;10136:70;;9992:224;9979:1;9976;9972:9;9967:14;;9932:284;;;9936:14;10232:3;10225:10;;9633:608;;;9509:732;;;;:::o;10247:109::-;10328:21;10343:5;10328:21;:::i;:::-;10323:3;10316:34;10247:109;;:::o;10362:360::-;10448:3;10476:38;10508:5;10476:38;:::i;:::-;10530:70;10593:6;10588:3;10530:70;:::i;:::-;10523:77;;10609:52;10654:6;10649:3;10642:4;10635:5;10631:16;10609:52;:::i;:::-;10686:29;10708:6;10686:29;:::i;:::-;10681:3;10677:39;10670:46;;10452:270;10362:360;;;;:::o;10728:364::-;10816:3;10844:39;10877:5;10844:39;:::i;:::-;10899:71;10963:6;10958:3;10899:71;:::i;:::-;10892:78;;10979:52;11024:6;11019:3;11012:4;11005:5;11001:16;10979:52;:::i;:::-;11056:29;11078:6;11056:29;:::i;:::-;11051:3;11047:39;11040:46;;10820:272;10728:364;;;;:::o;11098:377::-;11204:3;11232:39;11265:5;11232:39;:::i;:::-;11287:89;11369:6;11364:3;11287:89;:::i;:::-;11280:96;;11385:52;11430:6;11425:3;11418:4;11411:5;11407:16;11385:52;:::i;:::-;11462:6;11457:3;11453:16;11446:23;;11208:267;11098:377;;;;:::o;11505:845::-;11608:3;11645:5;11639:12;11674:36;11700:9;11674:36;:::i;:::-;11726:89;11808:6;11803:3;11726:89;:::i;:::-;11719:96;;11846:1;11835:9;11831:17;11862:1;11857:137;;;;12008:1;12003:341;;;;11824:520;;11857:137;11941:4;11937:9;11926;11922:25;11917:3;11910:38;11977:6;11972:3;11968:16;11961:23;;11857:137;;12003:341;12070:38;12102:5;12070:38;:::i;:::-;12130:1;12144:154;12158:6;12155:1;12152:13;12144:154;;;12232:7;12226:14;12222:1;12217:3;12213:11;12206:35;12282:1;12273:7;12269:15;12258:26;;12180:4;12177:1;12173:12;12168:17;;12144:154;;;12327:6;12322:3;12318:16;12311:23;;12010:334;;11824:520;;11612:738;;11505:845;;;;:::o;12356:366::-;12498:3;12519:67;12583:2;12578:3;12519:67;:::i;:::-;12512:74;;12595:93;12684:3;12595:93;:::i;:::-;12713:2;12708:3;12704:12;12697:19;;12356:366;;;:::o;12728:::-;12870:3;12891:67;12955:2;12950:3;12891:67;:::i;:::-;12884:74;;12967:93;13056:3;12967:93;:::i;:::-;13085:2;13080:3;13076:12;13069:19;;12728:366;;;:::o;13100:::-;13242:3;13263:67;13327:2;13322:3;13263:67;:::i;:::-;13256:74;;13339:93;13428:3;13339:93;:::i;:::-;13457:2;13452:3;13448:12;13441:19;;13100:366;;;:::o;13472:398::-;13631:3;13652:83;13733:1;13728:3;13652:83;:::i;:::-;13645:90;;13744:93;13833:3;13744:93;:::i;:::-;13862:1;13857:3;13853:11;13846:18;;13472:398;;;:::o;13876:108::-;13953:24;13971:5;13953:24;:::i;:::-;13948:3;13941:37;13876:108;;:::o;13990:118::-;14077:24;14095:5;14077:24;:::i;:::-;14072:3;14065:37;13990:118;;:::o;14114:112::-;14197:22;14213:5;14197:22;:::i;:::-;14192:3;14185:35;14114:112;;:::o;14232:589::-;14457:3;14479:95;14570:3;14561:6;14479:95;:::i;:::-;14472:102;;14591:95;14682:3;14673:6;14591:95;:::i;:::-;14584:102;;14703:92;14791:3;14782:6;14703:92;:::i;:::-;14696:99;;14812:3;14805:10;;14232:589;;;;;;:::o;14827:379::-;15011:3;15033:147;15176:3;15033:147;:::i;:::-;15026:154;;15197:3;15190:10;;14827:379;;;:::o;15212:222::-;15305:4;15343:2;15332:9;15328:18;15320:26;;15356:71;15424:1;15413:9;15409:17;15400:6;15356:71;:::i;:::-;15212:222;;;;:::o;15440:640::-;15635:4;15673:3;15662:9;15658:19;15650:27;;15687:71;15755:1;15744:9;15740:17;15731:6;15687:71;:::i;:::-;15768:72;15836:2;15825:9;15821:18;15812:6;15768:72;:::i;:::-;15850;15918:2;15907:9;15903:18;15894:6;15850:72;:::i;:::-;15969:9;15963:4;15959:20;15954:2;15943:9;15939:18;15932:48;15997:76;16068:4;16059:6;15997:76;:::i;:::-;15989:84;;15440:640;;;;;;;:::o;16086:373::-;16229:4;16267:2;16256:9;16252:18;16244:26;;16316:9;16310:4;16306:20;16302:1;16291:9;16287:17;16280:47;16344:108;16447:4;16438:6;16344:108;:::i;:::-;16336:116;;16086:373;;;;:::o;16465:210::-;16552:4;16590:2;16579:9;16575:18;16567:26;;16603:65;16665:1;16654:9;16650:17;16641:6;16603:65;:::i;:::-;16465:210;;;;:::o;16681:313::-;16794:4;16832:2;16821:9;16817:18;16809:26;;16881:9;16875:4;16871:20;16867:1;16856:9;16852:17;16845:47;16909:78;16982:4;16973:6;16909:78;:::i;:::-;16901:86;;16681:313;;;;:::o;17000:419::-;17166:4;17204:2;17193:9;17189:18;17181:26;;17253:9;17247:4;17243:20;17239:1;17228:9;17224:17;17217:47;17281:131;17407:4;17281:131;:::i;:::-;17273:139;;17000:419;;;:::o;17425:::-;17591:4;17629:2;17618:9;17614:18;17606:26;;17678:9;17672:4;17668:20;17664:1;17653:9;17649:17;17642:47;17706:131;17832:4;17706:131;:::i;:::-;17698:139;;17425:419;;;:::o;17850:::-;18016:4;18054:2;18043:9;18039:18;18031:26;;18103:9;18097:4;18093:20;18089:1;18078:9;18074:17;18067:47;18131:131;18257:4;18131:131;:::i;:::-;18123:139;;17850:419;;;:::o;18275:222::-;18368:4;18406:2;18395:9;18391:18;18383:26;;18419:71;18487:1;18476:9;18472:17;18463:6;18419:71;:::i;:::-;18275:222;;;;:::o;18503:214::-;18592:4;18630:2;18619:9;18615:18;18607:26;;18643:67;18707:1;18696:9;18692:17;18683:6;18643:67;:::i;:::-;18503:214;;;;:::o;18723:129::-;18757:6;18784:20;;:::i;:::-;18774:30;;18813:33;18841:4;18833:6;18813:33;:::i;:::-;18723:129;;;:::o;18858:75::-;18891:6;18924:2;18918:9;18908:19;;18858:75;:::o;18939:311::-;19016:4;19106:18;19098:6;19095:30;19092:56;;;19128:18;;:::i;:::-;19092:56;19178:4;19170:6;19166:17;19158:25;;19238:4;19232;19228:15;19220:23;;18939:311;;;:::o;19256:307::-;19317:4;19407:18;19399:6;19396:30;19393:56;;;19429:18;;:::i;:::-;19393:56;19467:29;19489:6;19467:29;:::i;:::-;19459:37;;19551:4;19545;19541:15;19533:23;;19256:307;;;:::o;19569:308::-;19631:4;19721:18;19713:6;19710:30;19707:56;;;19743:18;;:::i;:::-;19707:56;19781:29;19803:6;19781:29;:::i;:::-;19773:37;;19865:4;19859;19855:15;19847:23;;19569:308;;;:::o;19883:132::-;19950:4;19973:3;19965:11;;20003:4;19998:3;19994:14;19986:22;;19883:132;;;:::o;20021:141::-;20070:4;20093:3;20085:11;;20116:3;20113:1;20106:14;20150:4;20147:1;20137:18;20129:26;;20021:141;;;:::o;20168:114::-;20235:6;20269:5;20263:12;20253:22;;20168:114;;;:::o;20288:98::-;20339:6;20373:5;20367:12;20357:22;;20288:98;;;:::o;20392:99::-;20444:6;20478:5;20472:12;20462:22;;20392:99;;;:::o;20497:113::-;20567:4;20599;20594:3;20590:14;20582:22;;20497:113;;;:::o;20616:184::-;20715:11;20749:6;20744:3;20737:19;20789:4;20784:3;20780:14;20765:29;;20616:184;;;;:::o;20806:168::-;20889:11;20923:6;20918:3;20911:19;20963:4;20958:3;20954:14;20939:29;;20806:168;;;;:::o;20980:147::-;21081:11;21118:3;21103:18;;20980:147;;;;:::o;21133:169::-;21217:11;21251:6;21246:3;21239:19;21291:4;21286:3;21282:14;21267:29;;21133:169;;;;:::o;21308:148::-;21410:11;21447:3;21432:18;;21308:148;;;;:::o;21462:305::-;21502:3;21521:20;21539:1;21521:20;:::i;:::-;21516:25;;21555:20;21573:1;21555:20;:::i;:::-;21550:25;;21709:1;21641:66;21637:74;21634:1;21631:81;21628:107;;;21715:18;;:::i;:::-;21628:107;21759:1;21756;21752:9;21745:16;;21462:305;;;;:::o;21773:185::-;21813:1;21830:20;21848:1;21830:20;:::i;:::-;21825:25;;21864:20;21882:1;21864:20;:::i;:::-;21859:25;;21903:1;21893:35;;21908:18;;:::i;:::-;21893:35;21950:1;21947;21943:9;21938:14;;21773:185;;;;:::o;21964:348::-;22004:7;22027:20;22045:1;22027:20;:::i;:::-;22022:25;;22061:20;22079:1;22061:20;:::i;:::-;22056:25;;22249:1;22181:66;22177:74;22174:1;22171:81;22166:1;22159:9;22152:17;22148:105;22145:131;;;22256:18;;:::i;:::-;22145:131;22304:1;22301;22297:9;22286:20;;21964:348;;;;:::o;22318:191::-;22358:4;22378:20;22396:1;22378:20;:::i;:::-;22373:25;;22412:20;22430:1;22412:20;:::i;:::-;22407:25;;22451:1;22448;22445:8;22442:34;;;22456:18;;:::i;:::-;22442:34;22501:1;22498;22494:9;22486:17;;22318:191;;;;:::o;22515:96::-;22552:7;22581:24;22599:5;22581:24;:::i;:::-;22570:35;;22515:96;;;:::o;22617:90::-;22651:7;22694:5;22687:13;22680:21;22669:32;;22617:90;;;:::o;22713:149::-;22749:7;22789:66;22782:5;22778:78;22767:89;;22713:149;;;:::o;22868:126::-;22905:7;22945:42;22938:5;22934:54;22923:65;;22868:126;;;:::o;23000:77::-;23037:7;23066:5;23055:16;;23000:77;;;:::o;23083:86::-;23118:7;23158:4;23151:5;23147:16;23136:27;;23083:86;;;:::o;23175:154::-;23259:6;23254:3;23249;23236:30;23321:1;23312:6;23307:3;23303:16;23296:27;23175:154;;;:::o;23335:307::-;23403:1;23413:113;23427:6;23424:1;23421:13;23413:113;;;23512:1;23507:3;23503:11;23497:18;23493:1;23488:3;23484:11;23477:39;23449:2;23446:1;23442:10;23437:15;;23413:113;;;23544:6;23541:1;23538:13;23535:101;;;23624:1;23615:6;23610:3;23606:16;23599:27;23535:101;23384:258;23335:307;;;:::o;23648:320::-;23692:6;23729:1;23723:4;23719:12;23709:22;;23776:1;23770:4;23766:12;23797:18;23787:81;;23853:4;23845:6;23841:17;23831:27;;23787:81;23915:2;23907:6;23904:14;23884:18;23881:38;23878:84;;;23934:18;;:::i;:::-;23878:84;23699:269;23648:320;;;:::o;23974:281::-;24057:27;24079:4;24057:27;:::i;:::-;24049:6;24045:40;24187:6;24175:10;24172:22;24151:18;24139:10;24136:34;24133:62;24130:88;;;24198:18;;:::i;:::-;24130:88;24238:10;24234:2;24227:22;24017:238;23974:281;;:::o;24261:233::-;24300:3;24323:24;24341:5;24323:24;:::i;:::-;24314:33;;24369:66;24362:5;24359:77;24356:103;;;24439:18;;:::i;:::-;24356:103;24486:1;24479:5;24475:13;24468:20;;24261:233;;;:::o;24500:176::-;24532:1;24549:20;24567:1;24549:20;:::i;:::-;24544:25;;24583:20;24601:1;24583:20;:::i;:::-;24578:25;;24622:1;24612:35;;24627:18;;:::i;:::-;24612:35;24668:1;24665;24661:9;24656:14;;24500:176;;;;:::o;24682:180::-;24730:77;24727:1;24720:88;24827:4;24824:1;24817:15;24851:4;24848:1;24841:15;24868:180;24916:77;24913:1;24906:88;25013:4;25010:1;25003:15;25037:4;25034:1;25027:15;25054:180;25102:77;25099:1;25092:88;25199:4;25196:1;25189:15;25223:4;25220:1;25213:15;25240:180;25288:77;25285:1;25278:88;25385:4;25382:1;25375:15;25409:4;25406:1;25399:15;25426:180;25474:77;25471:1;25464:88;25571:4;25568:1;25561:15;25595:4;25592:1;25585:15;25612:117;25721:1;25718;25711:12;25735:117;25844:1;25841;25834:12;25858:117;25967:1;25964;25957:12;25981:117;26090:1;26087;26080:12;26104:117;26213:1;26210;26203:12;26227:102;26268:6;26319:2;26315:7;26310:2;26303:5;26299:14;26295:28;26285:38;;26227:102;;;:::o;26335:235::-;26475:34;26471:1;26463:6;26459:14;26452:58;26544:18;26539:2;26531:6;26527:15;26520:43;26335:235;:::o;26576:225::-;26716:34;26712:1;26704:6;26700:14;26693:58;26785:8;26780:2;26772:6;26768:15;26761:33;26576:225;:::o;26807:182::-;26947:34;26943:1;26935:6;26931:14;26924:58;26807:182;:::o;26995:114::-;;:::o;27115:122::-;27188:24;27206:5;27188:24;:::i;:::-;27181:5;27178:35;27168:63;;27227:1;27224;27217:12;27168:63;27115:122;:::o;27243:116::-;27313:21;27328:5;27313:21;:::i;:::-;27306:5;27303:32;27293:60;;27349:1;27346;27339:12;27293:60;27243:116;:::o;27365:120::-;27437:23;27454:5;27437:23;:::i;:::-;27430:5;27427:34;27417:62;;27475:1;27472;27465:12;27417:62;27365:120;:::o;27491:122::-;27564:24;27582:5;27564:24;:::i;:::-;27557:5;27554:35;27544:63;;27603:1;27600;27593:12;27544:63;27491:122;:::o
Swarm Source
ipfs://87f5eddaf983e192de3a6a2391bbb1148586ec5a63e7de66a4dc22ec3ace96a8
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.