Overview
POL Balance
0 POL
POL Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Sponsored
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 52426299 | 240 days ago | IN | 0 POL | 0.2184899 |
Loading...
Loading
Contract Name:
ERC721ArtToken
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2024-01-17 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; 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_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @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 `IERC721Receiver.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 (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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 (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; /** * @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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev 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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; /** * @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: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.20; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.20; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint256 tokenId => address) private _owners; mapping(address owner => uint256) private _balances; mapping(uint256 tokenId => address) private _tokenApprovals; mapping(address owner => mapping(address operator => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual returns (uint256) { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { return _requireOwned(tokenId); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string.concat(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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual { _approve(to, tokenId, _msgSender()); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. address previousOwner = _update(to, tokenId, _msgSender()); if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { transferFrom(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist * * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`. */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. */ function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId]; } /** * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * particular (ignoring whether it is owned by `owner`). * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { return spender != address(0) && (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); } /** * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets * the `spender` for the specific `tokenId`. * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { if (!_isAuthorized(owner, spender, tokenId)) { if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } else { revert ERC721InsufficientApproval(spender, tokenId); } } } /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. * * WARNING: Increasing an account's balance using this function tends to be paired with an override of the * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership * remain consistent with one another. */ function _increaseBalance(address account, uint128 value) internal virtual { unchecked { _balances[account] += value; } } /** * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. * * The `auth` argument is optional. If the value passed is non 0, then this function will check that * `auth` is either the owner of the token, or approved to operate on the token (by the owner). * * Emits a {Transfer} event. * * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. */ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { address from = _ownerOf(tokenId); // Perform (optional) operator check if (auth != address(0)) { _checkAuthorized(from, auth, tokenId); } // Execute the update if (from != address(0)) { // Clear approval. No need to re-authorize or emit the Approval event _approve(address(0), tokenId, address(0), false); unchecked { _balances[from] -= 1; } } if (to != address(0)) { unchecked { _balances[to] += 1; } } _owners[tokenId] = to; emit Transfer(from, to, tokenId); return from; } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner != address(0)) { revert ERC721InvalidSender(address(0)); } } /** * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); _checkOnERC721Received(address(0), to, tokenId, data); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal { address previousOwner = _update(address(0), tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } else if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients * are aware of the ERC721 standard to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is like {safeTransferFrom} in the sense that it invokes * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `tokenId` token must exist and be owned by `from`. * - `to` cannot be the zero address. * - `from` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId) internal { _safeTransfer(from, to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is * either the owner of the token, or approved to operate on all tokens held by this owner. * * Emits an {Approval} event. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address to, uint256 tokenId, address auth) internal { _approve(to, tokenId, auth, true); } /** * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not * emitted in the context of transfers. */ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { // Avoid reading the owner unless necessary if (emitEvent || auth != address(0)) { address owner = _requireOwned(tokenId); // We do not use _isAuthorized because single-token approvals should not be able to call approve if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { revert ERC721InvalidApprover(auth); } if (emitEvent) { emit Approval(owner, to, tokenId); } } _tokenApprovals[tokenId] = to; } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Requirements: * - operator can't be the address zero. * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { if (operator == address(0)) { revert ERC721InvalidOperator(operator); } _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). * Returns the owner. * * Overrides to ownership logic should be done to {_ownerOf}. */ function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf(tokenId); if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } return owner; } /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { if (retval != IERC721Receiver.onERC721Received.selector) { revert ERC721InvalidReceiver(to); } } catch (bytes memory reason) { if (reason.length == 0) { revert ERC721InvalidReceiver(to); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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: contracts/ERC721ArtToken.sol pragma solidity ^0.8.20; /** * @title ERC721ArtToken * @dev ERC721 token contract for Sztuka NFT dla 32. Finału WOŚP. */ contract ERC721ArtToken is ERC721, IERC2981, Ownable { using Math for uint256; using Strings for uint256; string private _metadataUriPrefix; address private _beneficiary; uint96 constant ROYALTIES_PERCENT = 10; /** * @dev The wallet is invalid (zero address). */ error ERC721ArtTokenInvalidWallet(); /** * @dev The token count is invalid (cannot be zero). */ error ERC721ArtTokenInvalidTokenCount(); /** * @dev The sale price is invalid (cannot be zero). */ error ERC721ArtTokenInvalidSalePrice(); /** * @dev Token identified by `identifier` does not exist. */ error ERC721ArtTokenIdentifierDoesNotExist(uint256 identifier); /** * @dev Value is the same as current one. */ error ERC721ArtTokenTheSameValue(); /** * @dev Creates token instance with royalties beneficiary address set to `beneficiary`, metadata URI prefix set to `metadataUriPrefix` and mints `count` of tokens to `wallet`. */ constructor(address beneficiary, address wallet, string memory metadataUriPrefix, uint96 count) ERC721("Sztuka NFT dla 32. Finalu WOSP", "WOSP2024ART") Ownable(_msgSender()) { if (wallet == address(0)) { revert ERC721ArtTokenInvalidWallet(); } if (count == 0) { revert ERC721ArtTokenInvalidTokenCount(); } _beneficiary = beneficiary; _metadataUriPrefix = metadataUriPrefix; for (uint i = 1; i <= count; ++i) { _mint(wallet, i); } } /** * @dev Requires that a token with given `identifier` exists. */ modifier onlyExistingToken(uint256 identifier) { if (_ownerOf(identifier) == address(0)) { revert ERC721ArtTokenIdentifierDoesNotExist(identifier); } _; } /** * @dev Sets royalties beneficiary to `beneficiary`. */ function setBeneficiary(address beneficiary) external onlyOwner { if (beneficiary == _beneficiary) { revert ERC721ArtTokenTheSameValue(); } _beneficiary = beneficiary; } /** * @dev Sets metadata URI prefix to `metadataUriPrefix`. */ function setMetadataUriPrefix(string calldata metadataUriPrefix) external onlyOwner { if (keccak256(abi.encodePacked(metadataUriPrefix)) == keccak256(abi.encodePacked(_metadataUriPrefix))) { revert ERC721ArtTokenTheSameValue(); } _metadataUriPrefix = metadataUriPrefix; } /** * @dev Returns metadata URI for given `identifier`. */ function tokenURI(uint256 identifier) public view override onlyExistingToken(identifier) returns (string memory) { return string(abi.encodePacked(_metadataUriPrefix, identifier.toString(), ".json")); } /** * @dev See {IERC2981-royaltyInfo}. */ function royaltyInfo(uint256 identifier, uint256 salePrice) public view override onlyExistingToken(identifier) returns (address, uint256) { if (salePrice == 0) { revert ERC721ArtTokenInvalidSalePrice(); } if (_beneficiary == address(0)) { return (_beneficiary, 0); } return (_beneficiary, salePrice.mulDiv(ROYALTIES_PERCENT, 100)); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceIdentifier) public view override(ERC721, IERC165) returns (bool) { return interfaceIdentifier == type(IERC2981).interfaceId || super.supportsInterface(interfaceIdentifier); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"string","name":"metadataUriPrefix","type":"string"},{"internalType":"uint96","name":"count","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"identifier","type":"uint256"}],"name":"ERC721ArtTokenIdentifierDoesNotExist","type":"error"},{"inputs":[],"name":"ERC721ArtTokenInvalidSalePrice","type":"error"},{"inputs":[],"name":"ERC721ArtTokenInvalidTokenCount","type":"error"},{"inputs":[],"name":"ERC721ArtTokenInvalidWallet","type":"error"},{"inputs":[],"name":"ERC721ArtTokenTheSameValue","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[],"name":"MathOverflowedMulDiv","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"identifier","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":"address","name":"beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadataUriPrefix","type":"string"}],"name":"setMetadataUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceIdentifier","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":"identifier","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801562000010575f80fd5b5060405162003a9538038062003a95833981810160405281019062000036919062000dd2565b62000046620002a960201b60201c565b6040518060400160405280601e81526020017f537a74756b61204e465420646c612033322e2046696e616c7520574f535000008152506040518060400160405280600b81526020017f574f535032303234415254000000000000000000000000000000000000000000815250815f9081620000c2919062001097565b508060019081620000d4919062001097565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200014a575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200014191906200118c565b60405180910390fd5b6200015b81620002b060201b60201c565b505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620001c2576040517fce0f544500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f816bffffffffffffffffffffffff16036200020a576040517f93a0e59900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600790816200025b919062001097565b505f600190505b816bffffffffffffffffffffffff1681116200029e576200028a84826200037360201b60201c565b806200029690620011d4565b905062000262565b505050505062001277565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003e6575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401620003dd91906200118c565b60405180910390fd5b5f620003fa83835f6200047460201b60201c565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146200046f575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016200046691906200118c565b60405180910390fd5b505050565b5f8062000487846200069a60201b60201c565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620004d157620004d0818486620006d360201b60201c565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146200056557620005195f855f80620007a460201b60201c565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614620005e557600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b620006e68383836200097b60201b60201c565b6200079f575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200075e57806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040162000755919062001231565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401620007969291906200124c565b60405180910390fd5b505050565b8080620007dd57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1562000926575f620007f58462000a4e60201b60201c565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156200086057508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156200087c57506200087a818462000adf60201b60201c565b155b15620008c157826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401620008b891906200118c565b60405180910390fd5b81156200092457838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000a4557508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480620009fd5750620009fc848462000adf60201b60201c565b5b8062000a4457508273ffffffffffffffffffffffffffffffffffffffff1662000a2c8362000b6d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f8062000a61836200069a60201b60201c565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000ad657826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040162000acd919062001231565b60405180910390fd5b80915050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000be28262000bb7565b9050919050565b62000bf48162000bd6565b811462000bff575f80fd5b50565b5f8151905062000c128162000be9565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62000c688262000c20565b810181811067ffffffffffffffff8211171562000c8a5762000c8962000c30565b5b80604052505050565b5f62000c9e62000ba6565b905062000cac828262000c5d565b919050565b5f67ffffffffffffffff82111562000cce5762000ccd62000c30565b5b62000cd98262000c20565b9050602081019050919050565b5f5b8381101562000d0557808201518184015260208101905062000ce8565b5f8484015250505050565b5f62000d2662000d208462000cb1565b62000c93565b90508281526020810184848401111562000d455762000d4462000c1c565b5b62000d5284828562000ce6565b509392505050565b5f82601f83011262000d715762000d7062000c18565b5b815162000d8384826020860162000d10565b91505092915050565b5f6bffffffffffffffffffffffff82169050919050565b62000dae8162000d8c565b811462000db9575f80fd5b50565b5f8151905062000dcc8162000da3565b92915050565b5f805f806080858703121562000ded5762000dec62000baf565b5b5f62000dfc8782880162000c02565b945050602062000e0f8782880162000c02565b935050604085015167ffffffffffffffff81111562000e335762000e3262000bb3565b5b62000e418782880162000d5a565b925050606062000e548782880162000dbc565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000eaf57607f821691505b60208210810362000ec55762000ec462000e6a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000f297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000eec565b62000f35868362000eec565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000f7f62000f7962000f738462000f4d565b62000f56565b62000f4d565b9050919050565b5f819050919050565b62000f9a8362000f5f565b62000fb262000fa98262000f86565b84845462000ef8565b825550505050565b5f90565b62000fc862000fba565b62000fd581848462000f8f565b505050565b5b8181101562000ffc5762000ff05f8262000fbe565b60018101905062000fdb565b5050565b601f8211156200104b57620010158162000ecb565b620010208462000edd565b8101602085101562001030578190505b620010486200103f8562000edd565b83018262000fda565b50505b505050565b5f82821c905092915050565b5f6200106d5f198460080262001050565b1980831691505092915050565b5f6200108783836200105c565b9150826002028217905092915050565b620010a28262000e60565b67ffffffffffffffff811115620010be57620010bd62000c30565b5b620010ca825462000e97565b620010d782828562001000565b5f60209050601f8311600181146200110d575f8415620010f8578287015190505b6200110485826200107a565b86555062001173565b601f1984166200111d8662000ecb565b5f5b8281101562001146578489015182556001820191506020850194506020810190506200111f565b8683101562001166578489015162001162601f8916826200105c565b8355505b6001600288020188555050505b505050505050565b620011868162000bd6565b82525050565b5f602082019050620011a15f8301846200117b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620011e08262000f4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620012155762001214620011a7565b5b600182019050919050565b6200122b8162000f4d565b82525050565b5f602082019050620012465f83018462001220565b92915050565b5f604082019050620012615f8301856200117b565b62001270602083018462001220565b9392505050565b61281080620012855f395ff3fe608060405234801561000f575f80fd5b506004361061011f575f3560e01c806370a08231116100ab578063ad2628cd1161006f578063ad2628cd14610304578063b88d4fde14610320578063c87b56dd1461033c578063e985e9c51461036c578063f2fde38b1461039c5761011f565b806370a0823114610272578063715018a6146102a25780638da5cb5b146102ac57806395d89b41146102ca578063a22cb465146102e85761011f565b80631c31f710116100f25780631c31f710146101bd57806323b872dd146101d95780632a55205a146101f557806342842e0e146102265780636352211e146102425761011f565b806301ffc9a71461012357806306fdde0314610153578063081812fc14610171578063095ea7b3146101a1575b5f80fd5b61013d60048036038101906101389190611c20565b6103b8565b60405161014a9190611c65565b60405180910390f35b61015b610431565b6040516101689190611d08565b60405180910390f35b61018b60048036038101906101869190611d5b565b6104c0565b6040516101989190611dc5565b60405180910390f35b6101bb60048036038101906101b69190611e08565b6104db565b005b6101d760048036038101906101d29190611e46565b6104f1565b005b6101f360048036038101906101ee9190611e71565b6105c2565b005b61020f600480360381019061020a9190611ec1565b6106c1565b60405161021d929190611f0e565b60405180910390f35b610240600480360381019061023b9190611e71565b610849565b005b61025c60048036038101906102579190611d5b565b610868565b6040516102699190611dc5565b60405180910390f35b61028c60048036038101906102879190611e46565b610879565b6040516102999190611f35565b60405180910390f35b6102aa61092f565b005b6102b4610942565b6040516102c19190611dc5565b60405180910390f35b6102d261096a565b6040516102df9190611d08565b60405180910390f35b61030260048036038101906102fd9190611f78565b6109fa565b005b61031e60048036038101906103199190612017565b610a10565b005b61033a6004803603810190610335919061218a565b610ab6565b005b61035660048036038101906103519190611d5b565b610ad3565b6040516103639190611d08565b60405180910390f35b6103866004803603810190610381919061220a565b610b81565b6040516103939190611c65565b60405180910390f35b6103b660048036038101906103b19190611e46565b610c0f565b005b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061042a575061042982610c93565b5b9050919050565b60605f805461043f90612275565b80601f016020809104026020016040519081016040528092919081815260200182805461046b90612275565b80156104b65780601f1061048d576101008083540402835291602001916104b6565b820191905f5260205f20905b81548152906001019060200180831161049957829003601f168201915b5050505050905090565b5f6104ca82610d74565b506104d482610dfa565b9050919050565b6104ed82826104e8610e33565b610e3a565b5050565b6104f9610e4c565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361057f576040517fbaad5d3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610632575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016106299190611dc5565b60405180910390fd5b5f6106458383610640610e33565b610ed3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106bb578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016106b2939291906122a5565b60405180910390fd5b50505050565b5f80835f73ffffffffffffffffffffffffffffffffffffffff166106e4826110de565b73ffffffffffffffffffffffffffffffffffffffff160361073c57806040517f7e0d3fb10000000000000000000000000000000000000000000000000000000081526004016107339190611f35565b60405180910390fd5b5f8403610775576040517f75a2409100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036107f55760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f92509250610841565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661083c600a6bffffffffffffffffffffffff166064876111179092919063ffffffff16565b925092505b509250929050565b61086383838360405180602001604052805f815250610ab6565b505050565b5f61087282610d74565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ea575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016108e19190611dc5565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610937610e4c565b6109405f611216565b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461097990612275565b80601f01602080910402602001604051908101604052809291908181526020018280546109a590612275565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b610a0c610a05610e33565b83836112d9565b5050565b610a18610e4c565b6007604051602001610a2a9190612376565b604051602081830303815290604052805190602001208282604051602001610a539291906123b0565b6040516020818303038152906040528051906020012003610aa0576040517fbaad5d3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160079182610ab192919061255d565b505050565b610ac18484846105c2565b610acd84848484611442565b50505050565b6060815f73ffffffffffffffffffffffffffffffffffffffff16610af6826110de565b73ffffffffffffffffffffffffffffffffffffffff1603610b4e57806040517f7e0d3fb1000000000000000000000000000000000000000000000000000000008152600401610b459190611f35565b60405180910390fd5b6007610b59846115f4565b604051602001610b6a9291906126a4565b604051602081830303815290604052915050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b610c17610e4c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c87575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610c7e9190611dc5565b60405180910390fd5b610c9081611216565b50565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d5d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d6d5750610d6c826116be565b5b9050919050565b5f80610d7f836110de565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610df157826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610de89190611f35565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b610e478383836001611727565b505050565b610e54610e33565b73ffffffffffffffffffffffffffffffffffffffff16610e72610942565b73ffffffffffffffffffffffffffffffffffffffff1614610ed157610e95610e33565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ec89190611dc5565b60405180910390fd5b565b5f80610ede846110de565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610f1f57610f1e8184866118e6565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610faa57610f5e5f855f80611727565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461102957600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f8083850290505f8019858709828110838203039150505f810361114f57838281611145576111446126d2565b5b049250505061120f565b808411611188576040517f227bc15300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8486880990508281118203915080830392505f855f038616905080860495508084049350600181825f0304019050808302841793505f600287600302189050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050505b9392505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361134957816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016113409190611dc5565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114359190611c65565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b11156115ee578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611485610e33565b8685856040518563ffffffff1660e01b81526004016114a79493929190612751565b6020604051808303815f875af19250505080156114e257506040513d601f19601f820116820180604052508101906114df91906127af565b60015b611563573d805f8114611510576040519150601f19603f3d011682016040523d82523d5f602084013e611515565b606091505b505f81510361155b57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016115529190611dc5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146115ec57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016115e39190611dc5565b60405180910390fd5b505b50505050565b60605f6001611602846119a9565b0190505f8167ffffffffffffffff8111156116205761161f612066565b5b6040519080825280601f01601f1916602001820160405280156116525781602001600182028036833780820191505090505b5090505f82602001820190505b6001156116b3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816116a8576116a76126d2565b5b0494505f850361165f575b819350505050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b808061175f57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611891575f61176e84610d74565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156117d857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156117eb57506117e98184610b81565b155b1561182d57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016118249190611dc5565b60405180910390fd5b811561188f57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6118f1838383611afa565b6119a4575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361196557806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161195c9190611f35565b60405180910390fd5b81816040517f177e802f00000000000000000000000000000000000000000000000000000000815260040161199b929190611f0e565b60405180910390fd5b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a05577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816119fb576119fa6126d2565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611a42576d04ee2d6d415b85acef81000000008381611a3857611a376126d2565b5b0492506020810190505b662386f26fc100008310611a7157662386f26fc100008381611a6757611a666126d2565b5b0492506010810190505b6305f5e1008310611a9a576305f5e1008381611a9057611a8f6126d2565b5b0492506008810190505b6127108310611abf576127108381611ab557611ab46126d2565b5b0492506004810190505b60648310611ae25760648381611ad857611ad76126d2565b5b0492506002810190505b600a8310611af1576001810190505b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611bb157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b725750611b718484610b81565b5b80611bb057508273ffffffffffffffffffffffffffffffffffffffff16611b9883610dfa565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611bff81611bcb565b8114611c09575f80fd5b50565b5f81359050611c1a81611bf6565b92915050565b5f60208284031215611c3557611c34611bc3565b5b5f611c4284828501611c0c565b91505092915050565b5f8115159050919050565b611c5f81611c4b565b82525050565b5f602082019050611c785f830184611c56565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611cb5578082015181840152602081019050611c9a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611cda82611c7e565b611ce48185611c88565b9350611cf4818560208601611c98565b611cfd81611cc0565b840191505092915050565b5f6020820190508181035f830152611d208184611cd0565b905092915050565b5f819050919050565b611d3a81611d28565b8114611d44575f80fd5b50565b5f81359050611d5581611d31565b92915050565b5f60208284031215611d7057611d6f611bc3565b5b5f611d7d84828501611d47565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611daf82611d86565b9050919050565b611dbf81611da5565b82525050565b5f602082019050611dd85f830184611db6565b92915050565b611de781611da5565b8114611df1575f80fd5b50565b5f81359050611e0281611dde565b92915050565b5f8060408385031215611e1e57611e1d611bc3565b5b5f611e2b85828601611df4565b9250506020611e3c85828601611d47565b9150509250929050565b5f60208284031215611e5b57611e5a611bc3565b5b5f611e6884828501611df4565b91505092915050565b5f805f60608486031215611e8857611e87611bc3565b5b5f611e9586828701611df4565b9350506020611ea686828701611df4565b9250506040611eb786828701611d47565b9150509250925092565b5f8060408385031215611ed757611ed6611bc3565b5b5f611ee485828601611d47565b9250506020611ef585828601611d47565b9150509250929050565b611f0881611d28565b82525050565b5f604082019050611f215f830185611db6565b611f2e6020830184611eff565b9392505050565b5f602082019050611f485f830184611eff565b92915050565b611f5781611c4b565b8114611f61575f80fd5b50565b5f81359050611f7281611f4e565b92915050565b5f8060408385031215611f8e57611f8d611bc3565b5b5f611f9b85828601611df4565b9250506020611fac85828601611f64565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611fd757611fd6611fb6565b5b8235905067ffffffffffffffff811115611ff457611ff3611fba565b5b6020830191508360018202830111156120105761200f611fbe565b5b9250929050565b5f806020838503121561202d5761202c611bc3565b5b5f83013567ffffffffffffffff81111561204a57612049611bc7565b5b61205685828601611fc2565b92509250509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61209c82611cc0565b810181811067ffffffffffffffff821117156120bb576120ba612066565b5b80604052505050565b5f6120cd611bba565b90506120d98282612093565b919050565b5f67ffffffffffffffff8211156120f8576120f7612066565b5b61210182611cc0565b9050602081019050919050565b828183375f83830152505050565b5f61212e612129846120de565b6120c4565b90508281526020810184848401111561214a57612149612062565b5b61215584828561210e565b509392505050565b5f82601f83011261217157612170611fb6565b5b813561218184826020860161211c565b91505092915050565b5f805f80608085870312156121a2576121a1611bc3565b5b5f6121af87828801611df4565b94505060206121c087828801611df4565b93505060406121d187828801611d47565b925050606085013567ffffffffffffffff8111156121f2576121f1611bc7565b5b6121fe8782880161215d565b91505092959194509250565b5f80604083850312156122205761221f611bc3565b5b5f61222d85828601611df4565b925050602061223e85828601611df4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061228c57607f821691505b60208210810361229f5761229e612248565b5b50919050565b5f6060820190506122b85f830186611db6565b6122c56020830185611eff565b6122d26040830184611db6565b949350505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461230281612275565b61230c81866122da565b9450600182165f8114612326576001811461233b5761236d565b60ff198316865281151582028601935061236d565b612344856122e4565b5f5b8381101561236557815481890152600182019150602081019050612346565b838801955050505b50505092915050565b5f61238182846122f6565b915081905092915050565b5f61239783856122da565b93506123a483858461210e565b82840190509392505050565b5f6123bc82848661238c565b91508190509392505050565b5f82905092915050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261241c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826123e1565b61242686836123e1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61246161245c61245784611d28565b61243e565b611d28565b9050919050565b5f819050919050565b61247a83612447565b61248e61248682612468565b8484546123ed565b825550505050565b5f90565b6124a2612496565b6124ad818484612471565b505050565b5b818110156124d0576124c55f8261249a565b6001810190506124b3565b5050565b601f821115612515576124e6816122e4565b6124ef846123d2565b810160208510156124fe578190505b61251261250a856123d2565b8301826124b2565b50505b505050565b5f82821c905092915050565b5f6125355f198460080261251a565b1980831691505092915050565b5f61254d8383612526565b9150826002028217905092915050565b61256783836123c8565b67ffffffffffffffff8111156125805761257f612066565b5b61258a8254612275565b6125958282856124d4565b5f601f8311600181146125c2575f84156125b0578287013590505b6125ba8582612542565b865550612621565b601f1984166125d0866122e4565b5f5b828110156125f7578489013582556001820191506020850194506020810190506125d2565b868310156126145784890135612610601f891682612526565b8355505b6001600288020188555050505b50505050505050565b5f61263482611c7e565b61263e81856122da565b935061264e818560208601611c98565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f61268e6005836122da565b91506126998261265a565b600582019050919050565b5f6126af82856122f6565b91506126bb828461262a565b91506126c682612682565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f612723826126ff565b61272d8185612709565b935061273d818560208601611c98565b61274681611cc0565b840191505092915050565b5f6080820190506127645f830187611db6565b6127716020830186611db6565b61277e6040830185611eff565b81810360608301526127908184612719565b905095945050505050565b5f815190506127a981611bf6565b92915050565b5f602082840312156127c4576127c3611bc3565b5b5f6127d18482850161279b565b9150509291505056fea26469706673582212208f441039203a44ac6bd3df10fbbb8833ec28ead51736da66b76bcfc19e25183f64736f6c6343000816003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000008015ff8aa47e853c654363693d9c5845d78aa93600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f696e666c752d6e66742d776f73702f33322f612f00000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061011f575f3560e01c806370a08231116100ab578063ad2628cd1161006f578063ad2628cd14610304578063b88d4fde14610320578063c87b56dd1461033c578063e985e9c51461036c578063f2fde38b1461039c5761011f565b806370a0823114610272578063715018a6146102a25780638da5cb5b146102ac57806395d89b41146102ca578063a22cb465146102e85761011f565b80631c31f710116100f25780631c31f710146101bd57806323b872dd146101d95780632a55205a146101f557806342842e0e146102265780636352211e146102425761011f565b806301ffc9a71461012357806306fdde0314610153578063081812fc14610171578063095ea7b3146101a1575b5f80fd5b61013d60048036038101906101389190611c20565b6103b8565b60405161014a9190611c65565b60405180910390f35b61015b610431565b6040516101689190611d08565b60405180910390f35b61018b60048036038101906101869190611d5b565b6104c0565b6040516101989190611dc5565b60405180910390f35b6101bb60048036038101906101b69190611e08565b6104db565b005b6101d760048036038101906101d29190611e46565b6104f1565b005b6101f360048036038101906101ee9190611e71565b6105c2565b005b61020f600480360381019061020a9190611ec1565b6106c1565b60405161021d929190611f0e565b60405180910390f35b610240600480360381019061023b9190611e71565b610849565b005b61025c60048036038101906102579190611d5b565b610868565b6040516102699190611dc5565b60405180910390f35b61028c60048036038101906102879190611e46565b610879565b6040516102999190611f35565b60405180910390f35b6102aa61092f565b005b6102b4610942565b6040516102c19190611dc5565b60405180910390f35b6102d261096a565b6040516102df9190611d08565b60405180910390f35b61030260048036038101906102fd9190611f78565b6109fa565b005b61031e60048036038101906103199190612017565b610a10565b005b61033a6004803603810190610335919061218a565b610ab6565b005b61035660048036038101906103519190611d5b565b610ad3565b6040516103639190611d08565b60405180910390f35b6103866004803603810190610381919061220a565b610b81565b6040516103939190611c65565b60405180910390f35b6103b660048036038101906103b19190611e46565b610c0f565b005b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061042a575061042982610c93565b5b9050919050565b60605f805461043f90612275565b80601f016020809104026020016040519081016040528092919081815260200182805461046b90612275565b80156104b65780601f1061048d576101008083540402835291602001916104b6565b820191905f5260205f20905b81548152906001019060200180831161049957829003601f168201915b5050505050905090565b5f6104ca82610d74565b506104d482610dfa565b9050919050565b6104ed82826104e8610e33565b610e3a565b5050565b6104f9610e4c565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361057f576040517fbaad5d3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610632575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016106299190611dc5565b60405180910390fd5b5f6106458383610640610e33565b610ed3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106bb578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016106b2939291906122a5565b60405180910390fd5b50505050565b5f80835f73ffffffffffffffffffffffffffffffffffffffff166106e4826110de565b73ffffffffffffffffffffffffffffffffffffffff160361073c57806040517f7e0d3fb10000000000000000000000000000000000000000000000000000000081526004016107339190611f35565b60405180910390fd5b5f8403610775576040517f75a2409100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036107f55760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f92509250610841565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661083c600a6bffffffffffffffffffffffff166064876111179092919063ffffffff16565b925092505b509250929050565b61086383838360405180602001604052805f815250610ab6565b505050565b5f61087282610d74565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ea575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016108e19190611dc5565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610937610e4c565b6109405f611216565b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461097990612275565b80601f01602080910402602001604051908101604052809291908181526020018280546109a590612275565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b610a0c610a05610e33565b83836112d9565b5050565b610a18610e4c565b6007604051602001610a2a9190612376565b604051602081830303815290604052805190602001208282604051602001610a539291906123b0565b6040516020818303038152906040528051906020012003610aa0576040517fbaad5d3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160079182610ab192919061255d565b505050565b610ac18484846105c2565b610acd84848484611442565b50505050565b6060815f73ffffffffffffffffffffffffffffffffffffffff16610af6826110de565b73ffffffffffffffffffffffffffffffffffffffff1603610b4e57806040517f7e0d3fb1000000000000000000000000000000000000000000000000000000008152600401610b459190611f35565b60405180910390fd5b6007610b59846115f4565b604051602001610b6a9291906126a4565b604051602081830303815290604052915050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b610c17610e4c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c87575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610c7e9190611dc5565b60405180910390fd5b610c9081611216565b50565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d5d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d6d5750610d6c826116be565b5b9050919050565b5f80610d7f836110de565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610df157826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610de89190611f35565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b610e478383836001611727565b505050565b610e54610e33565b73ffffffffffffffffffffffffffffffffffffffff16610e72610942565b73ffffffffffffffffffffffffffffffffffffffff1614610ed157610e95610e33565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ec89190611dc5565b60405180910390fd5b565b5f80610ede846110de565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610f1f57610f1e8184866118e6565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610faa57610f5e5f855f80611727565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461102957600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f8083850290505f8019858709828110838203039150505f810361114f57838281611145576111446126d2565b5b049250505061120f565b808411611188576040517f227bc15300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8486880990508281118203915080830392505f855f038616905080860495508084049350600181825f0304019050808302841793505f600287600302189050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050505b9392505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361134957816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016113409190611dc5565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114359190611c65565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b11156115ee578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611485610e33565b8685856040518563ffffffff1660e01b81526004016114a79493929190612751565b6020604051808303815f875af19250505080156114e257506040513d601f19601f820116820180604052508101906114df91906127af565b60015b611563573d805f8114611510576040519150601f19603f3d011682016040523d82523d5f602084013e611515565b606091505b505f81510361155b57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016115529190611dc5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146115ec57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016115e39190611dc5565b60405180910390fd5b505b50505050565b60605f6001611602846119a9565b0190505f8167ffffffffffffffff8111156116205761161f612066565b5b6040519080825280601f01601f1916602001820160405280156116525781602001600182028036833780820191505090505b5090505f82602001820190505b6001156116b3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816116a8576116a76126d2565b5b0494505f850361165f575b819350505050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b808061175f57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611891575f61176e84610d74565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156117d857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156117eb57506117e98184610b81565b155b1561182d57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016118249190611dc5565b60405180910390fd5b811561188f57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6118f1838383611afa565b6119a4575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361196557806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161195c9190611f35565b60405180910390fd5b81816040517f177e802f00000000000000000000000000000000000000000000000000000000815260040161199b929190611f0e565b60405180910390fd5b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a05577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816119fb576119fa6126d2565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611a42576d04ee2d6d415b85acef81000000008381611a3857611a376126d2565b5b0492506020810190505b662386f26fc100008310611a7157662386f26fc100008381611a6757611a666126d2565b5b0492506010810190505b6305f5e1008310611a9a576305f5e1008381611a9057611a8f6126d2565b5b0492506008810190505b6127108310611abf576127108381611ab557611ab46126d2565b5b0492506004810190505b60648310611ae25760648381611ad857611ad76126d2565b5b0492506002810190505b600a8310611af1576001810190505b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611bb157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b725750611b718484610b81565b5b80611bb057508273ffffffffffffffffffffffffffffffffffffffff16611b9883610dfa565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611bff81611bcb565b8114611c09575f80fd5b50565b5f81359050611c1a81611bf6565b92915050565b5f60208284031215611c3557611c34611bc3565b5b5f611c4284828501611c0c565b91505092915050565b5f8115159050919050565b611c5f81611c4b565b82525050565b5f602082019050611c785f830184611c56565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611cb5578082015181840152602081019050611c9a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611cda82611c7e565b611ce48185611c88565b9350611cf4818560208601611c98565b611cfd81611cc0565b840191505092915050565b5f6020820190508181035f830152611d208184611cd0565b905092915050565b5f819050919050565b611d3a81611d28565b8114611d44575f80fd5b50565b5f81359050611d5581611d31565b92915050565b5f60208284031215611d7057611d6f611bc3565b5b5f611d7d84828501611d47565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611daf82611d86565b9050919050565b611dbf81611da5565b82525050565b5f602082019050611dd85f830184611db6565b92915050565b611de781611da5565b8114611df1575f80fd5b50565b5f81359050611e0281611dde565b92915050565b5f8060408385031215611e1e57611e1d611bc3565b5b5f611e2b85828601611df4565b9250506020611e3c85828601611d47565b9150509250929050565b5f60208284031215611e5b57611e5a611bc3565b5b5f611e6884828501611df4565b91505092915050565b5f805f60608486031215611e8857611e87611bc3565b5b5f611e9586828701611df4565b9350506020611ea686828701611df4565b9250506040611eb786828701611d47565b9150509250925092565b5f8060408385031215611ed757611ed6611bc3565b5b5f611ee485828601611d47565b9250506020611ef585828601611d47565b9150509250929050565b611f0881611d28565b82525050565b5f604082019050611f215f830185611db6565b611f2e6020830184611eff565b9392505050565b5f602082019050611f485f830184611eff565b92915050565b611f5781611c4b565b8114611f61575f80fd5b50565b5f81359050611f7281611f4e565b92915050565b5f8060408385031215611f8e57611f8d611bc3565b5b5f611f9b85828601611df4565b9250506020611fac85828601611f64565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611fd757611fd6611fb6565b5b8235905067ffffffffffffffff811115611ff457611ff3611fba565b5b6020830191508360018202830111156120105761200f611fbe565b5b9250929050565b5f806020838503121561202d5761202c611bc3565b5b5f83013567ffffffffffffffff81111561204a57612049611bc7565b5b61205685828601611fc2565b92509250509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61209c82611cc0565b810181811067ffffffffffffffff821117156120bb576120ba612066565b5b80604052505050565b5f6120cd611bba565b90506120d98282612093565b919050565b5f67ffffffffffffffff8211156120f8576120f7612066565b5b61210182611cc0565b9050602081019050919050565b828183375f83830152505050565b5f61212e612129846120de565b6120c4565b90508281526020810184848401111561214a57612149612062565b5b61215584828561210e565b509392505050565b5f82601f83011261217157612170611fb6565b5b813561218184826020860161211c565b91505092915050565b5f805f80608085870312156121a2576121a1611bc3565b5b5f6121af87828801611df4565b94505060206121c087828801611df4565b93505060406121d187828801611d47565b925050606085013567ffffffffffffffff8111156121f2576121f1611bc7565b5b6121fe8782880161215d565b91505092959194509250565b5f80604083850312156122205761221f611bc3565b5b5f61222d85828601611df4565b925050602061223e85828601611df4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061228c57607f821691505b60208210810361229f5761229e612248565b5b50919050565b5f6060820190506122b85f830186611db6565b6122c56020830185611eff565b6122d26040830184611db6565b949350505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461230281612275565b61230c81866122da565b9450600182165f8114612326576001811461233b5761236d565b60ff198316865281151582028601935061236d565b612344856122e4565b5f5b8381101561236557815481890152600182019150602081019050612346565b838801955050505b50505092915050565b5f61238182846122f6565b915081905092915050565b5f61239783856122da565b93506123a483858461210e565b82840190509392505050565b5f6123bc82848661238c565b91508190509392505050565b5f82905092915050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261241c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826123e1565b61242686836123e1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61246161245c61245784611d28565b61243e565b611d28565b9050919050565b5f819050919050565b61247a83612447565b61248e61248682612468565b8484546123ed565b825550505050565b5f90565b6124a2612496565b6124ad818484612471565b505050565b5b818110156124d0576124c55f8261249a565b6001810190506124b3565b5050565b601f821115612515576124e6816122e4565b6124ef846123d2565b810160208510156124fe578190505b61251261250a856123d2565b8301826124b2565b50505b505050565b5f82821c905092915050565b5f6125355f198460080261251a565b1980831691505092915050565b5f61254d8383612526565b9150826002028217905092915050565b61256783836123c8565b67ffffffffffffffff8111156125805761257f612066565b5b61258a8254612275565b6125958282856124d4565b5f601f8311600181146125c2575f84156125b0578287013590505b6125ba8582612542565b865550612621565b601f1984166125d0866122e4565b5f5b828110156125f7578489013582556001820191506020850194506020810190506125d2565b868310156126145784890135612610601f891682612526565b8355505b6001600288020188555050505b50505050505050565b5f61263482611c7e565b61263e81856122da565b935061264e818560208601611c98565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f61268e6005836122da565b91506126998261265a565b600582019050919050565b5f6126af82856122f6565b91506126bb828461262a565b91506126c682612682565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f612723826126ff565b61272d8185612709565b935061273d818560208601611c98565b61274681611cc0565b840191505092915050565b5f6080820190506127645f830187611db6565b6127716020830186611db6565b61277e6040830185611eff565b81810360608301526127908184612719565b905095945050505050565b5f815190506127a981611bf6565b92915050565b5f602082840312156127c4576127c3611bc3565b5b5f6127d18482850161279b565b9150509291505056fea26469706673582212208f441039203a44ac6bd3df10fbbb8833ec28ead51736da66b76bcfc19e25183f64736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008015ff8aa47e853c654363693d9c5845d78aa93600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f696e666c752d6e66742d776f73702f33322f612f00000000000000000000000000
-----Decoded View---------------
Arg [0] : beneficiary (address): 0x0000000000000000000000000000000000000000
Arg [1] : wallet (address): 0x8015Ff8aA47E853C654363693d9c5845D78AA936
Arg [2] : metadataUriPrefix (string): https://storage.googleapis.com/influ-nft-wosp/32/a/
Arg [3] : count (uint96): 4
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000008015ff8aa47e853c654363693d9c5845d78aa936
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000033
Arg [5] : 68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f69
Arg [6] : 6e666c752d6e66742d776f73702f33322f612f00000000000000000000000000
Deployed Bytecode Sourcemap
58596:3700:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62062:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39495:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40667:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40486:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60589:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41336:588;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61577:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;41995:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39308:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39033:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57586:103;;;:::i;:::-;;56911:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39655:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40897:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60893:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42200:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61295:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41114:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57844:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62062:231;62164:4;62211:26;62188:49;;;:19;:49;;;;:97;;;;62241:44;62265:19;62241:23;:44::i;:::-;62188:97;62181:104;;62062:231;;;:::o;39495:91::-;39540:13;39573:5;39566:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39495:91;:::o;40667:158::-;40734:7;40754:22;40768:7;40754:13;:22::i;:::-;;40796:21;40809:7;40796:12;:21::i;:::-;40789:28;;40667:158;;;:::o;40486:115::-;40558:35;40567:2;40571:7;40580:12;:10;:12::i;:::-;40558:8;:35::i;:::-;40486:115;;:::o;60589:216::-;56797:13;:11;:13::i;:::-;60683:12:::1;;;;;;;;;;;60668:27;;:11;:27;;::::0;60664:95:::1;;60719:28;;;;;;;;;;;;;;60664:95;60786:11;60771:12;;:26;;;;;;;;;;;;;;;;;;60589:216:::0;:::o;41336:588::-;41445:1;41431:16;;:2;:16;;;41427:89;;41501:1;41471:33;;;;;;;;;;;:::i;:::-;;;;;;;;41427:89;41737:21;41761:34;41769:2;41773:7;41782:12;:10;:12::i;:::-;41761:7;:34::i;:::-;41737:58;;41827:4;41810:21;;:13;:21;;;41806:111;;41876:4;41882:7;41891:13;41855:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;41806:111;41416:508;41336:588;;;:::o;61577:413::-;61697:7;61706;61676:10;60400:1;60368:34;;:20;60377:10;60368:8;:20::i;:::-;:34;;;60364:122;;60463:10;60426:48;;;;;;;;;;;:::i;:::-;;;;;;;;60364:122;61743:1:::1;61730:9;:14:::0;61726:86:::1;;61768:32;;;;;;;;;;;;;;61726:86;61852:1;61828:26;;:12;;;;;;;;;;;:26;;::::0;61824:83:::1;;61879:12;;;;;;;;;;;61893:1;61871:24;;;;;;61824:83;61927:12;;;;;;;;;;;61941:40;58832:2;61941:40;;61977:3;61941:9;:16;;:40;;;;;:::i;:::-;61919:63;;;;60496:1;61577:413:::0;;;;;;:::o;41995:134::-;42082:39;42099:4;42105:2;42109:7;42082:39;;;;;;;;;;;;:16;:39::i;:::-;41995:134;;;:::o;39308:120::-;39371:7;39398:22;39412:7;39398:13;:22::i;:::-;39391:29;;39308:120;;;:::o;39033:213::-;39096:7;39137:1;39120:19;;:5;:19;;;39116:89;;39190:1;39163:30;;;;;;;;;;;:::i;:::-;;;;;;;;39116:89;39222:9;:16;39232:5;39222:16;;;;;;;;;;;;;;;;39215:23;;39033:213;;;:::o;57586:103::-;56797:13;:11;:13::i;:::-;57651:30:::1;57678:1;57651:18;:30::i;:::-;57586:103::o:0;56911:87::-;56957:7;56984:6;;;;;;;;;;;56977:13;;56911:87;:::o;39655:95::-;39702:13;39735:7;39728:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39655:95;:::o;40897:146::-;40983:52;41002:12;:10;:12::i;:::-;41016:8;41026;40983:18;:52::i;:::-;40897:146;;:::o;60893:318::-;56797:13;:11;:13::i;:::-;61069:18:::1;61052:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;61042:47;;;;;;61019:17;;61002:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60992:46;;;;;;:97:::0;60988:165:::1;;61113:28;;;;;;;;;;;;;;60988:165;61186:17;;61165:18;:38;;;;;;;:::i;:::-;;60893:318:::0;;:::o;42200:211::-;42314:31;42327:4;42333:2;42337:7;42314:12;:31::i;:::-;42356:47;42379:4;42385:2;42389:7;42398:4;42356:22;:47::i;:::-;42200:211;;;;:::o;61295:215::-;61393:13;61372:10;60400:1;60368:34;;:20;60377:10;60368:8;:20::i;:::-;:34;;;60364:122;;60463:10;60426:48;;;;;;;;;;;:::i;:::-;;;;;;;;60364:122;61450:18:::1;61470:21;:10;:19;:21::i;:::-;61433:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61419:83;;61295:215:::0;;;;:::o;41114:155::-;41202:4;41226:18;:25;41245:5;41226:25;;;;;;;;;;;;;;;:35;41252:8;41226:35;;;;;;;;;;;;;;;;;;;;;;;;;41219:42;;41114:155;;;;:::o;57844:220::-;56797:13;:11;:13::i;:::-;57949:1:::1;57929:22;;:8;:22;;::::0;57925:93:::1;;58003:1;57975:31;;;;;;;;;;;:::i;:::-;;;;;;;;57925:93;58028:28;58047:8;58028:18;:28::i;:::-;57844:220:::0;:::o;38664:305::-;38766:4;38818:25;38803:40;;;:11;:40;;;;:105;;;;38875:33;38860:48;;;:11;:48;;;;38803:105;:158;;;;38925:36;38949:11;38925:23;:36::i;:::-;38803:158;38783:178;;38664:305;;;:::o;53642:247::-;53705:7;53725:13;53741:17;53750:7;53741:8;:17::i;:::-;53725:33;;53790:1;53773:19;;:5;:19;;;53769:90;;53839:7;53816:31;;;;;;;;;;;:::i;:::-;;;;;;;;53769:90;53876:5;53869:12;;;53642:247;;;:::o;43173:129::-;43243:7;43270:15;:24;43286:7;43270:24;;;;;;;;;;;;;;;;;;;;;43263:31;;43173:129;;;:::o;37113:98::-;37166:7;37193:10;37186:17;;37113:98;:::o;51874:122::-;51955:33;51964:2;51968:7;51977:4;51983;51955:8;:33::i;:::-;51874:122;;;:::o;57076:166::-;57147:12;:10;:12::i;:::-;57136:23;;:7;:5;:7::i;:::-;:23;;;57132:103;;57210:12;:10;:12::i;:::-;57183:40;;;;;;;;;;;:::i;:::-;;;;;;;;57132:103;57076:166::o;46135:824::-;46221:7;46241:12;46256:17;46265:7;46256:8;:17::i;:::-;46241:32;;46352:1;46336:18;;:4;:18;;;46332:88;;46371:37;46388:4;46394;46400:7;46371:16;:37::i;:::-;46332:88;46483:1;46467:18;;:4;:18;;;46463:263;;46585:48;46602:1;46606:7;46623:1;46627:5;46585:8;:48::i;:::-;46698:1;46679:9;:15;46689:4;46679:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;46463:263;46756:1;46742:16;;:2;:16;;;46738:111;;46821:1;46804:9;:13;46814:2;46804:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;46738:111;46880:2;46861:7;:16;46869:7;46861:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46919:7;46915:2;46900:27;;46909:4;46900:27;;;;;;;;;;;;46947:4;46940:11;;;46135:824;;;;;:::o;42935:117::-;43001:7;43028;:16;43036:7;43028:16;;;;;;;;;;;;;;;;;;;;;43021:23;;42935:117;;;:::o;12051:4195::-;12133:14;12485:13;12505:1;12501;:5;12485:21;;12566:13;12693:1;12689:6;12686:1;12683;12676:20;12750:5;12746:2;12743:13;12735:5;12731:2;12727:14;12723:34;12714:43;;12647:125;12865:1;12856:5;:10;12852:373;;13198:11;13190:5;:19;;;;;:::i;:::-;;;13183:26;;;;;;12852:373;13349:5;13334:11;:20;13330:90;;13382:22;;;;;;;;;;;;;;13330:90;13682:17;13820:11;13817:1;13814;13807:25;13794:38;;13951:5;13940:9;13937:20;13930:5;13926:32;13917:41;;13996:9;13989:5;13985:21;13976:30;;14230:12;14264:11;14260:1;:15;14245:11;:31;14230:46;;14399:4;14386:11;14382:22;14367:37;;14494:4;14487:5;14483:16;14474:25;;14654:1;14647:4;14640;14637:1;14633:12;14629:23;14625:31;14617:39;;14757:4;14749:5;:12;14740:21;;;;15084:15;15122:1;15107:11;15103:1;:15;15102:21;15084:39;;15373:7;15359:11;:21;15355:1;:25;15344:36;;;;15443:7;15429:11;:21;15425:1;:25;15414:36;;;;15514:7;15500:11;:21;15496:1;:25;15485:36;;;;15585:7;15571:11;:21;15567:1;:25;15556:36;;;;15656:7;15642:11;:21;15638:1;:25;15627:36;;;;15728:7;15714:11;:21;15710:1;:25;15699:36;;;;16192:7;16184:5;:15;16175:24;;16214:13;;;;;12051:4195;;;;;;:::o;58224:191::-;58298:16;58317:6;;;;;;;;;;;58298:25;;58343:8;58334:6;;:17;;;;;;;;;;;;;;;;;;58398:8;58367:40;;58388:8;58367:40;;;;;;;;;;;;58287:128;58224:191;:::o;53081:318::-;53209:1;53189:22;;:8;:22;;;53185:93;;53257:8;53235:31;;;;;;;;;;;:::i;:::-;;;;;;;;53185:93;53326:8;53288:18;:25;53307:5;53288:25;;;;;;;;;;;;;;;:35;53314:8;53288:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53372:8;53350:41;;53365:5;53350:41;;;53382:8;53350:41;;;;;;:::i;:::-;;;;;;;;53081:318;;;:::o;54439:799::-;54573:1;54556:2;:14;;;:18;54552:679;;;54611:2;54595:36;;;54632:12;:10;:12::i;:::-;54646:4;54652:7;54661:4;54595:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54591:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54926:1;54909:6;:13;:18;54905:300;;54981:2;54959:25;;;;;;;;;;;:::i;:::-;;;;;;;;54905:300;55155:6;55149:13;55140:6;55136:2;55132:15;55125:38;54591:629;54724:41;;;54714:51;;;:6;:51;;;;54710:132;;54819:2;54797:25;;;;;;;;;;;:::i;:::-;;;;;;;;54710:132;54667:190;54552:679;54439:799;;;;:::o;24250:718::-;24306:13;24357:14;24394:1;24374:17;24385:5;24374:10;:17::i;:::-;:21;24357:38;;24410:20;24444:6;24433:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24410:41;;24466:11;24595:6;24591:2;24587:15;24579:6;24575:28;24568:35;;24632:290;24639:4;24632:290;;;24664:5;;;;;;;;24806:10;24801:2;24794:5;24790:14;24785:32;24780:3;24772:46;24864:2;24855:11;;;;;;:::i;:::-;;;;;24898:1;24889:5;:10;24632:290;24885:21;24632:290;24943:6;24936:13;;;;;24250:718;;;:::o;29554:148::-;29630:4;29669:25;29654:40;;;:11;:40;;;;29647:47;;29554:148;;;:::o;52184:678::-;52346:9;:31;;;;52375:1;52359:18;;:4;:18;;;;52346:31;52342:471;;;52394:13;52410:22;52424:7;52410:13;:22::i;:::-;52394:38;;52579:1;52563:18;;:4;:18;;;;:35;;;;;52594:4;52585:13;;:5;:13;;;;52563:35;:69;;;;;52603:29;52620:5;52627:4;52603:16;:29::i;:::-;52602:30;52563:69;52559:144;;;52682:4;52660:27;;;;;;;;;;;:::i;:::-;;;;;;;;52559:144;52723:9;52719:83;;;52778:7;52774:2;52758:28;;52767:5;52758:28;;;;;;;;;;;;52719:83;52379:434;52342:471;52852:2;52825:15;:24;52841:7;52825:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52184:678;;;;:::o;44342:376::-;44455:38;44469:5;44476:7;44485;44455:13;:38::i;:::-;44450:261;;44531:1;44514:19;;:5;:19;;;44510:190;;44584:7;44561:31;;;;;;;;;;;:::i;:::-;;;;;;;;44510:190;44667:7;44676;44640:44;;;;;;;;;;;;:::i;:::-;;;;;;;;44450:261;44342:376;;;:::o;20660:948::-;20713:7;20733:14;20750:1;20733:18;;20800:8;20791:5;:17;20787:106;;20838:8;20829:17;;;;;;:::i;:::-;;;;;20875:2;20865:12;;;;20787:106;20920:8;20911:5;:17;20907:106;;20958:8;20949:17;;;;;;:::i;:::-;;;;;20995:2;20985:12;;;;20907:106;21040:8;21031:5;:17;21027:106;;21078:8;21069:17;;;;;;:::i;:::-;;;;;21115:2;21105:12;;;;21027:106;21160:7;21151:5;:16;21147:103;;21197:7;21188:16;;;;;;:::i;:::-;;;;;21233:1;21223:11;;;;21147:103;21277:7;21268:5;:16;21264:103;;21314:7;21305:16;;;;;;:::i;:::-;;;;;21350:1;21340:11;;;;21264:103;21394:7;21385:5;:16;21381:103;;21431:7;21422:16;;;;;;:::i;:::-;;;;;21467:1;21457:11;;;;21381:103;21511:7;21502:5;:16;21498:68;;21549:1;21539:11;;;;21498:68;21594:6;21587:13;;;20660:948;;;:::o;43622:276::-;43725:4;43781:1;43762:21;;:7;:21;;;;:128;;;;;43810:7;43801:16;;:5;:16;;;:52;;;;43821:32;43838:5;43845:7;43821:16;:32::i;:::-;43801:52;:88;;;;43882:7;43857:32;;:21;43870:7;43857:12;:21::i;:::-;:32;;;43801:88;43762:128;43742:148;;43622:276;;;;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:619::-;5302:6;5310;5318;5367:2;5355:9;5346:7;5342:23;5338:32;5335:119;;;5373:79;;:::i;:::-;5335:119;5493:1;5518:53;5563:7;5554:6;5543:9;5539:22;5518:53;:::i;:::-;5508:63;;5464:117;5620:2;5646:53;5691:7;5682:6;5671:9;5667:22;5646:53;:::i;:::-;5636:63;;5591:118;5748:2;5774:53;5819:7;5810:6;5799:9;5795:22;5774:53;:::i;:::-;5764:63;;5719:118;5225:619;;;;;:::o;5850:474::-;5918:6;5926;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;6228:2;6254:53;6299:7;6290:6;6279:9;6275:22;6254:53;:::i;:::-;6244:63;;6199:118;5850:474;;;;;:::o;6330:118::-;6417:24;6435:5;6417:24;:::i;:::-;6412:3;6405:37;6330:118;;:::o;6454:332::-;6575:4;6613:2;6602:9;6598:18;6590:26;;6626:71;6694:1;6683:9;6679:17;6670:6;6626:71;:::i;:::-;6707:72;6775:2;6764:9;6760:18;6751:6;6707:72;:::i;:::-;6454:332;;;;;:::o;6792:222::-;6885:4;6923:2;6912:9;6908:18;6900:26;;6936:71;7004:1;6993:9;6989:17;6980:6;6936:71;:::i;:::-;6792:222;;;;:::o;7020:116::-;7090:21;7105:5;7090:21;:::i;:::-;7083:5;7080:32;7070:60;;7126:1;7123;7116:12;7070:60;7020:116;:::o;7142:133::-;7185:5;7223:6;7210:20;7201:29;;7239:30;7263:5;7239:30;:::i;:::-;7142:133;;;;:::o;7281:468::-;7346:6;7354;7403:2;7391:9;7382:7;7378:23;7374:32;7371:119;;;7409:79;;:::i;:::-;7371:119;7529:1;7554:53;7599:7;7590:6;7579:9;7575:22;7554:53;:::i;:::-;7544:63;;7500:117;7656:2;7682:50;7724:7;7715:6;7704:9;7700:22;7682:50;:::i;:::-;7672:60;;7627:115;7281:468;;;;;:::o;7755:117::-;7864:1;7861;7854:12;7878:117;7987:1;7984;7977:12;8001:117;8110:1;8107;8100:12;8138:553;8196:8;8206:6;8256:3;8249:4;8241:6;8237:17;8233:27;8223:122;;8264:79;;:::i;:::-;8223:122;8377:6;8364:20;8354:30;;8407:18;8399:6;8396:30;8393:117;;;8429:79;;:::i;:::-;8393:117;8543:4;8535:6;8531:17;8519:29;;8597:3;8589:4;8581:6;8577:17;8567:8;8563:32;8560:41;8557:128;;;8604:79;;:::i;:::-;8557:128;8138:553;;;;;:::o;8697:529::-;8768:6;8776;8825:2;8813:9;8804:7;8800:23;8796:32;8793:119;;;8831:79;;:::i;:::-;8793:119;8979:1;8968:9;8964:17;8951:31;9009:18;9001:6;8998:30;8995:117;;;9031:79;;:::i;:::-;8995:117;9144:65;9201:7;9192:6;9181:9;9177:22;9144:65;:::i;:::-;9126:83;;;;8922:297;8697:529;;;;;:::o;9232:117::-;9341:1;9338;9331:12;9355:180;9403:77;9400:1;9393:88;9500:4;9497:1;9490:15;9524:4;9521:1;9514:15;9541:281;9624:27;9646:4;9624:27;:::i;:::-;9616:6;9612:40;9754:6;9742:10;9739:22;9718:18;9706:10;9703:34;9700:62;9697:88;;;9765:18;;:::i;:::-;9697:88;9805:10;9801:2;9794:22;9584:238;9541:281;;:::o;9828:129::-;9862:6;9889:20;;:::i;:::-;9879:30;;9918:33;9946:4;9938:6;9918:33;:::i;:::-;9828:129;;;:::o;9963:307::-;10024:4;10114:18;10106:6;10103:30;10100:56;;;10136:18;;:::i;:::-;10100:56;10174:29;10196:6;10174:29;:::i;:::-;10166:37;;10258:4;10252;10248:15;10240:23;;9963:307;;;:::o;10276:146::-;10373:6;10368:3;10363;10350:30;10414:1;10405:6;10400:3;10396:16;10389:27;10276:146;;;:::o;10428:423::-;10505:5;10530:65;10546:48;10587:6;10546:48;:::i;:::-;10530:65;:::i;:::-;10521:74;;10618:6;10611:5;10604:21;10656:4;10649:5;10645:16;10694:3;10685:6;10680:3;10676:16;10673:25;10670:112;;;10701:79;;:::i;:::-;10670:112;10791:54;10838:6;10833:3;10828;10791:54;:::i;:::-;10511:340;10428:423;;;;;:::o;10870:338::-;10925:5;10974:3;10967:4;10959:6;10955:17;10951:27;10941:122;;10982:79;;:::i;:::-;10941:122;11099:6;11086:20;11124:78;11198:3;11190:6;11183:4;11175:6;11171:17;11124:78;:::i;:::-;11115:87;;10931:277;10870:338;;;;:::o;11214:943::-;11309:6;11317;11325;11333;11382:3;11370:9;11361:7;11357:23;11353:33;11350:120;;;11389:79;;:::i;:::-;11350:120;11509:1;11534:53;11579:7;11570:6;11559:9;11555:22;11534:53;:::i;:::-;11524:63;;11480:117;11636:2;11662:53;11707:7;11698:6;11687:9;11683:22;11662:53;:::i;:::-;11652:63;;11607:118;11764:2;11790:53;11835:7;11826:6;11815:9;11811:22;11790:53;:::i;:::-;11780:63;;11735:118;11920:2;11909:9;11905:18;11892:32;11951:18;11943:6;11940:30;11937:117;;;11973:79;;:::i;:::-;11937:117;12078:62;12132:7;12123:6;12112:9;12108:22;12078:62;:::i;:::-;12068:72;;11863:287;11214:943;;;;;;;:::o;12163:474::-;12231:6;12239;12288:2;12276:9;12267:7;12263:23;12259:32;12256:119;;;12294:79;;:::i;:::-;12256:119;12414:1;12439:53;12484:7;12475:6;12464:9;12460:22;12439:53;:::i;:::-;12429:63;;12385:117;12541:2;12567:53;12612:7;12603:6;12592:9;12588:22;12567:53;:::i;:::-;12557:63;;12512:118;12163:474;;;;;:::o;12643:180::-;12691:77;12688:1;12681:88;12788:4;12785:1;12778:15;12812:4;12809:1;12802:15;12829:320;12873:6;12910:1;12904:4;12900:12;12890:22;;12957:1;12951:4;12947:12;12978:18;12968:81;;13034:4;13026:6;13022:17;13012:27;;12968:81;13096:2;13088:6;13085:14;13065:18;13062:38;13059:84;;13115:18;;:::i;:::-;13059:84;12880:269;12829:320;;;:::o;13155:442::-;13304:4;13342:2;13331:9;13327:18;13319:26;;13355:71;13423:1;13412:9;13408:17;13399:6;13355:71;:::i;:::-;13436:72;13504:2;13493:9;13489:18;13480:6;13436:72;:::i;:::-;13518;13586:2;13575:9;13571:18;13562:6;13518:72;:::i;:::-;13155:442;;;;;;:::o;13603:148::-;13705:11;13742:3;13727:18;;13603:148;;;;:::o;13757:141::-;13806:4;13829:3;13821:11;;13852:3;13849:1;13842:14;13886:4;13883:1;13873:18;13865:26;;13757:141;;;:::o;13928:874::-;14031:3;14068:5;14062:12;14097:36;14123:9;14097:36;:::i;:::-;14149:89;14231:6;14226:3;14149:89;:::i;:::-;14142:96;;14269:1;14258:9;14254:17;14285:1;14280:166;;;;14460:1;14455:341;;;;14247:549;;14280:166;14364:4;14360:9;14349;14345:25;14340:3;14333:38;14426:6;14419:14;14412:22;14404:6;14400:35;14395:3;14391:45;14384:52;;14280:166;;14455:341;14522:38;14554:5;14522:38;:::i;:::-;14582:1;14596:154;14610:6;14607:1;14604:13;14596:154;;;14684:7;14678:14;14674:1;14669:3;14665:11;14658:35;14734:1;14725:7;14721:15;14710:26;;14632:4;14629:1;14625:12;14620:17;;14596:154;;;14779:6;14774:3;14770:16;14763:23;;14462:334;;14247:549;;14035:767;;13928:874;;;;:::o;14808:269::-;14937:3;14959:92;15047:3;15038:6;14959:92;:::i;:::-;14952:99;;15068:3;15061:10;;14808:269;;;;:::o;15107:330::-;15223:3;15244:89;15326:6;15321:3;15244:89;:::i;:::-;15237:96;;15343:56;15392:6;15387:3;15380:5;15343:56;:::i;:::-;15424:6;15419:3;15415:16;15408:23;;15107:330;;;;;:::o;15443:295::-;15585:3;15607:105;15708:3;15699:6;15691;15607:105;:::i;:::-;15600:112;;15729:3;15722:10;;15443:295;;;;;:::o;15744:97::-;15803:6;15831:3;15821:13;;15744:97;;;;:::o;15847:93::-;15884:6;15931:2;15926;15919:5;15915:14;15911:23;15901:33;;15847:93;;;:::o;15946:107::-;15990:8;16040:5;16034:4;16030:16;16009:37;;15946:107;;;;:::o;16059:393::-;16128:6;16178:1;16166:10;16162:18;16201:97;16231:66;16220:9;16201:97;:::i;:::-;16319:39;16349:8;16338:9;16319:39;:::i;:::-;16307:51;;16391:4;16387:9;16380:5;16376:21;16367:30;;16440:4;16430:8;16426:19;16419:5;16416:30;16406:40;;16135:317;;16059:393;;;;;:::o;16458:60::-;16486:3;16507:5;16500:12;;16458:60;;;:::o;16524:142::-;16574:9;16607:53;16625:34;16634:24;16652:5;16634:24;:::i;:::-;16625:34;:::i;:::-;16607:53;:::i;:::-;16594:66;;16524:142;;;:::o;16672:75::-;16715:3;16736:5;16729:12;;16672:75;;;:::o;16753:269::-;16863:39;16894:7;16863:39;:::i;:::-;16924:91;16973:41;16997:16;16973:41;:::i;:::-;16965:6;16958:4;16952:11;16924:91;:::i;:::-;16918:4;16911:105;16829:193;16753:269;;;:::o;17028:73::-;17073:3;17028:73;:::o;17107:189::-;17184:32;;:::i;:::-;17225:65;17283:6;17275;17269:4;17225:65;:::i;:::-;17160:136;17107:189;;:::o;17302:186::-;17362:120;17379:3;17372:5;17369:14;17362:120;;;17433:39;17470:1;17463:5;17433:39;:::i;:::-;17406:1;17399:5;17395:13;17386:22;;17362:120;;;17302:186;;:::o;17494:543::-;17595:2;17590:3;17587:11;17584:446;;;17629:38;17661:5;17629:38;:::i;:::-;17713:29;17731:10;17713:29;:::i;:::-;17703:8;17699:44;17896:2;17884:10;17881:18;17878:49;;;17917:8;17902:23;;17878:49;17940:80;17996:22;18014:3;17996:22;:::i;:::-;17986:8;17982:37;17969:11;17940:80;:::i;:::-;17599:431;;17584:446;17494:543;;;:::o;18043:117::-;18097:8;18147:5;18141:4;18137:16;18116:37;;18043:117;;;;:::o;18166:169::-;18210:6;18243:51;18291:1;18287:6;18279:5;18276:1;18272:13;18243:51;:::i;:::-;18239:56;18324:4;18318;18314:15;18304:25;;18217:118;18166:169;;;;:::o;18340:295::-;18416:4;18562:29;18587:3;18581:4;18562:29;:::i;:::-;18554:37;;18624:3;18621:1;18617:11;18611:4;18608:21;18600:29;;18340:295;;;;:::o;18640:1403::-;18764:44;18804:3;18799;18764:44;:::i;:::-;18873:18;18865:6;18862:30;18859:56;;;18895:18;;:::i;:::-;18859:56;18939:38;18971:4;18965:11;18939:38;:::i;:::-;19024:67;19084:6;19076;19070:4;19024:67;:::i;:::-;19118:1;19147:2;19139:6;19136:14;19164:1;19159:632;;;;19835:1;19852:6;19849:84;;;19908:9;19903:3;19899:19;19886:33;19877:42;;19849:84;19959:67;20019:6;20012:5;19959:67;:::i;:::-;19953:4;19946:81;19808:229;19129:908;;19159:632;19211:4;19207:9;19199:6;19195:22;19245:37;19277:4;19245:37;:::i;:::-;19304:1;19318:215;19332:7;19329:1;19326:14;19318:215;;;19418:9;19413:3;19409:19;19396:33;19388:6;19381:49;19469:1;19461:6;19457:14;19447:24;;19516:2;19505:9;19501:18;19488:31;;19355:4;19352:1;19348:12;19343:17;;19318:215;;;19561:6;19552:7;19549:19;19546:186;;;19626:9;19621:3;19617:19;19604:33;19669:48;19711:4;19703:6;19699:17;19688:9;19669:48;:::i;:::-;19661:6;19654:64;19569:163;19546:186;19778:1;19774;19766:6;19762:14;19758:22;19752:4;19745:36;19166:625;;;19129:908;;18739:1304;;;18640:1403;;;:::o;20049:390::-;20155:3;20183:39;20216:5;20183:39;:::i;:::-;20238:89;20320:6;20315:3;20238:89;:::i;:::-;20231:96;;20336:65;20394:6;20389:3;20382:4;20375:5;20371:16;20336:65;:::i;:::-;20426:6;20421:3;20417:16;20410:23;;20159:280;20049:390;;;;:::o;20445:155::-;20585:7;20581:1;20573:6;20569:14;20562:31;20445:155;:::o;20606:400::-;20766:3;20787:84;20869:1;20864:3;20787:84;:::i;:::-;20780:91;;20880:93;20969:3;20880:93;:::i;:::-;20998:1;20993:3;20989:11;20982:18;;20606:400;;;:::o;21012:695::-;21290:3;21312:92;21400:3;21391:6;21312:92;:::i;:::-;21305:99;;21421:95;21512:3;21503:6;21421:95;:::i;:::-;21414:102;;21533:148;21677:3;21533:148;:::i;:::-;21526:155;;21698:3;21691:10;;21012:695;;;;;:::o;21713:180::-;21761:77;21758:1;21751:88;21858:4;21855:1;21848:15;21882:4;21879:1;21872:15;21899:98;21950:6;21984:5;21978:12;21968:22;;21899:98;;;:::o;22003:168::-;22086:11;22120:6;22115:3;22108:19;22160:4;22155:3;22151:14;22136:29;;22003:168;;;;:::o;22177:373::-;22263:3;22291:38;22323:5;22291:38;:::i;:::-;22345:70;22408:6;22403:3;22345:70;:::i;:::-;22338:77;;22424:65;22482:6;22477:3;22470:4;22463:5;22459:16;22424:65;:::i;:::-;22514:29;22536:6;22514:29;:::i;:::-;22509:3;22505:39;22498:46;;22267:283;22177:373;;;;:::o;22556:640::-;22751:4;22789:3;22778:9;22774:19;22766:27;;22803:71;22871:1;22860:9;22856:17;22847:6;22803:71;:::i;:::-;22884:72;22952:2;22941:9;22937:18;22928:6;22884:72;:::i;:::-;22966;23034:2;23023:9;23019:18;23010:6;22966:72;:::i;:::-;23085:9;23079:4;23075:20;23070:2;23059:9;23055:18;23048:48;23113:76;23184:4;23175:6;23113:76;:::i;:::-;23105:84;;22556:640;;;;;;;:::o;23202:141::-;23258:5;23289:6;23283:13;23274:22;;23305:32;23331:5;23305:32;:::i;:::-;23202:141;;;;:::o;23349:349::-;23418:6;23467:2;23455:9;23446:7;23442:23;23438:32;23435:119;;;23473:79;;:::i;:::-;23435:119;23593:1;23618:63;23673:7;23664:6;23653:9;23649:22;23618:63;:::i;:::-;23608:73;;23564:127;23349:349;;;;:::o
Swarm Source
ipfs://8f441039203a44ac6bd3df10fbbb8833ec28ead51736da66b76bcfc19e25183f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.