ERC-721
Overview
Max Total Supply
79 PARAM
Holders
33
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 PARAMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Parameter
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-04 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * ________ ________ ________ ________ _____ ______ ________ ___ ___ ________ ___ ___ ________ ________ ________ *|\ __ \|\ __ \|\ __ \|\ __ \|\ _ \ _ \|\ ____\ |\ \ |\ \ |\ _____\\ \|\ \|\ ___ \|\ ____\|\ ____\ *\ \ \|\ \ \ \|\ \ \ \|\ \ \ \|\ \ \ \\\__\ \ \ \ \___|_ \ \ \\_\ \ \ \ \__/\ \ \\\ \ \ \\ \ \ \ \___|\ \ \___|_ * \ \ ____\ \ __ \ \ _ _\ \ __ \ \ \\|__| \ \ \_____ \ \ \______ \ \ \ __\\ \ \\\ \ \ \\ \ \ \ \ \ \_____ \ * \ \ \___|\ \ \ \ \ \ \\ \\ \ \ \ \ \ \ \ \ \|____|\ \ \|_____|\ \ \ \ \_| \ \ \\\ \ \ \\ \ \ \ \____\|____|\ \ * \ \__\ \ \__\ \__\ \__\\ _\\ \__\ \__\ \__\ \ \__\____\_\ \ \ \__\ \ \__\ \ \_______\ \__\\ \__\ \_______\____\_\ \ * \|__| \|__|\|__|\|__|\|__|\|__|\|__|\|__| \|__|\_________\ \|__| \|__| \|_______|\|__| \|__|\|_______|\_________\ * \|_________| \|_________| */ // Parameters (for Functions) // no website // just this contract // what you get: // a boolean // a single digit // a double digit // a triple digit // a character // a hex color // a second hex color // a logical operator // any of these can come with an additional single digit parameter // as well as an additional character parameter // any value may return null // 8192 max supply. 0-indexed /** * @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. * 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 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 Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } contract Parameter is ERC721Enumerable, ReentrancyGuard, Ownable { string[] private bool_list = [ "true","false" ]; string[] private digit_list = [ "0","1","2","3","4","5","6","7","8","9" ]; string[] private char_list = [ "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z" ]; string[] private color_list = [ "a","b","c","d","e","f","0","1","2","3","4","5","6","7","8","9" ]; string[] private operator_list = [ "AND","OR","NOT" ]; function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function getBool(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "BOOL", bool_list,1); } function getDigit(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "DIGIT", digit_list,1); } function getDoubleDigit(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "DOUBLEDIGIT", digit_list,2); } function getTripleDigit(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "TRIPLEDIGIT", digit_list,3); } function getChar(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "CHAR", char_list,1); } function getColor(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "COLOR", color_list,6); } function getSecondaryColor(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "SECONDARYCOLOR", color_list,6); } function getOperator(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "OPERATOR", operator_list,1); } function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray, uint256 pulls) internal view returns (string memory) { uint256 rand = 0; string memory output = ""; for (uint256 i = 0; i < pulls; i++) { rand = random(string(abi.encodePacked(keyPrefix,i, toString(tokenId)))); output = string(abi.encodePacked(output,sourceArray[rand % sourceArray.length])); } uint256 rarity = rand % 100; uint256 rerand = 0; if (rarity == 99){ output = string(abi.encodePacked('null')); } else if (rarity > 80) { rerand = random(string(abi.encodePacked(keyPrefix,"19", toString(tokenId)))); string[2] memory name; name[1] = digit_list[rerand % digit_list.length]; output = string(abi.encodePacked(output, ", ", name[1])); if (rarity >= 95) { name[0] = char_list[rerand % char_list.length]; output = string(abi.encodePacked(output, ", ", name[0])); } } return output; } function tokenURI(uint256 tokenId) override public view returns (string memory) { string[17] memory parts; parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: #d8dee9; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="#303841" /><text x="10" y="20" class="base">'; parts[1] = getBool(tokenId); parts[2] = '</text><text x="10" y="40" class="base">'; parts[3] = getDigit(tokenId); parts[4] = '</text><text x="10" y="60" class="base">'; parts[5] = getDoubleDigit(tokenId); parts[6] = '</text><text x="10" y="80" class="base">'; parts[7] = getTripleDigit(tokenId); parts[8] = '</text><text x="10" y="100" class="base">'; parts[9] = getChar(tokenId); parts[10] = '</text><text x="10" y="120" class="base">'; parts[11] = getColor(tokenId); parts[12] = '</text><text x="10" y="140" class="base">'; parts[13] = getSecondaryColor(tokenId); parts[14] = '</text><text x="10" y="160" class="base">'; parts[15] = getOperator(tokenId); parts[16] = '</text></svg>'; string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8])); output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16])); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Parameter Set ', toString(tokenId), '", "description": "Parameter is randomized input generated and stored on chain. Definitions are intentionally omitted for others to interpret. Feel free to use this Parameter in any way you want.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}')))); output = string(abi.encodePacked('data:application/json;base64,', json)); return output; } function claim(uint256 tokenId) public nonReentrant { require(tokenId >= 0 && tokenId <= 8180, "Token ID invalid"); _safeMint(_msgSender(), tokenId); } function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require(tokenId >= 8181 && tokenId < 8192, "Token ID invalid"); _safeMint(owner(), tokenId); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // 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); } constructor() ERC721("Parameter", "PARAM") Ownable() {} } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getBool","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getChar","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDigit","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDoubleDigit","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOperator","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecondaryColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTripleDigit","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600460c0908152637472756560e01b60e052608090815261014060405260056101009081526466616c736560d81b6101205260a0526200004490600c9060026200070b565b50604080516101808101825260016101408201818152600360fc1b610160840152825282518084018452818152603160f81b6020828101919091528084019190915283518085018552828152601960f91b818301528385015283518085018552828152603360f81b81830152606084015283518085018552828152600d60fa1b81830152608084015283518085018552828152603560f81b8183015260a084015283518085018552828152601b60f91b8183015260c084015283518085018552828152603760f81b8183015260e084015283518085018552828152600760fb1b818301526101008401528351808501909452908352603960f81b908301526101208101919091526200015b90600d90600a6200076f565b50604080516103808101825260016103408201818152606160f81b610360840152825282518084018452818152603160f91b6020828101919091528084019190915283518085018552828152606360f81b818301528385015283518085018552828152601960fa1b81830152606084015283518085018552828152606560f81b81830152608084015283518085018552828152603360f91b8183015260a084015283518085018552828152606760f81b8183015260c084015283518085018552828152600d60fb1b8183015260e084015283518085018552828152606960f81b8183015261010084015283518085018552828152603560f91b8183015261012084015283518085018552828152606b60f81b8183015261014084015283518085018552828152601b60fa1b8183015261016084015283518085018552828152606d60f81b8183015261018084015283518085018552828152603760f91b818301526101a084015283518085018552828152606f60f81b818301526101c084015283518085018552828152600760fc1b818301526101e084015283518085018552828152607160f81b8183015261020084015283518085018552828152603960f91b8183015261022084015283518085018552828152607360f81b8183015261024084015283518085018552828152601d60fa1b8183015261026084015283518085018552828152607560f81b8183015261028084015283518085018552828152603b60f91b818301526102a084015283518085018552828152607760f81b818301526102c084015283518085018552828152600f60fb1b818301526102e084015283518085018552828152607960f81b818301526103008401528351808501909452908352603d60f91b908301526103208101919091526200040290600e90601a620007c1565b50604080516102408101825260016102008201818152606160f81b610220840152825282518084018452818152603160f91b6020828101919091528084019190915283518085018552828152606360f81b818301528385015283518085018552828152601960fa1b81830152606084015283518085018552828152606560f81b81830152608084015283518085018552828152603360f91b8183015260a084015283518085018552828152600360fc1b8183015260c084015283518085018552828152603160f81b8183015260e084015283518085018552828152601960f91b8183015261010084015283518085018552828152603360f81b8183015261012084015283518085018552828152600d60fa1b8183015261014084015283518085018552828152603560f81b8183015261016084015283518085018552828152601b60f91b8183015261018084015283518085018552828152603760f81b818301526101a084015283518085018552828152600760fb1b818301526101c08401528351808501909452908352603960f81b908301526101e0810191909152620005af90600f90601062000813565b5060405180606001604052806040518060400160405280600381526020016210539160ea1b81525081526020016040518060400160405280600281526020016127a960f11b8152508152602001604051806040016040528060038152602001621393d560ea1b81525081525060109060036200062d92919062000865565b503480156200063b57600080fd5b5060408051808201825260098152682830b930b6b2ba32b960b91b602080830191825283518085019094526005845264504152414d60d81b9084015281519192916200068a91600091620008b7565b508051620006a0906001906020840190620008b7565b50506001600a5550620006b333620006b9565b620009f9565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d57825180516200074c918491602090910190620008b7565b50916020019190600101906200072c565b506200076b92915062000942565b5090565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d5782518051620007b0918491602090910190620008b7565b509160200191906001019062000790565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d578251805162000802918491602090910190620008b7565b5091602001919060010190620007e2565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d578251805162000854918491602090910190620008b7565b509160200191906001019062000834565b8280548282559060005260206000209081019282156200075d579160200282015b828111156200075d5782518051620008a6918491602090910190620008b7565b509160200191906001019062000886565b828054620008c590620009bc565b90600052602060002090601f016020900481019282620008e9576000855562000934565b82601f106200090457805160ff191683800117855562000934565b8280016001018555821562000934579182015b828111156200093457825182559160200191906001019062000917565b506200076b92915062000963565b808211156200076b5760006200095982826200097a565b5060010162000942565b5b808211156200076b576000815560010162000964565b5080546200098890620009bc565b6000825580601f1062000999575050565b601f016020900490600052602060002090810190620009b9919062000963565b50565b600181811c90821680620009d157607f821691505b60208210811415620009f357634e487b7160e01b600052602260045260246000fd5b50919050565b6131088062000a096000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636343546611610104578063993e9ef4116100a2578063e985e9c511610071578063e985e9c5146103c7578063f2fde38b14610403578063f6f5afa014610416578063f87540fd1461042957600080fd5b8063993e9ef41461037b578063a22cb4651461038e578063b88d4fde146103a1578063c87b56dd146103b457600080fd5b8063715018a6116100de578063715018a61461034757806380057b9a1461034f5780638da5cb5b1461036257806395d89b411461037357600080fd5b8063634354661461030e5780636352211e1461032157806370a082311461033457600080fd5b806323b872dd1161017157806342842e0e1161014b57806342842e0e146102c2578063434f48c4146102d55780634f6ccce7146102e8578063573d5ef0146102fb57600080fd5b806323b872dd146102895780632f745c591461029c578063379607f5146102af57600080fd5b8063081812fc116101ad578063081812fc14610224578063095ea7b31461024f5780630ff88a8d1461026457806318160ddd1461027757600080fd5b806301ffc9a7146101d457806305f63c8a146101fc57806306fdde031461021c575b600080fd5b6101e76101e23660046127cb565b61043c565b60405190151581526020015b60405180910390f35b61020f61020a366004612805565b610467565b6040516101f39190612c0e565b61020f610567565b610237610232366004612805565b6105f9565b6040516001600160a01b0390911681526020016101f3565b61026261025d3660046127a1565b610693565b005b61020f610272366004612805565b6107a9565b6008545b6040519081526020016101f3565b61026261029736600461264d565b61089a565b61027b6102aa3660046127a1565b6108cb565b6102626102bd366004612805565b610961565b6102626102d036600461264d565b610a11565b6102626102e3366004612805565b610a2c565b61027b6102f6366004612805565b610b15565b61020f610309366004612805565b610ba8565b61020f61031c366004612805565b610cab565b61023761032f366004612805565b610d9c565b61027b6103423660046125f8565b610e13565b610262610e9a565b61020f61035d366004612805565b610ed0565b600b546001600160a01b0316610237565b61020f610fcd565b61020f610389366004612805565b610fdc565b61026261039c366004612765565b6110ce565b6102626103af366004612689565b611193565b61020f6103c2366004612805565b6111cb565b6101e76103d536600461261a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102626104113660046125f8565b611475565b61020f610424366004612805565b611510565b61020f610437366004612805565b61160b565b60006001600160e01b0319821663780e9d6360e01b148061046157506104618261170e565b92915050565b6060610461826040518060400160405280600881526020016727a822a920aa27a960c11b8152506010805480602002602001604051908101604052809291908181526020016000905b8282101561055c5783829060005260206000200180546104cf90612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546104fb90612d87565b80156105485780601f1061051d57610100808354040283529160200191610548565b820191906000526020600020905b81548152906001019060200180831161052b57829003601f168201915b5050505050815260200190600101906104b0565b50505050600161175e565b60606000805461057690612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546105a290612d87565b80156105ef5780601f106105c4576101008083540402835291602001916105ef565b820191906000526020600020905b8154815290600101906020018083116105d257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106775760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061069e82610d9c565b9050806001600160a01b0316836001600160a01b0316141561070c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161066e565b336001600160a01b0382161480610728575061072881336103d5565b61079a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161066e565b6107a48383611a84565b505050565b6060610461826040518060400160405280600481526020016321a420a960e11b815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561055c57838290600052602060002001805461080d90612d87565b80601f016020809104026020016040519081016040528092919081815260200182805461083990612d87565b80156108865780601f1061085b57610100808354040283529160200191610886565b820191906000526020600020905b81548152906001019060200180831161086957829003601f168201915b5050505050815260200190600101906107ee565b6108a43382611af2565b6108c05760405162461bcd60e51b815260040161066e90612ca8565b6107a4838383611be5565b60006108d683610e13565b82106109385760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161066e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a5414156109b45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066e565b6002600a55611ff48111156109fe5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161066e565b610a09335b82611d90565b506001600a55565b6107a483838360405180602001604052806000815250611193565b6002600a541415610a7f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066e565b6002600a55600b546001600160a01b03163314610aae5760405162461bcd60e51b815260040161066e90612c73565b611ff58110158015610ac1575061200081105b610b005760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161066e565b610a09610a03600b546001600160a01b031690565b6000610b2060085490565b8210610b835760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161066e565b60088281548110610b9657610b96612e33565b90600052602060002001549050919050565b6060610461826040518060400160405280600b81526020016a1113d5509311511251d25560aa1b815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610ca0578382906000526020600020018054610c1390612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f90612d87565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b505050505081526020019060010190610bf4565b50505050600261175e565b606061046182604051806040016040528060048152602001631093d3d360e21b815250600c805480602002602001604051908101604052809291908181526020016000905b8282101561055c578382906000526020600020018054610d0f90612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3b90612d87565b8015610d885780601f10610d5d57610100808354040283529160200191610d88565b820191906000526020600020905b815481529060010190602001808311610d6b57829003601f168201915b505050505081526020019060010190610cf0565b6000818152600260205260408120546001600160a01b0316806104615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161066e565b60006001600160a01b038216610e7e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161066e565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610ec45760405162461bcd60e51b815260040161066e90612c73565b610ece6000611dae565b565b6060610461826040518060400160405280600581526020016421a7a627a960d91b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610fc2578382906000526020600020018054610f3590612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6190612d87565b8015610fae5780601f10610f8357610100808354040283529160200191610fae565b820191906000526020600020905b815481529060010190602001808311610f9157829003601f168201915b505050505081526020019060010190610f16565b50505050600661175e565b60606001805461057690612d87565b60606104618260405180604001604052806005815260200164111251d25560da1b815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561055c57838290600052602060002001805461104190612d87565b80601f016020809104026020016040519081016040528092919081815260200182805461106d90612d87565b80156110ba5780601f1061108f576101008083540402835291602001916110ba565b820191906000526020600020905b81548152906001019060200180831161109d57829003601f168201915b505050505081526020019060010190611022565b6001600160a01b0382163314156111275760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161066e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61119d3383611af2565b6111b95760405162461bcd60e51b815260040161066e90612ca8565b6111c584848484611e00565b50505050565b60606111d561259b565b6040518061014001604052806101018152602001612faa610101913981526111fc83610cab565b81600160200201819052506040518060600160405280602881526020016130ab60289139604082015261122e83610fdc565b6060808301919091526040805191820190526028808252612e766020830139608082015261125b83610ba8565b60a082015260408051606081019091526028808252612ef0602083013960c08201526112868361160b565b60e082015260408051606081019091526029808252612f1860208301396101008201526112b2836107a9565b61012082015260408051606081019091526029808252612ec760208301396101408201526112df83610ed0565b61016082015260408051606081019091526029808252612f41602083013961018082015261130c83611510565b6101a082015260408051606081019091526029808252612e9e60208301396101c082015261133983610467565b6101e0820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6113a99a909101612895565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b01519799506113fc988a9890602001612895565b6040516020818303038152906040529050600061144961141b86611e33565b61142484611f31565b6040516020016114359291906129fc565b604051602081830303815290604052611f31565b90508060405160200161145c9190612b8c565b60408051601f1981840301815291905295945050505050565b600b546001600160a01b0316331461149f5760405162461bcd60e51b815260040161066e90612c73565b6001600160a01b0381166115045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161066e565b61150d81611dae565b50565b6060610461826040518060400160405280600e81526020016d29a2a1a7a72220a92ca1a7a627a960911b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610fc257838290600052602060002001805461157e90612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546115aa90612d87565b80156115f75780601f106115cc576101008083540402835291602001916115f7565b820191906000526020600020905b8154815290600101906020018083116115da57829003601f168201915b50505050508152602001906001019061155f565b6060610461826040518060400160405280600b81526020016a151492541311511251d25560aa1b815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561170357838290600052602060002001805461167690612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546116a290612d87565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b505050505081526020019060010190611657565b50505050600361175e565b60006001600160e01b031982166380ac58cd60e01b148061173f57506001600160e01b03198216635b5e139f60e01b145b8061046157506301ffc9a760e01b6001600160e01b0319831614610461565b60408051602081019091526000808252606091815b8481101561180d576117af87826117898b611e33565b60405160200161179b939291906129c5565b604051602081830303815290604052612097565b925081868751856117c09190612ddd565b815181106117d0576117d0612e33565b60200260200101516040516020016117e9929190612866565b6040516020818303038152906040529150808061180590612dc2565b915050611773565b50600061181b606484612ddd565b90506000816063141561185157604051631b9d5b1b60e21b60208201526024016040516020818303038152906040529250611a75565b6050821115611a7557611878886118678b611e33565b60405160200161179b929190612957565b90506118826125c3565b600d80546118909084612ddd565b815481106118a0576118a0612e33565b9060005260206000200180546118b590612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546118e190612d87565b801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b50505050508160016002811061194657611946612e33565b6020020152838160016020020151604051602001611965929190612994565b6040516020818303038152906040529350605f8310611a7357600e805461198c9084612ddd565b8154811061199c5761199c612e33565b9060005260206000200180546119b190612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546119dd90612d87565b8015611a2a5780601f106119ff57610100808354040283529160200191611a2a565b820191906000526020600020905b815481529060010190602001808311611a0d57829003601f168201915b505050505081600060028110611a4257611a42612e33565b6020020152838160006020020151604051602001611a61929190612994565b60405160208183030381529060405293505b505b5090925050505b949350505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ab982610d9c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b6b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161066e565b6000611b7683610d9c565b9050806001600160a01b0316846001600160a01b03161480611bb15750836001600160a01b0316611ba6846105f9565b6001600160a01b0316145b80611a7c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611a7c565b826001600160a01b0316611bf882610d9c565b6001600160a01b031614611c605760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161066e565b6001600160a01b038216611cc25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161066e565b611ccd8383836120c8565b611cd8600082611a84565b6001600160a01b0383166000908152600360205260408120805460019290611d01908490612d44565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d2f908490612cf9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611daa828260405180602001604052806000815250612180565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e0b848484611be5565b611e17848484846121b3565b6111c55760405162461bcd60e51b815260040161066e90612c21565b606081611e575750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e815780611e6b81612dc2565b9150611e7a9050600a83612d11565b9150611e5b565b60008167ffffffffffffffff811115611e9c57611e9c612e49565b6040519080825280601f01601f191660200182016040528015611ec6576020820181803683370190505b5090505b8415611a7c57611edb600183612d44565b9150611ee8600a86612ddd565b611ef3906030612cf9565b60f81b818381518110611f0857611f08612e33565b60200101906001600160f81b031916908160001a905350611f2a600a86612d11565b9450611eca565b805160609080611f51575050604080516020810190915260008152919050565b60006003611f60836002612cf9565b611f6a9190612d11565b611f75906004612d25565b90506000611f84826020612cf9565b67ffffffffffffffff811115611f9c57611f9c612e49565b6040519080825280601f01601f191660200182016040528015611fc6576020820181803683370190505b5090506000604051806060016040528060408152602001612f6a604091399050600181016020830160005b86811015612052576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611ff1565b50600386066001811461206c576002811461207d57612089565b613d3d60f01b600119830152612089565b603d60f81b6000198301525b505050918152949350505050565b6000816040516020016120aa919061284a565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b0383166121235761211e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612146565b816001600160a01b0316836001600160a01b0316146121465761214683826122bd565b6001600160a01b03821661215d576107a48161235a565b826001600160a01b0316826001600160a01b0316146107a4576107a48282612409565b61218a838361244d565b61219760008484846121b3565b6107a45760405162461bcd60e51b815260040161066e90612c21565b60006001600160a01b0384163b156122b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121f7903390899088908890600401612bd1565b602060405180830381600087803b15801561221157600080fd5b505af1925050508015612241575060408051601f3d908101601f1916820190925261223e918101906127e8565b60015b61229b573d80801561226f576040519150601f19603f3d011682016040523d82523d6000602084013e612274565b606091505b5080516122935760405162461bcd60e51b815260040161066e90612c21565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a7c565b506001611a7c565b600060016122ca84610e13565b6122d49190612d44565b600083815260076020526040902054909150808214612327576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061236c90600190612d44565b6000838152600960205260408120546008805493945090928490811061239457612394612e33565b9060005260206000200154905080600883815481106123b5576123b5612e33565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123ed576123ed612e1d565b6001900381819060005260206000200160009055905550505050565b600061241483610e13565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161066e565b6000818152600260205260409020546001600160a01b0316156125085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161066e565b612514600083836120c8565b6001600160a01b038216600090815260036020526040812080546001929061253d908490612cf9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061022001604052806011905b60608152602001906001900390816125ab5790505090565b60408051808201909152606081526001602082016125ab565b80356001600160a01b03811681146125f357600080fd5b919050565b60006020828403121561260a57600080fd5b612613826125dc565b9392505050565b6000806040838503121561262d57600080fd5b612636836125dc565b9150612644602084016125dc565b90509250929050565b60008060006060848603121561266257600080fd5b61266b846125dc565b9250612679602085016125dc565b9150604084013590509250925092565b6000806000806080858703121561269f57600080fd5b6126a8856125dc565b93506126b6602086016125dc565b925060408501359150606085013567ffffffffffffffff808211156126da57600080fd5b818701915087601f8301126126ee57600080fd5b81358181111561270057612700612e49565b604051601f8201601f19908116603f0116810190838211818310171561272857612728612e49565b816040528281528a602084870101111561274157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561277857600080fd5b612781836125dc565b91506020830135801515811461279657600080fd5b809150509250929050565b600080604083850312156127b457600080fd5b6127bd836125dc565b946020939093013593505050565b6000602082840312156127dd57600080fd5b813561261381612e5f565b6000602082840312156127fa57600080fd5b815161261381612e5f565b60006020828403121561281757600080fd5b5035919050565b60008151808452612836816020860160208601612d5b565b601f01601f19169290920160200192915050565b6000825161285c818460208701612d5b565b9190910192915050565b60008351612878818460208801612d5b565b83519083019061288c818360208801612d5b565b01949350505050565b60008a516128a7818460208f01612d5b565b8a51908301906128bb818360208f01612d5b565b8a516128cd8183850160208f01612d5b565b8a519290910101906128e3818360208d01612d5b565b88516128f58183850160208d01612d5b565b885192909101019061290b818360208b01612d5b565b865161291d8183850160208b01612d5b565b8651929091010190612933818360208901612d5b565b84516129458183850160208901612d5b565b9101019b9a5050505050505050505050565b60008351612969818460208801612d5b565b61313960f01b9083019081528351612988816002840160208801612d5b565b01600201949350505050565b600083516129a6818460208801612d5b565b61016160f51b9083019081528351612988816002840160208801612d5b565b600084516129d7818460208901612d5b565b820184815283516129ef816020808501908801612d5b565b0160200195945050505050565b7f7b226e616d65223a2022506172616d6574657220536574200000000000000000815260008351612a34816018850160208801612d5b565b80830190507f222c20226465736372697074696f6e223a2022506172616d657465722069732060188201527f72616e646f6d697a656420696e7075742067656e65726174656420616e64207360388201527f746f726564206f6e20636861696e2e20446566696e6974696f6e73206172652060588201527f696e74656e74696f6e616c6c79206f6d697474656420666f72206f746865727360788201527f20746f20696e746572707265742e204665656c206672656520746f207573652060988201527f7468697320506172616d6574657220696e20616e792077617920796f7520776160b88201527f6e742e222c2022696d616765223a2022646174613a696d6167652f7376672b7860d8820152691b5b0ed8985cd94d8d0b60b21b60f88201526101028451612b6b8183850160208901612d5b565b612b81828285010161227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612bc481601d850160208701612d5b565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c049083018461281e565b9695505050505050565b602081526000612613602083018461281e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612d0c57612d0c612df1565b500190565b600082612d2057612d20612e07565b500490565b6000816000190483118215151615612d3f57612d3f612df1565b500290565b600082821015612d5657612d56612df1565b500390565b60005b83811015612d76578181015183820152602001612d5e565b838111156111c55750506000910152565b600181811c90821680612d9b57607f821691505b60208210811415612dbc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612dd657612dd6612df1565b5060010190565b600082612dec57612dec612e07565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461150d57600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20236438646565393b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222333303338343122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212203ab6c145b7ecb1b7f0cf25eafc1bb8412a25d7ffb1180ca79a75d7171aee630064736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636343546611610104578063993e9ef4116100a2578063e985e9c511610071578063e985e9c5146103c7578063f2fde38b14610403578063f6f5afa014610416578063f87540fd1461042957600080fd5b8063993e9ef41461037b578063a22cb4651461038e578063b88d4fde146103a1578063c87b56dd146103b457600080fd5b8063715018a6116100de578063715018a61461034757806380057b9a1461034f5780638da5cb5b1461036257806395d89b411461037357600080fd5b8063634354661461030e5780636352211e1461032157806370a082311461033457600080fd5b806323b872dd1161017157806342842e0e1161014b57806342842e0e146102c2578063434f48c4146102d55780634f6ccce7146102e8578063573d5ef0146102fb57600080fd5b806323b872dd146102895780632f745c591461029c578063379607f5146102af57600080fd5b8063081812fc116101ad578063081812fc14610224578063095ea7b31461024f5780630ff88a8d1461026457806318160ddd1461027757600080fd5b806301ffc9a7146101d457806305f63c8a146101fc57806306fdde031461021c575b600080fd5b6101e76101e23660046127cb565b61043c565b60405190151581526020015b60405180910390f35b61020f61020a366004612805565b610467565b6040516101f39190612c0e565b61020f610567565b610237610232366004612805565b6105f9565b6040516001600160a01b0390911681526020016101f3565b61026261025d3660046127a1565b610693565b005b61020f610272366004612805565b6107a9565b6008545b6040519081526020016101f3565b61026261029736600461264d565b61089a565b61027b6102aa3660046127a1565b6108cb565b6102626102bd366004612805565b610961565b6102626102d036600461264d565b610a11565b6102626102e3366004612805565b610a2c565b61027b6102f6366004612805565b610b15565b61020f610309366004612805565b610ba8565b61020f61031c366004612805565b610cab565b61023761032f366004612805565b610d9c565b61027b6103423660046125f8565b610e13565b610262610e9a565b61020f61035d366004612805565b610ed0565b600b546001600160a01b0316610237565b61020f610fcd565b61020f610389366004612805565b610fdc565b61026261039c366004612765565b6110ce565b6102626103af366004612689565b611193565b61020f6103c2366004612805565b6111cb565b6101e76103d536600461261a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102626104113660046125f8565b611475565b61020f610424366004612805565b611510565b61020f610437366004612805565b61160b565b60006001600160e01b0319821663780e9d6360e01b148061046157506104618261170e565b92915050565b6060610461826040518060400160405280600881526020016727a822a920aa27a960c11b8152506010805480602002602001604051908101604052809291908181526020016000905b8282101561055c5783829060005260206000200180546104cf90612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546104fb90612d87565b80156105485780601f1061051d57610100808354040283529160200191610548565b820191906000526020600020905b81548152906001019060200180831161052b57829003601f168201915b5050505050815260200190600101906104b0565b50505050600161175e565b60606000805461057690612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546105a290612d87565b80156105ef5780601f106105c4576101008083540402835291602001916105ef565b820191906000526020600020905b8154815290600101906020018083116105d257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106775760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061069e82610d9c565b9050806001600160a01b0316836001600160a01b0316141561070c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161066e565b336001600160a01b0382161480610728575061072881336103d5565b61079a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161066e565b6107a48383611a84565b505050565b6060610461826040518060400160405280600481526020016321a420a960e11b815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561055c57838290600052602060002001805461080d90612d87565b80601f016020809104026020016040519081016040528092919081815260200182805461083990612d87565b80156108865780601f1061085b57610100808354040283529160200191610886565b820191906000526020600020905b81548152906001019060200180831161086957829003601f168201915b5050505050815260200190600101906107ee565b6108a43382611af2565b6108c05760405162461bcd60e51b815260040161066e90612ca8565b6107a4838383611be5565b60006108d683610e13565b82106109385760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161066e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a5414156109b45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066e565b6002600a55611ff48111156109fe5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161066e565b610a09335b82611d90565b506001600a55565b6107a483838360405180602001604052806000815250611193565b6002600a541415610a7f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066e565b6002600a55600b546001600160a01b03163314610aae5760405162461bcd60e51b815260040161066e90612c73565b611ff58110158015610ac1575061200081105b610b005760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161066e565b610a09610a03600b546001600160a01b031690565b6000610b2060085490565b8210610b835760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161066e565b60088281548110610b9657610b96612e33565b90600052602060002001549050919050565b6060610461826040518060400160405280600b81526020016a1113d5509311511251d25560aa1b815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610ca0578382906000526020600020018054610c1390612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f90612d87565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b505050505081526020019060010190610bf4565b50505050600261175e565b606061046182604051806040016040528060048152602001631093d3d360e21b815250600c805480602002602001604051908101604052809291908181526020016000905b8282101561055c578382906000526020600020018054610d0f90612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3b90612d87565b8015610d885780601f10610d5d57610100808354040283529160200191610d88565b820191906000526020600020905b815481529060010190602001808311610d6b57829003601f168201915b505050505081526020019060010190610cf0565b6000818152600260205260408120546001600160a01b0316806104615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161066e565b60006001600160a01b038216610e7e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161066e565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610ec45760405162461bcd60e51b815260040161066e90612c73565b610ece6000611dae565b565b6060610461826040518060400160405280600581526020016421a7a627a960d91b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610fc2578382906000526020600020018054610f3590612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6190612d87565b8015610fae5780601f10610f8357610100808354040283529160200191610fae565b820191906000526020600020905b815481529060010190602001808311610f9157829003601f168201915b505050505081526020019060010190610f16565b50505050600661175e565b60606001805461057690612d87565b60606104618260405180604001604052806005815260200164111251d25560da1b815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561055c57838290600052602060002001805461104190612d87565b80601f016020809104026020016040519081016040528092919081815260200182805461106d90612d87565b80156110ba5780601f1061108f576101008083540402835291602001916110ba565b820191906000526020600020905b81548152906001019060200180831161109d57829003601f168201915b505050505081526020019060010190611022565b6001600160a01b0382163314156111275760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161066e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61119d3383611af2565b6111b95760405162461bcd60e51b815260040161066e90612ca8565b6111c584848484611e00565b50505050565b60606111d561259b565b6040518061014001604052806101018152602001612faa610101913981526111fc83610cab565b81600160200201819052506040518060600160405280602881526020016130ab60289139604082015261122e83610fdc565b6060808301919091526040805191820190526028808252612e766020830139608082015261125b83610ba8565b60a082015260408051606081019091526028808252612ef0602083013960c08201526112868361160b565b60e082015260408051606081019091526029808252612f1860208301396101008201526112b2836107a9565b61012082015260408051606081019091526029808252612ec760208301396101408201526112df83610ed0565b61016082015260408051606081019091526029808252612f41602083013961018082015261130c83611510565b6101a082015260408051606081019091526029808252612e9e60208301396101c082015261133983610467565b6101e0820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6113a99a909101612895565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b01519799506113fc988a9890602001612895565b6040516020818303038152906040529050600061144961141b86611e33565b61142484611f31565b6040516020016114359291906129fc565b604051602081830303815290604052611f31565b90508060405160200161145c9190612b8c565b60408051601f1981840301815291905295945050505050565b600b546001600160a01b0316331461149f5760405162461bcd60e51b815260040161066e90612c73565b6001600160a01b0381166115045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161066e565b61150d81611dae565b50565b6060610461826040518060400160405280600e81526020016d29a2a1a7a72220a92ca1a7a627a960911b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610fc257838290600052602060002001805461157e90612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546115aa90612d87565b80156115f75780601f106115cc576101008083540402835291602001916115f7565b820191906000526020600020905b8154815290600101906020018083116115da57829003601f168201915b50505050508152602001906001019061155f565b6060610461826040518060400160405280600b81526020016a151492541311511251d25560aa1b815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561170357838290600052602060002001805461167690612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546116a290612d87565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b505050505081526020019060010190611657565b50505050600361175e565b60006001600160e01b031982166380ac58cd60e01b148061173f57506001600160e01b03198216635b5e139f60e01b145b8061046157506301ffc9a760e01b6001600160e01b0319831614610461565b60408051602081019091526000808252606091815b8481101561180d576117af87826117898b611e33565b60405160200161179b939291906129c5565b604051602081830303815290604052612097565b925081868751856117c09190612ddd565b815181106117d0576117d0612e33565b60200260200101516040516020016117e9929190612866565b6040516020818303038152906040529150808061180590612dc2565b915050611773565b50600061181b606484612ddd565b90506000816063141561185157604051631b9d5b1b60e21b60208201526024016040516020818303038152906040529250611a75565b6050821115611a7557611878886118678b611e33565b60405160200161179b929190612957565b90506118826125c3565b600d80546118909084612ddd565b815481106118a0576118a0612e33565b9060005260206000200180546118b590612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546118e190612d87565b801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b50505050508160016002811061194657611946612e33565b6020020152838160016020020151604051602001611965929190612994565b6040516020818303038152906040529350605f8310611a7357600e805461198c9084612ddd565b8154811061199c5761199c612e33565b9060005260206000200180546119b190612d87565b80601f01602080910402602001604051908101604052809291908181526020018280546119dd90612d87565b8015611a2a5780601f106119ff57610100808354040283529160200191611a2a565b820191906000526020600020905b815481529060010190602001808311611a0d57829003601f168201915b505050505081600060028110611a4257611a42612e33565b6020020152838160006020020151604051602001611a61929190612994565b60405160208183030381529060405293505b505b5090925050505b949350505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ab982610d9c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b6b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161066e565b6000611b7683610d9c565b9050806001600160a01b0316846001600160a01b03161480611bb15750836001600160a01b0316611ba6846105f9565b6001600160a01b0316145b80611a7c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611a7c565b826001600160a01b0316611bf882610d9c565b6001600160a01b031614611c605760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161066e565b6001600160a01b038216611cc25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161066e565b611ccd8383836120c8565b611cd8600082611a84565b6001600160a01b0383166000908152600360205260408120805460019290611d01908490612d44565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d2f908490612cf9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611daa828260405180602001604052806000815250612180565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e0b848484611be5565b611e17848484846121b3565b6111c55760405162461bcd60e51b815260040161066e90612c21565b606081611e575750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e815780611e6b81612dc2565b9150611e7a9050600a83612d11565b9150611e5b565b60008167ffffffffffffffff811115611e9c57611e9c612e49565b6040519080825280601f01601f191660200182016040528015611ec6576020820181803683370190505b5090505b8415611a7c57611edb600183612d44565b9150611ee8600a86612ddd565b611ef3906030612cf9565b60f81b818381518110611f0857611f08612e33565b60200101906001600160f81b031916908160001a905350611f2a600a86612d11565b9450611eca565b805160609080611f51575050604080516020810190915260008152919050565b60006003611f60836002612cf9565b611f6a9190612d11565b611f75906004612d25565b90506000611f84826020612cf9565b67ffffffffffffffff811115611f9c57611f9c612e49565b6040519080825280601f01601f191660200182016040528015611fc6576020820181803683370190505b5090506000604051806060016040528060408152602001612f6a604091399050600181016020830160005b86811015612052576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611ff1565b50600386066001811461206c576002811461207d57612089565b613d3d60f01b600119830152612089565b603d60f81b6000198301525b505050918152949350505050565b6000816040516020016120aa919061284a565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b0383166121235761211e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612146565b816001600160a01b0316836001600160a01b0316146121465761214683826122bd565b6001600160a01b03821661215d576107a48161235a565b826001600160a01b0316826001600160a01b0316146107a4576107a48282612409565b61218a838361244d565b61219760008484846121b3565b6107a45760405162461bcd60e51b815260040161066e90612c21565b60006001600160a01b0384163b156122b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121f7903390899088908890600401612bd1565b602060405180830381600087803b15801561221157600080fd5b505af1925050508015612241575060408051601f3d908101601f1916820190925261223e918101906127e8565b60015b61229b573d80801561226f576040519150601f19603f3d011682016040523d82523d6000602084013e612274565b606091505b5080516122935760405162461bcd60e51b815260040161066e90612c21565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a7c565b506001611a7c565b600060016122ca84610e13565b6122d49190612d44565b600083815260076020526040902054909150808214612327576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061236c90600190612d44565b6000838152600960205260408120546008805493945090928490811061239457612394612e33565b9060005260206000200154905080600883815481106123b5576123b5612e33565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123ed576123ed612e1d565b6001900381819060005260206000200160009055905550505050565b600061241483610e13565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161066e565b6000818152600260205260409020546001600160a01b0316156125085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161066e565b612514600083836120c8565b6001600160a01b038216600090815260036020526040812080546001929061253d908490612cf9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061022001604052806011905b60608152602001906001900390816125ab5790505090565b60408051808201909152606081526001602082016125ab565b80356001600160a01b03811681146125f357600080fd5b919050565b60006020828403121561260a57600080fd5b612613826125dc565b9392505050565b6000806040838503121561262d57600080fd5b612636836125dc565b9150612644602084016125dc565b90509250929050565b60008060006060848603121561266257600080fd5b61266b846125dc565b9250612679602085016125dc565b9150604084013590509250925092565b6000806000806080858703121561269f57600080fd5b6126a8856125dc565b93506126b6602086016125dc565b925060408501359150606085013567ffffffffffffffff808211156126da57600080fd5b818701915087601f8301126126ee57600080fd5b81358181111561270057612700612e49565b604051601f8201601f19908116603f0116810190838211818310171561272857612728612e49565b816040528281528a602084870101111561274157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561277857600080fd5b612781836125dc565b91506020830135801515811461279657600080fd5b809150509250929050565b600080604083850312156127b457600080fd5b6127bd836125dc565b946020939093013593505050565b6000602082840312156127dd57600080fd5b813561261381612e5f565b6000602082840312156127fa57600080fd5b815161261381612e5f565b60006020828403121561281757600080fd5b5035919050565b60008151808452612836816020860160208601612d5b565b601f01601f19169290920160200192915050565b6000825161285c818460208701612d5b565b9190910192915050565b60008351612878818460208801612d5b565b83519083019061288c818360208801612d5b565b01949350505050565b60008a516128a7818460208f01612d5b565b8a51908301906128bb818360208f01612d5b565b8a516128cd8183850160208f01612d5b565b8a519290910101906128e3818360208d01612d5b565b88516128f58183850160208d01612d5b565b885192909101019061290b818360208b01612d5b565b865161291d8183850160208b01612d5b565b8651929091010190612933818360208901612d5b565b84516129458183850160208901612d5b565b9101019b9a5050505050505050505050565b60008351612969818460208801612d5b565b61313960f01b9083019081528351612988816002840160208801612d5b565b01600201949350505050565b600083516129a6818460208801612d5b565b61016160f51b9083019081528351612988816002840160208801612d5b565b600084516129d7818460208901612d5b565b820184815283516129ef816020808501908801612d5b565b0160200195945050505050565b7f7b226e616d65223a2022506172616d6574657220536574200000000000000000815260008351612a34816018850160208801612d5b565b80830190507f222c20226465736372697074696f6e223a2022506172616d657465722069732060188201527f72616e646f6d697a656420696e7075742067656e65726174656420616e64207360388201527f746f726564206f6e20636861696e2e20446566696e6974696f6e73206172652060588201527f696e74656e74696f6e616c6c79206f6d697474656420666f72206f746865727360788201527f20746f20696e746572707265742e204665656c206672656520746f207573652060988201527f7468697320506172616d6574657220696e20616e792077617920796f7520776160b88201527f6e742e222c2022696d616765223a2022646174613a696d6167652f7376672b7860d8820152691b5b0ed8985cd94d8d0b60b21b60f88201526101028451612b6b8183850160208901612d5b565b612b81828285010161227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612bc481601d850160208701612d5b565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c049083018461281e565b9695505050505050565b602081526000612613602083018461281e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612d0c57612d0c612df1565b500190565b600082612d2057612d20612e07565b500490565b6000816000190483118215151615612d3f57612d3f612df1565b500290565b600082821015612d5657612d56612df1565b500390565b60005b83811015612d76578181015183820152602001612d5e565b838111156111c55750506000910152565b600181811c90821680612d9b57607f821691505b60208210811415612dbc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612dd657612dd6612df1565b5060010190565b600082612dec57612dec612e07565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461150d57600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20236438646565393b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222333303338343122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212203ab6c145b7ecb1b7f0cf25eafc1bb8412a25d7ffb1180ca79a75d7171aee630064736f6c63430008070033
Deployed Bytecode Sourcemap
46446:6381:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40296:224;;;;;;:::i;:::-;;:::i;:::-;;;11226:14:1;;11219:22;11201:41;;11189:2;11174:18;40296:224:0;;;;;;;;48285:143;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27410:100::-;;;:::i;28969:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10524:32:1;;;10506:51;;10494:2;10479:18;28969:221:0;10360:203:1;28492:411:0;;;;;;:::i;:::-;;:::i;:::-;;47832:131;;;;;;:::i;:::-;;:::i;40936:113::-;41024:10;:17;40936:113;;;19119:25:1;;;19107:2;19092:18;40936:113:0;18973:177:1;29859:339:0;;;;;;:::i;:::-;;:::i;40604:256::-;;;;;;:::i;:::-;;:::i;51658:174::-;;;;;;:::i;:::-;;:::i;30269:185::-;;;;;;:::i;:::-;;:::i;51844:186::-;;;;;;:::i;:::-;;:::i;41126:233::-;;;;;;:::i;:::-;;:::i;47520:146::-;;;;;;:::i;:::-;;:::i;47231:131::-;;;;;;:::i;:::-;;:::i;27104:239::-;;;;;;:::i;:::-;;:::i;26834:208::-;;;;;;:::i;:::-;;:::i;11802:94::-;;;:::i;47975:134::-;;;;;;:::i;:::-;;:::i;11151:87::-;11224:6;;-1:-1:-1;;;;;11224:6:0;11151:87;;27579:104;;;:::i;47374:134::-;;;;;;:::i;:::-;;:::i;29262:295::-;;;;;;:::i;:::-;;:::i;30525:328::-;;;;;;:::i;:::-;;:::i;49578:2072::-;;;;;;:::i;:::-;;:::i;29628:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;29749:25:0;;;29725:4;29749:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29628:164;12051:192;;;;;;:::i;:::-;;:::i;48121:152::-;;;;;;:::i;:::-;;:::i;47678:146::-;;;;;;:::i;:::-;;:::i;40296:224::-;40398:4;-1:-1:-1;;;;;;40422:50:0;;-1:-1:-1;;;40422:50:0;;:90;;;40476:36;40500:11;40476:23;:36::i;:::-;40415:97;40296:224;-1:-1:-1;;40296:224:0:o;48285:143::-;48344:13;48377:43;48383:7;48377:43;;;;;;;;;;;;;-1:-1:-1;;;48377:43:0;;;48404:13;48377:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48418:1;48377:5;:43::i;27410:100::-;27464:13;27497:5;27490:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27410:100;:::o;28969:221::-;29045:7;32452:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32452:16:0;29065:73;;;;-1:-1:-1;;;29065:73:0;;16053:2:1;29065:73:0;;;16035:21:1;16092:2;16072:18;;;16065:30;16131:34;16111:18;;;16104:62;-1:-1:-1;;;16182:18:1;;;16175:42;16234:19;;29065:73:0;;;;;;;;;-1:-1:-1;29158:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29158:24:0;;28969:221::o;28492:411::-;28573:13;28589:23;28604:7;28589:14;:23::i;:::-;28573:39;;28637:5;-1:-1:-1;;;;;28631:11:0;:2;-1:-1:-1;;;;;28631:11:0;;;28623:57;;;;-1:-1:-1;;;28623:57:0;;17582:2:1;28623:57:0;;;17564:21:1;17621:2;17601:18;;;17594:30;17660:34;17640:18;;;17633:62;-1:-1:-1;;;17711:18:1;;;17704:31;17752:19;;28623:57:0;17380:397:1;28623:57:0;10091:10;-1:-1:-1;;;;;28715:21:0;;;;:62;;-1:-1:-1;28740:37:0;28757:5;10091:10;29628:164;:::i;28740:37::-;28693:168;;;;-1:-1:-1;;;28693:168:0;;14446:2:1;28693:168:0;;;14428:21:1;14485:2;14465:18;;;14458:30;14524:34;14504:18;;;14497:62;14595:26;14575:18;;;14568:54;14639:19;;28693:168:0;14244:420:1;28693:168:0;28874:21;28883:2;28887:7;28874:8;:21::i;:::-;28562:341;28492:411;;:::o;47832:131::-;47887:13;47920:35;47926:7;47920:35;;;;;;;;;;;;;-1:-1:-1;;;47920:35:0;;;47943:9;47920:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29859:339;30054:41;10091:10;30087:7;30054:18;:41::i;:::-;30046:103;;;;-1:-1:-1;;;30046:103:0;;;;;;;:::i;:::-;30162:28;30172:4;30178:2;30182:7;30162:9;:28::i;40604:256::-;40701:7;40737:23;40754:5;40737:16;:23::i;:::-;40729:5;:31;40721:87;;;;-1:-1:-1;;;40721:87:0;;11679:2:1;40721:87:0;;;11661:21:1;11718:2;11698:18;;;11691:30;11757:34;11737:18;;;11730:62;-1:-1:-1;;;11808:18:1;;;11801:41;11859:19;;40721:87:0;11477:407:1;40721:87:0;-1:-1:-1;;;;;;40826:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40604:256::o;51658:174::-;14090:1;14686:7;;:19;;14678:63;;;;-1:-1:-1;;;14678:63:0;;18815:2:1;14678:63:0;;;18797:21:1;18854:2;18834:18;;;18827:30;18893:33;18873:18;;;18866:61;18944:18;;14678:63:0;18613:355:1;14678:63:0;14090:1;14819:7;:18;51756:4:::1;51745:7;:15;;51721:60;;;::::0;-1:-1:-1;;;51721:60:0;;16827:2:1;51721:60:0::1;::::0;::::1;16809:21:1::0;16866:2;16846:18;;;16839:30;-1:-1:-1;;;16885:18:1;;;16878:46;16941:18;;51721:60:0::1;16625:340:1::0;51721:60:0::1;51792:32;10091:10:::0;51802:12:::1;51816:7;51792:9;:32::i;:::-;-1:-1:-1::0;14046:1:0;14998:7;:22;51658:174::o;30269:185::-;30407:39;30424:4;30430:2;30434:7;30407:39;;;;;;;;;;;;:16;:39::i;51844:186::-;14090:1;14686:7;;:19;;14678:63;;;;-1:-1:-1;;;14678:63:0;;18815:2:1;14678:63:0;;;18797:21:1;18854:2;18834:18;;;18827:30;18893:33;18873:18;;;18866:61;18944:18;;14678:63:0;18613:355:1;14678:63:0;14090:1;14819:7;:18;11224:6;;-1:-1:-1;;;;;11224:6:0;10091:10;11371:23:::1;11363:68;;;;-1:-1:-1::0;;;11363:68:0::1;;;;;;;:::i;:::-;51941:4:::2;51930:7;:15;;:33;;;;;51959:4;51949:7;:14;51930:33;51922:62;;;::::0;-1:-1:-1;;;51922:62:0;;16827:2:1;51922:62:0::2;::::0;::::2;16809:21:1::0;16866:2;16846:18;;;16839:30;-1:-1:-1;;;16885:18:1;;;16878:46;16941:18;;51922:62:0::2;16625:340:1::0;51922:62:0::2;51995:27;52005:7;11224:6:::0;;-1:-1:-1;;;;;11224:6:0;;11151:87;41126:233;41201:7;41237:30;41024:10;:17;;40936:113;41237:30;41229:5;:38;41221:95;;;;-1:-1:-1;;;41221:95:0;;18402:2:1;41221:95:0;;;18384:21:1;18441:2;18421:18;;;18414:30;18480:34;18460:18;;;18453:62;-1:-1:-1;;;18531:18:1;;;18524:42;18583:19;;41221:95:0;18200:408:1;41221:95:0;41334:10;41345:5;41334:17;;;;;;;;:::i;:::-;;;;;;;;;41327:24;;41126:233;;;:::o;47520:146::-;47582:13;47615:43;47621:7;47615:43;;;;;;;;;;;;;-1:-1:-1;;;47615:43:0;;;47645:10;47615:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47656:1;47615:5;:43::i;47231:131::-;47286:13;47319:35;47325:7;47319:35;;;;;;;;;;;;;-1:-1:-1;;;47319:35:0;;;47342:9;47319:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27104:239;27176:7;27212:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27212:16:0;27247:19;27239:73;;;;-1:-1:-1;;;27239:73:0;;15282:2:1;27239:73:0;;;15264:21:1;15321:2;15301:18;;;15294:30;15360:34;15340:18;;;15333:62;-1:-1:-1;;;15411:18:1;;;15404:39;15460:19;;27239:73:0;15080:405:1;26834:208:0;26906:7;-1:-1:-1;;;;;26934:19:0;;26926:74;;;;-1:-1:-1;;;26926:74:0;;14871:2:1;26926:74:0;;;14853:21:1;14910:2;14890:18;;;14883:30;14949:34;14929:18;;;14922:62;-1:-1:-1;;;15000:18:1;;;14993:40;15050:19;;26926:74:0;14669:406:1;26926:74:0;-1:-1:-1;;;;;;27018:16:0;;;;;:9;:16;;;;;;;26834:208::o;11802:94::-;11224:6;;-1:-1:-1;;;;;11224:6:0;10091:10;11371:23;11363:68;;;;-1:-1:-1;;;11363:68:0;;;;;;;:::i;:::-;11867:21:::1;11885:1;11867:9;:21::i;:::-;11802:94::o:0;47975:134::-;48031:13;48064:37;48070:7;48064:37;;;;;;;;;;;;;-1:-1:-1;;;48064:37:0;;;48088:10;48064:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48099:1;48064:5;:37::i;27579:104::-;27635:13;27668:7;27661:14;;;;;:::i;47374:134::-;47430:13;47463:37;47469:7;47463:37;;;;;;;;;;;;;-1:-1:-1;;;47463:37:0;;;47487:10;47463:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29262:295;-1:-1:-1;;;;;29365:24:0;;10091:10;29365:24;;29357:62;;;;-1:-1:-1;;;29357:62:0;;13679:2:1;29357:62:0;;;13661:21:1;13718:2;13698:18;;;13691:30;13757:27;13737:18;;;13730:55;13802:18;;29357:62:0;13477:349:1;29357:62:0;10091:10;29432:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29432:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29432:53:0;;;;;;;;;;29501:48;;11201:41:1;;;29432:42:0;;10091:10;29501:48;;11174:18:1;29501:48:0;;;;;;;29262:295;;:::o;30525:328::-;30700:41;10091:10;30733:7;30700:18;:41::i;:::-;30692:103;;;;-1:-1:-1;;;30692:103:0;;;;;;;:::i;:::-;30806:39;30820:4;30826:2;30830:7;30839:5;30806:13;:39::i;:::-;30525:328;;;;:::o;49578:2072::-;49643:13;49669:23;;:::i;:::-;49703:270;;;;;;;;;;;;;;;;;;;49997:16;50005:7;49997;:16::i;:::-;49986:5;49992:1;49986:8;;;:27;;;;50026:53;;;;;;;;;;;;;;;;;:8;;;:53;50103:17;50112:7;50103:8;:17::i;:::-;50092:8;;;;:28;;;;50133:53;;;;;;;;;;;;;50092:8;50133:53;;;:8;;;:53;50210:23;50225:7;50210:14;:23::i;:::-;50199:8;;;:34;50246:53;;;;;;;;;;;;;;50199:8;50246:53;;;:8;;;:53;50323:23;50338:7;50323:14;:23::i;:::-;50312:8;;;:34;50359:54;;;;;;;;;;;;;;50312:8;50359:54;;;:8;;;:54;50437:16;50445:7;50437;:16::i;:::-;50426:8;;;:27;50466:55;;;;;;;;;;;;;;50426:8;50466:55;;;:9;;;:55;50546:17;50555:7;50546:8;:17::i;:::-;50534:9;;;:29;50576:55;;;;;;;;;;;;;;50534:9;50576:55;;;:9;;;:55;50656:26;50674:7;50656:17;:26::i;:::-;50644:9;;;:38;50695:55;;;;;;;;;;;;;;50644:9;50695:55;;;:9;;;:55;50775:20;50787:7;50775:11;:20::i;:::-;50763:9;;;:32;50808:27;;;;;;;;;;;-1:-1:-1;;;50763:9:0;50808:27;;;;;;;:9;;;:27;;;;50895:8;;50905;;;;50915;;;;50925;;;;50935;;;;50945;;;;50955;;;;50965;;;;50975;;;;50878:106;;-1:-1:-1;;50878:106:0;;50975:8;;50878:106;;:::i;:::-;;;;;;;-1:-1:-1;;50878:106:0;;;;;;;51037:8;;;;51047:9;;;;51058;;;;51069;;;;51080;;;;51091;;;;51102;;;;51113;;;;50878:106;;-1:-1:-1;51012:111:0;;50878:106;;51113:9;51037:8;51012:111;;:::i;:::-;;;;;;;;;;;;;50996:128;;51145:18;51166:367;51238:17;51247:7;51238:8;:17::i;:::-;51495:28;51515:6;51495:13;:28::i;:::-;51193:337;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51166:13;:367::i;:::-;51145:388;;51610:4;51560:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51560:55:0;;;;;;;;;;49578:2072;-1:-1:-1;;;;;49578:2072:0:o;12051:192::-;11224:6;;-1:-1:-1;;;;;11224:6:0;10091:10;11371:23;11363:68;;;;-1:-1:-1;;;11363:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12140:22:0;::::1;12132:73;;;::::0;-1:-1:-1;;;12132:73:0;;12510:2:1;12132:73:0::1;::::0;::::1;12492:21:1::0;12549:2;12529:18;;;12522:30;12588:34;12568:18;;;12561:62;-1:-1:-1;;;12639:18:1;;;12632:36;12685:19;;12132:73:0::1;12308:402:1::0;12132:73:0::1;12216:19;12226:8;12216:9;:19::i;:::-;12051:192:::0;:::o;48121:152::-;48186:13;48219:46;48225:7;48219:46;;;;;;;;;;;;;-1:-1:-1;;;48219:46:0;;;48252:10;48219:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47678:146;47740:13;47773:43;47779:7;47773:43;;;;;;;;;;;;;-1:-1:-1;;;47773:43:0;;;47803:10;47773:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47814:1;47773:5;:43::i;26465:305::-;26567:4;-1:-1:-1;;;;;;26604:40:0;;-1:-1:-1;;;26604:40:0;;:105;;-1:-1:-1;;;;;;;26661:48:0;;-1:-1:-1;;;26661:48:0;26604:105;:158;;;-1:-1:-1;;;;;;;;;;25181:40:0;;;26726:36;25072:157;48440:1130;48617:25;;;;;;;;;48590:12;48617:25;;;48564:13;;48590:12;48653:229;48677:5;48673:1;:9;48653:229;;;48711:64;48742:9;48752:1;48755:17;48764:7;48755:8;:17::i;:::-;48725:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48711:6;:64::i;:::-;48704:71;;48823:6;48830:11;48849;:18;48842:4;:25;;;;:::i;:::-;48830:38;;;;;;;;:::i;:::-;;;;;;;48806:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48790:80;;48684:3;;;;;:::i;:::-;;;;48653:229;;;-1:-1:-1;48894:14:0;48911:10;48918:3;48911:4;:10;:::i;:::-;48894:27;;48932:14;48965:6;48975:2;48965:12;48961:578;;;49009:24;;-1:-1:-1;;;49009:24:0;;;10303:19:1;10338:11;;49009:24:0;;;;;;;;;;;;48993:41;;48961:578;;;49074:2;49065:6;:11;49061:478;;;49102:67;49133:9;49149:17;49158:7;49149:8;:17::i;:::-;49116:51;;;;;;;;;:::i;49102:67::-;49093:76;;49184:21;;:::i;:::-;49230:10;49250:17;;49241:26;;:6;:26;:::i;:::-;49230:38;;;;;;;;:::i;:::-;;;;;;;;49220:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;49225:1;49220:7;;;;;;;:::i;:::-;;;;:48;49316:6;49330:4;49335:1;49330:7;;;;49299:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49283:56;;49368:2;49358:6;:12;49354:174;;49401:9;49420:16;;49411:25;;:6;:25;:::i;:::-;49401:36;;;;;;;;:::i;:::-;;;;;;;;49391:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;49396:1;49391:7;;;;;;;:::i;:::-;;;;:46;49489:6;49503:4;49508:1;49503:7;;;;49472:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49456:56;;49354:174;49078:461;49061:478;-1:-1:-1;49556:6:0;;-1:-1:-1;;;48440:1130:0;;;;;;;:::o;36345:174::-;36420:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36420:29:0;-1:-1:-1;;;;;36420:29:0;;;;;;;;:24;;36474:23;36420:24;36474:14;:23::i;:::-;-1:-1:-1;;;;;36465:46:0;;;;;;;;;;;36345:174;;:::o;32657:348::-;32750:4;32452:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32452:16:0;32767:73;;;;-1:-1:-1;;;32767:73:0;;14033:2:1;32767:73:0;;;14015:21:1;14072:2;14052:18;;;14045:30;14111:34;14091:18;;;14084:62;-1:-1:-1;;;14162:18:1;;;14155:42;14214:19;;32767:73:0;13831:408:1;32767:73:0;32851:13;32867:23;32882:7;32867:14;:23::i;:::-;32851:39;;32920:5;-1:-1:-1;;;;;32909:16:0;:7;-1:-1:-1;;;;;32909:16:0;;:51;;;;32953:7;-1:-1:-1;;;;;32929:31:0;:20;32941:7;32929:11;:20::i;:::-;-1:-1:-1;;;;;32929:31:0;;32909:51;:87;;;-1:-1:-1;;;;;;29749:25:0;;;29725:4;29749:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32964:32;29628:164;35649:578;35808:4;-1:-1:-1;;;;;35781:31:0;:23;35796:7;35781:14;:23::i;:::-;-1:-1:-1;;;;;35781:31:0;;35773:85;;;;-1:-1:-1;;;35773:85:0;;17172:2:1;35773:85:0;;;17154:21:1;17211:2;17191:18;;;17184:30;17250:34;17230:18;;;17223:62;-1:-1:-1;;;17301:18:1;;;17294:39;17350:19;;35773:85:0;16970:405:1;35773:85:0;-1:-1:-1;;;;;35877:16:0;;35869:65;;;;-1:-1:-1;;;35869:65:0;;13274:2:1;35869:65:0;;;13256:21:1;13313:2;13293:18;;;13286:30;13352:34;13332:18;;;13325:62;-1:-1:-1;;;13403:18:1;;;13396:34;13447:19;;35869:65:0;13072:400:1;35869:65:0;35947:39;35968:4;35974:2;35978:7;35947:20;:39::i;:::-;36051:29;36068:1;36072:7;36051:8;:29::i;:::-;-1:-1:-1;;;;;36093:15:0;;;;;;:9;:15;;;;;:20;;36112:1;;36093:15;:20;;36112:1;;36093:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36124:13:0;;;;;;:9;:13;;;;;:18;;36141:1;;36124:13;:18;;36141:1;;36124:18;:::i;:::-;;;;-1:-1:-1;;36153:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36153:21:0;-1:-1:-1;;;;;36153:21:0;;;;;;;;;36192:27;;36153:16;;36192:27;;;;;;;35649:578;;;:::o;33347:110::-;33423:26;33433:2;33437:7;33423:26;;;;;;;;;;;;:9;:26::i;:::-;33347:110;;:::o;12251:173::-;12326:6;;;-1:-1:-1;;;;;12343:17:0;;;-1:-1:-1;;;;;;12343:17:0;;;;;;;12376:40;;12326:6;;;12343:17;12326:6;;12376:40;;12307:16;;12376:40;12296:128;12251:173;:::o;31735:315::-;31892:28;31902:4;31908:2;31912:7;31892:9;:28::i;:::-;31939:48;31962:4;31968:2;31972:7;31981:5;31939:22;:48::i;:::-;31931:111;;;;-1:-1:-1;;;31931:111:0;;;;;;;:::i;52042:715::-;52098:13;52311:10;52307:53;;-1:-1:-1;;52338:10:0;;;;;;;;;;;;-1:-1:-1;;;52338:10:0;;;;;52042:715::o;52307:53::-;52385:5;52370:12;52426:78;52433:9;;52426:78;;52459:8;;;;:::i;:::-;;-1:-1:-1;52482:10:0;;-1:-1:-1;52490:2:0;52482:10;;:::i;:::-;;;52426:78;;;52514:19;52546:6;52536:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52536:17:0;;52514:39;;52564:154;52571:10;;52564:154;;52598:11;52608:1;52598:11;;:::i;:::-;;-1:-1:-1;52667:10:0;52675:2;52667:5;:10;:::i;:::-;52654:24;;:2;:24;:::i;:::-;52641:39;;52624:6;52631;52624:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;52624:56:0;;;;;;;;-1:-1:-1;52695:11:0;52704:2;52695:11;;:::i;:::-;;;52564:154;;53178:1607;53276:11;;53236:13;;53302:8;53298:23;;-1:-1:-1;;53312:9:0;;;;;;;;;-1:-1:-1;53312:9:0;;;53178:1607;-1:-1:-1;53178:1607:0:o;53298:23::-;53373:18;53411:1;53400:7;:3;53406:1;53400:7;:::i;:::-;53399:13;;;;:::i;:::-;53394:19;;:1;:19;:::i;:::-;53373:40;-1:-1:-1;53471:19:0;53503:15;53373:40;53516:2;53503:15;:::i;:::-;53493:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53493:26:0;;53471:48;;53532:18;53553:5;;;;;;;;;;;;;;;;;53532:26;;53622:1;53615:5;53611:13;53667:2;53659:6;53655:15;53718:1;53686:777;53741:3;53738:1;53735:10;53686:777;;;53796:1;53839:12;;;;;53833:19;53934:4;53922:2;53918:14;;;;;53900:40;;53894:47;54043:2;54039:14;;;54035:25;;54021:40;;54015:47;54172:1;54168:13;;;54164:24;;54150:39;;54144:46;54292:16;;;;54278:31;;54272:38;53970:1;53966:11;;;54064:4;54011:58;;;54002:68;54095:11;;54140:57;;;54131:67;;;;54223:11;;54268:49;;54259:59;54347:3;54343:13;54376:22;;54446:1;54431:17;;;;53789:9;53686:777;;;53690:44;54495:1;54490:3;54486:11;54516:1;54511:84;;;;54614:1;54609:82;;;;54479:212;;54511:84;-1:-1:-1;;;;;54544:17:0;;54537:43;54511:84;;54609:82;-1:-1:-1;;;;;54642:17:0;;54635:41;54479:212;-1:-1:-1;;;54707:26:0;;;54714:6;53178:1607;-1:-1:-1;;;;53178:1607:0:o;47081:138::-;47141:7;47203:5;47186:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47186:23:0;;;;;;;;;47176:34;;47186:23;47176:34;;;;;47081:138;-1:-1:-1;;47081:138:0:o;41972:589::-;-1:-1:-1;;;;;42178:18:0;;42174:187;;42213:40;42245:7;43388:10;:17;;43361:24;;;;:15;:24;;;;;:44;;;43416:24;;;;;;;;;;;;43284:164;42213:40;42174:187;;;42283:2;-1:-1:-1;;;;;42275:10:0;:4;-1:-1:-1;;;;;42275:10:0;;42271:90;;42302:47;42335:4;42341:7;42302:32;:47::i;:::-;-1:-1:-1;;;;;42375:16:0;;42371:183;;42408:45;42445:7;42408:36;:45::i;42371:183::-;42481:4;-1:-1:-1;;;;;42475:10:0;:2;-1:-1:-1;;;;;42475:10:0;;42471:83;;42502:40;42530:2;42534:7;42502:27;:40::i;33684:321::-;33814:18;33820:2;33824:7;33814:5;:18::i;:::-;33865:54;33896:1;33900:2;33904:7;33913:5;33865:22;:54::i;:::-;33843:154;;;;-1:-1:-1;;;33843:154:0;;;;;;;:::i;37084:803::-;37239:4;-1:-1:-1;;;;;37260:13:0;;17567:20;17615:8;37256:624;;37296:72;;-1:-1:-1;;;37296:72:0;;-1:-1:-1;;;;;37296:36:0;;;;;:72;;10091:10;;37347:4;;37353:7;;37362:5;;37296:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37296:72:0;;;;;;;;-1:-1:-1;;37296:72:0;;;;;;;;;;;;:::i;:::-;;;37292:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37542:13:0;;37538:272;;37585:60;;-1:-1:-1;;;37585:60:0;;;;;;;:::i;37538:272::-;37760:6;37754:13;37745:6;37741:2;37737:15;37730:38;37292:533;-1:-1:-1;;;;;;37419:55:0;-1:-1:-1;;;37419:55:0;;-1:-1:-1;37412:62:0;;37256:624;-1:-1:-1;37864:4:0;37857:11;;44075:988;44341:22;44391:1;44366:22;44383:4;44366:16;:22::i;:::-;:26;;;;:::i;:::-;44403:18;44424:26;;;:17;:26;;;;;;44341:51;;-1:-1:-1;44557:28:0;;;44553:328;;-1:-1:-1;;;;;44624:18:0;;44602:19;44624:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44675:30;;;;;;:44;;;44792:30;;:17;:30;;;;;:43;;;44553:328;-1:-1:-1;44977:26:0;;;;:17;:26;;;;;;;;44970:33;;;-1:-1:-1;;;;;45021:18:0;;;;;:12;:18;;;;;:34;;;;;;;45014:41;44075:988::o;45358:1079::-;45636:10;:17;45611:22;;45636:21;;45656:1;;45636:21;:::i;:::-;45668:18;45689:24;;;:15;:24;;;;;;46062:10;:26;;45611:46;;-1:-1:-1;45689:24:0;;45611:46;;46062:26;;;;;;:::i;:::-;;;;;;;;;46040:48;;46126:11;46101:10;46112;46101:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46206:28;;;:15;:28;;;;;;;:41;;;46378:24;;;;;46371:31;46413:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45429:1008;;;45358:1079;:::o;42862:221::-;42947:14;42964:20;42981:2;42964:16;:20::i;:::-;-1:-1:-1;;;;;42995:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43040:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42862:221:0:o;34341:382::-;-1:-1:-1;;;;;34421:16:0;;34413:61;;;;-1:-1:-1;;;34413:61:0;;15692:2:1;34413:61:0;;;15674:21:1;;;15711:18;;;15704:30;15770:34;15750:18;;;15743:62;15822:18;;34413:61:0;15490:356:1;34413:61:0;32428:4;32452:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32452:16:0;:30;34485:58;;;;-1:-1:-1;;;34485:58:0;;12917:2:1;34485:58:0;;;12899:21:1;12956:2;12936:18;;;12929:30;12995;12975:18;;;12968:58;13043:18;;34485:58:0;12715:352:1;34485:58:0;34556:45;34585:1;34589:2;34593:7;34556:20;:45::i;:::-;-1:-1:-1;;;;;34614:13:0;;;;;;:9;:13;;;;;:18;;34631:1;;34614:13;:18;;34631:1;;34614:18;:::i;:::-;;;;-1:-1:-1;;34643:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34643:21:0;-1:-1:-1;;;;;34643:21:0;;;;;;;;34682:33;;34643:16;;;34682:33;;34643:16;;34682:33;34341:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:257::-;3465:3;3503:5;3497:12;3530:6;3525:3;3518:19;3546:63;3602:6;3595:4;3590:3;3586:14;3579:4;3572:5;3568:16;3546:63;:::i;:::-;3663:2;3642:15;-1:-1:-1;;3638:29:1;3629:39;;;;3670:4;3625:50;;3424:257;-1:-1:-1;;3424:257:1:o;3816:276::-;3947:3;3985:6;3979:13;4001:53;4047:6;4042:3;4035:4;4027:6;4023:17;4001:53;:::i;:::-;4070:16;;;;;3816:276;-1:-1:-1;;3816:276:1:o;4097:470::-;4276:3;4314:6;4308:13;4330:53;4376:6;4371:3;4364:4;4356:6;4352:17;4330:53;:::i;:::-;4446:13;;4405:16;;;;4468:57;4446:13;4405:16;4502:4;4490:17;;4468:57;:::i;:::-;4541:20;;4097:470;-1:-1:-1;;;;4097:470:1:o;4572:1780::-;5087:3;5125:6;5119:13;5141:53;5187:6;5182:3;5175:4;5167:6;5163:17;5141:53;:::i;:::-;5257:13;;5216:16;;;;5279:57;5257:13;5216:16;5313:4;5301:17;;5279:57;:::i;:::-;5367:6;5361:13;5383:72;5446:8;5435;5428:5;5424:20;5417:4;5409:6;5405:17;5383:72;:::i;:::-;5537:13;;5481:20;;;;5477:35;;5559:57;5537:13;5477:35;5593:4;5581:17;;5559:57;:::i;:::-;5647:6;5641:13;5663:72;5726:8;5715;5708:5;5704:20;5697:4;5689:6;5685:17;5663:72;:::i;:::-;5817:13;;5761:20;;;;5757:35;;5839:57;5817:13;5757:35;5873:4;5861:17;;5839:57;:::i;:::-;5927:6;5921:13;5943:72;6006:8;5995;5988:5;5984:20;5977:4;5969:6;5965:17;5943:72;:::i;:::-;6097:13;;6041:20;;;;6037:35;;6119:57;6097:13;6037:35;6153:4;6141:17;;6119:57;:::i;:::-;6207:6;6201:13;6223:72;6286:8;6275;6268:5;6264:20;6257:4;6249:6;6245:17;6223:72;:::i;:::-;6315:20;;6311:35;;4572:1780;-1:-1:-1;;;;;;;;;;;4572:1780:1:o;6357:615::-;6637:3;6675:6;6669:13;6691:53;6737:6;6732:3;6725:4;6717:6;6713:17;6691:53;:::i;:::-;-1:-1:-1;;;6766:16:1;;;6791:19;;;6835:13;;6857:65;6835:13;6909:1;6898:13;;6891:4;6879:17;;6857:65;:::i;:::-;6942:20;6964:1;6938:28;;6357:615;-1:-1:-1;;;;6357:615:1:o;6977:::-;7257:3;7295:6;7289:13;7311:53;7357:6;7352:3;7345:4;7337:6;7333:17;7311:53;:::i;:::-;-1:-1:-1;;;7386:16:1;;;7411:19;;;7455:13;;7477:65;7455:13;7529:1;7518:13;;7511:4;7499:17;;7477:65;:::i;7597:550::-;7804:3;7842:6;7836:13;7858:53;7904:6;7899:3;7892:4;7884:6;7880:17;7858:53;:::i;:::-;7933:16;;7958:21;;;8004:13;;8026:68;8004:13;8078:4;8067:16;;;;8048:17;;8026:68;:::i;:::-;8114:20;8136:4;8110:31;;7597:550;-1:-1:-1;;;;;7597:550:1:o;8152:1491::-;8664:66;8659:3;8652:79;8634:3;8760:6;8754:13;8776:62;8831:6;8826:2;8821:3;8817:12;8810:4;8802:6;8798:17;8776:62;:::i;:::-;8866:6;8861:3;8857:16;8847:26;;8902:66;8897:2;8893;8889:11;8882:87;8998:34;8993:2;8989;8985:11;8978:55;9062:34;9057:2;9053;9049:11;9042:55;9127:34;9121:3;9117:2;9113:12;9106:56;9192:34;9186:3;9182:2;9178:12;9171:56;9257:34;9251:3;9247:2;9243:12;9236:56;9322:66;9316:3;9312:2;9308:12;9301:88;-1:-1:-1;;;9413:3:1;9409:2;9405:12;9398:34;9451:3;9485:6;9479:13;9501:63;9555:8;9550:2;9546;9542:11;9535:4;9527:6;9523:17;9501:63;:::i;:::-;9580:57;9633:2;9622:8;9618:2;9614:17;9610:26;-1:-1:-1;;;3751:27:1;;3803:1;3794:11;;3686:125;9580:57;9573:64;8152:1491;-1:-1:-1;;;;;;;8152:1491:1:o;9648:448::-;9910:31;9905:3;9898:44;9880:3;9971:6;9965:13;9987:62;10042:6;10037:2;10032:3;10028:12;10021:4;10013:6;10009:17;9987:62;:::i;:::-;10069:16;;;;10087:2;10065:25;;9648:448;-1:-1:-1;;9648:448:1:o;10568:488::-;-1:-1:-1;;;;;10837:15:1;;;10819:34;;10889:15;;10884:2;10869:18;;10862:43;10936:2;10921:18;;10914:34;;;10984:3;10979:2;10964:18;;10957:31;;;10762:4;;11005:45;;11030:19;;11022:6;11005:45;:::i;:::-;10997:53;10568:488;-1:-1:-1;;;;;;10568:488:1:o;11253:219::-;11402:2;11391:9;11384:21;11365:4;11422:44;11462:2;11451:9;11447:18;11439:6;11422:44;:::i;11889:414::-;12091:2;12073:21;;;12130:2;12110:18;;;12103:30;12169:34;12164:2;12149:18;;12142:62;-1:-1:-1;;;12235:2:1;12220:18;;12213:48;12293:3;12278:19;;11889:414::o;16264:356::-;16466:2;16448:21;;;16485:18;;;16478:30;16544:34;16539:2;16524:18;;16517:62;16611:2;16596:18;;16264:356::o;17782:413::-;17984:2;17966:21;;;18023:2;18003:18;;;17996:30;18062:34;18057:2;18042:18;;18035:62;-1:-1:-1;;;18128:2:1;18113:18;;18106:47;18185:3;18170:19;;17782:413::o;19155:128::-;19195:3;19226:1;19222:6;19219:1;19216:13;19213:39;;;19232:18;;:::i;:::-;-1:-1:-1;19268:9:1;;19155:128::o;19288:120::-;19328:1;19354;19344:35;;19359:18;;:::i;:::-;-1:-1:-1;19393:9:1;;19288:120::o;19413:168::-;19453:7;19519:1;19515;19511:6;19507:14;19504:1;19501:21;19496:1;19489:9;19482:17;19478:45;19475:71;;;19526:18;;:::i;:::-;-1:-1:-1;19566:9:1;;19413:168::o;19586:125::-;19626:4;19654:1;19651;19648:8;19645:34;;;19659:18;;:::i;:::-;-1:-1:-1;19696:9:1;;19586:125::o;19716:258::-;19788:1;19798:113;19812:6;19809:1;19806:13;19798:113;;;19888:11;;;19882:18;19869:11;;;19862:39;19834:2;19827:10;19798:113;;;19929:6;19926:1;19923:13;19920:48;;;-1:-1:-1;;19964:1:1;19946:16;;19939:27;19716:258::o;19979:380::-;20058:1;20054:12;;;;20101;;;20122:61;;20176:4;20168:6;20164:17;20154:27;;20122:61;20229:2;20221:6;20218:14;20198:18;20195:38;20192:161;;;20275:10;20270:3;20266:20;20263:1;20256:31;20310:4;20307:1;20300:15;20338:4;20335:1;20328:15;20192:161;;19979:380;;;:::o;20364:135::-;20403:3;-1:-1:-1;;20424:17:1;;20421:43;;;20444:18;;:::i;:::-;-1:-1:-1;20491:1:1;20480:13;;20364:135::o;20504:112::-;20536:1;20562;20552:35;;20567:18;;:::i;:::-;-1:-1:-1;20601:9:1;;20504:112::o;20621:127::-;20682:10;20677:3;20673:20;20670:1;20663:31;20713:4;20710:1;20703:15;20737:4;20734:1;20727:15;20753:127;20814:10;20809:3;20805:20;20802:1;20795:31;20845:4;20842:1;20835:15;20869:4;20866:1;20859:15;20885:127;20946:10;20941:3;20937:20;20934:1;20927:31;20977:4;20974:1;20967:15;21001:4;20998:1;20991:15;21017:127;21078:10;21073:3;21069:20;21066:1;21059:31;21109:4;21106:1;21099:15;21133:4;21130:1;21123:15;21149:127;21210:10;21205:3;21201:20;21198:1;21191:31;21241:4;21238:1;21231:15;21265:4;21262:1;21255:15;21281:131;-1:-1:-1;;;;;;21355:32:1;;21345:43;;21335:71;;21402:1;21399;21392:12
Swarm Source
ipfs://3ab6c145b7ecb1b7f0cf25eafc1bb8412a25d7ffb1180ca79a75d7171aee6300
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.