Overview
TokenID
3183
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Pokerlook
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-03 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [////IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * ////IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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); } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * import "./IERC721.sol"; * import "./IERC721Receiver.sol"; * import "./extensions/IERC721Metadata.sol"; * import "../../utils/Address.sol"; * import "../../utils/Context.sol"; * import "../../utils/Strings.sol"; * import "../../utils/introspection/ERC165.sol"; * * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } abstract contract Auth { address internal owner; mapping(address => bool) internal authorizations; constructor(address _owner) { owner = _owner; authorizations[_owner] = true; } /** * Function modifier to require caller to be contract owner */ modifier onlyOwner() { require(isOwner(msg.sender), "!OWNER"); _; } /** * Function modifier to require caller to be authorized */ modifier authorized() { require(isAuthorized(msg.sender), "!AUTHORIZED"); _; } /** * Authorize address. Owner only */ function authorize(address adr) public onlyOwner { authorizations[adr] = true; } /** * Remove address' authorization. Owner only */ function unauthorize(address adr) public onlyOwner { authorizations[adr] = false; } /** * Check if address is owner */ function isOwner(address account) public view returns (bool) { return account == owner; } /** * Return address' authorization status */ function isAuthorized(address adr) public view returns (bool) { return authorizations[adr]; } /** * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized */ function transferOwnership(address payable adr) public onlyOwner { owner = adr; authorizations[adr] = true; emit OwnershipTransferred(adr); } event OwnershipTransferred(address owner); } /** * CAUTION * This version of SafeMath should only be used with Solidity 0.8 or later, * because it relies on the compiler's built in overflow checks. * * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { // unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); // } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { // unchecked { if (b > a) return (false, 0); return (true, a - b); // } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); // } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { // unchecked { if (b == 0) return (false, 0); return (true, a / b); // } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { // unchecked { if (b == 0) return (false, 0); return (true, a % b); // } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // unchecked { require(b <= a, errorMessage); return a - b; // } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // unchecked { require(b > 0, errorMessage); return a / b; // } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // unchecked { require(b > 0, errorMessage); return a % b; // } } } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } contract Pokerlook is ERC721Enumerable, Auth { using SafeMath for uint256; string baseTokenURI; bool public isPublic = false; bool public isPrivate = true; uint256 public maxSupply = 5000; uint256 public privateSupply = 0; uint256 public privatePrice = 0.15 ether; uint256 public publicPrice = 0.1 ether; address adminWallet = 0x11a7070D70fF0aDDFf7A641f074DBf76075Bcb32; address devWallet = 0x11a7070D70fF0aDDFf7A641f074DBf76075Bcb32; uint256 devFee = 100; // 10% uint256 public maxMintNumber = 20; uint256[5000] private _availableTokens; uint256 private _numAvailableTokens = 5000; struct User { bool referred; address referred_by; uint256 earnings_1; uint256 earnings_2; uint256 earnings_3; } struct Referral_levels { uint256 level_1; uint256 level_2; uint256 level_3; } uint256[3] referral_fees = [100, 50, 25]; // unit 1000 (2.5% = 25) mapping(address => Referral_levels) public refer_info; mapping(address => User) public user_info; event TokenMint(address indexed to, uint256 tokenId); event SetPrice(uint256 _value); event MaxMintNumber(uint256 _value); event ChangePublic(bool _value); event ChangePrivate(bool _value); event SetPrivatePrice(uint256 _value); event ChangePrivateSupply(uint256 _value); constructor() ERC721("Pokerlook ORIGIN Avatars", "PKLA") payable Auth(msg.sender) { } function changePublic() external authorized { isPublic = !isPublic; emit ChangePublic(isPublic); } function setPublicPrice(uint256 _publicPrice) external authorized { publicPrice = _publicPrice; emit SetPrice(_publicPrice); } function setMaxMintNumber(uint256 _maxMintNumber) external authorized { require(_maxMintNumber <= 200, "Too many tokens for one mint!"); maxMintNumber = _maxMintNumber; emit MaxMintNumber(maxMintNumber); } function setPrivateSupply(uint256 _privateSupply) external authorized { require(_privateSupply > totalSupply(), "Private supply should be more than current supply"); privateSupply = _privateSupply; emit ChangePrivateSupply(privateSupply); } function changePrivate() external authorized { isPrivate = !isPrivate; emit ChangePrivate(isPrivate); } function setPrivatePrice(uint256 _privatePrice) external authorized { privatePrice = _privatePrice; emit SetPrivatePrice(privatePrice); } function setBaseTokenURI(string memory _baseTokenURI) external authorized { baseTokenURI = _baseTokenURI; } function tokenURI(uint256 _tokenId) override public view returns (string memory) { string memory _tokenURI = Strings.toString(_tokenId); return string(abi.encodePacked(baseTokenURI, _tokenURI, ".json")); } function mint(uint256 _number, address ref_addr) public payable { require(_number <= maxMintNumber, "Too many tokens to mint at once."); if (isPrivate) { require(privateSupply > totalSupply(), "Private sale is sold!"); require(msg.value >= privatePrice.mul(_number), "Amount is not enough!"); if (_number.add(totalSupply()) > privateSupply) { _number = privateSupply.sub(totalSupply()); isPrivate = false; emit ChangePrivate(false); } } else { require(isPublic, "Minting is paused!"); require(msg.value >= publicPrice.mul(_number), "Amount is not enough!"); } require(_number.add(totalSupply()) <= maxSupply, "No tokens available for minting!"); referee(ref_addr); uint256 devAmount = msg.value.mul(devFee).div(1000); (bool dev, ) = payable(devWallet).call{value: devAmount}(""); require(dev); uint256 amount = refereeFee(msg.sender, msg.value); uint256 adminAmount = amount.sub(devAmount); (bool admin, ) = payable(adminWallet).call{value: adminAmount}(""); require(admin); for (uint256 i = 1; i <= _number; i++) { uint256 _mintIndex = useRandomAvailableToken(_number, i); _safeMint(ref_addr, _mintIndex); //msg.sender emit TokenMint(ref_addr, _mintIndex); //_msgSender() } } function useRandomAvailableToken(uint256 _numToFetch, uint256 _i) internal returns (uint256) { uint256 randomNum = uint256( keccak256( abi.encode( msg.sender, tx.gasprice, block.number, block.timestamp, blockhash(block.number - 1), _numToFetch, _i ) ) ); uint256 randomIndex = (randomNum % _numAvailableTokens); return useAvailableTokenAtIndex(randomIndex); } function useAvailableTokenAtIndex(uint256 indexToUse) internal returns (uint256) { uint256 valAtIndex = _availableTokens[indexToUse]; uint256 result; if (valAtIndex == 0) { result = indexToUse; } else { result = valAtIndex; } uint256 lastIndex = _numAvailableTokens - 1; if (indexToUse != lastIndex) { uint256 lastValInArray = _availableTokens[lastIndex]; if (lastValInArray == 0) { if (lastIndex == 0) { _availableTokens[indexToUse] = maxSupply; } else { _availableTokens[indexToUse] = lastIndex; } } else { _availableTokens[indexToUse] = lastValInArray; } } _numAvailableTokens--; return result; } function updateAdminWallet(address _adminWallet) external onlyOwner { adminWallet = _adminWallet; } function updateDevWallet(address _devWallet) external { require(msg.sender == devWallet, "You are not a dev."); devWallet = _devWallet; } function setReferralFees(uint256 level1_fee, uint256 level2_fee, uint256 level3_fee) external authorized { require(level1_fee + level2_fee + level3_fee < 500, "Too big fee for referrals!"); referral_fees[0] = level1_fee; referral_fees[1] = level2_fee; referral_fees[2] = level3_fee; } function referee(address ref_add) internal { if (user_info[msg.sender].referred == false && ref_add != msg.sender && ref_add != address(0)) { user_info[msg.sender].referred_by = ref_add; user_info[msg.sender].referred = true; address level1 = user_info[msg.sender].referred_by; address level2 = user_info[level1].referred_by; address level3 = user_info[level2].referred_by; if ((level1 != msg.sender) && (level1 != address(0))) { refer_info[level1].level_1 += 1; } if ((level2 != msg.sender) && (level2 != address(0))) { refer_info[level2].level_2 += 1; } if ((level3 != msg.sender) && (level3 != address(0))) { refer_info[level3].level_3 += 1; } } } function refereeFee(address account, uint256 amount) internal returns(uint256) { if (user_info[account].referred) { address level1 = user_info[account].referred_by; address level2 = user_info[level1].referred_by; address level3 = user_info[level2].referred_by; uint256 amount1 = amount.mul(referral_fees[0]).div(1000); uint256 amount2 = amount.mul(referral_fees[1]).div(1000); uint256 amount3 = amount.mul(referral_fees[2]).div(1000); if ((level1 != account) && (level1 != address(0))) { (bool state1, ) = payable(level1).call{value: amount1}(""); require(state1); amount = amount.sub(amount1); user_info[level1].earnings_1 = user_info[level1].earnings_1.add(amount1); } if ((level2 != account) && (level2 != address(0))) { (bool state2, ) = payable(level2).call{value: amount2}(""); require(state2); amount = amount.sub(amount2); user_info[level2].earnings_2 = user_info[level2].earnings_2.add(amount2); } if ((level3 != account) && (level3 != address(0))) { (bool state3, ) = payable(level3).call{value: amount3}(""); require(state3); amount = amount.sub(amount3); user_info[level3].earnings_3 = user_info[level3].earnings_3.add(amount3); } } return amount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"ChangePrivate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"ChangePrivateSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"ChangePublic","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"MaxMintNumber","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"SetPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"SetPrivatePrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenMint","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":"adr","type":"address"}],"name":"authorize","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":"changePrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPrivate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintNumber","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":"_number","type":"uint256"},{"internalType":"address","name":"ref_addr","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"refer_info","outputs":[{"internalType":"uint256","name":"level_1","type":"uint256"},{"internalType":"uint256","name":"level_2","type":"uint256"},{"internalType":"uint256","name":"level_3","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintNumber","type":"uint256"}],"name":"setMaxMintNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_privatePrice","type":"uint256"}],"name":"setPrivatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_privateSupply","type":"uint256"}],"name":"setPrivateSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level1_fee","type":"uint256"},{"internalType":"uint256","name":"level2_fee","type":"uint256"},{"internalType":"uint256","name":"level3_fee","type":"uint256"}],"name":"setReferralFees","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 payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adminWallet","type":"address"}],"name":"updateAdminWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"user_info","outputs":[{"internalType":"bool","name":"referred","type":"bool"},{"internalType":"address","name":"referred_by","type":"address"},{"internalType":"uint256","name":"earnings_1","type":"uint256"},{"internalType":"uint256","name":"earnings_2","type":"uint256"},{"internalType":"uint256","name":"earnings_3","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
600d805461ffff1916610100179055611388600e8190556000600f55670214e8348c4f000060105567016345785d8a0000601155601280546001600160a01b03199081167311a7070d70ff0addff7a641f074dbf76075bcb329081179092556013805490911690911790556064601481815560155561139e9190915560e06040526080908152603260a052601960c052620000a09061139f9060036200015a565b50604080518082018252601881527f506f6b65726c6f6f6b204f524947494e20417661746172730000000000000000602080830191825283518085019094526004845263504b4c4160e01b908401528151339391620001039160009190620001a2565b50805162000119906001906020840190620001a2565b5050600a80546001600160a01b039093166001600160a01b031990931683179055506000908152600b60205260409020805460ff1916600117905562000273565b826003810192821562000190579160200282015b8281111562000190578251829060ff169055916020019190600101906200016e565b506200019e9291506200021f565b5090565b828054620001b09062000236565b90600052602060002090601f016020900481019282620001d4576000855562000190565b82601f10620001ef57805160ff191683800117855562000190565b8280016001018555821562000190579182015b828111156200019057825182559160200191906001019062000202565b5b808211156200019e576000815560010162000220565b6002810460018216806200024b57607f821691505b602082108114156200026d57634e487b7160e01b600052602260045260246000fd5b50919050565b61305880620002836000396000f3fe6080604052600436106102465760003560e01c806391d9c4ed11610139578063c87b56dd116100b6578063e62cb46e1161007a578063e62cb46e1461072e578063e985e9c514610743578063f0b37c041461078c578063f2fde38b146107ac578063faff660e146107cc578063fe9fbb80146107eb57610246565b8063c87b56dd14610666578063d067358314610686578063d5abeb01146106a6578063dbf80fec146106bc578063dc9a15351461071457610246565b8063a22cb465116100fd578063a22cb465146105d0578063a945bf80146105f0578063b6a5d7de14610606578063b88d4fde14610626578063c62752551461064657610246565b806391d9c4ed1461055257806394bf804d1461057257806395d89b41146105855780639a997c471461059a578063a10f151e146105b057610246565b806330176e13116101c75780635eec08701161018b5780635eec0870146104bc5780636352211e146104dc57806370a08231146104fc57806387c0568b1461051c578063897045461461053257610246565b806330176e131461043157806342842e0e14610451578063492a1629146104715780634f6ccce71461048657806356bd182d146104a657610246565b80631816467f1161020e5780631816467f1461031b57806321058d2a1461033b57806323b872dd146103c25780632f54bf6e146103e25780632f745c591461041157610246565b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612b96565b61080b565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610838565b6040516102779190612db1565b3480156102ae57600080fd5b506102c26102bd366004612c14565b6108ca565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612b6b565b610964565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa610336366004612a29565b610a7a565b34801561034757600080fd5b50610390610356366004612a29565b6113a360205260009081526040902080546001820154600283015460039093015460ff8316936101009093046001600160a01b0316929085565b6040805195151586526001600160a01b039094166020860152928401919091526060830152608082015260a001610277565b3480156103ce57600080fd5b506102fa6103dd366004612a7d565b610aeb565b3480156103ee57600080fd5b5061026b6103fd366004612a29565b600a546001600160a01b0390811691161490565b34801561041d57600080fd5b5061030d61042c366004612b6b565b610b1c565b34801561043d57600080fd5b506102fa61044c366004612bce565b610bb2565b34801561045d57600080fd5b506102fa61046c366004612a7d565b610bee565b34801561047d57600080fd5b506102fa610c09565b34801561049257600080fd5b5061030d6104a1366004612c14565b610c80565b3480156104b257600080fd5b5061030d600f5481565b3480156104c857600080fd5b506102fa6104d7366004612a29565b610d21565b3480156104e857600080fd5b506102c26104f7366004612c14565b610d6d565b34801561050857600080fd5b5061030d610517366004612a29565b610de4565b34801561052857600080fd5b5061030d60105481565b34801561053e57600080fd5b506102fa61054d366004612c50565b610e6b565b34801561055e57600080fd5b506102fa61056d366004612c14565b610f06565b6102fa610580366004612c2c565b610fb8565b34801561059157600080fd5b506102956113bc565b3480156105a657600080fd5b5061030d60155481565b3480156105bc57600080fd5b506102fa6105cb366004612c14565b6113cb565b3480156105dc57600080fd5b506102fa6105eb366004612b3a565b611425565b3480156105fc57600080fd5b5061030d60115481565b34801561061257600080fd5b506102fa610621366004612a29565b6114f7565b34801561063257600080fd5b506102fa610641366004612abd565b611545565b34801561065257600080fd5b506102fa610661366004612c14565b61157d565b34801561067257600080fd5b50610295610681366004612c14565b6115d7565b34801561069257600080fd5b506102fa6106a1366004612c14565b611611565b3480156106b257600080fd5b5061030d600e5481565b3480156106c857600080fd5b506106f96106d7366004612a29565b6113a26020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610277565b34801561072057600080fd5b50600d5461026b9060ff1681565b34801561073a57600080fd5b506102fa6116d6565b34801561074f57600080fd5b5061026b61075e366004612a45565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561079857600080fd5b506102fa6107a7366004612a29565b611753565b3480156107b857600080fd5b506102fa6107c7366004612a29565b61179e565b3480156107d857600080fd5b50600d5461026b90610100900460ff1681565b3480156107f757600080fd5b5061026b610806366004612a29565b611830565b60006001600160e01b0319821663780e9d6360e01b148061083057506108308261184e565b90505b919050565b60606000805461084790612f51565b80601f016020809104026020016040519081016040528092919081815260200182805461087390612f51565b80156108c05780601f10610895576101008083540402835291602001916108c0565b820191906000526020600020905b8154815290600101906020018083116108a357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109485760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061096f82610d6d565b9050806001600160a01b0316836001600160a01b031614156109dd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161093f565b336001600160a01b03821614806109f957506109f9813361075e565b610a6b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161093f565b610a75838361189e565b505050565b6013546001600160a01b03163314610ac95760405162461bcd60e51b81526020600482015260126024820152712cb7ba9030b932903737ba1030903232bb1760711b604482015260640161093f565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b610af5338261190c565b610b115760405162461bcd60e51b815260040161093f90612e36565b610a75838383611a03565b6000610b2783610de4565b8210610b895760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161093f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bbb33611830565b610bd75760405162461bcd60e51b815260040161093f90612e87565b8051610bea90600c90602084019061291a565b5050565b610a7583838360405180602001604052806000815250611545565b610c1233611830565b610c2e5760405162461bcd60e51b815260040161093f90612e87565b600d805460ff19811660ff9182161517918290556040517ff35e7f85b714ecbd62a45b6269c072c67fa2f41e4467a7612df441c6ec2fae9492610c7692161515815260200190565b60405180910390a1565b6000610c8b60085490565b8210610cee5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161093f565b60088281548110610d0f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610d4b5760405162461bcd60e51b815260040161093f90612e16565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806108305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161093f565b60006001600160a01b038216610e4f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161093f565b506001600160a01b031660009081526003602052604090205490565b610e7433611830565b610e905760405162461bcd60e51b815260040161093f90612e87565b6101f481610e9e8486612eac565b610ea89190612eac565b10610ef55760405162461bcd60e51b815260206004820152601a60248201527f546f6f206269672066656520666f7220726566657272616c7321000000000000604482015260640161093f565b61139f929092556113a0556113a155565b610f0f33611830565b610f2b5760405162461bcd60e51b815260040161093f90612e87565b60c8811115610f7c5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d616e7920746f6b656e7320666f72206f6e65206d696e7421000000604482015260640161093f565b60158190556040518181527f540af958bf28c91b5dfb1fa9e8b0329bda30813960dc8b6f1711d995aec3c779906020015b60405180910390a150565b60155482111561100a5760405162461bcd60e51b815260206004820181905260248201527f546f6f206d616e7920746f6b656e7320746f206d696e74206174206f6e63652e604482015260640161093f565b600d54610100900460ff161561113257600854600f54116110655760405162461bcd60e51b8152602060048201526015602482015274507269766174652073616c6520697320736f6c642160581b604482015260640161093f565b6010546110729083611bae565b3410156110b95760405162461bcd60e51b8152602060048201526015602482015274416d6f756e74206973206e6f7420656e6f7567682160581b604482015260640161093f565b600f546110cf6110c860085490565b8490611bc1565b111561112d576110ea6110e160085490565b600f5490611bcd565b600d805461ff0019169055604051600081529092507f271fd4f40231b04dc2cdec4c65a09f89fe8cb2dbb3a70dd716fff2017d53b93f9060200160405180910390a15b6111cd565b600d5460ff166111795760405162461bcd60e51b81526020600482015260126024820152714d696e74696e67206973207061757365642160701b604482015260640161093f565b6011546111869083611bae565b3410156111cd5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e74206973206e6f7420656e6f7567682160581b604482015260640161093f565b600e546111dc6110c860085490565b111561122a5760405162461bcd60e51b815260206004820181905260248201527f4e6f20746f6b656e7320617661696c61626c6520666f72206d696e74696e6721604482015260640161093f565b61123381611bd9565b60006112566103e861125060145434611bae90919063ffffffff16565b90611d85565b6013546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146112a8576040519150601f19603f3d011682016040523d82523d6000602084013e6112ad565b606091505b50509050806112bb57600080fd5b60006112c73334611d91565b905060006112d58285611bcd565b6012546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114611327576040519150601f19603f3d011682016040523d82523d6000602084013e61132c565b606091505b505090508061133a57600080fd5b60015b8781116113b257600061135089836120f7565b905061135c8882612188565b876001600160a01b03167f36bf5aa3964be01dbd95a0154a8930793fe68353bdc580871ffb2c911366bbc78260405161139791815260200190565b60405180910390a250806113aa81612f86565b91505061133d565b5050505050505050565b60606001805461084790612f51565b6113d433611830565b6113f05760405162461bcd60e51b815260040161093f90612e87565b60108190556040518181527f8a81ba946dafb8f106b660022186fe69243575cf4a67b9673cadb007d0b138c290602001610fad565b6001600160a01b03821633141561147e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093f565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114eb911515815260200190565b60405180910390a35050565b600a546001600160a01b031633146115215760405162461bcd60e51b815260040161093f90612e16565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b61154f338361190c565b61156b5760405162461bcd60e51b815260040161093f90612e36565b611577848484846121a2565b50505050565b61158633611830565b6115a25760405162461bcd60e51b815260040161093f90612e87565b60118190556040518181527f4f5539c0409dfc4cb06f64cbd31237e1fbfe443f531584bf4dd77ec7fc5ba7b190602001610fad565b606060006115e4836121d5565b9050600c816040516020016115fa929190612cc3565b604051602081830303815290604052915050919050565b61161a33611830565b6116365760405162461bcd60e51b815260040161093f90612e87565b60085481116116a15760405162461bcd60e51b815260206004820152603160248201527f5072697661746520737570706c792073686f756c64206265206d6f7265207468604482015270616e2063757272656e7420737570706c7960781b606482015260840161093f565b600f8190556040518181527f9f989c825e903c1304253f5fad1cd0245f5f27c790539742140e7aa443e718a690602001610fad565b6116df33611830565b6116fb5760405162461bcd60e51b815260040161093f90612e87565b600d805460ff610100808304821615810261ff001990931692909217928390556040517f271fd4f40231b04dc2cdec4c65a09f89fe8cb2dbb3a70dd716fff2017d53b93f93610c769390049091161515815260200190565b600a546001600160a01b0316331461177d5760405162461bcd60e51b815260040161093f90612e16565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b600a546001600160a01b031633146117c85760405162461bcd60e51b815260040161093f90612e16565b600a80546001600160a01b0319166001600160a01b0383169081179091556000818152600b6020908152604091829020805460ff1916600117905590519182527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639101610fad565b6001600160a01b03166000908152600b602052604090205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061187f57506001600160e01b03198216635b5e139f60e01b145b8061083057506301ffc9a760e01b6001600160e01b0319831614610830565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118d382610d6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166119855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161093f565b600061199083610d6d565b9050806001600160a01b0316846001600160a01b031614806119cb5750836001600160a01b03166119c0846108ca565b6001600160a01b0316145b806119fb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a1682610d6d565b6001600160a01b031614611a7e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161093f565b6001600160a01b038216611ae05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161093f565b611aeb8383836122f0565b611af660008261189e565b6001600160a01b0383166000908152600360205260408120805460019290611b1f908490612ef7565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b4d908490612eac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611bba8284612ed8565b9392505050565b6000611bba8284612eac565b6000611bba8284612ef7565b3360009081526113a3602052604090205460ff16158015611c0357506001600160a01b0381163314155b8015611c1757506001600160a01b03811615155b15611d82573360008181526113a3602052604080822080546001610100600160a81b03199091166101006001600160a01b0388811682029290921760ff191692909217928390559181900482168085528385205482900483168086529390942054939492930416908314801590611c9657506001600160a01b03831615155b15611ccb576001600160a01b03831660009081526113a260205260408120805460019290611cc5908490612eac565b90915550505b6001600160a01b0382163314801590611cec57506001600160a01b03821615155b15611d26576001600160a01b03821660009081526113a2602052604081206001908101805491929091611d20908490612eac565b90915550505b6001600160a01b0381163314801590611d4757506001600160a01b03811615155b15611577576001600160a01b03811660009081526113a260205260408120600201805460019290611d79908490612eac565b90915550505050505b50565b6000611bba8284612ec4565b6001600160a01b03821660009081526113a3602052604081205460ff16156120f1576001600160a01b0380841660009081526113a3602052604080822054610100908190048416808452828420548290048516808552928420549094929391900490911690611e0c6103e861125061139f8401548990611bae565b90506000611e276103e861125061139f600101548a90611bae565b90506000611e426103e861125061139f600201548b90611bae565b9050886001600160a01b0316866001600160a01b031614158015611e6e57506001600160a01b03861615155b15611f26576000866001600160a01b03168460405160006040518083038185875af1925050503d8060008114611ec0576040519150601f19603f3d011682016040523d82523d6000602084013e611ec5565b606091505b5050905080611ed357600080fd5b611edd8985611bcd565b6001600160a01b03881660009081526113a36020526040902060010154909950611f079085611bc1565b6001600160a01b03881660009081526113a36020526040902060010155505b886001600160a01b0316856001600160a01b031614158015611f5057506001600160a01b03851615155b15612008576000856001600160a01b03168360405160006040518083038185875af1925050503d8060008114611fa2576040519150601f19603f3d011682016040523d82523d6000602084013e611fa7565b606091505b5050905080611fb557600080fd5b611fbf8984611bcd565b6001600160a01b03871660009081526113a36020526040902060020154909950611fe99084611bc1565b6001600160a01b03871660009081526113a36020526040902060020155505b886001600160a01b0316846001600160a01b03161415801561203257506001600160a01b03841615155b156120ea576000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114612084576040519150601f19603f3d011682016040523d82523d6000602084013e612089565b606091505b505090508061209757600080fd5b6120a18983611bcd565b6001600160a01b03861660009081526113a360205260409020600301549099506120cb9083611bc1565b6001600160a01b03861660009081526113a36020526040902060030155505b5050505050505b50919050565b600080333a4342612109600183612ef7565b604080516001600160a01b039096166020870152850193909352606084019190915260808301524060a082015260c0810185905260e08101849052610100016040516020818303038152906040528051906020012060001c9050600061139e54826121749190612fa1565b905061217f816123ad565b95945050505050565b610bea8282604051806020016040528060008152506124d2565b6121ad848484611a03565b6121b984848484612505565b6115775760405162461bcd60e51b815260040161093f90612dc4565b6060816121fa57506040805180820190915260018152600360fc1b6020820152610833565b8160005b8115612224578061220e81612f86565b915061221d9050600a83612ec4565b91506121fe565b60008167ffffffffffffffff81111561224d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612277576020820181803683370190505b5090505b84156119fb5761228c600183612ef7565b9150612299600a86612fa1565b6122a4906030612eac565b60f81b8183815181106122c757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122e9600a86612ec4565b945061227b565b6001600160a01b03831661234b5761234681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61236e565b816001600160a01b0316836001600160a01b03161461236e5761236e8382612612565b6001600160a01b03821661238a57612385816126af565b610a75565b826001600160a01b0316826001600160a01b031614610a7557610a758282612788565b60008060168361138881106123d257634e487b7160e01b600052603260045260246000fd5b015490506000816123e45750826123e7565b50805b6000600161139e546123f99190612ef7565b90508085146124b3576000601682611388811061242657634e487b7160e01b600052603260045260246000fd5b015490508061248b578161246057600e54601687611388811061245957634e487b7160e01b600052603260045260246000fd5b0155612486565b81601687611388811061248357634e487b7160e01b600052603260045260246000fd5b01555b6124b1565b8060168761138881106124ae57634e487b7160e01b600052603260045260246000fd5b01555b505b61139e80549060006124c483612f3a565b909155509195945050505050565b6124dc83836127cc565b6124e96000848484612505565b610a755760405162461bcd60e51b815260040161093f90612dc4565b60006001600160a01b0384163b1561260757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612549903390899088908890600401612d74565b602060405180830381600087803b15801561256357600080fd5b505af1925050508015612593575060408051601f3d908101601f1916820190925261259091810190612bb2565b60015b6125ed573d8080156125c1576040519150601f19603f3d011682016040523d82523d6000602084013e6125c6565b606091505b5080516125e55760405162461bcd60e51b815260040161093f90612dc4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119fb565b506001949350505050565b6000600161261f84610de4565b6126299190612ef7565b60008381526007602052604090205490915080821461267c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126c190600190612ef7565b600083815260096020526040812054600880549394509092849081106126f757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061272657634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061276c57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061279383610de4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166128225760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161093f565b6000818152600260205260409020546001600160a01b0316156128875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161093f565b612893600083836122f0565b6001600160a01b03821660009081526003602052604081208054600192906128bc908490612eac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461292690612f51565b90600052602060002090601f016020900481019282612948576000855561298e565b82601f1061296157805160ff191683800117855561298e565b8280016001018555821561298e579182015b8281111561298e578251825591602001919060010190612973565b5061299a92915061299e565b5090565b5b8082111561299a576000815560010161299f565b600067ffffffffffffffff808411156129ce576129ce612fe1565b604051601f8501601f19908116603f011681019082821181831017156129f6576129f6612fe1565b81604052809350858152868686011115612a0f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a3a578081fd5b8135611bba81612ff7565b60008060408385031215612a57578081fd5b8235612a6281612ff7565b91506020830135612a7281612ff7565b809150509250929050565b600080600060608486031215612a91578081fd5b8335612a9c81612ff7565b92506020840135612aac81612ff7565b929592945050506040919091013590565b60008060008060808587031215612ad2578081fd5b8435612add81612ff7565b93506020850135612aed81612ff7565b925060408501359150606085013567ffffffffffffffff811115612b0f578182fd5b8501601f81018713612b1f578182fd5b612b2e878235602084016129b3565b91505092959194509250565b60008060408385031215612b4c578182fd5b8235612b5781612ff7565b915060208301358015158114612a72578182fd5b60008060408385031215612b7d578182fd5b8235612b8881612ff7565b946020939093013593505050565b600060208284031215612ba7578081fd5b8135611bba8161300c565b600060208284031215612bc3578081fd5b8151611bba8161300c565b600060208284031215612bdf578081fd5b813567ffffffffffffffff811115612bf5578182fd5b8201601f81018413612c05578182fd5b6119fb848235602084016129b3565b600060208284031215612c25578081fd5b5035919050565b60008060408385031215612c3e578182fd5b823591506020830135612a7281612ff7565b600080600060608486031215612c64578283fd5b505081359360208301359350604090920135919050565b60008151808452612c93816020860160208601612f0e565b601f01601f19169290920160200192915050565b60008151612cb9818560208601612f0e565b9290920192915050565b8254600090819060028104600180831680612cdf57607f831692505b6020808410821415612cff57634e487b7160e01b87526022600452602487fd5b818015612d135760018114612d2457612d50565b60ff19861689528489019650612d50565b60008b815260209020885b86811015612d485781548b820152908501908301612d2f565b505084890196505b50505050505061217f612d638286612ca7565b64173539b7b760d91b815260050190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612da790830184612c7b565b9695505050505050565b600060208252611bba6020830184612c7b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b60008219821115612ebf57612ebf612fb5565b500190565b600082612ed357612ed3612fcb565b500490565b6000816000190483118215151615612ef257612ef2612fb5565b500290565b600082821015612f0957612f09612fb5565b500390565b60005b83811015612f29578181015183820152602001612f11565b838111156115775750506000910152565b600081612f4957612f49612fb5565b506000190190565b600281046001821680612f6557607f821691505b602082108114156120f157634e487b7160e01b600052602260045260246000fd5b6000600019821415612f9a57612f9a612fb5565b5060010190565b600082612fb057612fb0612fcb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611d8257600080fd5b6001600160e01b031981168114611d8257600080fdfea26469706673582212201335fcc94170d111698d1fe3e62f983703ca416a898c93528e035a1bea0bbbfc64736f6c63430008020033
Deployed Bytecode
0x6080604052600436106102465760003560e01c806391d9c4ed11610139578063c87b56dd116100b6578063e62cb46e1161007a578063e62cb46e1461072e578063e985e9c514610743578063f0b37c041461078c578063f2fde38b146107ac578063faff660e146107cc578063fe9fbb80146107eb57610246565b8063c87b56dd14610666578063d067358314610686578063d5abeb01146106a6578063dbf80fec146106bc578063dc9a15351461071457610246565b8063a22cb465116100fd578063a22cb465146105d0578063a945bf80146105f0578063b6a5d7de14610606578063b88d4fde14610626578063c62752551461064657610246565b806391d9c4ed1461055257806394bf804d1461057257806395d89b41146105855780639a997c471461059a578063a10f151e146105b057610246565b806330176e13116101c75780635eec08701161018b5780635eec0870146104bc5780636352211e146104dc57806370a08231146104fc57806387c0568b1461051c578063897045461461053257610246565b806330176e131461043157806342842e0e14610451578063492a1629146104715780634f6ccce71461048657806356bd182d146104a657610246565b80631816467f1161020e5780631816467f1461031b57806321058d2a1461033b57806323b872dd146103c25780632f54bf6e146103e25780632f745c591461041157610246565b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612b96565b61080b565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610838565b6040516102779190612db1565b3480156102ae57600080fd5b506102c26102bd366004612c14565b6108ca565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612b6b565b610964565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa610336366004612a29565b610a7a565b34801561034757600080fd5b50610390610356366004612a29565b6113a360205260009081526040902080546001820154600283015460039093015460ff8316936101009093046001600160a01b0316929085565b6040805195151586526001600160a01b039094166020860152928401919091526060830152608082015260a001610277565b3480156103ce57600080fd5b506102fa6103dd366004612a7d565b610aeb565b3480156103ee57600080fd5b5061026b6103fd366004612a29565b600a546001600160a01b0390811691161490565b34801561041d57600080fd5b5061030d61042c366004612b6b565b610b1c565b34801561043d57600080fd5b506102fa61044c366004612bce565b610bb2565b34801561045d57600080fd5b506102fa61046c366004612a7d565b610bee565b34801561047d57600080fd5b506102fa610c09565b34801561049257600080fd5b5061030d6104a1366004612c14565b610c80565b3480156104b257600080fd5b5061030d600f5481565b3480156104c857600080fd5b506102fa6104d7366004612a29565b610d21565b3480156104e857600080fd5b506102c26104f7366004612c14565b610d6d565b34801561050857600080fd5b5061030d610517366004612a29565b610de4565b34801561052857600080fd5b5061030d60105481565b34801561053e57600080fd5b506102fa61054d366004612c50565b610e6b565b34801561055e57600080fd5b506102fa61056d366004612c14565b610f06565b6102fa610580366004612c2c565b610fb8565b34801561059157600080fd5b506102956113bc565b3480156105a657600080fd5b5061030d60155481565b3480156105bc57600080fd5b506102fa6105cb366004612c14565b6113cb565b3480156105dc57600080fd5b506102fa6105eb366004612b3a565b611425565b3480156105fc57600080fd5b5061030d60115481565b34801561061257600080fd5b506102fa610621366004612a29565b6114f7565b34801561063257600080fd5b506102fa610641366004612abd565b611545565b34801561065257600080fd5b506102fa610661366004612c14565b61157d565b34801561067257600080fd5b50610295610681366004612c14565b6115d7565b34801561069257600080fd5b506102fa6106a1366004612c14565b611611565b3480156106b257600080fd5b5061030d600e5481565b3480156106c857600080fd5b506106f96106d7366004612a29565b6113a26020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610277565b34801561072057600080fd5b50600d5461026b9060ff1681565b34801561073a57600080fd5b506102fa6116d6565b34801561074f57600080fd5b5061026b61075e366004612a45565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561079857600080fd5b506102fa6107a7366004612a29565b611753565b3480156107b857600080fd5b506102fa6107c7366004612a29565b61179e565b3480156107d857600080fd5b50600d5461026b90610100900460ff1681565b3480156107f757600080fd5b5061026b610806366004612a29565b611830565b60006001600160e01b0319821663780e9d6360e01b148061083057506108308261184e565b90505b919050565b60606000805461084790612f51565b80601f016020809104026020016040519081016040528092919081815260200182805461087390612f51565b80156108c05780601f10610895576101008083540402835291602001916108c0565b820191906000526020600020905b8154815290600101906020018083116108a357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109485760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061096f82610d6d565b9050806001600160a01b0316836001600160a01b031614156109dd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161093f565b336001600160a01b03821614806109f957506109f9813361075e565b610a6b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161093f565b610a75838361189e565b505050565b6013546001600160a01b03163314610ac95760405162461bcd60e51b81526020600482015260126024820152712cb7ba9030b932903737ba1030903232bb1760711b604482015260640161093f565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b610af5338261190c565b610b115760405162461bcd60e51b815260040161093f90612e36565b610a75838383611a03565b6000610b2783610de4565b8210610b895760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161093f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bbb33611830565b610bd75760405162461bcd60e51b815260040161093f90612e87565b8051610bea90600c90602084019061291a565b5050565b610a7583838360405180602001604052806000815250611545565b610c1233611830565b610c2e5760405162461bcd60e51b815260040161093f90612e87565b600d805460ff19811660ff9182161517918290556040517ff35e7f85b714ecbd62a45b6269c072c67fa2f41e4467a7612df441c6ec2fae9492610c7692161515815260200190565b60405180910390a1565b6000610c8b60085490565b8210610cee5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161093f565b60088281548110610d0f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610d4b5760405162461bcd60e51b815260040161093f90612e16565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806108305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161093f565b60006001600160a01b038216610e4f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161093f565b506001600160a01b031660009081526003602052604090205490565b610e7433611830565b610e905760405162461bcd60e51b815260040161093f90612e87565b6101f481610e9e8486612eac565b610ea89190612eac565b10610ef55760405162461bcd60e51b815260206004820152601a60248201527f546f6f206269672066656520666f7220726566657272616c7321000000000000604482015260640161093f565b61139f929092556113a0556113a155565b610f0f33611830565b610f2b5760405162461bcd60e51b815260040161093f90612e87565b60c8811115610f7c5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d616e7920746f6b656e7320666f72206f6e65206d696e7421000000604482015260640161093f565b60158190556040518181527f540af958bf28c91b5dfb1fa9e8b0329bda30813960dc8b6f1711d995aec3c779906020015b60405180910390a150565b60155482111561100a5760405162461bcd60e51b815260206004820181905260248201527f546f6f206d616e7920746f6b656e7320746f206d696e74206174206f6e63652e604482015260640161093f565b600d54610100900460ff161561113257600854600f54116110655760405162461bcd60e51b8152602060048201526015602482015274507269766174652073616c6520697320736f6c642160581b604482015260640161093f565b6010546110729083611bae565b3410156110b95760405162461bcd60e51b8152602060048201526015602482015274416d6f756e74206973206e6f7420656e6f7567682160581b604482015260640161093f565b600f546110cf6110c860085490565b8490611bc1565b111561112d576110ea6110e160085490565b600f5490611bcd565b600d805461ff0019169055604051600081529092507f271fd4f40231b04dc2cdec4c65a09f89fe8cb2dbb3a70dd716fff2017d53b93f9060200160405180910390a15b6111cd565b600d5460ff166111795760405162461bcd60e51b81526020600482015260126024820152714d696e74696e67206973207061757365642160701b604482015260640161093f565b6011546111869083611bae565b3410156111cd5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e74206973206e6f7420656e6f7567682160581b604482015260640161093f565b600e546111dc6110c860085490565b111561122a5760405162461bcd60e51b815260206004820181905260248201527f4e6f20746f6b656e7320617661696c61626c6520666f72206d696e74696e6721604482015260640161093f565b61123381611bd9565b60006112566103e861125060145434611bae90919063ffffffff16565b90611d85565b6013546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146112a8576040519150601f19603f3d011682016040523d82523d6000602084013e6112ad565b606091505b50509050806112bb57600080fd5b60006112c73334611d91565b905060006112d58285611bcd565b6012546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114611327576040519150601f19603f3d011682016040523d82523d6000602084013e61132c565b606091505b505090508061133a57600080fd5b60015b8781116113b257600061135089836120f7565b905061135c8882612188565b876001600160a01b03167f36bf5aa3964be01dbd95a0154a8930793fe68353bdc580871ffb2c911366bbc78260405161139791815260200190565b60405180910390a250806113aa81612f86565b91505061133d565b5050505050505050565b60606001805461084790612f51565b6113d433611830565b6113f05760405162461bcd60e51b815260040161093f90612e87565b60108190556040518181527f8a81ba946dafb8f106b660022186fe69243575cf4a67b9673cadb007d0b138c290602001610fad565b6001600160a01b03821633141561147e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093f565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114eb911515815260200190565b60405180910390a35050565b600a546001600160a01b031633146115215760405162461bcd60e51b815260040161093f90612e16565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b61154f338361190c565b61156b5760405162461bcd60e51b815260040161093f90612e36565b611577848484846121a2565b50505050565b61158633611830565b6115a25760405162461bcd60e51b815260040161093f90612e87565b60118190556040518181527f4f5539c0409dfc4cb06f64cbd31237e1fbfe443f531584bf4dd77ec7fc5ba7b190602001610fad565b606060006115e4836121d5565b9050600c816040516020016115fa929190612cc3565b604051602081830303815290604052915050919050565b61161a33611830565b6116365760405162461bcd60e51b815260040161093f90612e87565b60085481116116a15760405162461bcd60e51b815260206004820152603160248201527f5072697661746520737570706c792073686f756c64206265206d6f7265207468604482015270616e2063757272656e7420737570706c7960781b606482015260840161093f565b600f8190556040518181527f9f989c825e903c1304253f5fad1cd0245f5f27c790539742140e7aa443e718a690602001610fad565b6116df33611830565b6116fb5760405162461bcd60e51b815260040161093f90612e87565b600d805460ff610100808304821615810261ff001990931692909217928390556040517f271fd4f40231b04dc2cdec4c65a09f89fe8cb2dbb3a70dd716fff2017d53b93f93610c769390049091161515815260200190565b600a546001600160a01b0316331461177d5760405162461bcd60e51b815260040161093f90612e16565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b600a546001600160a01b031633146117c85760405162461bcd60e51b815260040161093f90612e16565b600a80546001600160a01b0319166001600160a01b0383169081179091556000818152600b6020908152604091829020805460ff1916600117905590519182527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639101610fad565b6001600160a01b03166000908152600b602052604090205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061187f57506001600160e01b03198216635b5e139f60e01b145b8061083057506301ffc9a760e01b6001600160e01b0319831614610830565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118d382610d6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166119855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161093f565b600061199083610d6d565b9050806001600160a01b0316846001600160a01b031614806119cb5750836001600160a01b03166119c0846108ca565b6001600160a01b0316145b806119fb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a1682610d6d565b6001600160a01b031614611a7e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161093f565b6001600160a01b038216611ae05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161093f565b611aeb8383836122f0565b611af660008261189e565b6001600160a01b0383166000908152600360205260408120805460019290611b1f908490612ef7565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b4d908490612eac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611bba8284612ed8565b9392505050565b6000611bba8284612eac565b6000611bba8284612ef7565b3360009081526113a3602052604090205460ff16158015611c0357506001600160a01b0381163314155b8015611c1757506001600160a01b03811615155b15611d82573360008181526113a3602052604080822080546001610100600160a81b03199091166101006001600160a01b0388811682029290921760ff191692909217928390559181900482168085528385205482900483168086529390942054939492930416908314801590611c9657506001600160a01b03831615155b15611ccb576001600160a01b03831660009081526113a260205260408120805460019290611cc5908490612eac565b90915550505b6001600160a01b0382163314801590611cec57506001600160a01b03821615155b15611d26576001600160a01b03821660009081526113a2602052604081206001908101805491929091611d20908490612eac565b90915550505b6001600160a01b0381163314801590611d4757506001600160a01b03811615155b15611577576001600160a01b03811660009081526113a260205260408120600201805460019290611d79908490612eac565b90915550505050505b50565b6000611bba8284612ec4565b6001600160a01b03821660009081526113a3602052604081205460ff16156120f1576001600160a01b0380841660009081526113a3602052604080822054610100908190048416808452828420548290048516808552928420549094929391900490911690611e0c6103e861125061139f8401548990611bae565b90506000611e276103e861125061139f600101548a90611bae565b90506000611e426103e861125061139f600201548b90611bae565b9050886001600160a01b0316866001600160a01b031614158015611e6e57506001600160a01b03861615155b15611f26576000866001600160a01b03168460405160006040518083038185875af1925050503d8060008114611ec0576040519150601f19603f3d011682016040523d82523d6000602084013e611ec5565b606091505b5050905080611ed357600080fd5b611edd8985611bcd565b6001600160a01b03881660009081526113a36020526040902060010154909950611f079085611bc1565b6001600160a01b03881660009081526113a36020526040902060010155505b886001600160a01b0316856001600160a01b031614158015611f5057506001600160a01b03851615155b15612008576000856001600160a01b03168360405160006040518083038185875af1925050503d8060008114611fa2576040519150601f19603f3d011682016040523d82523d6000602084013e611fa7565b606091505b5050905080611fb557600080fd5b611fbf8984611bcd565b6001600160a01b03871660009081526113a36020526040902060020154909950611fe99084611bc1565b6001600160a01b03871660009081526113a36020526040902060020155505b886001600160a01b0316846001600160a01b03161415801561203257506001600160a01b03841615155b156120ea576000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114612084576040519150601f19603f3d011682016040523d82523d6000602084013e612089565b606091505b505090508061209757600080fd5b6120a18983611bcd565b6001600160a01b03861660009081526113a360205260409020600301549099506120cb9083611bc1565b6001600160a01b03861660009081526113a36020526040902060030155505b5050505050505b50919050565b600080333a4342612109600183612ef7565b604080516001600160a01b039096166020870152850193909352606084019190915260808301524060a082015260c0810185905260e08101849052610100016040516020818303038152906040528051906020012060001c9050600061139e54826121749190612fa1565b905061217f816123ad565b95945050505050565b610bea8282604051806020016040528060008152506124d2565b6121ad848484611a03565b6121b984848484612505565b6115775760405162461bcd60e51b815260040161093f90612dc4565b6060816121fa57506040805180820190915260018152600360fc1b6020820152610833565b8160005b8115612224578061220e81612f86565b915061221d9050600a83612ec4565b91506121fe565b60008167ffffffffffffffff81111561224d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612277576020820181803683370190505b5090505b84156119fb5761228c600183612ef7565b9150612299600a86612fa1565b6122a4906030612eac565b60f81b8183815181106122c757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122e9600a86612ec4565b945061227b565b6001600160a01b03831661234b5761234681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61236e565b816001600160a01b0316836001600160a01b03161461236e5761236e8382612612565b6001600160a01b03821661238a57612385816126af565b610a75565b826001600160a01b0316826001600160a01b031614610a7557610a758282612788565b60008060168361138881106123d257634e487b7160e01b600052603260045260246000fd5b015490506000816123e45750826123e7565b50805b6000600161139e546123f99190612ef7565b90508085146124b3576000601682611388811061242657634e487b7160e01b600052603260045260246000fd5b015490508061248b578161246057600e54601687611388811061245957634e487b7160e01b600052603260045260246000fd5b0155612486565b81601687611388811061248357634e487b7160e01b600052603260045260246000fd5b01555b6124b1565b8060168761138881106124ae57634e487b7160e01b600052603260045260246000fd5b01555b505b61139e80549060006124c483612f3a565b909155509195945050505050565b6124dc83836127cc565b6124e96000848484612505565b610a755760405162461bcd60e51b815260040161093f90612dc4565b60006001600160a01b0384163b1561260757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612549903390899088908890600401612d74565b602060405180830381600087803b15801561256357600080fd5b505af1925050508015612593575060408051601f3d908101601f1916820190925261259091810190612bb2565b60015b6125ed573d8080156125c1576040519150601f19603f3d011682016040523d82523d6000602084013e6125c6565b606091505b5080516125e55760405162461bcd60e51b815260040161093f90612dc4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119fb565b506001949350505050565b6000600161261f84610de4565b6126299190612ef7565b60008381526007602052604090205490915080821461267c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126c190600190612ef7565b600083815260096020526040812054600880549394509092849081106126f757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061272657634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061276c57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061279383610de4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166128225760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161093f565b6000818152600260205260409020546001600160a01b0316156128875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161093f565b612893600083836122f0565b6001600160a01b03821660009081526003602052604081208054600192906128bc908490612eac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461292690612f51565b90600052602060002090601f016020900481019282612948576000855561298e565b82601f1061296157805160ff191683800117855561298e565b8280016001018555821561298e579182015b8281111561298e578251825591602001919060010190612973565b5061299a92915061299e565b5090565b5b8082111561299a576000815560010161299f565b600067ffffffffffffffff808411156129ce576129ce612fe1565b604051601f8501601f19908116603f011681019082821181831017156129f6576129f6612fe1565b81604052809350858152868686011115612a0f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a3a578081fd5b8135611bba81612ff7565b60008060408385031215612a57578081fd5b8235612a6281612ff7565b91506020830135612a7281612ff7565b809150509250929050565b600080600060608486031215612a91578081fd5b8335612a9c81612ff7565b92506020840135612aac81612ff7565b929592945050506040919091013590565b60008060008060808587031215612ad2578081fd5b8435612add81612ff7565b93506020850135612aed81612ff7565b925060408501359150606085013567ffffffffffffffff811115612b0f578182fd5b8501601f81018713612b1f578182fd5b612b2e878235602084016129b3565b91505092959194509250565b60008060408385031215612b4c578182fd5b8235612b5781612ff7565b915060208301358015158114612a72578182fd5b60008060408385031215612b7d578182fd5b8235612b8881612ff7565b946020939093013593505050565b600060208284031215612ba7578081fd5b8135611bba8161300c565b600060208284031215612bc3578081fd5b8151611bba8161300c565b600060208284031215612bdf578081fd5b813567ffffffffffffffff811115612bf5578182fd5b8201601f81018413612c05578182fd5b6119fb848235602084016129b3565b600060208284031215612c25578081fd5b5035919050565b60008060408385031215612c3e578182fd5b823591506020830135612a7281612ff7565b600080600060608486031215612c64578283fd5b505081359360208301359350604090920135919050565b60008151808452612c93816020860160208601612f0e565b601f01601f19169290920160200192915050565b60008151612cb9818560208601612f0e565b9290920192915050565b8254600090819060028104600180831680612cdf57607f831692505b6020808410821415612cff57634e487b7160e01b87526022600452602487fd5b818015612d135760018114612d2457612d50565b60ff19861689528489019650612d50565b60008b815260209020885b86811015612d485781548b820152908501908301612d2f565b505084890196505b50505050505061217f612d638286612ca7565b64173539b7b760d91b815260050190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612da790830184612c7b565b9695505050505050565b600060208252611bba6020830184612c7b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b60008219821115612ebf57612ebf612fb5565b500190565b600082612ed357612ed3612fcb565b500490565b6000816000190483118215151615612ef257612ef2612fb5565b500290565b600082821015612f0957612f09612fb5565b500390565b60005b83811015612f29578181015183820152602001612f11565b838111156115775750506000910152565b600081612f4957612f49612fb5565b506000190190565b600281046001821680612f6557607f821691505b602082108114156120f157634e487b7160e01b600052602260045260246000fd5b6000600019821415612f9a57612f9a612fb5565b5060010190565b600082612fb057612fb0612fcb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611d8257600080fd5b6001600160e01b031981168114611d8257600080fdfea26469706673582212201335fcc94170d111698d1fe3e62f983703ca416a898c93528e035a1bea0bbbfc64736f6c63430008020033
Deployed Bytecode Sourcemap
48615:9069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42467:224;;;;;;;;;;-1:-1:-1;42467:224:0;;;;;:::i;:::-;;:::i;:::-;;;9330:14:1;;9323:22;9305:41;;9293:2;9278:18;42467:224:0;;;;;;;;21951:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23510:221::-;;;;;;;;;;-1:-1:-1;23510:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7774:32:1;;;7756:51;;7744:2;7729:18;23510:221:0;7711:102:1;23033:411:0;;;;;;;;;;-1:-1:-1;23033:411:0;;;;;:::i;:::-;;:::i;:::-;;43107:113;;;;;;;;;;-1:-1:-1;43195:10:0;:17;43107:113;;;20175:25:1;;;20163:2;20148:18;43107:113:0;20130:76:1;54745:160:0;;;;;;;;;;-1:-1:-1;54745:160:0;;;;;:::i;:::-;;:::i;49693:41::-;;;;;;;;;;-1:-1:-1;49693:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49693:41:0;;;;;;;;;9635:14:1;;9628:22;9610:41;;-1:-1:-1;;;;;9687:32:1;;;9682:2;9667:18;;9660:60;9736:18;;;9729:34;;;;9794:2;9779:18;;9772:34;9837:3;9822:19;;9815:35;9597:3;9582:19;49693:41:0;9564:292:1;24400:339:0;;;;;;;;;;-1:-1:-1;24400:339:0;;;;;:::i;:::-;;:::i;34106:103::-;;;;;;;;;;-1:-1:-1;34106:103:0;;;;;:::i;:::-;34196:5;;-1:-1:-1;;;;;34196:5:0;;;34185:16;;;;34106:103;42775:256;;;;;;;;;;-1:-1:-1;42775:256:0;;;;;:::i;:::-;;:::i;51258:121::-;;;;;;;;;;-1:-1:-1;51258:121:0;;;;;:::i;:::-;;:::i;24810:185::-;;;;;;;;;;-1:-1:-1;24810:185:0;;;;;:::i;:::-;;:::i;50145:121::-;;;;;;;;;;;;;:::i;43297:233::-;;;;;;;;;;-1:-1:-1;43297:233:0;;;;;:::i;:::-;;:::i;48838:32::-;;;;;;;;;;;;;;;;54624:113;;;;;;;;;;-1:-1:-1;54624:113:0;;;;;:::i;:::-;;:::i;21645:239::-;;;;;;;;;;-1:-1:-1;21645:239:0;;;;;:::i;:::-;;:::i;21375:208::-;;;;;;;;;;-1:-1:-1;21375:208:0;;;;;:::i;:::-;;:::i;48877:40::-;;;;;;;;;;;;;;;;54913:325;;;;;;;;;;-1:-1:-1;54913:325:0;;;;;:::i;:::-;;:::i;50431:237::-;;;;;;;;;;-1:-1:-1;50431:237:0;;;;;:::i;:::-;;:::i;51623:1485::-;;;;;;:::i;:::-;;:::i;22120:104::-;;;;;;;;;;;;;:::i;49143:33::-;;;;;;;;;;;;;;;;51090:160;;;;;;;;;;-1:-1:-1;51090:160:0;;;;;:::i;:::-;;:::i;23803:295::-;;;;;;;;;;-1:-1:-1;23803:295:0;;;;;:::i;:::-;;:::i;48924:38::-;;;;;;;;;;;;;;;;33779:94;;;;;;;;;;-1:-1:-1;33779:94:0;;;;;:::i;:::-;;:::i;25066:328::-;;;;;;;;;;-1:-1:-1;25066:328:0;;;;;:::i;:::-;;:::i;50274:149::-;;;;;;;;;;-1:-1:-1;50274:149:0;;;;;:::i;:::-;;:::i;51387:228::-;;;;;;;;;;-1:-1:-1;51387:228:0;;;;;:::i;:::-;;:::i;50676:272::-;;;;;;;;;;-1:-1:-1;50676:272:0;;;;;:::i;:::-;;:::i;48800:31::-;;;;;;;;;;;;;;;;49633:53;;;;;;;;;;-1:-1:-1;49633:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20413:25:1;;;20469:2;20454:18;;20447:34;;;;20497:18;;;20490:34;20401:2;20386:18;49633:53:0;20368:162:1;48728:28:0;;;;;;;;;;-1:-1:-1;48728:28:0;;;;;;;;50956:126;;;;;;;;;;;;;:::i;24169:164::-;;;;;;;;;;-1:-1:-1;24169:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24290:25:0;;;24266:4;24290:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24169:164;33949:97;;;;;;;;;;-1:-1:-1;33949:97:0;;;;;:::i;:::-;;:::i;34506:173::-;;;;;;;;;;-1:-1:-1;34506:173:0;;;;;:::i;:::-;;:::i;48763:28::-;;;;;;;;;;-1:-1:-1;48763:28:0;;;;;;;;;;;34280:107;;;;;;;;;;-1:-1:-1;34280:107:0;;;;;:::i;:::-;;:::i;42467:224::-;42569:4;-1:-1:-1;;;;;;42593:50:0;;-1:-1:-1;;;42593:50:0;;:90;;;42647:36;42671:11;42647:23;:36::i;:::-;42586:97;;42467:224;;;;:::o;21951:100::-;22005:13;22038:5;22031:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21951:100;:::o;23510:221::-;23586:7;26993:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26993:16:0;23606:73;;;;-1:-1:-1;;;23606:73:0;;15662:2:1;23606:73:0;;;15644:21:1;15701:2;15681:18;;;15674:30;15740:34;15720:18;;;15713:62;-1:-1:-1;;;15791:18:1;;;15784:42;15843:19;;23606:73:0;;;;;;;;;-1:-1:-1;23699:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23699:24:0;;23510:221::o;23033:411::-;23114:13;23130:23;23145:7;23130:14;:23::i;:::-;23114:39;;23178:5;-1:-1:-1;;;;;23172:11:0;:2;-1:-1:-1;;;;;23172:11:0;;;23164:57;;;;-1:-1:-1;;;23164:57:0;;16840:2:1;23164:57:0;;;16822:21:1;16879:2;16859:18;;;16852:30;16918:34;16898:18;;;16891:62;-1:-1:-1;;;16969:18:1;;;16962:31;17010:19;;23164:57:0;16812:223:1;23164:57:0;8986:10;-1:-1:-1;;;;;23256:21:0;;;;:62;;-1:-1:-1;23281:37:0;23298:5;8986:10;23305:12;8906:98;23281:37;23234:168;;;;-1:-1:-1;;;23234:168:0;;13694:2:1;23234:168:0;;;13676:21:1;13733:2;13713:18;;;13706:30;13772:34;13752:18;;;13745:62;13843:26;13823:18;;;13816:54;13887:19;;23234:168:0;13666:246:1;23234:168:0;23415:21;23424:2;23428:7;23415:8;:21::i;:::-;23033:411;;;:::o;54745:160::-;54832:9;;-1:-1:-1;;;;;54832:9:0;54818:10;:23;54810:54;;;;-1:-1:-1;;;54810:54:0;;18355:2:1;54810:54:0;;;18337:21:1;18394:2;18374:18;;;18367:30;-1:-1:-1;;;18413:18:1;;;18406:48;18471:18;;54810:54:0;18327:168:1;54810:54:0;54875:9;:22;;-1:-1:-1;;;;;;54875:22:0;-1:-1:-1;;;;;54875:22:0;;;;;;;;;;54745:160::o;24400:339::-;24595:41;8986:10;24628:7;24595:18;:41::i;:::-;24587:103;;;;-1:-1:-1;;;24587:103:0;;;;;;;:::i;:::-;24703:28;24713:4;24719:2;24723:7;24703:9;:28::i;42775:256::-;42872:7;42908:23;42925:5;42908:16;:23::i;:::-;42900:5;:31;42892:87;;;;-1:-1:-1;;;42892:87:0;;10287:2:1;42892:87:0;;;10269:21:1;10326:2;10306:18;;;10299:30;10365:34;10345:18;;;10338:62;-1:-1:-1;;;10416:18:1;;;10409:41;10467:19;;42892:87:0;10259:233:1;42892:87:0;-1:-1:-1;;;;;;42997:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42775:256::o;51258:121::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;51343:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51258:121:::0;:::o;24810:185::-;24948:39;24965:4;24971:2;24975:7;24948:39;;;;;;;;;;;;:16;:39::i;50145:121::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;50212:8:::1;::::0;;-1:-1:-1;;50200:20:0;::::1;50212:8;::::0;;::::1;50211:9;50200:20;::::0;;;;50236:22:::1;::::0;::::1;::::0;::::1;::::0;50249:8:::1;9330:14:1::0;9323:22;9305:41;;9293:2;9278:18;;9260:92;50236:22:0::1;;;;;;;;50145:121::o:0;43297:233::-;43372:7;43408:30;43195:10;:17;43107:113;;43408:30;43400:5;:38;43392:95;;;;-1:-1:-1;;;43392:95:0;;18702:2:1;43392:95:0;;;18684:21:1;18741:2;18721:18;;;18714:30;18780:34;18760:18;;;18753:62;-1:-1:-1;;;18831:18:1;;;18824:42;18883:19;;43392:95:0;18674:234:1;43392:95:0;43505:10;43516:5;43505:17;;;;;;-1:-1:-1;;;43505:17:0;;;;;;;;;;;;;;;;;43498:24;;43297:233;;;:::o;54624:113::-;34196:5;;-1:-1:-1;;;;;34196:5:0;33485:10;34185:16;33469:38;;;;-1:-1:-1;;;33469:38:0;;;;;;;:::i;:::-;54703:11:::1;:26:::0;;-1:-1:-1;;;;;;54703:26:0::1;-1:-1:-1::0;;;;;54703:26:0;;;::::1;::::0;;;::::1;::::0;;54624:113::o;21645:239::-;21717:7;21753:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21753:16:0;21788:19;21780:73;;;;-1:-1:-1;;;21780:73:0;;14530:2:1;21780:73:0;;;14512:21:1;14569:2;14549:18;;;14542:30;14608:34;14588:18;;;14581:62;-1:-1:-1;;;14659:18:1;;;14652:39;14708:19;;21780:73:0;14502:231:1;21375:208:0;21447:7;-1:-1:-1;;;;;21475:19:0;;21467:74;;;;-1:-1:-1;;;21467:74:0;;14119:2:1;21467:74:0;;;14101:21:1;14158:2;14138:18;;;14131:30;14197:34;14177:18;;;14170:62;-1:-1:-1;;;14248:18:1;;;14241:40;14298:19;;21467:74:0;14091:232:1;21467:74:0;-1:-1:-1;;;;;;21559:16:0;;;;;:9;:16;;;;;;;21375:208::o;54913:325::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;55076:3:::1;55063:10:::0;55037:23:::1;55050:10:::0;55037;:23:::1;:::i;:::-;:36;;;;:::i;:::-;:42;55029:81;;;::::0;-1:-1:-1;;;55029:81:0;;16485:2:1;55029:81:0::1;::::0;::::1;16467:21:1::0;16524:2;16504:18;;;16497:30;16563:28;16543:18;;;16536:56;16609:18;;55029:81:0::1;16457:176:1::0;55029:81:0::1;55121:13;:29:::0;;;;55161:16;:29;55201:16;:29;54913:325::o;50431:237::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;50538:3:::1;50520:14;:21;;50512:63;;;::::0;-1:-1:-1;;;50512:63:0;;19873:2:1;50512:63:0::1;::::0;::::1;19855:21:1::0;19912:2;19892:18;;;19885:30;19951:31;19931:18;;;19924:59;20000:18;;50512:63:0::1;19845:179:1::0;50512:63:0::1;50586:13;:30:::0;;;50632:28:::1;::::0;20175:25:1;;;50632:28:0::1;::::0;20163:2:1;20148:18;50632:28:0::1;;;;;;;;50431:237:::0;:::o;51623:1485::-;51717:13;;51706:7;:24;;51698:69;;;;-1:-1:-1;;;51698:69:0;;17242:2:1;51698:69:0;;;17224:21:1;;;17261:18;;;17254:30;17320:34;17300:18;;;17293:62;17372:18;;51698:69:0;17214:182:1;51698:69:0;51782:9;;;;;;;51778:569;;;43195:10;:17;51816:13;;:29;51808:63;;;;-1:-1:-1;;;51808:63:0;;11825:2:1;51808:63:0;;;11807:21:1;11864:2;11844:18;;;11837:30;-1:-1:-1;;;11883:18:1;;;11876:51;11944:18;;51808:63:0;11797:171:1;51808:63:0;51907:12;;:25;;51924:7;51907:16;:25::i;:::-;51894:9;:38;;51886:72;;;;-1:-1:-1;;;51886:72:0;;11118:2:1;51886:72:0;;;11100:21:1;11157:2;11137:18;;;11130:30;-1:-1:-1;;;11176:18:1;;;11169:51;11237:18;;51886:72:0;11090:171:1;51886:72:0;52006:13;;51977:26;51989:13;43195:10;:17;43107:113;;51989:13;51977:7;;:11;:26::i;:::-;:42;51973:205;;;52050:32;52068:13;43195:10;:17;43107:113;;52068:13;52050;;;:17;:32::i;:::-;52101:9;:17;;-1:-1:-1;;52101:17:0;;;52142:20;;-1:-1:-1;9305:41:1;;52040:42:0;;-1:-1:-1;52142:20:0;;9293:2:1;9278:18;52142:20:0;;;;;;;51973:205;51778:569;;;52218:8;;;;52210:39;;;;-1:-1:-1;;;52210:39:0;;13347:2:1;52210:39:0;;;13329:21:1;13386:2;13366:18;;;13359:30;-1:-1:-1;;;13405:18:1;;;13398:48;13463:18;;52210:39:0;13319:168:1;52210:39:0;52285:11;;:24;;52301:7;52285:15;:24::i;:::-;52272:9;:37;;52264:71;;;;-1:-1:-1;;;52264:71:0;;11118:2:1;52264:71:0;;;11100:21:1;11157:2;11137:18;;;11130:30;-1:-1:-1;;;11176:18:1;;;11169:51;11237:18;;52264:71:0;11090:171:1;52264:71:0;52395:9;;52365:26;52377:13;43195:10;:17;43107:113;;52365:26;:39;;52357:84;;;;-1:-1:-1;;;52357:84:0;;15301:2:1;52357:84:0;;;15283:21:1;;;15320:18;;;15313:30;15379:34;15359:18;;;15352:62;15431:18;;52357:84:0;15273:182:1;52357:84:0;52452:17;52460:8;52452:7;:17::i;:::-;52480;52500:31;52526:4;52500:21;52514:6;;52500:9;:13;;:21;;;;:::i;:::-;:25;;:31::i;:::-;52565:9;;52557:45;;52480:51;;-1:-1:-1;52543:8:0;;-1:-1:-1;;;;;52565:9:0;;;;52480:51;;52543:8;52557:45;52543:8;52557:45;52480:51;52565:9;52557:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52542:60;;;52621:3;52613:12;;;;;;52636:14;52653:33;52664:10;52676:9;52653:10;:33::i;:::-;52636:50;-1:-1:-1;52697:19:0;52719:21;52636:50;52730:9;52719:10;:21::i;:::-;52776:11;;52768:49;;52697:43;;-1:-1:-1;52752:10:0;;-1:-1:-1;;;;;52776:11:0;;;;52697:43;;52752:10;52768:49;52752:10;52768:49;52697:43;52776:11;52768:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52751:66;;;52836:5;52828:14;;;;;;52870:1;52853:248;52878:7;52873:1;:12;52853:248;;52907:18;52928:35;52952:7;52961:1;52928:23;:35::i;:::-;52907:56;;52978:31;52988:8;52998:10;52978:9;:31::i;:::-;53053:8;-1:-1:-1;;;;;53043:31:0;;53063:10;53043:31;;;;20175:25:1;;20163:2;20148:18;;20130:76;53043:31:0;;;;;;;;-1:-1:-1;52887:3:0;;;;:::i;:::-;;;;52853:248;;;;51623:1485;;;;;;;:::o;22120:104::-;22176:13;22209:7;22202:14;;;;;:::i;51090:160::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;51169:12:::1;:28:::0;;;51213:29:::1;::::0;20175:25:1;;;51213:29:0::1;::::0;20163:2:1;20148:18;51213:29:0::1;20130:76:1::0;23803:295:0;-1:-1:-1;;;;;23906:24:0;;8986:10;23906:24;;23898:62;;;;-1:-1:-1;;;23898:62:0;;12580:2:1;23898:62:0;;;12562:21:1;12619:2;12599:18;;;12592:30;12658:27;12638:18;;;12631:55;12703:18;;23898:62:0;12552:175:1;23898:62:0;8986:10;23973:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23973:42:0;;;;;;;;;;:53;;-1:-1:-1;;23973:53:0;;;;;;;:42;-1:-1:-1;;;;;24042:48:0;;24081:8;24042:48;;;;9330:14:1;9323:22;9305:41;;9293:2;9278:18;;9260:92;24042:48:0;;;;;;;;23803:295;;:::o;33779:94::-;34196:5;;-1:-1:-1;;;;;34196:5:0;33485:10;34185:16;33469:38;;;;-1:-1:-1;;;33469:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33839:19:0::1;;::::0;;;:14:::1;:19;::::0;;;;:26;;-1:-1:-1;;33839:26:0::1;33861:4;33839:26;::::0;;33779:94::o;25066:328::-;25241:41;8986:10;25274:7;25241:18;:41::i;:::-;25233:103;;;;-1:-1:-1;;;25233:103:0;;;;;;;:::i;:::-;25347:39;25361:4;25367:2;25371:7;25380:5;25347:13;:39::i;:::-;25066:328;;;;:::o;50274:149::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;50351:11:::1;:26:::0;;;50393:22:::1;::::0;20175:25:1;;;50393:22:0::1;::::0;20163:2:1;20148:18;50393:22:0::1;20130:76:1::0;51387:228:0;51453:13;51479:23;51505:26;51522:8;51505:16;:26::i;:::-;51479:52;;51573:12;51587:9;51556:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51542:65;;;51387:228;;;:::o;50676:272::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;43195:10;:17;50765:14:::1;:30;50757:92;;;::::0;-1:-1:-1;;;50757:92:0;;19115:2:1;50757:92:0::1;::::0;::::1;19097:21:1::0;19154:2;19134:18;;;19127:30;19193:34;19173:18;;;19166:62;-1:-1:-1;;;19244:18:1;;;19237:47;19301:19;;50757:92:0::1;19087:239:1::0;50757:92:0::1;50860:13;:30:::0;;;50906:34:::1;::::0;20175:25:1;;;50906:34:0::1;::::0;20163:2:1;20148:18;50906:34:0::1;20130:76:1::0;50956:126:0;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;51025:9:::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;51024:10;51012:22:::0;::::1;-1:-1:-1::0;;51012:22:0;;::::1;::::0;;;::::1;::::0;;;;51050:24:::1;::::0;::::1;::::0;::::1;::::0;51064:9;::::1;::::0;;::::1;9330:14:1::0;9323:22;9305:41;;9293:2;9278:18;;9260:92;33949:97:0;34196:5;;-1:-1:-1;;;;;34196:5:0;33485:10;34185:16;33469:38;;;;-1:-1:-1;;;33469:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34011:19:0::1;34033:5;34011:19:::0;;;:14:::1;:19;::::0;;;;:27;;-1:-1:-1;;34011:27:0::1;::::0;;33949:97::o;34506:173::-;34196:5;;-1:-1:-1;;;;;34196:5:0;33485:10;34185:16;33469:38;;;;-1:-1:-1;;;33469:38:0;;;;;;;:::i;:::-;34582:5:::1;:11:::0;;-1:-1:-1;;;;;;34582:11:0::1;-1:-1:-1::0;;;;;34582:11:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;34604:19:0;;;:14:::1;:19;::::0;;;;;;;;:26;;-1:-1:-1;;34604:26:0::1;-1:-1:-1::0;34604:26:0::1;::::0;;34646:25;;7756:51:1;;;34646:25:0::1;::::0;7729:18:1;34646:25:0::1;7711:102:1::0;34280:107:0;-1:-1:-1;;;;;34360:19:0;34336:4;34360:19;;;:14;:19;;;;;;;;;34280:107::o;21006:305::-;21108:4;-1:-1:-1;;;;;;21145:40:0;;-1:-1:-1;;;21145:40:0;;:105;;-1:-1:-1;;;;;;;21202:48:0;;-1:-1:-1;;;21202:48:0;21145:105;:158;;;-1:-1:-1;;;;;;;;;;6326:40:0;;;21267:36;6217:157;30886:174;30961:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30961:29:0;-1:-1:-1;;;;;30961:29:0;;;;;;;;:24;;31015:23;30961:24;31015:14;:23::i;:::-;-1:-1:-1;;;;;31006:46:0;;;;;;;;;;;30886:174;;:::o;27198:348::-;27291:4;26993:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26993:16:0;27308:73;;;;-1:-1:-1;;;27308:73:0;;12934:2:1;27308:73:0;;;12916:21:1;12973:2;12953:18;;;12946:30;13012:34;12992:18;;;12985:62;-1:-1:-1;;;13063:18:1;;;13056:42;13115:19;;27308:73:0;12906:234:1;27308:73:0;27392:13;27408:23;27423:7;27408:14;:23::i;:::-;27392:39;;27461:5;-1:-1:-1;;;;;27450:16:0;:7;-1:-1:-1;;;;;27450:16:0;;:51;;;;27494:7;-1:-1:-1;;;;;27470:31:0;:20;27482:7;27470:11;:20::i;:::-;-1:-1:-1;;;;;27470:31:0;;27450:51;:87;;;-1:-1:-1;;;;;;24290:25:0;;;24266:4;24290:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27505:32;27442:96;27198:348;-1:-1:-1;;;;27198:348:0:o;30190:578::-;30349:4;-1:-1:-1;;;;;30322:31:0;:23;30337:7;30322:14;:23::i;:::-;-1:-1:-1;;;;;30322:31:0;;30314:85;;;;-1:-1:-1;;;30314:85:0;;16075:2:1;30314:85:0;;;16057:21:1;16114:2;16094:18;;;16087:30;16153:34;16133:18;;;16126:62;-1:-1:-1;;;16204:18:1;;;16197:39;16253:19;;30314:85:0;16047:231:1;30314:85:0;-1:-1:-1;;;;;30418:16:0;;30410:65;;;;-1:-1:-1;;;30410:65:0;;12175:2:1;30410:65:0;;;12157:21:1;12214:2;12194:18;;;12187:30;12253:34;12233:18;;;12226:62;-1:-1:-1;;;12304:18:1;;;12297:34;12348:19;;30410:65:0;12147:226:1;30410:65:0;30488:39;30509:4;30515:2;30519:7;30488:20;:39::i;:::-;30592:29;30609:1;30613:7;30592:8;:29::i;:::-;-1:-1:-1;;;;;30634:15:0;;;;;;:9;:15;;;;;:20;;30653:1;;30634:15;:20;;30653:1;;30634:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30665:13:0;;;;;;:9;:13;;;;;:18;;30682:1;;30665:13;:18;;30682:1;;30665:18;:::i;:::-;;;;-1:-1:-1;;30694:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30694:21:0;-1:-1:-1;;;;;30694:21:0;;;;;;;;;30733:27;;30694:16;;30733:27;;;;;;;30190:578;;;:::o;38208:98::-;38266:7;38293:5;38297:1;38293;:5;:::i;:::-;38286:12;38208:98;-1:-1:-1;;;38208:98:0:o;37470:::-;37528:7;37555:5;37559:1;37555;:5;:::i;37851:98::-;37909:7;37936:5;37940:1;37936;:5;:::i;55246:871::-;55314:10;55304:21;;;;:9;:21;;;;;:30;;;:39;;;:64;;-1:-1:-1;;;;;;55347:21:0;;55358:10;55347:21;;55304:64;:89;;;;-1:-1:-1;;;;;;55372:21:0;;;;55304:89;55300:810;;;55420:10;55410:21;;;;:9;:21;;;;;;:43;;:33;-1:-1:-1;;;;;;55410:43:0;;;;-1:-1:-1;;;;;55410:43:0;;;;;;;;;-1:-1:-1;;55468:37:0;;;;;;;;;55539:33;;;;;;55604:17;;;;;;:29;;;;;;55665:17;;;;;;;:29;55539:33;;55604:29;;55665;;;55716:20;;;;;55715:48;;-1:-1:-1;;;;;;55742:20:0;;;;55715:48;55711:120;;;-1:-1:-1;;;;;55784:18:0;;;;;;:10;:18;;;;;:31;;55814:1;;55784:18;:31;;55814:1;;55784:31;:::i;:::-;;;;-1:-1:-1;;55711:120:0;-1:-1:-1;;;;;55850:20:0;;55860:10;55850:20;;;;55849:48;;-1:-1:-1;;;;;;55876:20:0;;;;55849:48;55845:120;;;-1:-1:-1;;;;;55918:18:0;;;;;;:10;:18;;;;;55948:1;55918:26;;;:31;;55948:1;;55918:26;;:31;;55948:1;;55918:31;:::i;:::-;;;;-1:-1:-1;;55845:120:0;-1:-1:-1;;;;;55984:20:0;;55994:10;55984:20;;;;55983:48;;-1:-1:-1;;;;;;56010:20:0;;;;55983:48;55979:120;;;-1:-1:-1;;;;;56052:18:0;;;;;;:10;:18;;;;;:26;;:31;;56082:1;;56052:18;:31;;56082:1;;56052:31;:::i;:::-;;;;-1:-1:-1;;55300:810:0;;;;55246:871;:::o;38607:98::-;38665:7;38692:5;38696:1;38692;:5;:::i;56125:1556::-;-1:-1:-1;;;;;56219:18:0;;56195:7;56219:18;;;:9;:18;;;;;:27;;;56215:1435;;;-1:-1:-1;;;;;56280:18:0;;;56263:14;56280:18;;;:9;:18;;;;;;:30;;;;;;;;56342:17;;;;;;:29;;;;;;56403:17;;;;;;:29;56280:30;;56342:29;;56403;;;;;;;56466:38;56499:4;56466:28;56477:13;56263:14;56477:16;;56466:6;;:10;:28::i;:38::-;56447:57;-1:-1:-1;56519:15:0;56538:38;56571:4;56538:28;56549:13;56563:1;56549:16;;56538:6;;:10;:28::i;:38::-;56519:57;-1:-1:-1;56591:15:0;56610:38;56643:4;56610:28;56621:13;56635:1;56621:16;;56610:6;;:10;:28::i;:38::-;56591:57;;56678:7;-1:-1:-1;;;;;56668:17:0;:6;-1:-1:-1;;;;;56668:17:0;;;56667:45;;;;-1:-1:-1;;;;;;56691:20:0;;;;56667:45;56663:316;;;56734:11;56759:6;-1:-1:-1;;;;;56751:20:0;56779:7;56751:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56733:58;;;56818:6;56810:15;;;;;;56853:19;:6;56864:7;56853:10;:19::i;:::-;-1:-1:-1;;;;;56922:17:0;;;;;;:9;:17;;;;;:28;;;56844;;-1:-1:-1;56922:41:0;;56955:7;56922:32;:41::i;:::-;-1:-1:-1;;;;;56891:17:0;;;;;;:9;:17;;;;;:28;;:72;-1:-1:-1;56663:316:0;57008:7;-1:-1:-1;;;;;56998:17:0;:6;-1:-1:-1;;;;;56998:17:0;;;56997:45;;;;-1:-1:-1;;;;;;57021:20:0;;;;56997:45;56993:316;;;57064:11;57089:6;-1:-1:-1;;;;;57081:20:0;57109:7;57081:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57063:58;;;57148:6;57140:15;;;;;;57183:19;:6;57194:7;57183:10;:19::i;:::-;-1:-1:-1;;;;;57252:17:0;;;;;;:9;:17;;;;;:28;;;57174;;-1:-1:-1;57252:41:0;;57285:7;57252:32;:41::i;:::-;-1:-1:-1;;;;;57221:17:0;;;;;;:9;:17;;;;;:28;;:72;-1:-1:-1;56993:316:0;57338:7;-1:-1:-1;;;;;57328:17:0;:6;-1:-1:-1;;;;;57328:17:0;;;57327:45;;;;-1:-1:-1;;;;;;57351:20:0;;;;57327:45;57323:316;;;57394:11;57419:6;-1:-1:-1;;;;;57411:20:0;57439:7;57411:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57393:58;;;57478:6;57470:15;;;;;;57513:19;:6;57524:7;57513:10;:19::i;:::-;-1:-1:-1;;;;;57582:17:0;;;;;;:9;:17;;;;;:28;;;57504;;-1:-1:-1;57582:41:0;;57615:7;57582:32;:41::i;:::-;-1:-1:-1;;;;;57551:17:0;;;;;;:9;:17;;;;;:28;;:72;-1:-1:-1;57323:316:0;56215:1435;;;;;;;-1:-1:-1;57667:6:0;56125:1556;-1:-1:-1;56125:1556:0:o;53116:607::-;53200:7;;53323:10;53356:11;53390:12;53425:15;53473:16;53488:1;53390:12;53473:16;:::i;:::-;53290:278;;;-1:-1:-1;;;;;8860:32:1;;;53290:278:0;;;8842:51:1;8909:18;;8902:34;;;;8952:18;;;8945:34;;;;8995:18;;;8988:34;53463:27:0;9038:19:1;;;9031:35;9082:19;;;9075:35;;;9126:19;;;9119:35;;;8814:19;;53290:278:0;;;;;;;;;;;;53262:321;;;;;;53240:354;;53220:374;;53605:19;53640;;53628:9;:31;;;;:::i;:::-;53605:55;;53678:37;53703:11;53678:24;:37::i;:::-;53671:44;53116:607;-1:-1:-1;;;;;53116:607:0:o;27888:110::-;27964:26;27974:2;27978:7;27964:26;;;;;;;;;;;;:9;:26::i;26276:315::-;26433:28;26443:4;26449:2;26453:7;26433:9;:28::i;:::-;26480:48;26503:4;26509:2;26513:7;26522:5;26480:22;:48::i;:::-;26472:111;;;;-1:-1:-1;;;26472:111:0;;;;;;;:::i;6607:723::-;6663:13;6884:10;6880:53;;-1:-1:-1;6911:10:0;;;;;;;;;;;;-1:-1:-1;;;6911:10:0;;;;;;6880:53;6958:5;6943:12;6999:78;7006:9;;6999:78;;7032:8;;;;:::i;:::-;;-1:-1:-1;7055:10:0;;-1:-1:-1;7063:2:0;7055:10;;:::i;:::-;;;6999:78;;;7087:19;7119:6;7109:17;;;;;;-1:-1:-1;;;7109:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7109:17:0;;7087:39;;7137:154;7144:10;;7137:154;;7171:11;7181:1;7171:11;;:::i;:::-;;-1:-1:-1;7240:10:0;7248:2;7240:5;:10;:::i;:::-;7227:24;;:2;:24;:::i;:::-;7214:39;;7197:6;7204;7197:14;;;;;;-1:-1:-1;;;7197:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;7197:56:0;;;;;;;;-1:-1:-1;7268:11:0;7277:2;7268:11;;:::i;:::-;;;7137:154;;44143:589;-1:-1:-1;;;;;44349:18:0;;44345:187;;44384:40;44416:7;45559:10;:17;;45532:24;;;;:15;:24;;;;;:44;;;45587:24;;;;;;;;;;;;45455:164;44384:40;44345:187;;;44454:2;-1:-1:-1;;;;;44446:10:0;:4;-1:-1:-1;;;;;44446:10:0;;44442:90;;44473:47;44506:4;44512:7;44473:32;:47::i;:::-;-1:-1:-1;;;;;44546:16:0;;44542:183;;44579:45;44616:7;44579:36;:45::i;:::-;44542:183;;;44652:4;-1:-1:-1;;;;;44646:10:0;:2;-1:-1:-1;;;;;44646:10:0;;44642:83;;44673:40;44701:2;44705:7;44673:27;:40::i;53735:881::-;53807:7;53827:18;53848:16;53865:10;53848:28;;;;;-1:-1:-1;;;53848:28:0;;;;;;;;;;;;-1:-1:-1;53887:14:0;53916:15;53912:119;;-1:-1:-1;53957:10:0;53912:119;;;-1:-1:-1;54009:10:0;53912:119;54041:17;54083:1;54061:19;;:23;;;;:::i;:::-;54041:43;;54113:9;54099:10;:23;54095:458;;54139:22;54164:16;54181:9;54164:27;;;;;-1:-1:-1;;;54164:27:0;;;;;;;;;;;;-1:-1:-1;54210:19:0;54206:336;;54253:14;54249:192;;54323:9;;54292:16;54309:10;54292:28;;;;;-1:-1:-1;;;54292:28:0;;;;;;;;;;:40;54249:192;;;54412:9;54381:16;54398:10;54381:28;;;;;-1:-1:-1;;;54381:28:0;;;;;;;;;;:40;54249:192;54206:336;;;54512:14;54481:16;54498:10;54481:28;;;;;-1:-1:-1;;;54481:28:0;;;;;;;;;;:45;54206:336;54095:458;;54563:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;54602:6:0;;53735:881;-1:-1:-1;;;;;53735:881:0:o;28225:321::-;28355:18;28361:2;28365:7;28355:5;:18::i;:::-;28406:54;28437:1;28441:2;28445:7;28454:5;28406:22;:54::i;:::-;28384:154;;;;-1:-1:-1;;;28384:154:0;;;;;;;:::i;31625:799::-;31780:4;-1:-1:-1;;;;;31801:13:0;;10128:20;10176:8;31797:620;;31837:72;;-1:-1:-1;;;31837:72:0;;-1:-1:-1;;;;;31837:36:0;;;;;:72;;8986:10;;31888:4;;31894:7;;31903:5;;31837:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31837:72:0;;;;;;;;-1:-1:-1;;31837:72:0;;;;;;;;;;;;:::i;:::-;;;31833:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32079:13:0;;32075:272;;32122:60;;-1:-1:-1;;;32122:60:0;;;;;;;:::i;32075:272::-;32297:6;32291:13;32282:6;32278:2;32274:15;32267:38;31833:529;-1:-1:-1;;;;;;31960:51:0;-1:-1:-1;;;31960:51:0;;-1:-1:-1;31953:58:0;;31797:620;-1:-1:-1;32401:4:0;31625:799;;;;;;:::o;46246:988::-;46512:22;46562:1;46537:22;46554:4;46537:16;:22::i;:::-;:26;;;;:::i;:::-;46574:18;46595:26;;;:17;:26;;;;;;46512:51;;-1:-1:-1;46728:28:0;;;46724:328;;-1:-1:-1;;;;;46795:18:0;;46773:19;46795:18;;;:12;:18;;;;;;;;:34;;;;;;;;;46846:30;;;;;;:44;;;46963:30;;:17;:30;;;;;:43;;;46724:328;-1:-1:-1;47148:26:0;;;;:17;:26;;;;;;;;47141:33;;;-1:-1:-1;;;;;47192:18:0;;;;;:12;:18;;;;;:34;;;;;;;47185:41;46246:988::o;47529:1079::-;47807:10;:17;47782:22;;47807:21;;47827:1;;47807:21;:::i;:::-;47839:18;47860:24;;;:15;:24;;;;;;48233:10;:26;;47782:46;;-1:-1:-1;47860:24:0;;47782:46;;48233:26;;;;-1:-1:-1;;;48233:26:0;;;;;;;;;;;;;;;;;48211:48;;48297:11;48272:10;48283;48272:22;;;;;;-1:-1:-1;;;48272:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;48377:28;;;:15;:28;;;;;;;:41;;;48549:24;;;;;48542:31;48584:10;:16;;;;;-1:-1:-1;;;48584:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;47529:1079;;;;:::o;45033:221::-;45118:14;45135:20;45152:2;45135:16;:20::i;:::-;-1:-1:-1;;;;;45166:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45211:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45033:221:0:o;28882:382::-;-1:-1:-1;;;;;28962:16:0;;28954:61;;;;-1:-1:-1;;;28954:61:0;;14940:2:1;28954:61:0;;;14922:21:1;;;14959:18;;;14952:30;15018:34;14998:18;;;14991:62;15070:18;;28954:61:0;14912:182:1;28954:61:0;26969:4;26993:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26993:16:0;:30;29026:58;;;;-1:-1:-1;;;29026:58:0;;11468:2:1;29026:58:0;;;11450:21:1;11507:2;11487:18;;;11480:30;11546;11526:18;;;11519:58;11594:18;;29026:58:0;11440:178:1;29026:58:0;29097:45;29126:1;29130:2;29134:7;29097:20;:45::i;:::-;-1:-1:-1;;;;;29155:13:0;;;;;;:9;:13;;;;;:18;;29172:1;;29155:13;:18;;29172:1;;29155:18;:::i;:::-;;;;-1:-1:-1;;29184:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29184:21:0;-1:-1:-1;;;;;29184:21:0;;;;;;;;29223:33;;29184:16;;;29223:33;;29184:16;;29223:33;28882:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:257::-;;762:2;750:9;741:7;737:23;733:32;730:2;;;783:6;775;768:22;730:2;827:9;814:23;846:31;871:5;846:31;:::i;1182:398::-;;;1311:2;1299:9;1290:7;1286:23;1282:32;1279:2;;;1332:6;1324;1317:22;1279:2;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1567:7;1557:17;;;1269:311;;;;;:::o;1585:466::-;;;;1731:2;1719:9;1710:7;1706:23;1702:32;1699:2;;;1752:6;1744;1737:22;1699:2;1796:9;1783:23;1815:31;1840:5;1815:31;:::i;:::-;1865:5;-1:-1:-1;1922:2:1;1907:18;;1894:32;1935:33;1894:32;1935:33;:::i;:::-;1689:362;;1987:7;;-1:-1:-1;;;2041:2:1;2026:18;;;;2013:32;;1689:362::o;2056:824::-;;;;;2228:3;2216:9;2207:7;2203:23;2199:33;2196:2;;;2250:6;2242;2235:22;2196:2;2294:9;2281:23;2313:31;2338:5;2313:31;:::i;:::-;2363:5;-1:-1:-1;2420:2:1;2405:18;;2392:32;2433:33;2392:32;2433:33;:::i;:::-;2485:7;-1:-1:-1;2539:2:1;2524:18;;2511:32;;-1:-1:-1;2594:2:1;2579:18;;2566:32;2621:18;2610:30;;2607:2;;;2658:6;2650;2643:22;2607:2;2686:22;;2739:4;2731:13;;2727:27;-1:-1:-1;2717:2:1;;2773:6;2765;2758:22;2717:2;2801:73;2866:7;2861:2;2848:16;2843:2;2839;2835:11;2801:73;:::i;:::-;2791:83;;;2186:694;;;;;;;:::o;2885:436::-;;;3011:2;2999:9;2990:7;2986:23;2982:32;2979:2;;;3032:6;3024;3017:22;2979:2;3076:9;3063:23;3095:31;3120:5;3095:31;:::i;:::-;3145:5;-1:-1:-1;3202:2:1;3187:18;;3174:32;3244:15;;3237:23;3225:36;;3215:2;;3280:6;3272;3265:22;3326:325;;;3455:2;3443:9;3434:7;3430:23;3426:32;3423:2;;;3476:6;3468;3461:22;3423:2;3520:9;3507:23;3539:31;3564:5;3539:31;:::i;:::-;3589:5;3641:2;3626:18;;;;3613:32;;-1:-1:-1;;;3413:238:1:o;3656:255::-;;3767:2;3755:9;3746:7;3742:23;3738:32;3735:2;;;3788:6;3780;3773:22;3735:2;3832:9;3819:23;3851:30;3875:5;3851:30;:::i;3916:259::-;;4038:2;4026:9;4017:7;4013:23;4009:32;4006:2;;;4059:6;4051;4044:22;4006:2;4096:9;4090:16;4115:30;4139:5;4115:30;:::i;4180:480::-;;4302:2;4290:9;4281:7;4277:23;4273:32;4270:2;;;4323:6;4315;4308:22;4270:2;4368:9;4355:23;4401:18;4393:6;4390:30;4387:2;;;4438:6;4430;4423:22;4387:2;4466:22;;4519:4;4511:13;;4507:27;-1:-1:-1;4497:2:1;;4553:6;4545;4538:22;4497:2;4581:73;4646:7;4641:2;4628:16;4623:2;4619;4615:11;4581:73;:::i;4665:190::-;;4777:2;4765:9;4756:7;4752:23;4748:32;4745:2;;;4798:6;4790;4783:22;4745:2;-1:-1:-1;4826:23:1;;4735:120;-1:-1:-1;4735:120:1:o;4860:325::-;;;4989:2;4977:9;4968:7;4964:23;4960:32;4957:2;;;5010:6;5002;4995:22;4957:2;5051:9;5038:23;5028:33;;5111:2;5100:9;5096:18;5083:32;5124:31;5149:5;5124:31;:::i;5190:326::-;;;;5336:2;5324:9;5315:7;5311:23;5307:32;5304:2;;;5357:6;5349;5342:22;5304:2;-1:-1:-1;;5385:23:1;;;5455:2;5440:18;;5427:32;;-1:-1:-1;5506:2:1;5491:18;;;5478:32;;5294:222;-1:-1:-1;5294:222:1:o;5521:257::-;;5600:5;5594:12;5627:6;5622:3;5615:19;5643:63;5699:6;5692:4;5687:3;5683:14;5676:4;5669:5;5665:16;5643:63;:::i;:::-;5760:2;5739:15;-1:-1:-1;;5735:29:1;5726:39;;;;5767:4;5722:50;;5570:208;-1:-1:-1;;5570:208:1:o;5783:185::-;;5863:5;5857:12;5878:52;5923:6;5918:3;5911:4;5904:5;5900:16;5878:52;:::i;:::-;5946:16;;;;;5833:135;-1:-1:-1;;5833:135:1:o;6091:1304::-;6426:13;;6091:1304;;;;6499:1;6484:17;;6520:1;6556:18;;;;6583:2;;6637:4;6629:6;6625:17;6615:27;;6583:2;6663;6711;6703:6;6700:14;6680:18;6677:38;6674:2;;;-1:-1:-1;;;6738:33:1;;6794:4;6791:1;6784:15;6824:4;6745:3;6812:17;6674:2;6855:18;6882:104;;;;7000:1;6995:322;;;;6848:469;;6882:104;-1:-1:-1;;6915:24:1;;6903:37;;6960:16;;;;-1:-1:-1;6882:104:1;;6995:322;20535:127;20601:17;;;20651:4;20635:21;;7090:3;7106:165;7120:6;7117:1;7114:13;7106:165;;;7198:14;;7185:11;;;7178:35;7241:16;;;;7135:10;;7106:165;;;7110:3;;7300:6;7295:3;7291:16;7284:23;;6848:469;;;;;;;7333:56;7358:30;7384:3;7376:6;7358:30;:::i;:::-;-1:-1:-1;;;6033:20:1;;6078:1;6069:11;;6023:63;8034:488;-1:-1:-1;;;;;8303:15:1;;;8285:34;;8355:15;;8350:2;8335:18;;8328:43;8402:2;8387:18;;8380:34;;;8450:3;8445:2;8430:18;;8423:31;;;8034:488;;8471:45;;8496:19;;8488:6;8471:45;:::i;:::-;8463:53;8237:285;-1:-1:-1;;;;;;8237:285:1:o;9861:219::-;;10010:2;9999:9;9992:21;10030:44;10070:2;10059:9;10055:18;10047:6;10030:44;:::i;10497:414::-;10699:2;10681:21;;;10738:2;10718:18;;;10711:30;10777:34;10772:2;10757:18;;10750:62;-1:-1:-1;;;10843:2:1;10828:18;;10821:48;10901:3;10886:19;;10671:240::o;17401:329::-;17603:2;17585:21;;;17642:1;17622:18;;;17615:29;-1:-1:-1;;;17675:2:1;17660:18;;17653:36;17721:2;17706:18;;17575:155::o;17735:413::-;17937:2;17919:21;;;17976:2;17956:18;;;17949:30;18015:34;18010:2;17995:18;;17988:62;-1:-1:-1;;;18081:2:1;18066:18;;18059:47;18138:3;18123:19;;17909:239::o;19331:335::-;19533:2;19515:21;;;19572:2;19552:18;;;19545:30;-1:-1:-1;;;19606:2:1;19591:18;;19584:41;19657:2;19642:18;;19505:161::o;20667:128::-;;20738:1;20734:6;20731:1;20728:13;20725:2;;;20744:18;;:::i;:::-;-1:-1:-1;20780:9:1;;20715:80::o;20800:120::-;;20866:1;20856:2;;20871:18;;:::i;:::-;-1:-1:-1;20905:9:1;;20846:74::o;20925:168::-;;21031:1;21027;21023:6;21019:14;21016:1;21013:21;21008:1;21001:9;20994:17;20990:45;20987:2;;;21038:18;;:::i;:::-;-1:-1:-1;21078:9:1;;20977:116::o;21098:125::-;;21166:1;21163;21160:8;21157:2;;;21171:18;;:::i;:::-;-1:-1:-1;21208:9:1;;21147:76::o;21228:258::-;21300:1;21310:113;21324:6;21321:1;21318:13;21310:113;;;21400:11;;;21394:18;21381:11;;;21374:39;21346:2;21339:10;21310:113;;;21441:6;21438:1;21435:13;21432:2;;;-1:-1:-1;;21476:1:1;21458:16;;21451:27;21281:205::o;21491:136::-;;21558:5;21548:2;;21567:18;;:::i;:::-;-1:-1:-1;;;21603:18:1;;21538:89::o;21632:380::-;21717:1;21707:12;;21764:1;21754:12;;;21775:2;;21829:4;21821:6;21817:17;21807:27;;21775:2;21882;21874:6;21871:14;21851:18;21848:38;21845:2;;;21928:10;21923:3;21919:20;21916:1;21909:31;21963:4;21960:1;21953:15;21991:4;21988:1;21981:15;22017:135;;-1:-1:-1;;22077:17:1;;22074:2;;;22097:18;;:::i;:::-;-1:-1:-1;22144:1:1;22133:13;;22064:88::o;22157:112::-;;22215:1;22205:2;;22220:18;;:::i;:::-;-1:-1:-1;22254:9:1;;22195:74::o;22274:127::-;22335:10;22330:3;22326:20;22323:1;22316:31;22366:4;22363:1;22356:15;22390:4;22387:1;22380:15;22406:127;22467:10;22462:3;22458:20;22455:1;22448:31;22498:4;22495:1;22488:15;22522:4;22519:1;22512:15;22538:127;22599:10;22594:3;22590:20;22587:1;22580:31;22630:4;22627:1;22620:15;22654:4;22651:1;22644:15;22670:131;-1:-1:-1;;;;;22745:31:1;;22735:42;;22725:2;;22791:1;22788;22781:12;22806:131;-1:-1:-1;;;;;;22880:32:1;;22870:43;;22860:2;;22927:1;22924;22917:12
Swarm Source
ipfs://1335fcc94170d111698d1fe3e62f983703ca416a898c93528e035a1bea0bbbfc
Loading...
Loading
Loading...
Loading
[ 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.