Overview
TokenID
104
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CowPunks
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-11-02 */ /** *Submitted for verification at apescan.io on 2024-11-02 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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 making 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; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/PENGEES.sol pragma solidity >=0.8.0 <0.9.0; contract CowPunks is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; string public _baseTokenURI; string public hiddenMetadataUri; uint256 public cost = 1 ether; uint256 public maxSupply = 2001; uint256 public freeSupply = 0; uint256 public maxMintAmountPerTx = 50; uint256 public FREE_NFT = 0; bool public paused = false; bool public revealed = true; mapping(address=>uint256) private free_nft; address private _royaltyReceiver; uint96 private _royaltyFeeNumerator; constructor( string memory _hiddenMetadataUri ) ERC721A(" CowPunks", " CowPunks") { setHiddenMetadataUri(_hiddenMetadataUri); } function mint(uint256 _mintAmount) public payable nonReentrant { require(tx.origin == msg.sender, "Contracts are not allowed"); require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!"); require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!"); require(!paused, "The contract is paused!"); uint256 amountForPay=_mintAmount; if (this.balanceOf(_msgSender()) < FREE_NFT){ if (amountForPay>=FREE_NFT){ amountForPay-=FREE_NFT - free_nft[_msgSender()]; }else{ amountForPay=0; } } require(msg.value >= cost * amountForPay, "Insufficient funds!"); if (totalSupply() >= freeSupply) { require(msg.value > 0, "Max free supply exceeded!"); require(msg.value >= cost * _mintAmount, "Insufficient funds!"); } free_nft[_msgSender()]+=_mintAmount; if (free_nft[_msgSender()] > FREE_NFT) free_nft[_msgSender()]=FREE_NFT; _safeMint(_msgSender(), _mintAmount); } function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner { _safeMint(_receiver, _mintAmount); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function setFreeSupply(uint256 _freeSupply) public onlyOwner { freeSupply = _freeSupply; } function setFREENFT(uint256 _FREENFT) public onlyOwner { FREE_NFT = _FREENFT; } function setPaused(bool _state) public onlyOwner { paused = _state; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } // METADATA HANDLING function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setBaseURI(string calldata baseURI) public onlyOwner { _baseTokenURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "URI does not exist!"); if (revealed) { return string(abi.encodePacked(_baseURI(), _tokenId.toString())); } else { return hiddenMetadataUri; } } //ROYALTY function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner { require(feeNumerator <= 10000, "Fee exceeds 100%"); _royaltyReceiver = receiver; _royaltyFeeNumerator = feeNumerator; } function royaltyInfo(uint256 /* _tokenId */, uint256 _salePrice) external view returns (address, uint256) { uint256 royaltyAmount = (_salePrice * _royaltyFeeNumerator) / 10000; return (_royaltyReceiver, royaltyAmount); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) { return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FREENFT","type":"uint256"}],"name":"setFREENFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeSupply","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052670de0b6b3a7640000600c556107d1600d555f600e556032600f555f6010555f60115f6101000a81548160ff0219169083151502179055506001601160016101000a81548160ff021916908315150217905550348015610062575f80fd5b50604051614e9f380380614e9f83398181016040528101906100849190610440565b6040518060400160405280600981526020017f20436f7750756e6b7300000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f20436f7750756e6b73000000000000000000000000000000000000000000000081525081600290816100ff9190610694565b50806003908161010f9190610694565b5061011e61015e60201b60201c565b5f81905550505061014161013661016660201b60201c565b61016d60201b60201c565b60016009819055506101588161023060201b60201c565b506107db565b5f6001905090565b5f33905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61023e61016660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166102626102cb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146102b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102af906107bd565b60405180910390fd5b80600b90816102c79190610694565b5050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6103528261030c565b810181811067ffffffffffffffff821117156103715761037061031c565b5b80604052505050565b5f6103836102f3565b905061038f8282610349565b919050565b5f67ffffffffffffffff8211156103ae576103ad61031c565b5b6103b78261030c565b9050602081019050919050565b8281835e5f83830152505050565b5f6103e46103df84610394565b61037a565b905082815260208101848484011115610400576103ff610308565b5b61040b8482856103c4565b509392505050565b5f82601f83011261042757610426610304565b5b81516104378482602086016103d2565b91505092915050565b5f60208284031215610455576104546102fc565b5b5f82015167ffffffffffffffff81111561047257610471610300565b5b61047e84828501610413565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806104d557607f821691505b6020821081036104e8576104e7610491565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261054a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261050f565b610554868361050f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61059861059361058e8461056c565b610575565b61056c565b9050919050565b5f819050919050565b6105b18361057e565b6105c56105bd8261059f565b84845461051b565b825550505050565b5f90565b6105d96105cd565b6105e48184846105a8565b505050565b5b81811015610607576105fc5f826105d1565b6001810190506105ea565b5050565b601f82111561064c5761061d816104ee565b61062684610500565b81016020851015610635578190505b61064961064185610500565b8301826105e9565b50505b505050565b5f82821c905092915050565b5f61066c5f1984600802610651565b1980831691505092915050565b5f610684838361065d565b9150826002028217905092915050565b61069d82610487565b67ffffffffffffffff8111156106b6576106b561031c565b5b6106c082546104be565b6106cb82828561060b565b5f60209050601f8311600181146106fc575f84156106ea578287015190505b6106f48582610679565b86555061075b565b601f19841661070a866104ee565b5f5b828110156107315784890151825560018201915060208501945060208101905061070c565b8683101561074e578489015161074a601f89168261065d565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6107a7602083610763565b91506107b282610773565b602082019050919050565b5f6020820190508181035f8301526107d48161079b565b9050919050565b6146b7806107e85f395ff3fe60806040526004361061023a575f3560e01c806370a082311161012d578063b3aa76a0116100aa578063e0a808531161006e578063e0a8085314610819578063e985e9c514610841578063efbd73f41461087d578063f2fde38b146108a5578063f676308a146108cd5761023a565b8063b3aa76a014610737578063b88d4fde14610761578063c87b56dd14610789578063cfc86f7b146107c5578063d5abeb01146107ef5761023a565b806395d89b41116100f157806395d89b4114610677578063a0712d68146106a1578063a22cb465146106bd578063a45ba8e7146106e5578063b071401b1461070f5761023a565b806370a08231146105a9578063715018a6146105e55780638da5cb5b146105fb5780638e9d3bf11461062557806394354fd01461064d5761023a565b80632a55205a116101bb578063518302271161017f57806351830227146104c957806355f804b3146104f35780635c975abb1461051b5780636352211e146105455780636f8b44b0146105815761023a565b80632a55205a146103fe5780633ccfd60b1461043b57806342842e0e1461045157806344a0d68a146104795780634fdd43cb146104a15761023a565b806313faede61161020257806313faede61461033057806316c38b3c1461035a57806318160ddd1461038257806323b872dd146103ac57806324a6ab0c146103d45761023a565b806301ffc9a71461023e57806304634d8d1461027a57806306fdde03146102a2578063081812fc146102cc578063095ea7b314610308575b5f80fd5b348015610249575f80fd5b50610264600480360381019061025f91906132db565b6108f5565b6040516102719190613320565b60405180910390f35b348015610285575f80fd5b506102a0600480360381019061029b91906133d4565b610936565b005b3480156102ad575f80fd5b506102b6610a7a565b6040516102c39190613482565b60405180910390f35b3480156102d7575f80fd5b506102f260048036038101906102ed91906134d5565b610b0a565b6040516102ff919061350f565b60405180910390f35b348015610313575f80fd5b5061032e60048036038101906103299190613528565b610b82565b005b34801561033b575f80fd5b50610344610c8b565b6040516103519190613575565b60405180910390f35b348015610365575f80fd5b50610380600480360381019061037b91906135b8565b610c91565b005b34801561038d575f80fd5b50610396610d29565b6040516103a39190613575565b60405180910390f35b3480156103b7575f80fd5b506103d260048036038101906103cd91906135e3565b610d3e565b005b3480156103df575f80fd5b506103e8610d4e565b6040516103f59190613575565b60405180910390f35b348015610409575f80fd5b50610424600480360381019061041f9190613633565b610d54565b604051610432929190613671565b60405180910390f35b348015610446575f80fd5b5061044f610dc9565b005b34801561045c575f80fd5b50610477600480360381019061047291906135e3565b610f15565b005b348015610484575f80fd5b5061049f600480360381019061049a91906134d5565b610f34565b005b3480156104ac575f80fd5b506104c760048036038101906104c291906137c4565b610fba565b005b3480156104d4575f80fd5b506104dd611049565b6040516104ea9190613320565b60405180910390f35b3480156104fe575f80fd5b5061051960048036038101906105149190613868565b61105c565b005b348015610526575f80fd5b5061052f6110ee565b60405161053c9190613320565b60405180910390f35b348015610550575f80fd5b5061056b600480360381019061056691906134d5565b611100565b604051610578919061350f565b60405180910390f35b34801561058c575f80fd5b506105a760048036038101906105a291906134d5565b611114565b005b3480156105b4575f80fd5b506105cf60048036038101906105ca91906138b3565b61119a565b6040516105dc9190613575565b60405180910390f35b3480156105f0575f80fd5b506105f9611264565b005b348015610606575f80fd5b5061060f6112eb565b60405161061c919061350f565b60405180910390f35b348015610630575f80fd5b5061064b600480360381019061064691906134d5565b611313565b005b348015610658575f80fd5b50610661611399565b60405161066e9190613575565b60405180910390f35b348015610682575f80fd5b5061068b61139f565b6040516106989190613482565b60405180910390f35b6106bb60048036038101906106b691906134d5565b61142f565b005b3480156106c8575f80fd5b506106e360048036038101906106de91906138de565b6118e2565b005b3480156106f0575f80fd5b506106f9611a54565b6040516107069190613482565b60405180910390f35b34801561071a575f80fd5b50610735600480360381019061073091906134d5565b611ae0565b005b348015610742575f80fd5b5061074b611b66565b6040516107589190613575565b60405180910390f35b34801561076c575f80fd5b50610787600480360381019061078291906139ba565b611b6c565b005b348015610794575f80fd5b506107af60048036038101906107aa91906134d5565b611be8565b6040516107bc9190613482565b60405180910390f35b3480156107d0575f80fd5b506107d9611d10565b6040516107e69190613482565b60405180910390f35b3480156107fa575f80fd5b50610803611d9c565b6040516108109190613575565b60405180910390f35b348015610824575f80fd5b5061083f600480360381019061083a91906135b8565b611da2565b005b34801561084c575f80fd5b5061086760048036038101906108629190613a3a565b611e3b565b6040516108749190613320565b60405180910390f35b348015610888575f80fd5b506108a3600480360381019061089e9190613a78565b611ec9565b005b3480156108b0575f80fd5b506108cb60048036038101906108c691906138b3565b611f53565b005b3480156108d8575f80fd5b506108f360048036038101906108ee91906134d5565b612049565b005b5f632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092f575061092e826120cf565b5b9050919050565b61093e6121b0565b73ffffffffffffffffffffffffffffffffffffffff1661095c6112eb565b73ffffffffffffffffffffffffffffffffffffffff16146109b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a990613b00565b60405180910390fd5b612710816bffffffffffffffffffffffff161115610a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90613b68565b60405180910390fd5b8160135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b606060028054610a8990613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab590613bb3565b8015610b005780601f10610ad757610100808354040283529160200191610b00565b820191905f5260205f20905b815481529060010190602001808311610ae357829003601f168201915b5050505050905090565b5f610b14826121b7565b610b4a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610b8c82611100565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bf3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c126121b0565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c445750610c4281610c3d6121b0565b611e3b565b155b15610c7b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c86838383612200565b505050565b600c5481565b610c996121b0565b73ffffffffffffffffffffffffffffffffffffffff16610cb76112eb565b73ffffffffffffffffffffffffffffffffffffffff1614610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0490613b00565b60405180910390fd5b8060115f6101000a81548160ff02191690831515021790555050565b5f610d326122af565b6001545f540303905090565b610d498383836122b7565b505050565b600e5481565b5f805f612710601360149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1685610d8e9190613c10565b610d989190613c7e565b905060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b610dd16121b0565b73ffffffffffffffffffffffffffffffffffffffff16610def6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90613b00565b60405180910390fd5b600260095403610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190613cf8565b60405180910390fd5b60026009819055505f610e9b6112eb565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ebe90613d43565b5f6040518083038185875af1925050503d805f8114610ef8576040519150601f19603f3d011682016040523d82523d5f602084013e610efd565b606091505b5050905080610f0a575f80fd5b506001600981905550565b610f2f83838360405180602001604052805f815250611b6c565b505050565b610f3c6121b0565b73ffffffffffffffffffffffffffffffffffffffff16610f5a6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa790613b00565b60405180910390fd5b80600c8190555050565b610fc26121b0565b73ffffffffffffffffffffffffffffffffffffffff16610fe06112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90613b00565b60405180910390fd5b80600b90816110459190613ef4565b5050565b601160019054906101000a900460ff1681565b6110646121b0565b73ffffffffffffffffffffffffffffffffffffffff166110826112eb565b73ffffffffffffffffffffffffffffffffffffffff16146110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613b00565b60405180910390fd5b8181600a91826110e9929190613fcd565b505050565b60115f9054906101000a900460ff1681565b5f61110a8261274d565b5f01519050919050565b61111c6121b0565b73ffffffffffffffffffffffffffffffffffffffff1661113a6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118790613b00565b60405180910390fd5b80600d8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611200576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61126c6121b0565b73ffffffffffffffffffffffffffffffffffffffff1661128a6112eb565b73ffffffffffffffffffffffffffffffffffffffff16146112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d790613b00565b60405180910390fd5b6112e95f6129c9565b565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61131b6121b0565b73ffffffffffffffffffffffffffffffffffffffff166113396112eb565b73ffffffffffffffffffffffffffffffffffffffff161461138f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138690613b00565b60405180910390fd5b8060108190555050565b600f5481565b6060600380546113ae90613bb3565b80601f01602080910402602001604051908101604052809291908181526020018280546113da90613bb3565b80156114255780601f106113fc57610100808354040283529160200191611425565b820191905f5260205f20905b81548152906001019060200180831161140857829003601f168201915b5050505050905090565b600260095403611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b90613cf8565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e1906140e4565b60405180910390fd5b5f811180156114fb5750600f548111155b61153a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115319061414c565b60405180910390fd5b600d5481611546610d29565b611550919061416a565b1115611591576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611588906141e7565b60405180910390fd5b60115f9054906101000a900460ff16156115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d79061424f565b60405180910390fd5b5f8190506010543073ffffffffffffffffffffffffffffffffffffffff166370a0823161160b6121b0565b6040518263ffffffff1660e01b8152600401611627919061350f565b602060405180830381865afa158015611642573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116669190614281565b10156116de5760105481106116d95760125f6116806121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546010546116c791906142ac565b816116d291906142ac565b90506116dd565b5f90505b5b80600c546116ec9190613c10565b34101561172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614329565b60405180910390fd5b600e54611739610d29565b106117d1575f3411611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790614391565b60405180910390fd5b81600c5461178e9190613c10565b3410156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790614329565b60405180910390fd5b5b8160125f6117dd6121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611824919061416a565b9250508190555060105460125f6118396121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156118c55760105460125f6118876121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6118d66118d06121b0565b83612a8c565b50600160098190555050565b6118ea6121b0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f61195a6121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a036121b0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a489190613320565b60405180910390a35050565b600b8054611a6190613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8d90613bb3565b8015611ad85780601f10611aaf57610100808354040283529160200191611ad8565b820191905f5260205f20905b815481529060010190602001808311611abb57829003601f168201915b505050505081565b611ae86121b0565b73ffffffffffffffffffffffffffffffffffffffff16611b066112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5390613b00565b60405180910390fd5b80600f8190555050565b60105481565b611b778484846122b7565b611b968373ffffffffffffffffffffffffffffffffffffffff16612aa9565b8015611bab5750611ba984848484612acb565b155b15611be2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611bf3826121b7565b611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c29906143f9565b60405180910390fd5b601160019054906101000a900460ff1615611c7f57611c4f612c16565b611c5883612ca6565b604051602001611c69929190614451565b6040516020818303038152906040529050611d0b565b600b8054611c8c90613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb890613bb3565b8015611d035780601f10611cda57610100808354040283529160200191611d03565b820191905f5260205f20905b815481529060010190602001808311611ce657829003601f168201915b505050505090505b919050565b600a8054611d1d90613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4990613bb3565b8015611d945780601f10611d6b57610100808354040283529160200191611d94565b820191905f5260205f20905b815481529060010190602001808311611d7757829003601f168201915b505050505081565b600d5481565b611daa6121b0565b73ffffffffffffffffffffffffffffffffffffffff16611dc86112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1590613b00565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611ed16121b0565b73ffffffffffffffffffffffffffffffffffffffff16611eef6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90613b00565b60405180910390fd5b611f4f8183612a8c565b5050565b611f5b6121b0565b73ffffffffffffffffffffffffffffffffffffffff16611f796112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690613b00565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361203d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612034906144e4565b60405180910390fd5b612046816129c9565b50565b6120516121b0565b73ffffffffffffffffffffffffffffffffffffffff1661206f6112eb565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90613b00565b60405180910390fd5b80600e8190555050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121a957506121a882612dff565b5b9050919050565b5f33905090565b5f816121c16122af565b111580156121cf57505f5482105b80156121f9575060045f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b5f6122c18261274d565b90508373ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461232b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff1661234b6121b0565b73ffffffffffffffffffffffffffffffffffffffff16148061237a5750612379856123746121b0565b611e3b565b5b806123bf57506123886121b0565b73ffffffffffffffffffffffffffffffffffffffff166123a784610b0a565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123f8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361245d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61246a8585856001612e68565b6124755f8487612200565b600160055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f60045f8581526020019081526020015f20905084815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001850190505f60045f8381526020019081526020015f2090505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036126db575f5482146126da5787815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460200151815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127468585856001612e6e565b5050505050565b612755613235565b5f829050806127626122af565b1115801561277057505f5481105b15612992575f60045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151612990575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461287c5780925050506129c4565b5b60011561298f5781806001900392505060045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461298a5780925050506129c4565b61287d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aa5828260405180602001604052805f815250612e74565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612af06121b0565b8786866040518563ffffffff1660e01b8152600401612b129493929190614554565b6020604051808303815f875af1925050508015612b4d57506040513d601f19601f82011682018060405250810190612b4a91906145b2565b60015b612bc3573d805f8114612b7b576040519150601f19603f3d011682016040523d82523d5f602084013e612b80565b606091505b505f815103612bbb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612c2590613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054612c5190613bb3565b8015612c9c5780601f10612c7357610100808354040283529160200191612c9c565b820191905f5260205f20905b815481529060010190602001808311612c7f57829003601f168201915b5050505050905090565b60605f8203612cec576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dfa565b5f8290505f5b5f8214612d1b578080612d04906145dd565b915050600a82612d149190613c7e565b9150612cf2565b5f8167ffffffffffffffff811115612d3657612d356136a0565b5b6040519080825280601f01601f191660200182016040528015612d685781602001600182028036833780820191505090505b5090505b5f8514612df357600182612d8091906142ac565b9150600a85612d8f9190614624565b6030612d9b919061416a565b60f81b818381518110612db157612db0614654565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612dec9190613c7e565b9450612d6c565b8093505050505b919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b612e818383836001612e86565b505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ef0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8403612f29576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f355f868387612e68565b8360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f85820190508380156130ef57506130ee8773ffffffffffffffffffffffffffffffffffffffff16612aa9565b5b156131b0575b818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131625f888480600101955088612acb565b613198576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036130f557825f54146131ab575f80fd5b61321a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036131b1575b815f81905550505061322e5f868387612e6e565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132ba81613286565b81146132c4575f80fd5b50565b5f813590506132d5816132b1565b92915050565b5f602082840312156132f0576132ef61327e565b5b5f6132fd848285016132c7565b91505092915050565b5f8115159050919050565b61331a81613306565b82525050565b5f6020820190506133335f830184613311565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61336282613339565b9050919050565b61337281613358565b811461337c575f80fd5b50565b5f8135905061338d81613369565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b6133b381613393565b81146133bd575f80fd5b50565b5f813590506133ce816133aa565b92915050565b5f80604083850312156133ea576133e961327e565b5b5f6133f78582860161337f565b9250506020613408858286016133c0565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61345482613412565b61345e818561341c565b935061346e81856020860161342c565b6134778161343a565b840191505092915050565b5f6020820190508181035f83015261349a818461344a565b905092915050565b5f819050919050565b6134b4816134a2565b81146134be575f80fd5b50565b5f813590506134cf816134ab565b92915050565b5f602082840312156134ea576134e961327e565b5b5f6134f7848285016134c1565b91505092915050565b61350981613358565b82525050565b5f6020820190506135225f830184613500565b92915050565b5f806040838503121561353e5761353d61327e565b5b5f61354b8582860161337f565b925050602061355c858286016134c1565b9150509250929050565b61356f816134a2565b82525050565b5f6020820190506135885f830184613566565b92915050565b61359781613306565b81146135a1575f80fd5b50565b5f813590506135b28161358e565b92915050565b5f602082840312156135cd576135cc61327e565b5b5f6135da848285016135a4565b91505092915050565b5f805f606084860312156135fa576135f961327e565b5b5f6136078682870161337f565b93505060206136188682870161337f565b9250506040613629868287016134c1565b9150509250925092565b5f80604083850312156136495761364861327e565b5b5f613656858286016134c1565b9250506020613667858286016134c1565b9150509250929050565b5f6040820190506136845f830185613500565b6136916020830184613566565b9392505050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6136d68261343a565b810181811067ffffffffffffffff821117156136f5576136f46136a0565b5b80604052505050565b5f613707613275565b905061371382826136cd565b919050565b5f67ffffffffffffffff821115613732576137316136a0565b5b61373b8261343a565b9050602081019050919050565b828183375f83830152505050565b5f61376861376384613718565b6136fe565b9050828152602081018484840111156137845761378361369c565b5b61378f848285613748565b509392505050565b5f82601f8301126137ab576137aa613698565b5b81356137bb848260208601613756565b91505092915050565b5f602082840312156137d9576137d861327e565b5b5f82013567ffffffffffffffff8111156137f6576137f5613282565b5b61380284828501613797565b91505092915050565b5f80fd5b5f80fd5b5f8083601f84011261382857613827613698565b5b8235905067ffffffffffffffff8111156138455761384461380b565b5b6020830191508360018202830111156138615761386061380f565b5b9250929050565b5f806020838503121561387e5761387d61327e565b5b5f83013567ffffffffffffffff81111561389b5761389a613282565b5b6138a785828601613813565b92509250509250929050565b5f602082840312156138c8576138c761327e565b5b5f6138d58482850161337f565b91505092915050565b5f80604083850312156138f4576138f361327e565b5b5f6139018582860161337f565b9250506020613912858286016135a4565b9150509250929050565b5f67ffffffffffffffff821115613936576139356136a0565b5b61393f8261343a565b9050602081019050919050565b5f61395e6139598461391c565b6136fe565b90508281526020810184848401111561397a5761397961369c565b5b613985848285613748565b509392505050565b5f82601f8301126139a1576139a0613698565b5b81356139b184826020860161394c565b91505092915050565b5f805f80608085870312156139d2576139d161327e565b5b5f6139df8782880161337f565b94505060206139f08782880161337f565b9350506040613a01878288016134c1565b925050606085013567ffffffffffffffff811115613a2257613a21613282565b5b613a2e8782880161398d565b91505092959194509250565b5f8060408385031215613a5057613a4f61327e565b5b5f613a5d8582860161337f565b9250506020613a6e8582860161337f565b9150509250929050565b5f8060408385031215613a8e57613a8d61327e565b5b5f613a9b858286016134c1565b9250506020613aac8582860161337f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613aea60208361341c565b9150613af582613ab6565b602082019050919050565b5f6020820190508181035f830152613b1781613ade565b9050919050565b7f46656520657863656564732031303025000000000000000000000000000000005f82015250565b5f613b5260108361341c565b9150613b5d82613b1e565b602082019050919050565b5f6020820190508181035f830152613b7f81613b46565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613bca57607f821691505b602082108103613bdd57613bdc613b86565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613c1a826134a2565b9150613c25836134a2565b9250828202613c33816134a2565b91508282048414831517613c4a57613c49613be3565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613c88826134a2565b9150613c93836134a2565b925082613ca357613ca2613c51565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613ce2601f8361341c565b9150613ced82613cae565b602082019050919050565b5f6020820190508181035f830152613d0f81613cd6565b9050919050565b5f81905092915050565b50565b5f613d2e5f83613d16565b9150613d3982613d20565b5f82019050919050565b5f613d4d82613d23565b9150819050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613db37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d78565b613dbd8683613d78565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613df8613df3613dee846134a2565b613dd5565b6134a2565b9050919050565b5f819050919050565b613e1183613dde565b613e25613e1d82613dff565b848454613d84565b825550505050565b5f90565b613e39613e2d565b613e44818484613e08565b505050565b5b81811015613e6757613e5c5f82613e31565b600181019050613e4a565b5050565b601f821115613eac57613e7d81613d57565b613e8684613d69565b81016020851015613e95578190505b613ea9613ea185613d69565b830182613e49565b50505b505050565b5f82821c905092915050565b5f613ecc5f1984600802613eb1565b1980831691505092915050565b5f613ee48383613ebd565b9150826002028217905092915050565b613efd82613412565b67ffffffffffffffff811115613f1657613f156136a0565b5b613f208254613bb3565b613f2b828285613e6b565b5f60209050601f831160018114613f5c575f8415613f4a578287015190505b613f548582613ed9565b865550613fbb565b601f198416613f6a86613d57565b5f5b82811015613f9157848901518255600182019150602085019450602081019050613f6c565b86831015613fae5784890151613faa601f891682613ebd565b8355505b6001600288020188555050505b505050505050565b5f82905092915050565b613fd78383613fc3565b67ffffffffffffffff811115613ff057613fef6136a0565b5b613ffa8254613bb3565b614005828285613e6b565b5f601f831160018114614032575f8415614020578287013590505b61402a8582613ed9565b865550614091565b601f19841661404086613d57565b5f5b8281101561406757848901358255600182019150602085019450602081019050614042565b868310156140845784890135614080601f891682613ebd565b8355505b6001600288020188555050505b50505050505050565b7f436f6e74726163747320617265206e6f7420616c6c6f776564000000000000005f82015250565b5f6140ce60198361341c565b91506140d98261409a565b602082019050919050565b5f6020820190508181035f8301526140fb816140c2565b9050919050565b7f496e76616c6964206d696e7420616d6f756e74210000000000000000000000005f82015250565b5f61413660148361341c565b915061414182614102565b602082019050919050565b5f6020820190508181035f8301526141638161412a565b9050919050565b5f614174826134a2565b915061417f836134a2565b925082820190508082111561419757614196613be3565b5b92915050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f6141d160148361341c565b91506141dc8261419d565b602082019050919050565b5f6020820190508181035f8301526141fe816141c5565b9050919050565b7f54686520636f6e747261637420697320706175736564210000000000000000005f82015250565b5f61423960178361341c565b915061424482614205565b602082019050919050565b5f6020820190508181035f8301526142668161422d565b9050919050565b5f8151905061427b816134ab565b92915050565b5f602082840312156142965761429561327e565b5b5f6142a38482850161426d565b91505092915050565b5f6142b6826134a2565b91506142c1836134a2565b92508282039050818111156142d9576142d8613be3565b5b92915050565b7f496e73756666696369656e742066756e647321000000000000000000000000005f82015250565b5f61431360138361341c565b915061431e826142df565b602082019050919050565b5f6020820190508181035f83015261434081614307565b9050919050565b7f4d6178206672656520737570706c7920657863656564656421000000000000005f82015250565b5f61437b60198361341c565b915061438682614347565b602082019050919050565b5f6020820190508181035f8301526143a88161436f565b9050919050565b7f55524920646f6573206e6f7420657869737421000000000000000000000000005f82015250565b5f6143e360138361341c565b91506143ee826143af565b602082019050919050565b5f6020820190508181035f830152614410816143d7565b9050919050565b5f81905092915050565b5f61442b82613412565b6144358185614417565b935061444581856020860161342c565b80840191505092915050565b5f61445c8285614421565b91506144688284614421565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6144ce60268361341c565b91506144d982614474565b604082019050919050565b5f6020820190508181035f8301526144fb816144c2565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f61452682614502565b614530818561450c565b935061454081856020860161342c565b6145498161343a565b840191505092915050565b5f6080820190506145675f830187613500565b6145746020830186613500565b6145816040830185613566565b8181036060830152614593818461451c565b905095945050505050565b5f815190506145ac816132b1565b92915050565b5f602082840312156145c7576145c661327e565b5b5f6145d48482850161459e565b91505092915050565b5f6145e7826134a2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361461957614618613be3565b5b600182019050919050565b5f61462e826134a2565b9150614639836134a2565b92508261464957614648613c51565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea26469706673582212204a799b033d5254d8bf28f9b8d74cba1e673f115d5b19b7d272a63cca563955a364736f6c6343000819003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656965786771676567363377647a62736e6e6b6f327735746a77787a796a6a7a70613334647965343768796b6134356674646c6837692f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061023a575f3560e01c806370a082311161012d578063b3aa76a0116100aa578063e0a808531161006e578063e0a8085314610819578063e985e9c514610841578063efbd73f41461087d578063f2fde38b146108a5578063f676308a146108cd5761023a565b8063b3aa76a014610737578063b88d4fde14610761578063c87b56dd14610789578063cfc86f7b146107c5578063d5abeb01146107ef5761023a565b806395d89b41116100f157806395d89b4114610677578063a0712d68146106a1578063a22cb465146106bd578063a45ba8e7146106e5578063b071401b1461070f5761023a565b806370a08231146105a9578063715018a6146105e55780638da5cb5b146105fb5780638e9d3bf11461062557806394354fd01461064d5761023a565b80632a55205a116101bb578063518302271161017f57806351830227146104c957806355f804b3146104f35780635c975abb1461051b5780636352211e146105455780636f8b44b0146105815761023a565b80632a55205a146103fe5780633ccfd60b1461043b57806342842e0e1461045157806344a0d68a146104795780634fdd43cb146104a15761023a565b806313faede61161020257806313faede61461033057806316c38b3c1461035a57806318160ddd1461038257806323b872dd146103ac57806324a6ab0c146103d45761023a565b806301ffc9a71461023e57806304634d8d1461027a57806306fdde03146102a2578063081812fc146102cc578063095ea7b314610308575b5f80fd5b348015610249575f80fd5b50610264600480360381019061025f91906132db565b6108f5565b6040516102719190613320565b60405180910390f35b348015610285575f80fd5b506102a0600480360381019061029b91906133d4565b610936565b005b3480156102ad575f80fd5b506102b6610a7a565b6040516102c39190613482565b60405180910390f35b3480156102d7575f80fd5b506102f260048036038101906102ed91906134d5565b610b0a565b6040516102ff919061350f565b60405180910390f35b348015610313575f80fd5b5061032e60048036038101906103299190613528565b610b82565b005b34801561033b575f80fd5b50610344610c8b565b6040516103519190613575565b60405180910390f35b348015610365575f80fd5b50610380600480360381019061037b91906135b8565b610c91565b005b34801561038d575f80fd5b50610396610d29565b6040516103a39190613575565b60405180910390f35b3480156103b7575f80fd5b506103d260048036038101906103cd91906135e3565b610d3e565b005b3480156103df575f80fd5b506103e8610d4e565b6040516103f59190613575565b60405180910390f35b348015610409575f80fd5b50610424600480360381019061041f9190613633565b610d54565b604051610432929190613671565b60405180910390f35b348015610446575f80fd5b5061044f610dc9565b005b34801561045c575f80fd5b50610477600480360381019061047291906135e3565b610f15565b005b348015610484575f80fd5b5061049f600480360381019061049a91906134d5565b610f34565b005b3480156104ac575f80fd5b506104c760048036038101906104c291906137c4565b610fba565b005b3480156104d4575f80fd5b506104dd611049565b6040516104ea9190613320565b60405180910390f35b3480156104fe575f80fd5b5061051960048036038101906105149190613868565b61105c565b005b348015610526575f80fd5b5061052f6110ee565b60405161053c9190613320565b60405180910390f35b348015610550575f80fd5b5061056b600480360381019061056691906134d5565b611100565b604051610578919061350f565b60405180910390f35b34801561058c575f80fd5b506105a760048036038101906105a291906134d5565b611114565b005b3480156105b4575f80fd5b506105cf60048036038101906105ca91906138b3565b61119a565b6040516105dc9190613575565b60405180910390f35b3480156105f0575f80fd5b506105f9611264565b005b348015610606575f80fd5b5061060f6112eb565b60405161061c919061350f565b60405180910390f35b348015610630575f80fd5b5061064b600480360381019061064691906134d5565b611313565b005b348015610658575f80fd5b50610661611399565b60405161066e9190613575565b60405180910390f35b348015610682575f80fd5b5061068b61139f565b6040516106989190613482565b60405180910390f35b6106bb60048036038101906106b691906134d5565b61142f565b005b3480156106c8575f80fd5b506106e360048036038101906106de91906138de565b6118e2565b005b3480156106f0575f80fd5b506106f9611a54565b6040516107069190613482565b60405180910390f35b34801561071a575f80fd5b50610735600480360381019061073091906134d5565b611ae0565b005b348015610742575f80fd5b5061074b611b66565b6040516107589190613575565b60405180910390f35b34801561076c575f80fd5b50610787600480360381019061078291906139ba565b611b6c565b005b348015610794575f80fd5b506107af60048036038101906107aa91906134d5565b611be8565b6040516107bc9190613482565b60405180910390f35b3480156107d0575f80fd5b506107d9611d10565b6040516107e69190613482565b60405180910390f35b3480156107fa575f80fd5b50610803611d9c565b6040516108109190613575565b60405180910390f35b348015610824575f80fd5b5061083f600480360381019061083a91906135b8565b611da2565b005b34801561084c575f80fd5b5061086760048036038101906108629190613a3a565b611e3b565b6040516108749190613320565b60405180910390f35b348015610888575f80fd5b506108a3600480360381019061089e9190613a78565b611ec9565b005b3480156108b0575f80fd5b506108cb60048036038101906108c691906138b3565b611f53565b005b3480156108d8575f80fd5b506108f360048036038101906108ee91906134d5565b612049565b005b5f632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092f575061092e826120cf565b5b9050919050565b61093e6121b0565b73ffffffffffffffffffffffffffffffffffffffff1661095c6112eb565b73ffffffffffffffffffffffffffffffffffffffff16146109b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a990613b00565b60405180910390fd5b612710816bffffffffffffffffffffffff161115610a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90613b68565b60405180910390fd5b8160135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b606060028054610a8990613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab590613bb3565b8015610b005780601f10610ad757610100808354040283529160200191610b00565b820191905f5260205f20905b815481529060010190602001808311610ae357829003601f168201915b5050505050905090565b5f610b14826121b7565b610b4a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610b8c82611100565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bf3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c126121b0565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c445750610c4281610c3d6121b0565b611e3b565b155b15610c7b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c86838383612200565b505050565b600c5481565b610c996121b0565b73ffffffffffffffffffffffffffffffffffffffff16610cb76112eb565b73ffffffffffffffffffffffffffffffffffffffff1614610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0490613b00565b60405180910390fd5b8060115f6101000a81548160ff02191690831515021790555050565b5f610d326122af565b6001545f540303905090565b610d498383836122b7565b505050565b600e5481565b5f805f612710601360149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1685610d8e9190613c10565b610d989190613c7e565b905060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b610dd16121b0565b73ffffffffffffffffffffffffffffffffffffffff16610def6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90613b00565b60405180910390fd5b600260095403610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190613cf8565b60405180910390fd5b60026009819055505f610e9b6112eb565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ebe90613d43565b5f6040518083038185875af1925050503d805f8114610ef8576040519150601f19603f3d011682016040523d82523d5f602084013e610efd565b606091505b5050905080610f0a575f80fd5b506001600981905550565b610f2f83838360405180602001604052805f815250611b6c565b505050565b610f3c6121b0565b73ffffffffffffffffffffffffffffffffffffffff16610f5a6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa790613b00565b60405180910390fd5b80600c8190555050565b610fc26121b0565b73ffffffffffffffffffffffffffffffffffffffff16610fe06112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90613b00565b60405180910390fd5b80600b90816110459190613ef4565b5050565b601160019054906101000a900460ff1681565b6110646121b0565b73ffffffffffffffffffffffffffffffffffffffff166110826112eb565b73ffffffffffffffffffffffffffffffffffffffff16146110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613b00565b60405180910390fd5b8181600a91826110e9929190613fcd565b505050565b60115f9054906101000a900460ff1681565b5f61110a8261274d565b5f01519050919050565b61111c6121b0565b73ffffffffffffffffffffffffffffffffffffffff1661113a6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118790613b00565b60405180910390fd5b80600d8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611200576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61126c6121b0565b73ffffffffffffffffffffffffffffffffffffffff1661128a6112eb565b73ffffffffffffffffffffffffffffffffffffffff16146112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d790613b00565b60405180910390fd5b6112e95f6129c9565b565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61131b6121b0565b73ffffffffffffffffffffffffffffffffffffffff166113396112eb565b73ffffffffffffffffffffffffffffffffffffffff161461138f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138690613b00565b60405180910390fd5b8060108190555050565b600f5481565b6060600380546113ae90613bb3565b80601f01602080910402602001604051908101604052809291908181526020018280546113da90613bb3565b80156114255780601f106113fc57610100808354040283529160200191611425565b820191905f5260205f20905b81548152906001019060200180831161140857829003601f168201915b5050505050905090565b600260095403611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b90613cf8565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e1906140e4565b60405180910390fd5b5f811180156114fb5750600f548111155b61153a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115319061414c565b60405180910390fd5b600d5481611546610d29565b611550919061416a565b1115611591576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611588906141e7565b60405180910390fd5b60115f9054906101000a900460ff16156115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d79061424f565b60405180910390fd5b5f8190506010543073ffffffffffffffffffffffffffffffffffffffff166370a0823161160b6121b0565b6040518263ffffffff1660e01b8152600401611627919061350f565b602060405180830381865afa158015611642573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116669190614281565b10156116de5760105481106116d95760125f6116806121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546010546116c791906142ac565b816116d291906142ac565b90506116dd565b5f90505b5b80600c546116ec9190613c10565b34101561172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614329565b60405180910390fd5b600e54611739610d29565b106117d1575f3411611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790614391565b60405180910390fd5b81600c5461178e9190613c10565b3410156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790614329565b60405180910390fd5b5b8160125f6117dd6121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611824919061416a565b9250508190555060105460125f6118396121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156118c55760105460125f6118876121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6118d66118d06121b0565b83612a8c565b50600160098190555050565b6118ea6121b0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f61195a6121b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a036121b0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a489190613320565b60405180910390a35050565b600b8054611a6190613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8d90613bb3565b8015611ad85780601f10611aaf57610100808354040283529160200191611ad8565b820191905f5260205f20905b815481529060010190602001808311611abb57829003601f168201915b505050505081565b611ae86121b0565b73ffffffffffffffffffffffffffffffffffffffff16611b066112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5390613b00565b60405180910390fd5b80600f8190555050565b60105481565b611b778484846122b7565b611b968373ffffffffffffffffffffffffffffffffffffffff16612aa9565b8015611bab5750611ba984848484612acb565b155b15611be2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611bf3826121b7565b611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c29906143f9565b60405180910390fd5b601160019054906101000a900460ff1615611c7f57611c4f612c16565b611c5883612ca6565b604051602001611c69929190614451565b6040516020818303038152906040529050611d0b565b600b8054611c8c90613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb890613bb3565b8015611d035780601f10611cda57610100808354040283529160200191611d03565b820191905f5260205f20905b815481529060010190602001808311611ce657829003601f168201915b505050505090505b919050565b600a8054611d1d90613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4990613bb3565b8015611d945780601f10611d6b57610100808354040283529160200191611d94565b820191905f5260205f20905b815481529060010190602001808311611d7757829003601f168201915b505050505081565b600d5481565b611daa6121b0565b73ffffffffffffffffffffffffffffffffffffffff16611dc86112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1590613b00565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611ed16121b0565b73ffffffffffffffffffffffffffffffffffffffff16611eef6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90613b00565b60405180910390fd5b611f4f8183612a8c565b5050565b611f5b6121b0565b73ffffffffffffffffffffffffffffffffffffffff16611f796112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690613b00565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361203d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612034906144e4565b60405180910390fd5b612046816129c9565b50565b6120516121b0565b73ffffffffffffffffffffffffffffffffffffffff1661206f6112eb565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90613b00565b60405180910390fd5b80600e8190555050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121a957506121a882612dff565b5b9050919050565b5f33905090565b5f816121c16122af565b111580156121cf57505f5482105b80156121f9575060045f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b5f6122c18261274d565b90508373ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461232b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff1661234b6121b0565b73ffffffffffffffffffffffffffffffffffffffff16148061237a5750612379856123746121b0565b611e3b565b5b806123bf57506123886121b0565b73ffffffffffffffffffffffffffffffffffffffff166123a784610b0a565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123f8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361245d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61246a8585856001612e68565b6124755f8487612200565b600160055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f60045f8581526020019081526020015f20905084815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001850190505f60045f8381526020019081526020015f2090505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036126db575f5482146126da5787815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460200151815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127468585856001612e6e565b5050505050565b612755613235565b5f829050806127626122af565b1115801561277057505f5481105b15612992575f60045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151612990575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461287c5780925050506129c4565b5b60011561298f5781806001900392505060045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461298a5780925050506129c4565b61287d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aa5828260405180602001604052805f815250612e74565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612af06121b0565b8786866040518563ffffffff1660e01b8152600401612b129493929190614554565b6020604051808303815f875af1925050508015612b4d57506040513d601f19601f82011682018060405250810190612b4a91906145b2565b60015b612bc3573d805f8114612b7b576040519150601f19603f3d011682016040523d82523d5f602084013e612b80565b606091505b505f815103612bbb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612c2590613bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054612c5190613bb3565b8015612c9c5780601f10612c7357610100808354040283529160200191612c9c565b820191905f5260205f20905b815481529060010190602001808311612c7f57829003601f168201915b5050505050905090565b60605f8203612cec576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dfa565b5f8290505f5b5f8214612d1b578080612d04906145dd565b915050600a82612d149190613c7e565b9150612cf2565b5f8167ffffffffffffffff811115612d3657612d356136a0565b5b6040519080825280601f01601f191660200182016040528015612d685781602001600182028036833780820191505090505b5090505b5f8514612df357600182612d8091906142ac565b9150600a85612d8f9190614624565b6030612d9b919061416a565b60f81b818381518110612db157612db0614654565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612dec9190613c7e565b9450612d6c565b8093505050505b919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b612e818383836001612e86565b505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ef0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8403612f29576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f355f868387612e68565b8360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f85820190508380156130ef57506130ee8773ffffffffffffffffffffffffffffffffffffffff16612aa9565b5b156131b0575b818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131625f888480600101955088612acb565b613198576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036130f557825f54146131ab575f80fd5b61321a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036131b1575b815f81905550505061322e5f868387612e6e565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132ba81613286565b81146132c4575f80fd5b50565b5f813590506132d5816132b1565b92915050565b5f602082840312156132f0576132ef61327e565b5b5f6132fd848285016132c7565b91505092915050565b5f8115159050919050565b61331a81613306565b82525050565b5f6020820190506133335f830184613311565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61336282613339565b9050919050565b61337281613358565b811461337c575f80fd5b50565b5f8135905061338d81613369565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b6133b381613393565b81146133bd575f80fd5b50565b5f813590506133ce816133aa565b92915050565b5f80604083850312156133ea576133e961327e565b5b5f6133f78582860161337f565b9250506020613408858286016133c0565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61345482613412565b61345e818561341c565b935061346e81856020860161342c565b6134778161343a565b840191505092915050565b5f6020820190508181035f83015261349a818461344a565b905092915050565b5f819050919050565b6134b4816134a2565b81146134be575f80fd5b50565b5f813590506134cf816134ab565b92915050565b5f602082840312156134ea576134e961327e565b5b5f6134f7848285016134c1565b91505092915050565b61350981613358565b82525050565b5f6020820190506135225f830184613500565b92915050565b5f806040838503121561353e5761353d61327e565b5b5f61354b8582860161337f565b925050602061355c858286016134c1565b9150509250929050565b61356f816134a2565b82525050565b5f6020820190506135885f830184613566565b92915050565b61359781613306565b81146135a1575f80fd5b50565b5f813590506135b28161358e565b92915050565b5f602082840312156135cd576135cc61327e565b5b5f6135da848285016135a4565b91505092915050565b5f805f606084860312156135fa576135f961327e565b5b5f6136078682870161337f565b93505060206136188682870161337f565b9250506040613629868287016134c1565b9150509250925092565b5f80604083850312156136495761364861327e565b5b5f613656858286016134c1565b9250506020613667858286016134c1565b9150509250929050565b5f6040820190506136845f830185613500565b6136916020830184613566565b9392505050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6136d68261343a565b810181811067ffffffffffffffff821117156136f5576136f46136a0565b5b80604052505050565b5f613707613275565b905061371382826136cd565b919050565b5f67ffffffffffffffff821115613732576137316136a0565b5b61373b8261343a565b9050602081019050919050565b828183375f83830152505050565b5f61376861376384613718565b6136fe565b9050828152602081018484840111156137845761378361369c565b5b61378f848285613748565b509392505050565b5f82601f8301126137ab576137aa613698565b5b81356137bb848260208601613756565b91505092915050565b5f602082840312156137d9576137d861327e565b5b5f82013567ffffffffffffffff8111156137f6576137f5613282565b5b61380284828501613797565b91505092915050565b5f80fd5b5f80fd5b5f8083601f84011261382857613827613698565b5b8235905067ffffffffffffffff8111156138455761384461380b565b5b6020830191508360018202830111156138615761386061380f565b5b9250929050565b5f806020838503121561387e5761387d61327e565b5b5f83013567ffffffffffffffff81111561389b5761389a613282565b5b6138a785828601613813565b92509250509250929050565b5f602082840312156138c8576138c761327e565b5b5f6138d58482850161337f565b91505092915050565b5f80604083850312156138f4576138f361327e565b5b5f6139018582860161337f565b9250506020613912858286016135a4565b9150509250929050565b5f67ffffffffffffffff821115613936576139356136a0565b5b61393f8261343a565b9050602081019050919050565b5f61395e6139598461391c565b6136fe565b90508281526020810184848401111561397a5761397961369c565b5b613985848285613748565b509392505050565b5f82601f8301126139a1576139a0613698565b5b81356139b184826020860161394c565b91505092915050565b5f805f80608085870312156139d2576139d161327e565b5b5f6139df8782880161337f565b94505060206139f08782880161337f565b9350506040613a01878288016134c1565b925050606085013567ffffffffffffffff811115613a2257613a21613282565b5b613a2e8782880161398d565b91505092959194509250565b5f8060408385031215613a5057613a4f61327e565b5b5f613a5d8582860161337f565b9250506020613a6e8582860161337f565b9150509250929050565b5f8060408385031215613a8e57613a8d61327e565b5b5f613a9b858286016134c1565b9250506020613aac8582860161337f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613aea60208361341c565b9150613af582613ab6565b602082019050919050565b5f6020820190508181035f830152613b1781613ade565b9050919050565b7f46656520657863656564732031303025000000000000000000000000000000005f82015250565b5f613b5260108361341c565b9150613b5d82613b1e565b602082019050919050565b5f6020820190508181035f830152613b7f81613b46565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613bca57607f821691505b602082108103613bdd57613bdc613b86565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613c1a826134a2565b9150613c25836134a2565b9250828202613c33816134a2565b91508282048414831517613c4a57613c49613be3565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613c88826134a2565b9150613c93836134a2565b925082613ca357613ca2613c51565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613ce2601f8361341c565b9150613ced82613cae565b602082019050919050565b5f6020820190508181035f830152613d0f81613cd6565b9050919050565b5f81905092915050565b50565b5f613d2e5f83613d16565b9150613d3982613d20565b5f82019050919050565b5f613d4d82613d23565b9150819050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613db37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d78565b613dbd8683613d78565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613df8613df3613dee846134a2565b613dd5565b6134a2565b9050919050565b5f819050919050565b613e1183613dde565b613e25613e1d82613dff565b848454613d84565b825550505050565b5f90565b613e39613e2d565b613e44818484613e08565b505050565b5b81811015613e6757613e5c5f82613e31565b600181019050613e4a565b5050565b601f821115613eac57613e7d81613d57565b613e8684613d69565b81016020851015613e95578190505b613ea9613ea185613d69565b830182613e49565b50505b505050565b5f82821c905092915050565b5f613ecc5f1984600802613eb1565b1980831691505092915050565b5f613ee48383613ebd565b9150826002028217905092915050565b613efd82613412565b67ffffffffffffffff811115613f1657613f156136a0565b5b613f208254613bb3565b613f2b828285613e6b565b5f60209050601f831160018114613f5c575f8415613f4a578287015190505b613f548582613ed9565b865550613fbb565b601f198416613f6a86613d57565b5f5b82811015613f9157848901518255600182019150602085019450602081019050613f6c565b86831015613fae5784890151613faa601f891682613ebd565b8355505b6001600288020188555050505b505050505050565b5f82905092915050565b613fd78383613fc3565b67ffffffffffffffff811115613ff057613fef6136a0565b5b613ffa8254613bb3565b614005828285613e6b565b5f601f831160018114614032575f8415614020578287013590505b61402a8582613ed9565b865550614091565b601f19841661404086613d57565b5f5b8281101561406757848901358255600182019150602085019450602081019050614042565b868310156140845784890135614080601f891682613ebd565b8355505b6001600288020188555050505b50505050505050565b7f436f6e74726163747320617265206e6f7420616c6c6f776564000000000000005f82015250565b5f6140ce60198361341c565b91506140d98261409a565b602082019050919050565b5f6020820190508181035f8301526140fb816140c2565b9050919050565b7f496e76616c6964206d696e7420616d6f756e74210000000000000000000000005f82015250565b5f61413660148361341c565b915061414182614102565b602082019050919050565b5f6020820190508181035f8301526141638161412a565b9050919050565b5f614174826134a2565b915061417f836134a2565b925082820190508082111561419757614196613be3565b5b92915050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f6141d160148361341c565b91506141dc8261419d565b602082019050919050565b5f6020820190508181035f8301526141fe816141c5565b9050919050565b7f54686520636f6e747261637420697320706175736564210000000000000000005f82015250565b5f61423960178361341c565b915061424482614205565b602082019050919050565b5f6020820190508181035f8301526142668161422d565b9050919050565b5f8151905061427b816134ab565b92915050565b5f602082840312156142965761429561327e565b5b5f6142a38482850161426d565b91505092915050565b5f6142b6826134a2565b91506142c1836134a2565b92508282039050818111156142d9576142d8613be3565b5b92915050565b7f496e73756666696369656e742066756e647321000000000000000000000000005f82015250565b5f61431360138361341c565b915061431e826142df565b602082019050919050565b5f6020820190508181035f83015261434081614307565b9050919050565b7f4d6178206672656520737570706c7920657863656564656421000000000000005f82015250565b5f61437b60198361341c565b915061438682614347565b602082019050919050565b5f6020820190508181035f8301526143a88161436f565b9050919050565b7f55524920646f6573206e6f7420657869737421000000000000000000000000005f82015250565b5f6143e360138361341c565b91506143ee826143af565b602082019050919050565b5f6020820190508181035f830152614410816143d7565b9050919050565b5f81905092915050565b5f61442b82613412565b6144358185614417565b935061444581856020860161342c565b80840191505092915050565b5f61445c8285614421565b91506144688284614421565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6144ce60268361341c565b91506144d982614474565b604082019050919050565b5f6020820190508181035f8301526144fb816144c2565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f61452682614502565b614530818561450c565b935061454081856020860161342c565b6145498161343a565b840191505092915050565b5f6080820190506145675f830187613500565b6145746020830186613500565b6145816040830185613566565b8181036060830152614593818461451c565b905095945050505050565b5f815190506145ac816132b1565b92915050565b5f602082840312156145c7576145c661327e565b5b5f6145d48482850161459e565b91505092915050565b5f6145e7826134a2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361461957614618613be3565b5b600182019050919050565b5f61462e826134a2565b9150614639836134a2565b92508261464957614648613c51565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea26469706673582212204a799b033d5254d8bf28f9b8d74cba1e673f115d5b19b7d272a63cca563955a364736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656965786771676567363377647a62736e6e6b6f327735746a77787a796a6a7a70613334647965343768796b6134356674646c6837692f0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _hiddenMetadataUri (string): ipfs://bafybeiexgqgeg63wdzbsnnko2w5tjwxzyjjzpa34dye47hyka45ftdlh7i/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f6261667962656965786771676567363377647a62736e6e6b6f
Arg [3] : 327735746a77787a796a6a7a70613334647965343768796b6134356674646c68
Arg [4] : 37692f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
47663:4193:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51668:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51205:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32948:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34451:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34014:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47828:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50237:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29084:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35316:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47898:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51431:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;50321:150;;;;;;;;;;;;;:::i;:::-;;35557:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49722:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50505:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48041:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50644:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48010:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32756:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49940:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30204:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7593:103;;;;;;;;;;;;;:::i;:::-;;6942:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47932:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33117:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48355:1036;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34727:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47789:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49803:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47975:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35813:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50866:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47757:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47862:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49634:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35085:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49398:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7851:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50040:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51668:183;51762:4;51797:10;51782:25;;:11;:25;;;;:65;;;;51811:36;51835:11;51811:23;:36::i;:::-;51782:65;51775:72;;51668:183;;;:::o;51205:220::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51319:5:::1;51303:12;:21;;;;51295:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;51371:8;51352:16;;:27;;;;;;;;;;;;;;;;;;51409:12;51386:20;;:35;;;;;;;;;;;;;;;;;;51205:220:::0;;:::o;32948:100::-;33002:13;33035:5;33028:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32948:100;:::o;34451:204::-;34519:7;34544:16;34552:7;34544;:16::i;:::-;34539:64;;34569:34;;;;;;;;;;;;;;34539:64;34623:15;:24;34639:7;34623:24;;;;;;;;;;;;;;;;;;;;;34616:31;;34451:204;;;:::o;34014:371::-;34087:13;34103:24;34119:7;34103:15;:24::i;:::-;34087:40;;34148:5;34142:11;;:2;:11;;;34138:48;;34162:24;;;;;;;;;;;;;;34138:48;34219:5;34203:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34229:37;34246:5;34253:12;:10;:12::i;:::-;34229:16;:37::i;:::-;34228:38;34203:63;34199:138;;;34290:35;;;;;;;;;;;;;;34199:138;34349:28;34358:2;34362:7;34371:5;34349:8;:28::i;:::-;34076:309;34014:371;;:::o;47828:29::-;;;;:::o;50237:77::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50302:6:::1;50293;;:15;;;;;;;;;;;;;;;;;;50237:77:::0;:::o;29084:303::-;29128:7;29353:15;:13;:15::i;:::-;29338:12;;29322:13;;:28;:46;29315:53;;29084:303;:::o;35316:170::-;35450:28;35460:4;35466:2;35470:7;35450:9;:28::i;:::-;35316:170;;;:::o;47898:29::-;;;;:::o;51431:231::-;51519:7;51528;51544:21;51606:5;51582:20;;;;;;;;;;;51569:33;;:10;:33;;;;:::i;:::-;51568:43;;;;:::i;:::-;51544:67;;51626:16;;;;;;;;;;;51644:13;51618:40;;;;;51431:231;;;;;:::o;50321:150::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1916:1:::1;2514:7;;:19:::0;2506:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1916:1;2647:7;:18;;;;50379:7:::2;50400;:5;:7::i;:::-;50392:21;;50421;50392:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50378:69;;;50462:2;50454:11;;;::::0;::::2;;50371:100;1872:1:::1;2826:7;:22;;;;50321:150::o:0;35557:185::-;35695:39;35712:4;35718:2;35722:7;35695:39;;;;;;;;;;;;:16;:39::i;:::-;35557:185;;;:::o;49722:74::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49785:5:::1;49778:4;:12;;;;49722:74:::0;:::o;50505:132::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50613:18:::1;50593:17;:38;;;;;;:::i;:::-;;50505:132:::0;:::o;48041:27::-;;;;;;;;;;;;;:::o;50644:98::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50729:7:::1;;50713:13;:23;;;;;;;:::i;:::-;;50644:98:::0;;:::o;48010:26::-;;;;;;;;;;;;;:::o;32756:125::-;32820:7;32847:21;32860:7;32847:12;:21::i;:::-;:26;;;32840:33;;32756:125;;;:::o;49940:94::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50018:10:::1;50006:9;:22;;;;49940:94:::0;:::o;30204:206::-;30268:7;30309:1;30292:19;;:5;:19;;;30288:60;;30320:28;;;;;;;;;;;;;;30288:60;30374:12;:19;30387:5;30374:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30366:36;;30359:43;;30204:206;;;:::o;7593:103::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7658:30:::1;7685:1;7658:18;:30::i;:::-;7593:103::o:0;6942:87::-;6988:7;7015:6;;;;;;;;;;;7008:13;;6942:87;:::o;50144:::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50217:8:::1;50206;:19;;;;50144:87:::0;:::o;47932:38::-;;;;:::o;33117:104::-;33173:13;33206:7;33199:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33117:104;:::o;48355:1036::-;1916:1;2514:7;;:19;2506:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1916:1;2647:7;:18;;;;48446:10:::1;48433:23;;:9;:23;;;48425:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48515:1;48501:11;:15;:52;;;;;48535:18;;48520:11;:33;;48501:52;48493:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;48624:9;;48609:11;48593:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;48585:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48674:6;;;;;;;;;;;48673:7;48665:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;48715:20;48736:11;48715:32;;48789:8;;48758:4;:14;;;48773:12;:10;:12::i;:::-;48758:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;48754:208;;;48827:8;;48813:12;:22;48809:146;;48876:8;:22;48885:12;:10;:12::i;:::-;48876:22;;;;;;;;;;;;;;;;48865:8;;:33;;;;:::i;:::-;48851:47;;;;;:::i;:::-;;;48809:146;;;48942:1;48929:14;;48809:146;48754:208;48996:12;48989:4;;:19;;;;:::i;:::-;48976:9;:32;;48968:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;49062:10;;49045:13;:11;:13::i;:::-;:27;49041:183;;49107:1;49095:9;:13;49087:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;49179:11;49172:4;;:18;;;;:::i;:::-;49159:9;:31;;49151:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49041:183;49254:11;49230:8;:22;49239:12;:10;:12::i;:::-;49230:22;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;49301:8;;49276;:22;49285:12;:10;:12::i;:::-;49276:22;;;;;;;;;;;;;;;;:33;49272:70;;;49334:8;;49311;:22;49320:12;:10;:12::i;:::-;49311:22;;;;;;;;;;;;;;;:31;;;;49272:70;49349:36;49359:12;:10;:12::i;:::-;49373:11;49349:9;:36::i;:::-;48418:973;1872:1:::0;2826:7;:22;;;;48355:1036;:::o;34727:287::-;34838:12;:10;:12::i;:::-;34826:24;;:8;:24;;;34822:54;;34859:17;;;;;;;;;;;;;;34822:54;34934:8;34889:18;:32;34908:12;:10;:12::i;:::-;34889:32;;;;;;;;;;;;;;;:42;34922:8;34889:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34987:8;34958:48;;34973:12;:10;:12::i;:::-;34958:48;;;34997:8;34958:48;;;;;;:::i;:::-;;;;;;;;34727:287;;:::o;47789:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49803:130::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49908:19:::1;49887:18;:40;;;;49803:130:::0;:::o;47975:27::-;;;;:::o;35813:369::-;35980:28;35990:4;35996:2;36000:7;35980:9;:28::i;:::-;36023:15;:2;:13;;;:15::i;:::-;:76;;;;;36043:56;36074:4;36080:2;36084:7;36093:5;36043:30;:56::i;:::-;36042:57;36023:76;36019:156;;;36123:40;;;;;;;;;;;;;;36019:156;35813:369;;;;:::o;50866:318::-;50940:13;50972:17;50980:8;50972:7;:17::i;:::-;50964:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51029:8;;;;;;;;;;;51025:154;;;51083:10;:8;:10::i;:::-;51095:19;:8;:17;:19::i;:::-;51066:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51052:64;;;;51025:154;51152:17;51145:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50866:318;;;;:::o;47757:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47862:31::-;;;;:::o;49634:81::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49703:6:::1;49692:8;;:17;;;;;;;;;;;;;;;;;;49634:81:::0;:::o;35085:164::-;35182:4;35206:18;:25;35225:5;35206:25;;;;;;;;;;;;;;;:35;35232:8;35206:35;;;;;;;;;;;;;;;;;;;;;;;;;35199:42;;35085:164;;;;:::o;49398:127::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49486:33:::1;49496:9;49507:11;49486:9;:33::i;:::-;49398:127:::0;;:::o;7851:201::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7960:1:::1;7940:22;;:8;:22;;::::0;7932:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8016:28;8035:8;8016:18;:28::i;:::-;7851:201:::0;:::o;50040:98::-;7173:12;:10;:12::i;:::-;7162:23;;:7;:5;:7::i;:::-;:23;;;7154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50121:11:::1;50108:10;:24;;;;50040:98:::0;:::o;29835:305::-;29937:4;29989:25;29974:40;;;:11;:40;;;;:105;;;;30046:33;30031:48;;;:11;:48;;;;29974:105;:158;;;;30096:36;30120:11;30096:23;:36::i;:::-;29974:158;29954:178;;29835:305;;;:::o;5666:98::-;5719:7;5746:10;5739:17;;5666:98;:::o;36437:174::-;36494:4;36537:7;36518:15;:13;:15::i;:::-;:26;;:53;;;;;36558:13;;36548:7;:23;36518:53;:85;;;;;36576:11;:20;36588:7;36576:20;;;;;;;;;;;:27;;;;;;;;;;;;36575:28;36518:85;36511:92;;36437:174;;;:::o;44594:196::-;44736:2;44709:15;:24;44725:7;44709:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44774:7;44770:2;44754:28;;44763:5;44754:28;;;;;;;;;;;;44594:196;;;:::o;49532:95::-;49597:7;49620:1;49613:8;;49532:95;:::o;39537:2130::-;39652:35;39690:21;39703:7;39690:12;:21::i;:::-;39652:59;;39750:4;39728:26;;:13;:18;;;:26;;;39724:67;;39763:28;;;;;;;;;;;;;;39724:67;39804:22;39846:4;39830:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;39867:36;39884:4;39890:12;:10;:12::i;:::-;39867:16;:36::i;:::-;39830:73;:126;;;;39944:12;:10;:12::i;:::-;39920:36;;:20;39932:7;39920:11;:20::i;:::-;:36;;;39830:126;39804:153;;39975:17;39970:66;;40001:35;;;;;;;;;;;;;;39970:66;40065:1;40051:16;;:2;:16;;;40047:52;;40076:23;;;;;;;;;;;;;;40047:52;40112:43;40134:4;40140:2;40144:7;40153:1;40112:21;:43::i;:::-;40220:35;40237:1;40241:7;40250:4;40220:8;:35::i;:::-;40581:1;40551:12;:18;40564:4;40551:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40625:1;40597:12;:16;40610:2;40597:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40643:31;40677:11;:20;40689:7;40677:20;;;;;;;;;;;40643:54;;40728:2;40712:8;:13;;;:18;;;;;;;;;;;;;;;;;;40778:15;40745:8;:23;;;:49;;;;;;;;;;;;;;;;;;41046:19;41078:1;41068:7;:11;41046:33;;41094:31;41128:11;:24;41140:11;41128:24;;;;;;;;;;;41094:58;;41196:1;41171:27;;:8;:13;;;;;;;;;;;;:27;;;41167:384;;41381:13;;41366:11;:28;41362:174;;41435:4;41419:8;:13;;;:20;;;;;;;;;;;;;;;;;;41488:13;:28;;;41462:8;:23;;;:54;;;;;;;;;;;;;;;;;;41362:174;41167:384;40526:1036;;;41598:7;41594:2;41579:27;;41588:4;41579:27;;;;;;;;;;;;41617:42;41638:4;41644:2;41648:7;41657:1;41617:20;:42::i;:::-;39641:2026;;39537:2130;;;:::o;31585:1109::-;31647:21;;:::i;:::-;31681:12;31696:7;31681:22;;31764:4;31745:15;:13;:15::i;:::-;:23;;:47;;;;;31779:13;;31772:4;:20;31745:47;31741:886;;;31813:31;31847:11;:17;31859:4;31847:17;;;;;;;;;;;31813:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31888:9;:16;;;31883:729;;31959:1;31933:28;;:9;:14;;;:28;;;31929:101;;31997:9;31990:16;;;;;;31929:101;32332:261;32339:4;32332:261;;;32372:6;;;;;;;;32417:11;:17;32429:4;32417:17;;;;;;;;;;;32405:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32491:1;32465:28;;:9;:14;;;:28;;;32461:109;;32533:9;32526:16;;;;;;32461:109;32332:261;;;31883:729;31794:833;31741:886;32655:31;;;;;;;;;;;;;;31585:1109;;;;:::o;8212:191::-;8286:16;8305:6;;;;;;;;;;;8286:25;;8331:8;8322:6;;:17;;;;;;;;;;;;;;;;;;8386:8;8355:40;;8376:8;8355:40;;;;;;;;;;;;8275:128;8212:191;:::o;36619:104::-;36688:27;36698:2;36702:8;36688:27;;;;;;;;;;;;:9;:27::i;:::-;36619:104;;:::o;9643:326::-;9703:4;9960:1;9938:7;:19;;;:23;9931:30;;9643:326;;;:::o;45282:667::-;45445:4;45482:2;45466:36;;;45503:12;:10;:12::i;:::-;45517:4;45523:7;45532:5;45466:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45462:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45717:1;45700:6;:13;:18;45696:235;;45746:40;;;;;;;;;;;;;;45696:235;45889:6;45883:13;45874:6;45870:2;45866:15;45859:38;45462:480;45595:45;;;45585:55;;;:6;:55;;;;45578:62;;;45282:667;;;;;;:::o;50749:110::-;50809:13;50840;50833:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50749:110;:::o;3228:723::-;3284:13;3514:1;3505:5;:10;3501:53;;3532:10;;;;;;;;;;;;;;;;;;;;;3501:53;3564:12;3579:5;3564:20;;3595:14;3620:78;3635:1;3627:4;:9;3620:78;;3653:8;;;;;:::i;:::-;;;;3684:2;3676:10;;;;;:::i;:::-;;;3620:78;;;3708:19;3740:6;3730:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3708:39;;3758:154;3774:1;3765:5;:10;3758:154;;3802:1;3792:11;;;;;:::i;:::-;;;3869:2;3861:5;:10;;;;:::i;:::-;3848:2;:24;;;;:::i;:::-;3835:39;;3818:6;3825;3818:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3898:2;3889:11;;;;;:::i;:::-;;;3758:154;;;3936:6;3922:21;;;;;3228:723;;;;:::o;19726:157::-;19811:4;19850:25;19835:40;;;:11;:40;;;;19828:47;;19726:157;;;:::o;46597:159::-;;;;;:::o;47415:158::-;;;;;:::o;37086:163::-;37209:32;37215:2;37219:8;37229:5;37236:4;37209:5;:32::i;:::-;37086:163;;;:::o;37508:1775::-;37647:20;37670:13;;37647:36;;37712:1;37698:16;;:2;:16;;;37694:48;;37723:19;;;;;;;;;;;;;;37694:48;37769:1;37757:8;:13;37753:44;;37779:18;;;;;;;;;;;;;;37753:44;37810:61;37840:1;37844:2;37848:12;37862:8;37810:21;:61::i;:::-;38183:8;38148:12;:16;38161:2;38148:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38247:8;38207:12;:16;38220:2;38207:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38306:2;38273:11;:25;38285:12;38273:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38373:15;38323:11;:25;38335:12;38323:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38406:20;38429:12;38406:35;;38456:11;38485:8;38470:12;:23;38456:37;;38514:4;:23;;;;;38522:15;:2;:13;;;:15::i;:::-;38514:23;38510:641;;;38558:314;38614:12;38610:2;38589:38;;38606:1;38589:38;;;;;;;;;;;;38655:69;38694:1;38698:2;38702:14;;;;;;38718:5;38655:30;:69::i;:::-;38650:174;;38760:40;;;;;;;;;;;;;;38650:174;38867:3;38851:12;:19;38558:314;;38953:12;38936:13;;:29;38932:43;;38967:8;;;38932:43;38510:641;;;39016:120;39072:14;;;;;;39068:2;39047:40;;39064:1;39047:40;;;;;;;;;;;;39131:3;39115:12;:19;39016:120;;38510:641;39181:12;39165:13;:28;;;;38123:1082;;39215:60;39244:1;39248:2;39252:12;39266:8;39215:20;:60::i;:::-;37636:1647;37508:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:139::-;3256:6;3251:3;3246;3240:23;3297:1;3288:6;3283:3;3279:16;3272:27;3167:139;;;:::o;3312:102::-;3353:6;3404:2;3400:7;3395:2;3388:5;3384:14;3380:28;3370:38;;3312:102;;;:::o;3420:377::-;3508:3;3536:39;3569:5;3536:39;:::i;:::-;3591:71;3655:6;3650:3;3591:71;:::i;:::-;3584:78;;3671:65;3729:6;3724:3;3717:4;3710:5;3706:16;3671:65;:::i;:::-;3761:29;3783:6;3761:29;:::i;:::-;3756:3;3752:39;3745:46;;3512:285;3420:377;;;;:::o;3803:313::-;3916:4;3954:2;3943:9;3939:18;3931:26;;4003:9;3997:4;3993:20;3989:1;3978:9;3974:17;3967:47;4031:78;4104:4;4095:6;4031:78;:::i;:::-;4023:86;;3803:313;;;;:::o;4122:77::-;4159:7;4188:5;4177:16;;4122:77;;;:::o;4205:122::-;4278:24;4296:5;4278:24;:::i;:::-;4271:5;4268:35;4258:63;;4317:1;4314;4307:12;4258:63;4205:122;:::o;4333:139::-;4379:5;4417:6;4404:20;4395:29;;4433:33;4460:5;4433:33;:::i;:::-;4333:139;;;;:::o;4478:329::-;4537:6;4586:2;4574:9;4565:7;4561:23;4557:32;4554:119;;;4592:79;;:::i;:::-;4554:119;4712:1;4737:53;4782:7;4773:6;4762:9;4758:22;4737:53;:::i;:::-;4727:63;;4683:117;4478:329;;;;:::o;4813:118::-;4900:24;4918:5;4900:24;:::i;:::-;4895:3;4888:37;4813:118;;:::o;4937:222::-;5030:4;5068:2;5057:9;5053:18;5045:26;;5081:71;5149:1;5138:9;5134:17;5125:6;5081:71;:::i;:::-;4937:222;;;;:::o;5165:474::-;5233:6;5241;5290:2;5278:9;5269:7;5265:23;5261:32;5258:119;;;5296:79;;:::i;:::-;5258:119;5416:1;5441:53;5486:7;5477:6;5466:9;5462:22;5441:53;:::i;:::-;5431:63;;5387:117;5543:2;5569:53;5614:7;5605:6;5594:9;5590:22;5569:53;:::i;:::-;5559:63;;5514:118;5165:474;;;;;:::o;5645:118::-;5732:24;5750:5;5732:24;:::i;:::-;5727:3;5720:37;5645:118;;:::o;5769:222::-;5862:4;5900:2;5889:9;5885:18;5877:26;;5913:71;5981:1;5970:9;5966:17;5957:6;5913:71;:::i;:::-;5769:222;;;;:::o;5997:116::-;6067:21;6082:5;6067:21;:::i;:::-;6060:5;6057:32;6047:60;;6103:1;6100;6093:12;6047:60;5997:116;:::o;6119:133::-;6162:5;6200:6;6187:20;6178:29;;6216:30;6240:5;6216:30;:::i;:::-;6119:133;;;;:::o;6258:323::-;6314:6;6363:2;6351:9;6342:7;6338:23;6334:32;6331:119;;;6369:79;;:::i;:::-;6331:119;6489:1;6514:50;6556:7;6547:6;6536:9;6532:22;6514:50;:::i;:::-;6504:60;;6460:114;6258:323;;;;:::o;6587:619::-;6664:6;6672;6680;6729:2;6717:9;6708:7;6704:23;6700:32;6697:119;;;6735:79;;:::i;:::-;6697:119;6855:1;6880:53;6925:7;6916:6;6905:9;6901:22;6880:53;:::i;:::-;6870:63;;6826:117;6982:2;7008:53;7053:7;7044:6;7033:9;7029:22;7008:53;:::i;:::-;6998:63;;6953:118;7110:2;7136:53;7181:7;7172:6;7161:9;7157:22;7136:53;:::i;:::-;7126:63;;7081:118;6587:619;;;;;:::o;7212:474::-;7280:6;7288;7337:2;7325:9;7316:7;7312:23;7308:32;7305:119;;;7343:79;;:::i;:::-;7305:119;7463:1;7488:53;7533:7;7524:6;7513:9;7509:22;7488:53;:::i;:::-;7478:63;;7434:117;7590:2;7616:53;7661:7;7652:6;7641:9;7637:22;7616:53;:::i;:::-;7606:63;;7561:118;7212:474;;;;;:::o;7692:332::-;7813:4;7851:2;7840:9;7836:18;7828:26;;7864:71;7932:1;7921:9;7917:17;7908:6;7864:71;:::i;:::-;7945:72;8013:2;8002:9;7998:18;7989:6;7945:72;:::i;:::-;7692:332;;;;;:::o;8030:117::-;8139:1;8136;8129:12;8153:117;8262:1;8259;8252:12;8276:180;8324:77;8321:1;8314:88;8421:4;8418:1;8411:15;8445:4;8442:1;8435:15;8462:281;8545:27;8567:4;8545:27;:::i;:::-;8537:6;8533:40;8675:6;8663:10;8660:22;8639:18;8627:10;8624:34;8621:62;8618:88;;;8686:18;;:::i;:::-;8618:88;8726:10;8722:2;8715:22;8505:238;8462:281;;:::o;8749:129::-;8783:6;8810:20;;:::i;:::-;8800:30;;8839:33;8867:4;8859:6;8839:33;:::i;:::-;8749:129;;;:::o;8884:308::-;8946:4;9036:18;9028:6;9025:30;9022:56;;;9058:18;;:::i;:::-;9022:56;9096:29;9118:6;9096:29;:::i;:::-;9088:37;;9180:4;9174;9170:15;9162:23;;8884:308;;;:::o;9198:148::-;9296:6;9291:3;9286;9273:30;9337:1;9328:6;9323:3;9319:16;9312:27;9198:148;;;:::o;9352:425::-;9430:5;9455:66;9471:49;9513:6;9471:49;:::i;:::-;9455:66;:::i;:::-;9446:75;;9544:6;9537:5;9530:21;9582:4;9575:5;9571:16;9620:3;9611:6;9606:3;9602:16;9599:25;9596:112;;;9627:79;;:::i;:::-;9596:112;9717:54;9764:6;9759:3;9754;9717:54;:::i;:::-;9436:341;9352:425;;;;;:::o;9797:340::-;9853:5;9902:3;9895:4;9887:6;9883:17;9879:27;9869:122;;9910:79;;:::i;:::-;9869:122;10027:6;10014:20;10052:79;10127:3;10119:6;10112:4;10104:6;10100:17;10052:79;:::i;:::-;10043:88;;9859:278;9797:340;;;;:::o;10143:509::-;10212:6;10261:2;10249:9;10240:7;10236:23;10232:32;10229:119;;;10267:79;;:::i;:::-;10229:119;10415:1;10404:9;10400:17;10387:31;10445:18;10437:6;10434:30;10431:117;;;10467:79;;:::i;:::-;10431:117;10572:63;10627:7;10618:6;10607:9;10603:22;10572:63;:::i;:::-;10562:73;;10358:287;10143:509;;;;:::o;10658:117::-;10767:1;10764;10757:12;10781:117;10890:1;10887;10880:12;10918:553;10976:8;10986:6;11036:3;11029:4;11021:6;11017:17;11013:27;11003:122;;11044:79;;:::i;:::-;11003:122;11157:6;11144:20;11134:30;;11187:18;11179:6;11176:30;11173:117;;;11209:79;;:::i;:::-;11173:117;11323:4;11315:6;11311:17;11299:29;;11377:3;11369:4;11361:6;11357:17;11347:8;11343:32;11340:41;11337:128;;;11384:79;;:::i;:::-;11337:128;10918:553;;;;;:::o;11477:529::-;11548:6;11556;11605:2;11593:9;11584:7;11580:23;11576:32;11573:119;;;11611:79;;:::i;:::-;11573:119;11759:1;11748:9;11744:17;11731:31;11789:18;11781:6;11778:30;11775:117;;;11811:79;;:::i;:::-;11775:117;11924:65;11981:7;11972:6;11961:9;11957:22;11924:65;:::i;:::-;11906:83;;;;11702:297;11477:529;;;;;:::o;12012:329::-;12071:6;12120:2;12108:9;12099:7;12095:23;12091:32;12088:119;;;12126:79;;:::i;:::-;12088:119;12246:1;12271:53;12316:7;12307:6;12296:9;12292:22;12271:53;:::i;:::-;12261:63;;12217:117;12012:329;;;;:::o;12347:468::-;12412:6;12420;12469:2;12457:9;12448:7;12444:23;12440:32;12437:119;;;12475:79;;:::i;:::-;12437:119;12595:1;12620:53;12665:7;12656:6;12645:9;12641:22;12620:53;:::i;:::-;12610:63;;12566:117;12722:2;12748:50;12790:7;12781:6;12770:9;12766:22;12748:50;:::i;:::-;12738:60;;12693:115;12347:468;;;;;:::o;12821:307::-;12882:4;12972:18;12964:6;12961:30;12958:56;;;12994:18;;:::i;:::-;12958:56;13032:29;13054:6;13032:29;:::i;:::-;13024:37;;13116:4;13110;13106:15;13098:23;;12821:307;;;:::o;13134:423::-;13211:5;13236:65;13252:48;13293:6;13252:48;:::i;:::-;13236:65;:::i;:::-;13227:74;;13324:6;13317:5;13310:21;13362:4;13355:5;13351:16;13400:3;13391:6;13386:3;13382:16;13379:25;13376:112;;;13407:79;;:::i;:::-;13376:112;13497:54;13544:6;13539:3;13534;13497:54;:::i;:::-;13217:340;13134:423;;;;;:::o;13576:338::-;13631:5;13680:3;13673:4;13665:6;13661:17;13657:27;13647:122;;13688:79;;:::i;:::-;13647:122;13805:6;13792:20;13830:78;13904:3;13896:6;13889:4;13881:6;13877:17;13830:78;:::i;:::-;13821:87;;13637:277;13576:338;;;;:::o;13920:943::-;14015:6;14023;14031;14039;14088:3;14076:9;14067:7;14063:23;14059:33;14056:120;;;14095:79;;:::i;:::-;14056:120;14215:1;14240:53;14285:7;14276:6;14265:9;14261:22;14240:53;:::i;:::-;14230:63;;14186:117;14342:2;14368:53;14413:7;14404:6;14393:9;14389:22;14368:53;:::i;:::-;14358:63;;14313:118;14470:2;14496:53;14541:7;14532:6;14521:9;14517:22;14496:53;:::i;:::-;14486:63;;14441:118;14626:2;14615:9;14611:18;14598:32;14657:18;14649:6;14646:30;14643:117;;;14679:79;;:::i;:::-;14643:117;14784:62;14838:7;14829:6;14818:9;14814:22;14784:62;:::i;:::-;14774:72;;14569:287;13920:943;;;;;;;:::o;14869:474::-;14937:6;14945;14994:2;14982:9;14973:7;14969:23;14965:32;14962:119;;;15000:79;;:::i;:::-;14962:119;15120:1;15145:53;15190:7;15181:6;15170:9;15166:22;15145:53;:::i;:::-;15135:63;;15091:117;15247:2;15273:53;15318:7;15309:6;15298:9;15294:22;15273:53;:::i;:::-;15263:63;;15218:118;14869:474;;;;;:::o;15349:::-;15417:6;15425;15474:2;15462:9;15453:7;15449:23;15445:32;15442:119;;;15480:79;;:::i;:::-;15442:119;15600:1;15625:53;15670:7;15661:6;15650:9;15646:22;15625:53;:::i;:::-;15615:63;;15571:117;15727:2;15753:53;15798:7;15789:6;15778:9;15774:22;15753:53;:::i;:::-;15743:63;;15698:118;15349:474;;;;;:::o;15829:182::-;15969:34;15965:1;15957:6;15953:14;15946:58;15829:182;:::o;16017:366::-;16159:3;16180:67;16244:2;16239:3;16180:67;:::i;:::-;16173:74;;16256:93;16345:3;16256:93;:::i;:::-;16374:2;16369:3;16365:12;16358:19;;16017:366;;;:::o;16389:419::-;16555:4;16593:2;16582:9;16578:18;16570:26;;16642:9;16636:4;16632:20;16628:1;16617:9;16613:17;16606:47;16670:131;16796:4;16670:131;:::i;:::-;16662:139;;16389:419;;;:::o;16814:166::-;16954:18;16950:1;16942:6;16938:14;16931:42;16814:166;:::o;16986:366::-;17128:3;17149:67;17213:2;17208:3;17149:67;:::i;:::-;17142:74;;17225:93;17314:3;17225:93;:::i;:::-;17343:2;17338:3;17334:12;17327:19;;16986:366;;;:::o;17358:419::-;17524:4;17562:2;17551:9;17547:18;17539:26;;17611:9;17605:4;17601:20;17597:1;17586:9;17582:17;17575:47;17639:131;17765:4;17639:131;:::i;:::-;17631:139;;17358:419;;;:::o;17783:180::-;17831:77;17828:1;17821:88;17928:4;17925:1;17918:15;17952:4;17949:1;17942:15;17969:320;18013:6;18050:1;18044:4;18040:12;18030:22;;18097:1;18091:4;18087:12;18118:18;18108:81;;18174:4;18166:6;18162:17;18152:27;;18108:81;18236:2;18228:6;18225:14;18205:18;18202:38;18199:84;;18255:18;;:::i;:::-;18199:84;18020:269;17969:320;;;:::o;18295:180::-;18343:77;18340:1;18333:88;18440:4;18437:1;18430:15;18464:4;18461:1;18454:15;18481:410;18521:7;18544:20;18562:1;18544:20;:::i;:::-;18539:25;;18578:20;18596:1;18578:20;:::i;:::-;18573:25;;18633:1;18630;18626:9;18655:30;18673:11;18655:30;:::i;:::-;18644:41;;18834:1;18825:7;18821:15;18818:1;18815:22;18795:1;18788:9;18768:83;18745:139;;18864:18;;:::i;:::-;18745:139;18529:362;18481:410;;;;:::o;18897:180::-;18945:77;18942:1;18935:88;19042:4;19039:1;19032:15;19066:4;19063:1;19056:15;19083:185;19123:1;19140:20;19158:1;19140:20;:::i;:::-;19135:25;;19174:20;19192:1;19174:20;:::i;:::-;19169:25;;19213:1;19203:35;;19218:18;;:::i;:::-;19203:35;19260:1;19257;19253:9;19248:14;;19083:185;;;;:::o;19274:181::-;19414:33;19410:1;19402:6;19398:14;19391:57;19274:181;:::o;19461:366::-;19603:3;19624:67;19688:2;19683:3;19624:67;:::i;:::-;19617:74;;19700:93;19789:3;19700:93;:::i;:::-;19818:2;19813:3;19809:12;19802:19;;19461:366;;;:::o;19833:419::-;19999:4;20037:2;20026:9;20022:18;20014:26;;20086:9;20080:4;20076:20;20072:1;20061:9;20057:17;20050:47;20114:131;20240:4;20114:131;:::i;:::-;20106:139;;19833:419;;;:::o;20258:147::-;20359:11;20396:3;20381:18;;20258:147;;;;:::o;20411:114::-;;:::o;20531:398::-;20690:3;20711:83;20792:1;20787:3;20711:83;:::i;:::-;20704:90;;20803:93;20892:3;20803:93;:::i;:::-;20921:1;20916:3;20912:11;20905:18;;20531:398;;;:::o;20935:379::-;21119:3;21141:147;21284:3;21141:147;:::i;:::-;21134:154;;21305:3;21298:10;;20935:379;;;:::o;21320:141::-;21369:4;21392:3;21384:11;;21415:3;21412:1;21405:14;21449:4;21446:1;21436:18;21428:26;;21320:141;;;:::o;21467:93::-;21504:6;21551:2;21546;21539:5;21535:14;21531:23;21521:33;;21467:93;;;:::o;21566:107::-;21610:8;21660:5;21654:4;21650:16;21629:37;;21566:107;;;;:::o;21679:393::-;21748:6;21798:1;21786:10;21782:18;21821:97;21851:66;21840:9;21821:97;:::i;:::-;21939:39;21969:8;21958:9;21939:39;:::i;:::-;21927:51;;22011:4;22007:9;22000:5;21996:21;21987:30;;22060:4;22050:8;22046:19;22039:5;22036:30;22026:40;;21755:317;;21679:393;;;;;:::o;22078:60::-;22106:3;22127:5;22120:12;;22078:60;;;:::o;22144:142::-;22194:9;22227:53;22245:34;22254:24;22272:5;22254:24;:::i;:::-;22245:34;:::i;:::-;22227:53;:::i;:::-;22214:66;;22144:142;;;:::o;22292:75::-;22335:3;22356:5;22349:12;;22292:75;;;:::o;22373:269::-;22483:39;22514:7;22483:39;:::i;:::-;22544:91;22593:41;22617:16;22593:41;:::i;:::-;22585:6;22578:4;22572:11;22544:91;:::i;:::-;22538:4;22531:105;22449:193;22373:269;;;:::o;22648:73::-;22693:3;22648:73;:::o;22727:189::-;22804:32;;:::i;:::-;22845:65;22903:6;22895;22889:4;22845:65;:::i;:::-;22780:136;22727:189;;:::o;22922:186::-;22982:120;22999:3;22992:5;22989:14;22982:120;;;23053:39;23090:1;23083:5;23053:39;:::i;:::-;23026:1;23019:5;23015:13;23006:22;;22982:120;;;22922:186;;:::o;23114:543::-;23215:2;23210:3;23207:11;23204:446;;;23249:38;23281:5;23249:38;:::i;:::-;23333:29;23351:10;23333:29;:::i;:::-;23323:8;23319:44;23516:2;23504:10;23501:18;23498:49;;;23537:8;23522:23;;23498:49;23560:80;23616:22;23634:3;23616:22;:::i;:::-;23606:8;23602:37;23589:11;23560:80;:::i;:::-;23219:431;;23204:446;23114:543;;;:::o;23663:117::-;23717:8;23767:5;23761:4;23757:16;23736:37;;23663:117;;;;:::o;23786:169::-;23830:6;23863:51;23911:1;23907:6;23899:5;23896:1;23892:13;23863:51;:::i;:::-;23859:56;23944:4;23938;23934:15;23924:25;;23837:118;23786:169;;;;:::o;23960:295::-;24036:4;24182:29;24207:3;24201:4;24182:29;:::i;:::-;24174:37;;24244:3;24241:1;24237:11;24231:4;24228:21;24220:29;;23960:295;;;;:::o;24260:1395::-;24377:37;24410:3;24377:37;:::i;:::-;24479:18;24471:6;24468:30;24465:56;;;24501:18;;:::i;:::-;24465:56;24545:38;24577:4;24571:11;24545:38;:::i;:::-;24630:67;24690:6;24682;24676:4;24630:67;:::i;:::-;24724:1;24748:4;24735:17;;24780:2;24772:6;24769:14;24797:1;24792:618;;;;25454:1;25471:6;25468:77;;;25520:9;25515:3;25511:19;25505:26;25496:35;;25468:77;25571:67;25631:6;25624:5;25571:67;:::i;:::-;25565:4;25558:81;25427:222;24762:887;;24792:618;24844:4;24840:9;24832:6;24828:22;24878:37;24910:4;24878:37;:::i;:::-;24937:1;24951:208;24965:7;24962:1;24959:14;24951:208;;;25044:9;25039:3;25035:19;25029:26;25021:6;25014:42;25095:1;25087:6;25083:14;25073:24;;25142:2;25131:9;25127:18;25114:31;;24988:4;24985:1;24981:12;24976:17;;24951:208;;;25187:6;25178:7;25175:19;25172:179;;;25245:9;25240:3;25236:19;25230:26;25288:48;25330:4;25322:6;25318:17;25307:9;25288:48;:::i;:::-;25280:6;25273:64;25195:156;25172:179;25397:1;25393;25385:6;25381:14;25377:22;25371:4;25364:36;24799:611;;;24762:887;;24352:1303;;;24260:1395;;:::o;25661:97::-;25720:6;25748:3;25738:13;;25661:97;;;;:::o;25764:1403::-;25888:44;25928:3;25923;25888:44;:::i;:::-;25997:18;25989:6;25986:30;25983:56;;;26019:18;;:::i;:::-;25983:56;26063:38;26095:4;26089:11;26063:38;:::i;:::-;26148:67;26208:6;26200;26194:4;26148:67;:::i;:::-;26242:1;26271:2;26263:6;26260:14;26288:1;26283:632;;;;26959:1;26976:6;26973:84;;;27032:9;27027:3;27023:19;27010:33;27001:42;;26973:84;27083:67;27143:6;27136:5;27083:67;:::i;:::-;27077:4;27070:81;26932:229;26253:908;;26283:632;26335:4;26331:9;26323:6;26319:22;26369:37;26401:4;26369:37;:::i;:::-;26428:1;26442:215;26456:7;26453:1;26450:14;26442:215;;;26542:9;26537:3;26533:19;26520:33;26512:6;26505:49;26593:1;26585:6;26581:14;26571:24;;26640:2;26629:9;26625:18;26612:31;;26479:4;26476:1;26472:12;26467:17;;26442:215;;;26685:6;26676:7;26673:19;26670:186;;;26750:9;26745:3;26741:19;26728:33;26793:48;26835:4;26827:6;26823:17;26812:9;26793:48;:::i;:::-;26785:6;26778:64;26693:163;26670:186;26902:1;26898;26890:6;26886:14;26882:22;26876:4;26869:36;26290:625;;;26253:908;;25863:1304;;;25764:1403;;;:::o;27173:175::-;27313:27;27309:1;27301:6;27297:14;27290:51;27173:175;:::o;27354:366::-;27496:3;27517:67;27581:2;27576:3;27517:67;:::i;:::-;27510:74;;27593:93;27682:3;27593:93;:::i;:::-;27711:2;27706:3;27702:12;27695:19;;27354:366;;;:::o;27726:419::-;27892:4;27930:2;27919:9;27915:18;27907:26;;27979:9;27973:4;27969:20;27965:1;27954:9;27950:17;27943:47;28007:131;28133:4;28007:131;:::i;:::-;27999:139;;27726:419;;;:::o;28151:170::-;28291:22;28287:1;28279:6;28275:14;28268:46;28151:170;:::o;28327:366::-;28469:3;28490:67;28554:2;28549:3;28490:67;:::i;:::-;28483:74;;28566:93;28655:3;28566:93;:::i;:::-;28684:2;28679:3;28675:12;28668:19;;28327:366;;;:::o;28699:419::-;28865:4;28903:2;28892:9;28888:18;28880:26;;28952:9;28946:4;28942:20;28938:1;28927:9;28923:17;28916:47;28980:131;29106:4;28980:131;:::i;:::-;28972:139;;28699:419;;;:::o;29124:191::-;29164:3;29183:20;29201:1;29183:20;:::i;:::-;29178:25;;29217:20;29235:1;29217:20;:::i;:::-;29212:25;;29260:1;29257;29253:9;29246:16;;29281:3;29278:1;29275:10;29272:36;;;29288:18;;:::i;:::-;29272:36;29124:191;;;;:::o;29321:170::-;29461:22;29457:1;29449:6;29445:14;29438:46;29321:170;:::o;29497:366::-;29639:3;29660:67;29724:2;29719:3;29660:67;:::i;:::-;29653:74;;29736:93;29825:3;29736:93;:::i;:::-;29854:2;29849:3;29845:12;29838:19;;29497:366;;;:::o;29869:419::-;30035:4;30073:2;30062:9;30058:18;30050:26;;30122:9;30116:4;30112:20;30108:1;30097:9;30093:17;30086:47;30150:131;30276:4;30150:131;:::i;:::-;30142:139;;29869:419;;;:::o;30294:173::-;30434:25;30430:1;30422:6;30418:14;30411:49;30294:173;:::o;30473:366::-;30615:3;30636:67;30700:2;30695:3;30636:67;:::i;:::-;30629:74;;30712:93;30801:3;30712:93;:::i;:::-;30830:2;30825:3;30821:12;30814:19;;30473:366;;;:::o;30845:419::-;31011:4;31049:2;31038:9;31034:18;31026:26;;31098:9;31092:4;31088:20;31084:1;31073:9;31069:17;31062:47;31126:131;31252:4;31126:131;:::i;:::-;31118:139;;30845:419;;;:::o;31270:143::-;31327:5;31358:6;31352:13;31343:22;;31374:33;31401:5;31374:33;:::i;:::-;31270:143;;;;:::o;31419:351::-;31489:6;31538:2;31526:9;31517:7;31513:23;31509:32;31506:119;;;31544:79;;:::i;:::-;31506:119;31664:1;31689:64;31745:7;31736:6;31725:9;31721:22;31689:64;:::i;:::-;31679:74;;31635:128;31419:351;;;;:::o;31776:194::-;31816:4;31836:20;31854:1;31836:20;:::i;:::-;31831:25;;31870:20;31888:1;31870:20;:::i;:::-;31865:25;;31914:1;31911;31907:9;31899:17;;31938:1;31932:4;31929:11;31926:37;;;31943:18;;:::i;:::-;31926:37;31776:194;;;;:::o;31976:169::-;32116:21;32112:1;32104:6;32100:14;32093:45;31976:169;:::o;32151:366::-;32293:3;32314:67;32378:2;32373:3;32314:67;:::i;:::-;32307:74;;32390:93;32479:3;32390:93;:::i;:::-;32508:2;32503:3;32499:12;32492:19;;32151:366;;;:::o;32523:419::-;32689:4;32727:2;32716:9;32712:18;32704:26;;32776:9;32770:4;32766:20;32762:1;32751:9;32747:17;32740:47;32804:131;32930:4;32804:131;:::i;:::-;32796:139;;32523:419;;;:::o;32948:175::-;33088:27;33084:1;33076:6;33072:14;33065:51;32948:175;:::o;33129:366::-;33271:3;33292:67;33356:2;33351:3;33292:67;:::i;:::-;33285:74;;33368:93;33457:3;33368:93;:::i;:::-;33486:2;33481:3;33477:12;33470:19;;33129:366;;;:::o;33501:419::-;33667:4;33705:2;33694:9;33690:18;33682:26;;33754:9;33748:4;33744:20;33740:1;33729:9;33725:17;33718:47;33782:131;33908:4;33782:131;:::i;:::-;33774:139;;33501:419;;;:::o;33926:169::-;34066:21;34062:1;34054:6;34050:14;34043:45;33926:169;:::o;34101:366::-;34243:3;34264:67;34328:2;34323:3;34264:67;:::i;:::-;34257:74;;34340:93;34429:3;34340:93;:::i;:::-;34458:2;34453:3;34449:12;34442:19;;34101:366;;;:::o;34473:419::-;34639:4;34677:2;34666:9;34662:18;34654:26;;34726:9;34720:4;34716:20;34712:1;34701:9;34697:17;34690:47;34754:131;34880:4;34754:131;:::i;:::-;34746:139;;34473:419;;;:::o;34898:148::-;35000:11;35037:3;35022:18;;34898:148;;;;:::o;35052:390::-;35158:3;35186:39;35219:5;35186:39;:::i;:::-;35241:89;35323:6;35318:3;35241:89;:::i;:::-;35234:96;;35339:65;35397:6;35392:3;35385:4;35378:5;35374:16;35339:65;:::i;:::-;35429:6;35424:3;35420:16;35413:23;;35162:280;35052:390;;;;:::o;35448:435::-;35628:3;35650:95;35741:3;35732:6;35650:95;:::i;:::-;35643:102;;35762:95;35853:3;35844:6;35762:95;:::i;:::-;35755:102;;35874:3;35867:10;;35448:435;;;;;:::o;35889:225::-;36029:34;36025:1;36017:6;36013:14;36006:58;36098:8;36093:2;36085:6;36081:15;36074:33;35889:225;:::o;36120:366::-;36262:3;36283:67;36347:2;36342:3;36283:67;:::i;:::-;36276:74;;36359:93;36448:3;36359:93;:::i;:::-;36477:2;36472:3;36468:12;36461:19;;36120:366;;;:::o;36492:419::-;36658:4;36696:2;36685:9;36681:18;36673:26;;36745:9;36739:4;36735:20;36731:1;36720:9;36716:17;36709:47;36773:131;36899:4;36773:131;:::i;:::-;36765:139;;36492:419;;;:::o;36917:98::-;36968:6;37002:5;36996:12;36986:22;;36917:98;;;:::o;37021:168::-;37104:11;37138:6;37133:3;37126:19;37178:4;37173:3;37169:14;37154:29;;37021:168;;;;:::o;37195:373::-;37281:3;37309:38;37341:5;37309:38;:::i;:::-;37363:70;37426:6;37421:3;37363:70;:::i;:::-;37356:77;;37442:65;37500:6;37495:3;37488:4;37481:5;37477:16;37442:65;:::i;:::-;37532:29;37554:6;37532:29;:::i;:::-;37527:3;37523:39;37516:46;;37285:283;37195:373;;;;:::o;37574:640::-;37769:4;37807:3;37796:9;37792:19;37784:27;;37821:71;37889:1;37878:9;37874:17;37865:6;37821:71;:::i;:::-;37902:72;37970:2;37959:9;37955:18;37946:6;37902:72;:::i;:::-;37984;38052:2;38041:9;38037:18;38028:6;37984:72;:::i;:::-;38103:9;38097:4;38093:20;38088:2;38077:9;38073:18;38066:48;38131:76;38202:4;38193:6;38131:76;:::i;:::-;38123:84;;37574:640;;;;;;;:::o;38220:141::-;38276:5;38307:6;38301:13;38292:22;;38323:32;38349:5;38323:32;:::i;:::-;38220:141;;;;:::o;38367:349::-;38436:6;38485:2;38473:9;38464:7;38460:23;38456:32;38453:119;;;38491:79;;:::i;:::-;38453:119;38611:1;38636:63;38691:7;38682:6;38671:9;38667:22;38636:63;:::i;:::-;38626:73;;38582:127;38367:349;;;;:::o;38722:233::-;38761:3;38784:24;38802:5;38784:24;:::i;:::-;38775:33;;38830:66;38823:5;38820:77;38817:103;;38900:18;;:::i;:::-;38817:103;38947:1;38940:5;38936:13;38929:20;;38722:233;;;:::o;38961:176::-;38993:1;39010:20;39028:1;39010:20;:::i;:::-;39005:25;;39044:20;39062:1;39044:20;:::i;:::-;39039:25;;39083:1;39073:35;;39088:18;;:::i;:::-;39073:35;39129:1;39126;39122:9;39117:14;;38961:176;;;;:::o;39143:180::-;39191:77;39188:1;39181:88;39288:4;39285:1;39278:15;39312:4;39309:1;39302:15
Swarm Source
ipfs://4a799b033d5254d8bf28f9b8d74cba1e673f115d5b19b7d272a63cca563955a3
[ 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.