Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 640 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 21217990 | 4 days ago | IN | 0 ETH | 0.00090972 | ||||
Safe Transfer Fr... | 21198169 | 7 days ago | IN | 0 ETH | 0.0007391 | ||||
Safe Transfer Fr... | 21198104 | 7 days ago | IN | 0 ETH | 0.00104882 | ||||
Set Approval For... | 21197816 | 7 days ago | IN | 0 ETH | 0.00075219 | ||||
Set Approval For... | 21196405 | 7 days ago | IN | 0 ETH | 0.0008116 | ||||
Set Approval For... | 21196293 | 7 days ago | IN | 0 ETH | 0.0008704 | ||||
Set Approval For... | 21195817 | 7 days ago | IN | 0 ETH | 0.00105717 | ||||
Set Approval For... | 21127437 | 17 days ago | IN | 0 ETH | 0.00145284 | ||||
Safe Transfer Fr... | 21090727 | 22 days ago | IN | 0 ETH | 0.00038288 | ||||
Safe Transfer Fr... | 21068895 | 25 days ago | IN | 0 ETH | 0.00064437 | ||||
Safe Transfer Fr... | 21067869 | 25 days ago | IN | 0 ETH | 0.00083125 | ||||
Set Approval For... | 20954013 | 41 days ago | IN | 0 ETH | 0.00038788 | ||||
Set Approval For... | 20944913 | 42 days ago | IN | 0 ETH | 0.00061902 | ||||
Safe Transfer Fr... | 20917265 | 46 days ago | IN | 0 ETH | 0.00073267 | ||||
Set Approval For... | 20844465 | 56 days ago | IN | 0 ETH | 0.00052082 | ||||
Set Approval For... | 20844453 | 56 days ago | IN | 0 ETH | 0.00050692 | ||||
Set Approval For... | 20737935 | 71 days ago | IN | 0 ETH | 0.00058879 | ||||
Set Approval For... | 20703469 | 76 days ago | IN | 0 ETH | 0.00006327 | ||||
Set Approval For... | 20674751 | 80 days ago | IN | 0 ETH | 0.00006374 | ||||
Set Approval For... | 20673061 | 80 days ago | IN | 0 ETH | 0.00005595 | ||||
Safe Transfer Fr... | 20667665 | 81 days ago | IN | 0 ETH | 0.00006699 | ||||
Set Approval For... | 20581240 | 93 days ago | IN | 0 ETH | 0.0000441 | ||||
Set Approval For... | 20573951 | 94 days ago | IN | 0 ETH | 0.00004077 | ||||
Set Approval For... | 20548871 | 98 days ago | IN | 0 ETH | 0.00008426 | ||||
Set Approval For... | 20548817 | 98 days ago | IN | 0 ETH | 0.00008858 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Orbit
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-06-07 */ // 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/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: @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/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/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/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/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/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/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/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.20; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // 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: ERC721A.sol // Creators: locationtba.eth, 2pmflow.eth pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 1;//0; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_ ) { require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } // /** // * @dev See {IERC721-safeTransferFrom}. // */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > currentIndex - 1) { endIndex = currentIndex - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (isContract(to)) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function isContract(address account) public view returns (bool) { // extcodesize > 0 is contract addr uint size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: HJN.sol /* ============================================== Orbit ============================================== */ pragma solidity >=0.8.9 <0.9.0; /** * @title Orbit */ library MerkleProof { function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } // Sorted Pair Hash function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? keccak256(abi.encodePacked(a, b)) : keccak256(abi.encodePacked(b, a)); } } contract Orbit is ERC721A, Ownable { using Strings for uint256; bool public publicMintEnabled = false; bool public wlMintStep1Enabled = false; bool public wlMintStep2Enabled = false; uint256 public Price = 1 ether; uint256 public TotalNum = 500; string private _baseURIextended = "ipfs://Qmbp5LkhFTjVxxedeWhCUX5vv8a9BshZvu5QLpXDmKCcgg/"; bytes32 public wlroot1 = ""; // bytes32 public wlroot2 = ""; // mapping(address => bool) public listClaimed; // mapping(address => bool) public blacklist; constructor() ERC721A("Orbit", "Orbit", 500) Ownable(msg.sender) {} function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { string memory currentBaseURI = _baseURI(); return string( abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json") ); } function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIextended = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function setRoot(bytes32 mroot,uint256 step) public onlyOwner { if (step ==1){ wlroot1 = mroot; } if (step == 2){ wlroot2 = mroot; } } function setPrice(uint256 newPrice) public onlyOwner { Price = newPrice; } function setPublicMint(bool enable) public onlyOwner { publicMintEnabled = enable; } function setWlMint(bool enable,uint256 step) public onlyOwner { if (step == 1){ wlMintStep1Enabled = enable; }else if (step == 2){ wlMintStep2Enabled = enable; } } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract!"); _; } function wlmint1(bytes32[] calldata proof) payable external callerIsUser { require(wlMintStep1Enabled, "The whitelist sale is not enabled!"); require(Price <= msg.value,"Don't send under (in ETH)."); require(totalSupply() <= TotalNum, "already mint out"); require(!listClaimed[msg.sender], "Already minted!"); // require(_verify(wlroot1,_leaf(msg.sender), proof), "Invalid merkle proof"); // listClaimed[msg.sender] = true; // _safeMint(msg.sender, 1); } function wlmint2(bytes32[] calldata proof) payable external callerIsUser { require(wlMintStep2Enabled, "The whitelist sale is not enabled!"); require(Price <= msg.value,"Don't send under (in ETH)."); require(totalSupply() <= TotalNum, "already mint out"); require(!listClaimed[msg.sender], "Already minted!"); // require(_verify(wlroot2,_leaf(msg.sender), proof), "Invalid merkle proof"); // listClaimed[msg.sender] = true; // _safeMint(msg.sender, 1); } function _leaf(address account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account)); } function _verify(bytes32 root,bytes32 leaf, bytes32[] memory proof) internal pure returns (bool) { return MerkleProof.verify(proof, root, leaf); } function mint() external payable callerIsUser { require(publicMintEnabled, "The whitelist sale is not enabled!"); require(totalSupply() <= TotalNum, "already mint out"); _safeMint(msg.sender, 1); } function airdrop(address _to, uint256 numberOfTokens) external onlyOwner { require(totalSupply() + numberOfTokens <= TotalNum, "already mint out"); _safeMint(_to, numberOfTokens); } function transferFrom(address _from, address _to, uint256 _tokenId) public override { require(!blacklist[_from], "Recipient is on the blacklist"); super.transferFrom(_from, _to, _tokenId); } function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public override { require(!blacklist[_from], "Recipient is on the blacklist"); super.safeTransferFrom(_from, _to, _tokenId, _data); } function safeTransferFrom(address _from, address _to, uint256 _tokenId) public override { require(!blacklist[_from], "Recipient is on the blacklist"); super.safeTransferFrom(_from, _to, _tokenId, ""); } function removeFromBlacklist(address _address) public onlyOwner { blacklist[_address] = false; } function addToBlacklist(address _address) public onlyOwner { blacklist[_address] = true; } function withdraw() public onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":[],"name":"Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"listClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"mroot","type":"bytes32"},{"internalType":"uint256","name":"step","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"},{"internalType":"uint256","name":"step","type":"uint256"}],"name":"setWlMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMintStep1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMintStep2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"wlmint1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"wlmint2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlroot1","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlroot2","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60015f9081556007556008805462ffffff60a01b19169055670de0b6b3a76400006009556101f4600a55610100604052603660a081815290612ad260c039600b9061004a90826101e0565b505f600c555f600d5534801561005e575f80fd5b5060408051808201825260058082526413dc989a5d60da1b602080840182905284518086019095529184529083015233916101f46100a0565b60405180910390fd5b60016100ac84826101e0565b5060026100b983826101e0565b5060805250506001600160a01b0381166100e857604051631e4fbdf760e01b81525f6004820152602401610097565b6100f1816100f7565b5061029a565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061017057607f821691505b60208210810361018e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101db57805f5260205f20601f840160051c810160208510156101b95750805b601f840160051c820191505b818110156101d8575f81556001016101c5565b50505b505050565b81516001600160401b038111156101f9576101f9610148565b61020d81610207845461015c565b84610194565b6020601f82116001811461023f575f83156102285750848201515b5f19600385901b1c1916600184901b1784556101d8565b5f84815260208120601f198516915b8281101561026e578785015182556020948501946001909201910161024e565b508482101561028b57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6080516128126102c05f395f81816115620152818161158c015261188401526128125ff3fe608060405260043610610249575f3560e01c8063715018a611610134578063b88d4fde116100b3578063d7224ba011610078578063d7224ba014610662578063e2b9e12814610677578063e985e9c5146106a5578063edbe2a21146106ec578063f2fde38b1461070b578063f9f92be41461072a575f80fd5b8063b88d4fde146105dc578063c36b2a3c146105fb578063c62dd15c1461061b578063c87b56dd14610630578063d3dd752f1461064f575f80fd5b806395d89b41116100f957806395d89b411461056a5780639dfde2011461057e578063a22cb46514610593578063b2d5fb47146105b2578063b6b7d944146105c7575f80fd5b8063715018a6146104e85780637b57422f146104fc5780638ba4cc3c1461050f5780638da5cb5b1461052e57806391b7f5ed1461054b575f80fd5b80632f745c59116101cb578063537df3b611610190578063537df3b61461042d57806355f804b31461044c578063612c941b1461046b5780636352211e1461048a5780636c7b0419146104a957806370a08231146104c9575f80fd5b80632f745c591461039d5780633ccfd60b146103bc57806342842e0e146103d057806344337ea1146103ef5780634f6ccce71461040e575f80fd5b80630f4161aa116102115780630f4161aa146103195780631249c58b14610339578063162790551461034157806318160ddd1461036157806323b872dd1461037e575f80fd5b806301ffc9a71461024d57806306fdde0314610281578063081812fc146102a2578063095ea7b3146102d95780630e2d56cf146102fa575b5f80fd5b348015610258575f80fd5b5061026c6102673660046120ac565b610758565b60405190151581526020015b60405180910390f35b34801561028c575f80fd5b506102956107c4565b60405161027891906120f5565b3480156102ad575f80fd5b506102c16102bc366004612107565b610854565b6040516001600160a01b039091168152602001610278565b3480156102e4575f80fd5b506102f86102f3366004612139565b6108e1565b005b348015610305575f80fd5b506102f8610314366004612170565b6109f7565b348015610324575f80fd5b5060085461026c90600160a01b900460ff1681565b6102f8610a1d565b34801561034c575f80fd5b5061026c61035b366004612189565b3b151590565b34801561036c575f80fd5b505f545b604051908152602001610278565b348015610389575f80fd5b506102f86103983660046121a2565b610a95565b3480156103a8575f80fd5b506103706103b7366004612139565b610ad8565b3480156103c7575f80fd5b506102f8610c36565b3480156103db575f80fd5b506102f86103ea3660046121a2565b610cfc565b3480156103fa575f80fd5b506102f8610409366004612189565b610d4e565b348015610419575f80fd5b50610370610428366004612107565b610d79565b348015610438575f80fd5b506102f8610447366004612189565b610dda565b348015610457575f80fd5b506102f8610466366004612265565b610e02565b348015610476575f80fd5b506102f86104853660046122a9565b610e1a565b348015610495575f80fd5b506102c16104a4366004612107565b610e6c565b3480156104b4575f80fd5b5060085461026c90600160a81b900460ff1681565b3480156104d4575f80fd5b506103706104e3366004612189565b610e7d565b3480156104f3575f80fd5b506102f8610f0c565b6102f861050a3660046122c3565b610f1d565b34801561051a575f80fd5b506102f8610529366004612139565b6110db565b348015610539575f80fd5b506008546001600160a01b03166102c1565b348015610556575f80fd5b506102f8610565366004612107565b611121565b348015610575575f80fd5b5061029561112e565b348015610589575f80fd5b5061037060095481565b34801561059e575f80fd5b506102f86105ad366004612332565b61113d565b3480156105bd575f80fd5b50610370600c5481565b3480156105d2575f80fd5b50610370600a5481565b3480156105e7575f80fd5b506102f86105f6366004612363565b611200565b348015610606575f80fd5b5060085461026c90600160b01b900460ff1681565b348015610626575f80fd5b50610370600d5481565b34801561063b575f80fd5b5061029561064a366004612107565b61124a565b6102f861065d3660046122c3565b611289565b34801561066d575f80fd5b5061037060075481565b348015610682575f80fd5b5061026c610691366004612189565b600e6020525f908152604090205460ff1681565b3480156106b0575f80fd5b5061026c6106bf3660046123d9565b6001600160a01b039182165f90815260066020908152604080832093909416825291909152205460ff1690565b3480156106f7575f80fd5b506102f8610706366004612401565b6113a6565b348015610716575f80fd5b506102f8610725366004612189565b6113ca565b348015610735575f80fd5b5061026c610744366004612189565b600f6020525f908152604090205460ff1681565b5f6001600160e01b031982166380ac58cd60e01b148061078857506001600160e01b03198216635b5e139f60e01b145b806107a357506001600160e01b0319821663780e9d6360e01b145b806107be57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546107d390612421565b80601f01602080910402602001604051908101604052809291908181526020018280546107ff90612421565b801561084a5780601f106108215761010080835404028352916020019161084a565b820191905f5260205f20905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b5f61085f825f541190565b6108c65760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b505f908152600560205260409020546001600160a01b031690565b5f6108eb82610e6c565b9050806001600160a01b0316836001600160a01b0316036109595760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016108bd565b336001600160a01b0382161480610975575061097581336106bf565b6109e75760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108bd565b6109f2838383611404565b505050565b6109ff61145f565b60088054911515600160a01b0260ff60a01b19909216919091179055565b323314610a3c5760405162461bcd60e51b81526004016108bd90612459565b600854600160a01b900460ff16610a655760405162461bcd60e51b81526004016108bd90612490565b600a545f541115610a885760405162461bcd60e51b81526004016108bd906124d2565b610a9333600161148c565b565b6001600160a01b0383165f908152600f602052604090205460ff1615610acd5760405162461bcd60e51b81526004016108bd906124fc565b6109f28383836114a5565b5f610ae283610e7d565b8210610b3b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016108bd565b5f80549080805b83811015610bd6575f818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610b9357805192505b876001600160a01b0316836001600160a01b031603610bcd57868403610bbf575093506107be92505050565b83610bc981612547565b9450505b50600101610b42565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016108bd565b610c3e61145f565b6040515f90339047908381818185875af1925050503d805f8114610c7d576040519150601f19603f3d011682016040523d82523d5f602084013e610c82565b606091505b5050905080610cf95760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108bd565b50565b6001600160a01b0383165f908152600f602052604090205460ff1615610d345760405162461bcd60e51b81526004016108bd906124fc565b6109f283838360405180602001604052805f8152506114b0565b610d5661145f565b6001600160a01b03165f908152600f60205260409020805460ff19166001179055565b5f80548210610dd65760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108bd565b5090565b610de261145f565b6001600160a01b03165f908152600f60205260409020805460ff19169055565b610e0a61145f565b600b610e1682826125aa565b5050565b610e2261145f565b80600103610e475760088054831515600160a81b0260ff60a81b199091161790555050565b80600203610e165760088054831515600160b01b0260ff60b01b199091161790555050565b5f610e76826114e3565b5192915050565b5f6001600160a01b038216610ee85760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016108bd565b506001600160a01b03165f908152600460205260409020546001600160801b031690565b610f1461145f565b610a935f611688565b323314610f3c5760405162461bcd60e51b81526004016108bd90612459565b600854600160b01b900460ff16610f655760405162461bcd60e51b81526004016108bd90612490565b346009541115610fb75760405162461bcd60e51b815260206004820152601a60248201527f446f6e27742073656e6420756e6465722028696e20455448292e00000000000060448201526064016108bd565b600a545f541115610fda5760405162461bcd60e51b81526004016108bd906124d2565b335f908152600e602052604090205460ff161561102b5760405162461bcd60e51b815260206004820152600f60248201526e416c7265616479206d696e7465642160881b60448201526064016108bd565b611072600d5461103a336116d9565b8484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061171792505050565b6110b55760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b60448201526064016108bd565b335f818152600e60205260409020805460ff19166001908117909155610e16919061148c565b6110e361145f565b600a54816110ef5f5490565b6110f99190612664565b11156111175760405162461bcd60e51b81526004016108bd906124d2565b610e16828261148c565b61112961145f565b600955565b6060600280546107d390612421565b336001600160a01b038316036111955760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108bd565b335f8181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001600160a01b0384165f908152600f602052604090205460ff16156112385760405162461bcd60e51b81526004016108bd906124fc565b611244848484846114b0565b50505050565b60605f61125561172b565b9050806112618461173a565b60405160200161127292919061268e565b604051602081830303815290604052915050919050565b3233146112a85760405162461bcd60e51b81526004016108bd90612459565b600854600160a81b900460ff166112d15760405162461bcd60e51b81526004016108bd90612490565b3460095411156113235760405162461bcd60e51b815260206004820152601a60248201527f446f6e27742073656e6420756e6465722028696e20455448292e00000000000060448201526064016108bd565b600a545f5411156113465760405162461bcd60e51b81526004016108bd906124d2565b335f908152600e602052604090205460ff16156113975760405162461bcd60e51b815260206004820152600f60248201526e416c7265616479206d696e7465642160881b60448201526064016108bd565b611072600c5461103a336116d9565b6113ae61145f565b806001036113bc57600c8290555b80600203610e165750600d55565b6113d261145f565b6001600160a01b0381166113fb57604051631e4fbdf760e01b81525f60048201526024016108bd565b610cf981611688565b5f8281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a935760405163118cdaa760e01b81523360048201526024016108bd565b610e16828260405180602001604052805f8152506117c9565b6109f2838383611a95565b6114bb848484611a95565b6114c784848484611e0c565b6112445760405162461bcd60e51b81526004016108bd906126b8565b604080518082019091525f8082526020820152611500825f541190565b61155f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016108bd565b5f7f000000000000000000000000000000000000000000000000000000000000000083106115bf576115b17f00000000000000000000000000000000000000000000000000000000000000008461270b565b6115bc906001612664565b90505b825b818110611627575f818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561161457949350505050565b508061161f8161271e565b9150506115c1565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016108bd565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040516bffffffffffffffffffffffff19606083901b1660208201525f90603401604051602081830303815290604052805190602001209050919050565b5f611723828585611f00565b949350505050565b6060600b80546107d390612421565b60605f61174683611f15565b60010190505f816001600160401b03811115611764576117646121dc565b6040519080825280601f01601f19166020018201604052801561178e576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461179857509392505050565b5f546001600160a01b03841661182b5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108bd565b611835815f541190565b156118825760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016108bd565b7f00000000000000000000000000000000000000000000000000000000000000008311156118fd5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016108bd565b6001600160a01b0384165f908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611958908790612733565b6001600160801b031681526020018583602001516119769190612733565b6001600160801b039081169091526001600160a01b038088165f8181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015611a875760405182906001600160a01b038916905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611a565f888488611e0c565b611a725760405162461bcd60e51b81526004016108bd906126b8565b81611a7c81612547565b925050600101611a0b565b505f8190555b505050505050565b5f611a9f826114e3565b80519091505f906001600160a01b0316336001600160a01b03161480611ad5575033611aca84610854565b6001600160a01b0316145b80611ae757508151611ae790336106bf565b905080611b515760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108bd565b846001600160a01b0316825f01516001600160a01b031614611bc45760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016108bd565b6001600160a01b038416611c285760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016108bd565b611c365f84845f0151611404565b6001600160a01b0385165f908152600460205260408120805460019290611c679084906001600160801b0316612752565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386165f9081526004602052604081208054600194509092611cb291859116612733565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b0342811660208085019182525f8981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611d38846001612664565b5f818152600360205260409020549091506001600160a01b0316611dc657611d60815f541190565b15611dc65760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081525f878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a8d565b5f833b15611ef557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e46903390899088908890600401612771565b6020604051808303815f875af1925050508015611e80575060408051601f3d908101601f19168201909252611e7d918101906127ad565b60015b611edb573d808015611ead576040519150601f19603f3d011682016040523d82523d5f602084013e611eb2565b606091505b5080515f03611ed35760405162461bcd60e51b81526004016108bd906126b8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611723565b506001949350505050565b5f82611f0c8584611fec565b14949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611f535772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611f7f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611f9d57662386f26fc10000830492506010015b6305f5e1008310611fb5576305f5e100830492506008015b6127108310611fc957612710830492506004015b60648310611fdb576064830492506002015b600a83106107be5760010192915050565b5f81815b84518110156120265761201c8286838151811061200f5761200f6127c8565b602002602001015161202e565b9150600101611ff0565b509392505050565b5f81831061206557604080516020810184905290810184905260600160405160208183030381529060405280519060200120612090565b6040805160208101859052908101839052606001604051602081830303815290604052805190602001205b9392505050565b6001600160e01b031981168114610cf9575f80fd5b5f602082840312156120bc575f80fd5b813561209081612097565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61209060208301846120c7565b5f60208284031215612117575f80fd5b5035919050565b80356001600160a01b0381168114612134575f80fd5b919050565b5f806040838503121561214a575f80fd5b6121538361211e565b946020939093013593505050565b80358015158114612134575f80fd5b5f60208284031215612180575f80fd5b61209082612161565b5f60208284031215612199575f80fd5b6120908261211e565b5f805f606084860312156121b4575f80fd5b6121bd8461211e565b92506121cb6020850161211e565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b5f806001600160401b03841115612209576122096121dc565b50604051601f19601f85018116603f011681018181106001600160401b0382111715612237576122376121dc565b60405283815290508082840185101561224e575f80fd5b838360208301375f60208583010152509392505050565b5f60208284031215612275575f80fd5b81356001600160401b0381111561228a575f80fd5b8201601f8101841361229a575f80fd5b611723848235602084016121f0565b5f80604083850312156122ba575f80fd5b61215383612161565b5f80602083850312156122d4575f80fd5b82356001600160401b038111156122e9575f80fd5b8301601f810185136122f9575f80fd5b80356001600160401b0381111561230e575f80fd5b8560208260051b8401011115612322575f80fd5b6020919091019590945092505050565b5f8060408385031215612343575f80fd5b61234c8361211e565b915061235a60208401612161565b90509250929050565b5f805f8060808587031215612376575f80fd5b61237f8561211e565b935061238d6020860161211e565b92506040850135915060608501356001600160401b038111156123ae575f80fd5b8501601f810187136123be575f80fd5b6123cd878235602084016121f0565b91505092959194509250565b5f80604083850312156123ea575f80fd5b6123f38361211e565b915061235a6020840161211e565b5f8060408385031215612412575f80fd5b50508035926020909101359150565b600181811c9082168061243557607f821691505b60208210810361245357634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601f908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163742100604082015260600190565b60208082526022908201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604082015261642160f01b606082015260800190565b60208082526010908201526f185b1c9958591e481b5a5b9d081bdd5d60821b604082015260600190565b6020808252601d908201527f526563697069656e74206973206f6e2074686520626c61636b6c697374000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161255857612558612533565b5060010190565b601f8211156109f257805f5260205f20601f840160051c810160208510156125845750805b601f840160051c820191505b818110156125a3575f8155600101612590565b5050505050565b81516001600160401b038111156125c3576125c36121dc565b6125d7816125d18454612421565b8461255f565b6020601f821160018114612609575f83156125f25750848201515b5f19600385901b1c1916600184901b1784556125a3565b5f84815260208120601f198516915b828110156126385787850151825560209485019460019092019101612618565b508482101561265557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b808201808211156107be576107be612533565b5f81518060208401855e5f93019283525090919050565b5f6126a261269c8386612677565b84612677565b64173539b7b760d91b8152600501949350505050565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b818103818111156107be576107be612533565b5f8161272c5761272c612533565b505f190190565b6001600160801b0381811683821601908111156107be576107be612533565b6001600160801b0382811682821603908111156107be576107be612533565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906127a3908301846120c7565b9695505050505050565b5f602082840312156127bd575f80fd5b815161209081612097565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220bbecdcba8d559cf4a519e969335cb96433e6597c1a9ea06ee274cf68294c986464736f6c634300081a0033697066733a2f2f516d6270354c6b6846546a56787865646557684355583576763861394273685a767535514c7058446d4b436367672f
Deployed Bytecode
0x608060405260043610610249575f3560e01c8063715018a611610134578063b88d4fde116100b3578063d7224ba011610078578063d7224ba014610662578063e2b9e12814610677578063e985e9c5146106a5578063edbe2a21146106ec578063f2fde38b1461070b578063f9f92be41461072a575f80fd5b8063b88d4fde146105dc578063c36b2a3c146105fb578063c62dd15c1461061b578063c87b56dd14610630578063d3dd752f1461064f575f80fd5b806395d89b41116100f957806395d89b411461056a5780639dfde2011461057e578063a22cb46514610593578063b2d5fb47146105b2578063b6b7d944146105c7575f80fd5b8063715018a6146104e85780637b57422f146104fc5780638ba4cc3c1461050f5780638da5cb5b1461052e57806391b7f5ed1461054b575f80fd5b80632f745c59116101cb578063537df3b611610190578063537df3b61461042d57806355f804b31461044c578063612c941b1461046b5780636352211e1461048a5780636c7b0419146104a957806370a08231146104c9575f80fd5b80632f745c591461039d5780633ccfd60b146103bc57806342842e0e146103d057806344337ea1146103ef5780634f6ccce71461040e575f80fd5b80630f4161aa116102115780630f4161aa146103195780631249c58b14610339578063162790551461034157806318160ddd1461036157806323b872dd1461037e575f80fd5b806301ffc9a71461024d57806306fdde0314610281578063081812fc146102a2578063095ea7b3146102d95780630e2d56cf146102fa575b5f80fd5b348015610258575f80fd5b5061026c6102673660046120ac565b610758565b60405190151581526020015b60405180910390f35b34801561028c575f80fd5b506102956107c4565b60405161027891906120f5565b3480156102ad575f80fd5b506102c16102bc366004612107565b610854565b6040516001600160a01b039091168152602001610278565b3480156102e4575f80fd5b506102f86102f3366004612139565b6108e1565b005b348015610305575f80fd5b506102f8610314366004612170565b6109f7565b348015610324575f80fd5b5060085461026c90600160a01b900460ff1681565b6102f8610a1d565b34801561034c575f80fd5b5061026c61035b366004612189565b3b151590565b34801561036c575f80fd5b505f545b604051908152602001610278565b348015610389575f80fd5b506102f86103983660046121a2565b610a95565b3480156103a8575f80fd5b506103706103b7366004612139565b610ad8565b3480156103c7575f80fd5b506102f8610c36565b3480156103db575f80fd5b506102f86103ea3660046121a2565b610cfc565b3480156103fa575f80fd5b506102f8610409366004612189565b610d4e565b348015610419575f80fd5b50610370610428366004612107565b610d79565b348015610438575f80fd5b506102f8610447366004612189565b610dda565b348015610457575f80fd5b506102f8610466366004612265565b610e02565b348015610476575f80fd5b506102f86104853660046122a9565b610e1a565b348015610495575f80fd5b506102c16104a4366004612107565b610e6c565b3480156104b4575f80fd5b5060085461026c90600160a81b900460ff1681565b3480156104d4575f80fd5b506103706104e3366004612189565b610e7d565b3480156104f3575f80fd5b506102f8610f0c565b6102f861050a3660046122c3565b610f1d565b34801561051a575f80fd5b506102f8610529366004612139565b6110db565b348015610539575f80fd5b506008546001600160a01b03166102c1565b348015610556575f80fd5b506102f8610565366004612107565b611121565b348015610575575f80fd5b5061029561112e565b348015610589575f80fd5b5061037060095481565b34801561059e575f80fd5b506102f86105ad366004612332565b61113d565b3480156105bd575f80fd5b50610370600c5481565b3480156105d2575f80fd5b50610370600a5481565b3480156105e7575f80fd5b506102f86105f6366004612363565b611200565b348015610606575f80fd5b5060085461026c90600160b01b900460ff1681565b348015610626575f80fd5b50610370600d5481565b34801561063b575f80fd5b5061029561064a366004612107565b61124a565b6102f861065d3660046122c3565b611289565b34801561066d575f80fd5b5061037060075481565b348015610682575f80fd5b5061026c610691366004612189565b600e6020525f908152604090205460ff1681565b3480156106b0575f80fd5b5061026c6106bf3660046123d9565b6001600160a01b039182165f90815260066020908152604080832093909416825291909152205460ff1690565b3480156106f7575f80fd5b506102f8610706366004612401565b6113a6565b348015610716575f80fd5b506102f8610725366004612189565b6113ca565b348015610735575f80fd5b5061026c610744366004612189565b600f6020525f908152604090205460ff1681565b5f6001600160e01b031982166380ac58cd60e01b148061078857506001600160e01b03198216635b5e139f60e01b145b806107a357506001600160e01b0319821663780e9d6360e01b145b806107be57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546107d390612421565b80601f01602080910402602001604051908101604052809291908181526020018280546107ff90612421565b801561084a5780601f106108215761010080835404028352916020019161084a565b820191905f5260205f20905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b5f61085f825f541190565b6108c65760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b505f908152600560205260409020546001600160a01b031690565b5f6108eb82610e6c565b9050806001600160a01b0316836001600160a01b0316036109595760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016108bd565b336001600160a01b0382161480610975575061097581336106bf565b6109e75760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108bd565b6109f2838383611404565b505050565b6109ff61145f565b60088054911515600160a01b0260ff60a01b19909216919091179055565b323314610a3c5760405162461bcd60e51b81526004016108bd90612459565b600854600160a01b900460ff16610a655760405162461bcd60e51b81526004016108bd90612490565b600a545f541115610a885760405162461bcd60e51b81526004016108bd906124d2565b610a9333600161148c565b565b6001600160a01b0383165f908152600f602052604090205460ff1615610acd5760405162461bcd60e51b81526004016108bd906124fc565b6109f28383836114a5565b5f610ae283610e7d565b8210610b3b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016108bd565b5f80549080805b83811015610bd6575f818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610b9357805192505b876001600160a01b0316836001600160a01b031603610bcd57868403610bbf575093506107be92505050565b83610bc981612547565b9450505b50600101610b42565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016108bd565b610c3e61145f565b6040515f90339047908381818185875af1925050503d805f8114610c7d576040519150601f19603f3d011682016040523d82523d5f602084013e610c82565b606091505b5050905080610cf95760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108bd565b50565b6001600160a01b0383165f908152600f602052604090205460ff1615610d345760405162461bcd60e51b81526004016108bd906124fc565b6109f283838360405180602001604052805f8152506114b0565b610d5661145f565b6001600160a01b03165f908152600f60205260409020805460ff19166001179055565b5f80548210610dd65760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108bd565b5090565b610de261145f565b6001600160a01b03165f908152600f60205260409020805460ff19169055565b610e0a61145f565b600b610e1682826125aa565b5050565b610e2261145f565b80600103610e475760088054831515600160a81b0260ff60a81b199091161790555050565b80600203610e165760088054831515600160b01b0260ff60b01b199091161790555050565b5f610e76826114e3565b5192915050565b5f6001600160a01b038216610ee85760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016108bd565b506001600160a01b03165f908152600460205260409020546001600160801b031690565b610f1461145f565b610a935f611688565b323314610f3c5760405162461bcd60e51b81526004016108bd90612459565b600854600160b01b900460ff16610f655760405162461bcd60e51b81526004016108bd90612490565b346009541115610fb75760405162461bcd60e51b815260206004820152601a60248201527f446f6e27742073656e6420756e6465722028696e20455448292e00000000000060448201526064016108bd565b600a545f541115610fda5760405162461bcd60e51b81526004016108bd906124d2565b335f908152600e602052604090205460ff161561102b5760405162461bcd60e51b815260206004820152600f60248201526e416c7265616479206d696e7465642160881b60448201526064016108bd565b611072600d5461103a336116d9565b8484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061171792505050565b6110b55760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b60448201526064016108bd565b335f818152600e60205260409020805460ff19166001908117909155610e16919061148c565b6110e361145f565b600a54816110ef5f5490565b6110f99190612664565b11156111175760405162461bcd60e51b81526004016108bd906124d2565b610e16828261148c565b61112961145f565b600955565b6060600280546107d390612421565b336001600160a01b038316036111955760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108bd565b335f8181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001600160a01b0384165f908152600f602052604090205460ff16156112385760405162461bcd60e51b81526004016108bd906124fc565b611244848484846114b0565b50505050565b60605f61125561172b565b9050806112618461173a565b60405160200161127292919061268e565b604051602081830303815290604052915050919050565b3233146112a85760405162461bcd60e51b81526004016108bd90612459565b600854600160a81b900460ff166112d15760405162461bcd60e51b81526004016108bd90612490565b3460095411156113235760405162461bcd60e51b815260206004820152601a60248201527f446f6e27742073656e6420756e6465722028696e20455448292e00000000000060448201526064016108bd565b600a545f5411156113465760405162461bcd60e51b81526004016108bd906124d2565b335f908152600e602052604090205460ff16156113975760405162461bcd60e51b815260206004820152600f60248201526e416c7265616479206d696e7465642160881b60448201526064016108bd565b611072600c5461103a336116d9565b6113ae61145f565b806001036113bc57600c8290555b80600203610e165750600d55565b6113d261145f565b6001600160a01b0381166113fb57604051631e4fbdf760e01b81525f60048201526024016108bd565b610cf981611688565b5f8281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a935760405163118cdaa760e01b81523360048201526024016108bd565b610e16828260405180602001604052805f8152506117c9565b6109f2838383611a95565b6114bb848484611a95565b6114c784848484611e0c565b6112445760405162461bcd60e51b81526004016108bd906126b8565b604080518082019091525f8082526020820152611500825f541190565b61155f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016108bd565b5f7f00000000000000000000000000000000000000000000000000000000000001f483106115bf576115b17f00000000000000000000000000000000000000000000000000000000000001f48461270b565b6115bc906001612664565b90505b825b818110611627575f818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561161457949350505050565b508061161f8161271e565b9150506115c1565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016108bd565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040516bffffffffffffffffffffffff19606083901b1660208201525f90603401604051602081830303815290604052805190602001209050919050565b5f611723828585611f00565b949350505050565b6060600b80546107d390612421565b60605f61174683611f15565b60010190505f816001600160401b03811115611764576117646121dc565b6040519080825280601f01601f19166020018201604052801561178e576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461179857509392505050565b5f546001600160a01b03841661182b5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108bd565b611835815f541190565b156118825760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016108bd565b7f00000000000000000000000000000000000000000000000000000000000001f48311156118fd5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016108bd565b6001600160a01b0384165f908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611958908790612733565b6001600160801b031681526020018583602001516119769190612733565b6001600160801b039081169091526001600160a01b038088165f8181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015611a875760405182906001600160a01b038916905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611a565f888488611e0c565b611a725760405162461bcd60e51b81526004016108bd906126b8565b81611a7c81612547565b925050600101611a0b565b505f8190555b505050505050565b5f611a9f826114e3565b80519091505f906001600160a01b0316336001600160a01b03161480611ad5575033611aca84610854565b6001600160a01b0316145b80611ae757508151611ae790336106bf565b905080611b515760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108bd565b846001600160a01b0316825f01516001600160a01b031614611bc45760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016108bd565b6001600160a01b038416611c285760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016108bd565b611c365f84845f0151611404565b6001600160a01b0385165f908152600460205260408120805460019290611c679084906001600160801b0316612752565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386165f9081526004602052604081208054600194509092611cb291859116612733565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b0342811660208085019182525f8981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611d38846001612664565b5f818152600360205260409020549091506001600160a01b0316611dc657611d60815f541190565b15611dc65760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081525f878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a8d565b5f833b15611ef557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e46903390899088908890600401612771565b6020604051808303815f875af1925050508015611e80575060408051601f3d908101601f19168201909252611e7d918101906127ad565b60015b611edb573d808015611ead576040519150601f19603f3d011682016040523d82523d5f602084013e611eb2565b606091505b5080515f03611ed35760405162461bcd60e51b81526004016108bd906126b8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611723565b506001949350505050565b5f82611f0c8584611fec565b14949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611f535772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611f7f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611f9d57662386f26fc10000830492506010015b6305f5e1008310611fb5576305f5e100830492506008015b6127108310611fc957612710830492506004015b60648310611fdb576064830492506002015b600a83106107be5760010192915050565b5f81815b84518110156120265761201c8286838151811061200f5761200f6127c8565b602002602001015161202e565b9150600101611ff0565b509392505050565b5f81831061206557604080516020810184905290810184905260600160405160208183030381529060405280519060200120612090565b6040805160208101859052908101839052606001604051602081830303815290604052805190602001205b9392505050565b6001600160e01b031981168114610cf9575f80fd5b5f602082840312156120bc575f80fd5b813561209081612097565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61209060208301846120c7565b5f60208284031215612117575f80fd5b5035919050565b80356001600160a01b0381168114612134575f80fd5b919050565b5f806040838503121561214a575f80fd5b6121538361211e565b946020939093013593505050565b80358015158114612134575f80fd5b5f60208284031215612180575f80fd5b61209082612161565b5f60208284031215612199575f80fd5b6120908261211e565b5f805f606084860312156121b4575f80fd5b6121bd8461211e565b92506121cb6020850161211e565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b5f806001600160401b03841115612209576122096121dc565b50604051601f19601f85018116603f011681018181106001600160401b0382111715612237576122376121dc565b60405283815290508082840185101561224e575f80fd5b838360208301375f60208583010152509392505050565b5f60208284031215612275575f80fd5b81356001600160401b0381111561228a575f80fd5b8201601f8101841361229a575f80fd5b611723848235602084016121f0565b5f80604083850312156122ba575f80fd5b61215383612161565b5f80602083850312156122d4575f80fd5b82356001600160401b038111156122e9575f80fd5b8301601f810185136122f9575f80fd5b80356001600160401b0381111561230e575f80fd5b8560208260051b8401011115612322575f80fd5b6020919091019590945092505050565b5f8060408385031215612343575f80fd5b61234c8361211e565b915061235a60208401612161565b90509250929050565b5f805f8060808587031215612376575f80fd5b61237f8561211e565b935061238d6020860161211e565b92506040850135915060608501356001600160401b038111156123ae575f80fd5b8501601f810187136123be575f80fd5b6123cd878235602084016121f0565b91505092959194509250565b5f80604083850312156123ea575f80fd5b6123f38361211e565b915061235a6020840161211e565b5f8060408385031215612412575f80fd5b50508035926020909101359150565b600181811c9082168061243557607f821691505b60208210810361245357634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601f908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163742100604082015260600190565b60208082526022908201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604082015261642160f01b606082015260800190565b60208082526010908201526f185b1c9958591e481b5a5b9d081bdd5d60821b604082015260600190565b6020808252601d908201527f526563697069656e74206973206f6e2074686520626c61636b6c697374000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161255857612558612533565b5060010190565b601f8211156109f257805f5260205f20601f840160051c810160208510156125845750805b601f840160051c820191505b818110156125a3575f8155600101612590565b5050505050565b81516001600160401b038111156125c3576125c36121dc565b6125d7816125d18454612421565b8461255f565b6020601f821160018114612609575f83156125f25750848201515b5f19600385901b1c1916600184901b1784556125a3565b5f84815260208120601f198516915b828110156126385787850151825560209485019460019092019101612618565b508482101561265557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b808201808211156107be576107be612533565b5f81518060208401855e5f93019283525090919050565b5f6126a261269c8386612677565b84612677565b64173539b7b760d91b8152600501949350505050565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b818103818111156107be576107be612533565b5f8161272c5761272c612533565b505f190190565b6001600160801b0381811683821601908111156107be576107be612533565b6001600160801b0382811682821603908111156107be576107be612533565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906127a3908301846120c7565b9695505050505050565b5f602082840312156127bd575f80fd5b815161209081612097565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220bbecdcba8d559cf4a519e969335cb96433e6597c1a9ea06ee274cf68294c986464736f6c634300081a0033
Deployed Bytecode Sourcemap
57467:5059:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43942:370;;;;;;;;;;-1:-1:-1;43942:370:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;43942:370:0;;;;;;;;45668:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47193:204::-;;;;;;;;;;-1:-1:-1;47193:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1528:32:1;;;1510:51;;1498:2;1483:18;47193:204:0;1364:203:1;46756:379:0;;;;;;;;;;-1:-1:-1;46756:379:0;;;;;:::i;:::-;;:::i;:::-;;59011:98;;;;;;;;;;-1:-1:-1;59011:98:0;;;;;:::i;:::-;;:::i;57544:37::-;;;;;;;;;;-1:-1:-1;57544:37:0;;;;-1:-1:-1;;;57544:37:0;;;;;;60882:229;;;:::i;55063:246::-;;;;;;;;;;-1:-1:-1;55063:246:0;;;;;:::i;:::-;55243:20;55295:8;;;55063:246;42506:94;;;;;;;;;;-1:-1:-1;42559:7:0;42582:12;42506:94;;;2742:25:1;;;2730:2;2715:18;42506:94:0;2596:177:1;61333:213:0;;;;;;;;;;-1:-1:-1;61333:213:0;;;;;:::i;:::-;;:::i;43134:744::-;;;;;;;;;;-1:-1:-1;43134:744:0;;;;;:::i;:::-;;:::i;62273:250::-;;;;;;;;;;;;;:::i;61810:225::-;;;;;;;;;;-1:-1:-1;61810:225:0;;;;;:::i;:::-;;:::i;62161:104::-;;;;;;;;;;-1:-1:-1;62161:104:0;;;;;:::i;:::-;;:::i;42669:177::-;;;;;;;;;;-1:-1:-1;42669:177:0;;;;;:::i;:::-;;:::i;62043:110::-;;;;;;;;;;-1:-1:-1;62043:110:0;;;;;:::i;:::-;;:::i;58446:109::-;;;;;;;;;;-1:-1:-1;58446:109:0;;;;;:::i;:::-;;:::i;59117:221::-;;;;;;;;;;-1:-1:-1;59117:221:0;;;;;:::i;:::-;;:::i;45491:118::-;;;;;;;;;;-1:-1:-1;45491:118:0;;;;;:::i;:::-;;:::i;57588:38::-;;;;;;;;;;-1:-1:-1;57588:38:0;;;;-1:-1:-1;;;57588:38:0;;;;;;44368:211;;;;;;;;;;-1:-1:-1;44368:211:0;;;;;:::i;:::-;;:::i;3361:103::-;;;;;;;;;;;;;:::i;60008:524::-;;;;;;:::i;:::-;;:::i;61121:204::-;;;;;;;;;;-1:-1:-1;61121:204:0;;;;;:::i;:::-;;:::i;2686:87::-;;;;;;;;;;-1:-1:-1;2759:6:0;;-1:-1:-1;;;;;2759:6:0;2686:87;;58915:88;;;;;;;;;;-1:-1:-1;58915:88:0;;;;;:::i;:::-;;:::i;45823:98::-;;;;;;;;;;;;;:::i;57678:30::-;;;;;;;;;;;;;;;;47461:274;;;;;;;;;;-1:-1:-1;47461:274:0;;;;;:::i;:::-;;:::i;57855:27::-;;;;;;;;;;;;;;;;57715:29;;;;;;;;;;;;;;;;61554:248;;;;;;;;;;-1:-1:-1;61554:248:0;;;;;:::i;:::-;;:::i;57633:38::-;;;;;;;;;;-1:-1:-1;57633:38:0;;;;-1:-1:-1;;;57633:38:0;;;;;;57892:27;;;;;;;;;;;;;;;;58107:331;;;;;;;;;;-1:-1:-1;58107:331:0;;;;;:::i;:::-;;:::i;59476:524::-;;;;;;:::i;:::-;;:::i;52835:43::-;;;;;;;;;;;;;;;;57929;;;;;;;;;;-1:-1:-1;57929:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47798:186;;;;;;;;;;-1:-1:-1;47798:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;47943:25:0;;;47920:4;47943:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;47798:186;58688:219;;;;;;;;;;-1:-1:-1;58688:219:0;;;;;:::i;:::-;;:::i;3619:220::-;;;;;;;;;;-1:-1:-1;3619:220:0;;;;;:::i;:::-;;:::i;57982:41::-;;;;;;;;;;-1:-1:-1;57982:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43942:370;44069:4;-1:-1:-1;;;;;;44099:40:0;;-1:-1:-1;;;44099:40:0;;:99;;-1:-1:-1;;;;;;;44150:48:0;;-1:-1:-1;;;44150:48:0;44099:99;:160;;;-1:-1:-1;;;;;;;44209:50:0;;-1:-1:-1;;;44209:50:0;44099:160;:207;;;-1:-1:-1;;;;;;;;;;40489:40:0;;;44270:36;44085:221;43942:370;-1:-1:-1;;43942:370:0:o;45668:94::-;45722:13;45751:5;45744:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45668:94;:::o;47193:204::-;47261:7;47285:16;47293:7;49111:4;49141:12;-1:-1:-1;49131:22:0;49054:105;47285:16;47277:74;;;;-1:-1:-1;;;47277:74:0;;7690:2:1;47277:74:0;;;7672:21:1;7729:2;7709:18;;;7702:30;7768:34;7748:18;;;7741:62;-1:-1:-1;;;7819:18:1;;;7812:43;7872:19;;47277:74:0;;;;;;;;;-1:-1:-1;47367:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;47367:24:0;;47193:204::o;46756:379::-;46825:13;46841:24;46857:7;46841:15;:24::i;:::-;46825:40;;46886:5;-1:-1:-1;;;;;46880:11:0;:2;-1:-1:-1;;;;;46880:11:0;;46872:58;;;;-1:-1:-1;;;46872:58:0;;8104:2:1;46872:58:0;;;8086:21:1;8143:2;8123:18;;;8116:30;8182:34;8162:18;;;8155:62;-1:-1:-1;;;8233:18:1;;;8226:32;8275:19;;46872:58:0;7902:398:1;46872:58:0;775:10;-1:-1:-1;;;;;46955:21:0;;;;:62;;-1:-1:-1;46980:37:0;46997:5;775:10;47798:186;:::i;46980:37::-;46939:153;;;;-1:-1:-1;;;46939:153:0;;8507:2:1;46939:153:0;;;8489:21:1;8546:2;8526:18;;;8519:30;8585:34;8565:18;;;8558:62;8656:27;8636:18;;;8629:55;8701:19;;46939:153:0;8305:421:1;46939:153:0;47101:28;47110:2;47114:7;47123:5;47101:8;:28::i;:::-;46818:317;46756:379;;:::o;59011:98::-;2572:13;:11;:13::i;:::-;59075:17:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;59075:26:0::1;-1:-1:-1::0;;;;59075:26:0;;::::1;::::0;;;::::1;::::0;;59011:98::o;60882:229::-;59389:9;59402:10;59389:23;59381:67;;;;-1:-1:-1;;;59381:67:0;;;;;;;:::i;:::-;60947:17:::1;::::0;-1:-1:-1;;;60947:17:0;::::1;;;60939:64;;;;-1:-1:-1::0;;;60939:64:0::1;;;;;;;:::i;:::-;61039:8;::::0;42559:7;42582:12;61022:25:::1;;61014:54;;;;-1:-1:-1::0;;;61014:54:0::1;;;;;;;:::i;:::-;61079:24;61089:10;61101:1;61079:9;:24::i;:::-;60882:229::o:0;61333:213::-;-1:-1:-1;;;;;61437:16:0;;;;;;:9;:16;;;;;;;;61436:17;61428:59;;;;-1:-1:-1;;;61428:59:0;;;;;;;:::i;:::-;61498:40;61517:5;61524:3;61529:8;61498:18;:40::i;43134:744::-;43243:7;43278:16;43288:5;43278:9;:16::i;:::-;43270:5;:24;43262:71;;;;-1:-1:-1;;;43262:71:0;;10399:2:1;43262:71:0;;;10381:21:1;10438:2;10418:18;;;10411:30;10477:34;10457:18;;;10450:62;-1:-1:-1;;;10528:18:1;;;10521:32;10570:19;;43262:71:0;10197:398:1;43262:71:0;43340:22;42582:12;;;43340:22;;43460:350;43484:14;43480:1;:18;43460:350;;;43514:31;43548:14;;;:11;:14;;;;;;;;;43514:48;;;;;;;;;-1:-1:-1;;;;;43514:48:0;;;;;-1:-1:-1;;;43514:48:0;;;-1:-1:-1;;;;;43514:48:0;;;;;;;;43575:28;43571:89;;43636:14;;;-1:-1:-1;43571:89:0;43693:5;-1:-1:-1;;;;;43672:26:0;:17;-1:-1:-1;;;;;43672:26:0;;43668:135;;43730:5;43715:11;:20;43711:59;;-1:-1:-1;43757:1:0;-1:-1:-1;43750:8:0;;-1:-1:-1;;;43750:8:0;43711:59;43780:13;;;;:::i;:::-;;;;43668:135;-1:-1:-1;43500:3:0;;43460:350;;;-1:-1:-1;43816:56:0;;-1:-1:-1;;;43816:56:0;;11074:2:1;43816:56:0;;;11056:21:1;11113:2;11093:18;;;11086:30;11152:34;11132:18;;;11125:62;-1:-1:-1;;;11203:18:1;;;11196:44;11257:19;;43816:56:0;10872:410:1;62273:250:0;2572:13;:11;:13::i;:::-;62340:49:::1;::::0;62322:12:::1;::::0;62340:10:::1;::::0;62363:21:::1;::::0;62322:12;62340:49;62322:12;62340:49;62363:21;62340:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62321:68;;;62422:7;62400:115;;;::::0;-1:-1:-1;;;62400:115:0;;11699:2:1;62400:115:0::1;::::0;::::1;11681:21:1::0;11738:2;11718:18;;;11711:30;11777:34;11757:18;;;11750:62;11848:28;11828:18;;;11821:56;11894:19;;62400:115:0::1;11497:422:1::0;62400:115:0::1;62310:213;62273:250::o:0;61810:225::-;-1:-1:-1;;;;;61918:16:0;;;;;;:9;:16;;;;;;;;61917:17;61909:59;;;;-1:-1:-1;;;61909:59:0;;;;;;;:::i;:::-;61979:48;62002:5;62009:3;62014:8;61979:48;;;;;;;;;;;;:22;:48::i;62161:104::-;2572:13;:11;:13::i;:::-;-1:-1:-1;;;;;62231:19:0::1;;::::0;;;:9:::1;:19;::::0;;;;:26;;-1:-1:-1;;62231:26:0::1;62253:4;62231:26;::::0;;62161:104::o;42669:177::-;42736:7;42582:12;;42760:5;:21;42752:69;;;;-1:-1:-1;;;42752:69:0;;12126:2:1;42752:69:0;;;12108:21:1;12165:2;12145:18;;;12138:30;12204:34;12184:18;;;12177:62;-1:-1:-1;;;12255:18:1;;;12248:33;12298:19;;42752:69:0;11924:399:1;42752:69:0;-1:-1:-1;42835:5:0;42669:177::o;62043:110::-;2572:13;:11;:13::i;:::-;-1:-1:-1;;;;;62118:19:0::1;62140:5;62118:19:::0;;;:9:::1;:19;::::0;;;;:27;;-1:-1:-1;;62118:27:0::1;::::0;;62043:110::o;58446:109::-;2572:13;:11;:13::i;:::-;58520:16:::1;:27;58539:8:::0;58520:16;:27:::1;:::i;:::-;;58446:109:::0;:::o;59117:221::-;2572:13;:11;:13::i;:::-;59194:4:::1;59202:1;59194:9:::0;59190:141:::1;;59219:18;:27:::0;;;::::1;;-1:-1:-1::0;;;59219:27:0::1;-1:-1:-1::0;;;;59219:27:0;;::::1;;::::0;;58520::::1;58446:109:::0;:::o;59190:141::-:1;59267:4;59275:1;59267:9:::0;59263:68:::1;;59292:18;:27:::0;;;::::1;;-1:-1:-1::0;;;59292:27:0::1;-1:-1:-1::0;;;;59292:27:0;;::::1;;::::0;;59117:221;;:::o;45491:118::-;45555:7;45578:20;45590:7;45578:11;:20::i;:::-;:25;;45491:118;-1:-1:-1;;45491:118:0:o;44368:211::-;44432:7;-1:-1:-1;;;;;44456:19:0;;44448:75;;;;-1:-1:-1;;;44448:75:0;;14654:2:1;44448:75:0;;;14636:21:1;14693:2;14673:18;;;14666:30;14732:34;14712:18;;;14705:62;-1:-1:-1;;;14783:18:1;;;14776:41;14834:19;;44448:75:0;14452:407:1;44448:75:0;-1:-1:-1;;;;;;44545:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;44545:27:0;;44368:211::o;3361:103::-;2572:13;:11;:13::i;:::-;3426:30:::1;3453:1;3426:18;:30::i;60008:524::-:0;59389:9;59402:10;59389:23;59381:67;;;;-1:-1:-1;;;59381:67:0;;;;;;;:::i;:::-;60100:18:::1;::::0;-1:-1:-1;;;60100:18:0;::::1;;;60092:65;;;;-1:-1:-1::0;;;60092:65:0::1;;;;;;;:::i;:::-;60185:9;60176:5;;:18;;60168:56;;;::::0;-1:-1:-1;;;60168:56:0;;15066:2:1;60168:56:0::1;::::0;::::1;15048:21:1::0;15105:2;15085:18;;;15078:30;15144:28;15124:18;;;15117:56;15190:18;;60168:56:0::1;14864:350:1::0;60168:56:0::1;60260:8;::::0;42559:7;42582:12;60243:25:::1;;60235:54;;;;-1:-1:-1::0;;;60235:54:0::1;;;;;;;:::i;:::-;60321:10;60309:23;::::0;;;:11:::1;:23;::::0;;;;;::::1;;60308:24;60300:52;;;::::0;-1:-1:-1;;;60300:52:0;;15421:2:1;60300:52:0::1;::::0;::::1;15403:21:1::0;15460:2;15440:18;;;15433:30;-1:-1:-1;;;15479:18:1;;;15472:45;15534:18;;60300:52:0::1;15219:339:1::0;60300:52:0::1;60374:41;60382:7;;60390:17;60396:10;60390:5;:17::i;:::-;60409:5;;60374:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;60374:7:0::1;::::0;-1:-1:-1;;;60374:41:0:i:1;:::-;60366:74;;;::::0;-1:-1:-1;;;60366:74:0;;15765:2:1;60366:74:0::1;::::0;::::1;15747:21:1::0;15804:2;15784:18;;;15777:30;-1:-1:-1;;;15823:18:1;;;15816:50;15883:18;;60366:74:0::1;15563:344:1::0;60366:74:0::1;60468:10;60456:23;::::0;;;:11:::1;:23;::::0;;;;:30;;-1:-1:-1;;60456:30:0::1;60482:4;60456:30:::0;;::::1;::::0;;;60500:24:::1;::::0;60468:10;60500:9:::1;:24::i;61121:204::-:0;2572:13;:11;:13::i;:::-;61247:8:::1;;61229:14;61213:13;42559:7:::0;42582:12;;42506:94;61213:13:::1;:30;;;;:::i;:::-;:42;;61205:71;;;;-1:-1:-1::0;;;61205:71:0::1;;;;;;;:::i;:::-;61287:30;61297:3;61302:14;61287:9;:30::i;58915:88::-:0;2572:13;:11;:13::i;:::-;58979:5:::1;:16:::0;58915:88::o;45823:98::-;45879:13;45908:7;45901:14;;;;;:::i;47461:274::-;775:10;-1:-1:-1;;;;;47552:24:0;;;47544:63;;;;-1:-1:-1;;;47544:63:0;;16244:2:1;47544:63:0;;;16226:21:1;16283:2;16263:18;;;16256:30;16322:28;16302:18;;;16295:56;16368:18;;47544:63:0;16042:350:1;47544:63:0;775:10;47616:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;47616:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;47616:53:0;;;;;;;;;;47681:48;;540:41:1;;;47616:42:0;;775:10;47681:48;;513:18:1;47681:48:0;;;;;;;47461:274;;:::o;61554:248::-;-1:-1:-1;;;;;61682:16:0;;;;;;:9;:16;;;;;;;;61681:17;61673:59;;;;-1:-1:-1;;;61673:59:0;;;;;;;:::i;:::-;61743:51;61766:5;61773:3;61778:8;61788:5;61743:22;:51::i;:::-;61554:248;;;;:::o;58107:331::-;58226:13;58256:28;58287:10;:8;:10::i;:::-;58256:41;;58370:14;58386:19;:8;:17;:19::i;:::-;58353:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58308:122;;;58107:331;;;:::o;59476:524::-;59389:9;59402:10;59389:23;59381:67;;;;-1:-1:-1;;;59381:67:0;;;;;;;:::i;:::-;59568:18:::1;::::0;-1:-1:-1;;;59568:18:0;::::1;;;59560:65;;;;-1:-1:-1::0;;;59560:65:0::1;;;;;;;:::i;:::-;59653:9;59644:5;;:18;;59636:56;;;::::0;-1:-1:-1;;;59636:56:0;;15066:2:1;59636:56:0::1;::::0;::::1;15048:21:1::0;15105:2;15085:18;;;15078:30;15144:28;15124:18;;;15117:56;15190:18;;59636:56:0::1;14864:350:1::0;59636:56:0::1;59728:8;::::0;42559:7;42582:12;59711:25:::1;;59703:54;;;;-1:-1:-1::0;;;59703:54:0::1;;;;;;;:::i;:::-;59789:10;59777:23;::::0;;;:11:::1;:23;::::0;;;;;::::1;;59776:24;59768:52;;;::::0;-1:-1:-1;;;59768:52:0;;15421:2:1;59768:52:0::1;::::0;::::1;15403:21:1::0;15460:2;15440:18;;;15433:30;-1:-1:-1;;;15479:18:1;;;15472:45;15534:18;;59768:52:0::1;15219:339:1::0;59768:52:0::1;59842:41;59850:7;;59858:17;59864:10;59858:5;:17::i;58688:219::-:0;2572:13;:11;:13::i;:::-;58765:4:::1;58772:1;58765:8:::0;58761:65:::1;;58789:7;:15:::0;;;58761:65:::1;58848:4;58856:1;58848:9:::0;58844:56:::1;;-1:-1:-1::0;58873:7:0::1;:15:::0;58688:219::o;3619:220::-;2572:13;:11;:13::i;:::-;-1:-1:-1;;;;;3704:22:0;::::1;3700:93;;3750:31;::::0;-1:-1:-1;;;3750:31:0;;3778:1:::1;3750:31;::::0;::::1;1510:51:1::0;1483:18;;3750:31:0::1;1364:203:1::0;3700:93:0::1;3803:28;3822:8;3803:18;:28::i;52657:172::-:0;52754:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;52754:29:0;-1:-1:-1;;;;;52754:29:0;;;;;;;;;52795:28;;52754:24;;52795:28;;;;;;;52657:172;;;:::o;2851:166::-;2759:6;;-1:-1:-1;;;;;2759:6:0;775:10;2911:23;2907:103;;2958:40;;-1:-1:-1;;;2958:40:0;;775:10;2958:40;;;1510:51:1;1483:18;;2958:40:0;1364:203:1;49165:98:0;49230:27;49240:2;49244:8;49230:27;;;;;;;;;;;;:9;:27::i;48043:151::-;48160:28;48170:4;48176:2;48180:7;48160:9;:28::i;48495:320::-;48641:28;48651:4;48657:2;48661:7;48641:9;:28::i;:::-;48692:48;48715:4;48721:2;48725:7;48734:5;48692:22;:48::i;:::-;48676:133;;;;-1:-1:-1;;;48676:133:0;;;;;;;:::i;44831:606::-;-1:-1:-1;;;;;;;;;;;;;;;;;44948:16:0;44956:7;49111:4;49141:12;-1:-1:-1;49131:22:0;49054:105;44948:16;44940:71;;;;-1:-1:-1;;;44940:71:0;;17666:2:1;44940:71:0;;;17648:21:1;17705:2;17685:18;;;17678:30;17744:34;17724:18;;;17717:62;-1:-1:-1;;;17795:18:1;;;17788:40;17845:19;;44940:71:0;17464:406:1;44940:71:0;45020:26;45068:12;45057:7;:23;45053:93;;45112:22;45122:12;45112:7;:22;:::i;:::-;:26;;45137:1;45112:26;:::i;:::-;45091:47;;45053:93;45174:7;45154:212;45191:18;45183:4;:26;45154:212;;45228:31;45262:17;;;:11;:17;;;;;;;;;45228:51;;;;;;;;;-1:-1:-1;;;;;45228:51:0;;;;;-1:-1:-1;;;45228:51:0;;;-1:-1:-1;;;;;45228:51:0;;;;;;;;45292:28;45288:71;;45340:9;44831:606;-1:-1:-1;;;;44831:606:0:o;45288:71::-;-1:-1:-1;45211:6:0;;;;:::i;:::-;;;;45154:212;;;-1:-1:-1;45374:57:0;;-1:-1:-1;;;45374:57:0;;18351:2:1;45374:57:0;;;18333:21:1;18390:2;18370:18;;;18363:30;18429:34;18409:18;;;18402:62;-1:-1:-1;;;18480:18:1;;;18473:45;18535:19;;45374:57:0;18149:411:1;3999:191:0;4092:6;;;-1:-1:-1;;;;;4109:17:0;;;-1:-1:-1;;;;;;4109:17:0;;;;;;;4142:40;;4092:6;;;4109:17;4092:6;;4142:40;;4073:16;;4142:40;4062:128;3999:191;:::o;60542:126::-;60634:25;;-1:-1:-1;;18714:2:1;18710:15;;;18706:53;60634:25:0;;;18694:66:1;60597:7:0;;18776:12:1;;60634:25:0;;;;;;;;;;;;60624:36;;;;;;60617:43;;60542:126;;;:::o;60676:192::-;60794:4;60823:37;60842:5;60849:4;60855;60823:18;:37::i;:::-;60816:44;60676:192;-1:-1:-1;;;;60676:192:0:o;58563:117::-;58623:13;58656:16;58649:23;;;;;:::i;21692:718::-;21748:13;21799:14;21816:17;21827:5;21816:10;:17::i;:::-;21836:1;21816:21;21799:38;;21852:20;21886:6;-1:-1:-1;;;;;21875:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21875:18:0;-1:-1:-1;21852:41:0;-1:-1:-1;22017:28:0;;;22033:2;22017:28;22074:290;-1:-1:-1;;22106:5:0;-1:-1:-1;;;22243:2:0;22232:14;;22227:32;22106:5;22214:46;22306:2;22297:11;;;-1:-1:-1;22327:21:0;22074:290;22327:21;-1:-1:-1;22385:6:0;21692:718;-1:-1:-1;;;21692:718:0:o;49518:1272::-;49623:20;49646:12;-1:-1:-1;;;;;49673:16:0;;49665:62;;;;-1:-1:-1;;;49665:62:0;;19133:2:1;49665:62:0;;;19115:21:1;19172:2;19152:18;;;19145:30;19211:34;19191:18;;;19184:62;-1:-1:-1;;;19262:18:1;;;19255:31;19303:19;;49665:62:0;18931:397:1;49665:62:0;49864:21;49872:12;49111:4;49141:12;-1:-1:-1;49131:22:0;49054:105;49864:21;49863:22;49855:64;;;;-1:-1:-1;;;49855:64:0;;19535:2:1;49855:64:0;;;19517:21:1;19574:2;19554:18;;;19547:30;19613:31;19593:18;;;19586:59;19662:18;;49855:64:0;19333:353:1;49855:64:0;49946:12;49934:8;:24;;49926:71;;;;-1:-1:-1;;;49926:71:0;;19893:2:1;49926:71:0;;;19875:21:1;19932:2;19912:18;;;19905:30;19971:34;19951:18;;;19944:62;-1:-1:-1;;;20022:18:1;;;20015:32;20064:19;;49926:71:0;19691:398:1;49926:71:0;-1:-1:-1;;;;;50109:16:0;;50076:30;50109:16;;;:12;:16;;;;;;;;;50076:49;;;;;;;;;-1:-1:-1;;;;;50076:49:0;;;;;-1:-1:-1;;;50076:49:0;;;;;;;;;;;50151:119;;;;;;;;50171:19;;50076:49;;50151:119;;;50171:39;;50201:8;;50171:39;:::i;:::-;-1:-1:-1;;;;;50151:119:0;;;;;50254:8;50219:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;50151:119:0;;;;;;-1:-1:-1;;;;;50132:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;50132:138:0;;;;;;;;;;;;50305:43;;;;;;;;;;-1:-1:-1;;;;;50331:15:0;50305:43;;;;;;;;50277:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;50277:71:0;-1:-1:-1;;;;;;50277:71:0;;;;;;;;;;;;;;;;;;50289:12;;50401:281;50425:8;50421:1;:12;50401:281;;;50454:38;;50479:12;;-1:-1:-1;;;;;50454:38:0;;;50471:1;;50454:38;;50471:1;;50454:38;50519:59;50550:1;50554:2;50558:12;50572:5;50519:22;:59::i;:::-;50501:150;;;;-1:-1:-1;;;50501:150:0;;;;;;;:::i;:::-;50660:14;;;;:::i;:::-;;-1:-1:-1;;50435:3:0;;50401:281;;;-1:-1:-1;50690:12:0;:27;;;50724:60;49616:1174;;;49518:1272;;;:::o;51022:1529::-;51119:35;51157:20;51169:7;51157:11;:20::i;:::-;51228:18;;51119:58;;-1:-1:-1;51186:22:0;;-1:-1:-1;;;;;51212:34:0;775:10;-1:-1:-1;;;;;51212:34:0;;:81;;;-1:-1:-1;775:10:0;51257:20;51269:7;51257:11;:20::i;:::-;-1:-1:-1;;;;;51257:36:0;;51212:81;:142;;;-1:-1:-1;51321:18:0;;51304:50;;775:10;47798:186;:::i;51304:50::-;51186:169;;51380:17;51364:101;;;;-1:-1:-1;;;51364:101:0;;20541:2:1;51364:101:0;;;20523:21:1;20580:2;20560:18;;;20553:30;20619:34;20599:18;;;20592:62;-1:-1:-1;;;20670:18:1;;;20663:48;20728:19;;51364:101:0;20339:414:1;51364:101:0;51512:4;-1:-1:-1;;;;;51490:26:0;:13;:18;;;-1:-1:-1;;;;;51490:26:0;;51474:98;;;;-1:-1:-1;;;51474:98:0;;20960:2:1;51474:98:0;;;20942:21:1;20999:2;20979:18;;;20972:30;21038:34;21018:18;;;21011:62;-1:-1:-1;;;21089:18:1;;;21082:36;21135:19;;51474:98:0;20758:402:1;51474:98:0;-1:-1:-1;;;;;51587:16:0;;51579:66;;;;-1:-1:-1;;;51579:66:0;;21367:2:1;51579:66:0;;;21349:21:1;21406:2;21386:18;;;21379:30;21445:34;21425:18;;;21418:62;-1:-1:-1;;;21496:18:1;;;21489:35;21541:19;;51579:66:0;21165:401:1;51579:66:0;51754:49;51771:1;51775:7;51784:13;:18;;;51754:8;:49::i;:::-;-1:-1:-1;;;;;51812:18:0;;;;;;:12;:18;;;;;:31;;51842:1;;51812:18;:31;;51842:1;;-1:-1:-1;;;;;51812:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;51812:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;51850:16:0;;-1:-1:-1;51850:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;51850:16:0;;:29;;-1:-1:-1;;51850:29:0;;:::i;:::-;;;-1:-1:-1;;;;;51850:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51909:43:0;;;;;;;;-1:-1:-1;;;;;51909:43:0;;;;;-1:-1:-1;;;;;51935:15:0;51909:43;;;;;;;;;-1:-1:-1;51886:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;51886:66:0;-1:-1:-1;;;;;;51886:66:0;;;;;;;;;;;52202:11;51898:7;-1:-1:-1;52202:11:0;:::i;:::-;52265:1;52224:24;;;:11;:24;;;;;:29;52180:33;;-1:-1:-1;;;;;;52224:29:0;52220:236;;52282:20;52290:11;49111:4;49141:12;-1:-1:-1;49131:22:0;49054:105;52282:20;52278:171;;;52342:97;;;;;;;;52369:18;;-1:-1:-1;;;;;52342:97:0;;;;;;52400:28;;;;-1:-1:-1;;;;;52342:97:0;;;;;;;;;-1:-1:-1;52315:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;52315:124:0;-1:-1:-1;;;;;;52315:124:0;;;;;;;;;;;;52278:171;52488:7;52484:2;-1:-1:-1;;;;;52469:27:0;52478:4;-1:-1:-1;;;;;52469:27:0;;;;;;;;;;;52503:42;61554:248;54368:689;54505:4;55243:20;;55295:8;54518:534;;54560:72;;-1:-1:-1;;;54560:72:0;;-1:-1:-1;;;;;54560:36:0;;;;;:72;;775:10;;54611:4;;54617:7;;54626:5;;54560:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54560:72:0;;;;;;;;-1:-1:-1;;54560:72:0;;;;;;;;;;;;:::i;:::-;;;54547:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54791:6;:13;54808:1;54791:18;54787:215;;54824:61;;-1:-1:-1;;;54824:61:0;;;;;;;:::i;54787:215::-;54970:6;54964:13;54955:6;54951:2;54947:15;54940:38;54547:464;-1:-1:-1;;;;;;54682:55:0;-1:-1:-1;;;54682:55:0;;-1:-1:-1;54675:62:0;;54518:534;-1:-1:-1;55040:4:0;54368:689;;;;;;:::o;56677:190::-;56802:4;56855;56826:25;56839:5;56846:4;56826:12;:25::i;:::-;:33;;56677:190;-1:-1:-1;;;;56677:190:0:o;16756:948::-;16809:7;;-1:-1:-1;;;16887:17:0;;16883:106;;-1:-1:-1;;;16925:17:0;;;-1:-1:-1;16971:2:0;16961:12;16883:106;17016:8;17007:5;:17;17003:106;;17054:8;17045:17;;;-1:-1:-1;17091:2:0;17081:12;17003:106;17136:8;17127:5;:17;17123:106;;17174:8;17165:17;;;-1:-1:-1;17211:2:0;17201:12;17123:106;17256:7;17247:5;:16;17243:103;;17293:7;17284:16;;;-1:-1:-1;17329:1:0;17319:11;17243:103;17373:7;17364:5;:16;17360:103;;17410:7;17401:16;;;-1:-1:-1;17446:1:0;17436:11;17360:103;17490:7;17481:5;:16;17477:103;;17527:7;17518:16;;;-1:-1:-1;17563:1:0;17553:11;17477:103;17607:7;17598:5;:16;17594:68;;17645:1;17635:11;17690:6;16756:948;-1:-1:-1;;16756:948:0:o;56875:328::-;56985:7;57033:4;56985:7;57048:118;57072:5;:12;57068:1;:16;57048:118;;;57121:33;57131:12;57145:5;57151:1;57145:8;;;;;;;;:::i;:::-;;;;;;;57121:9;:33::i;:::-;57106:48;-1:-1:-1;57086:3:0;;57048:118;;;-1:-1:-1;57183:12:0;56875:328;-1:-1:-1;;;56875:328:0:o;57236:222::-;57299:7;57343:1;57339;:5;:111;;57427:22;;;;;;22863:19:1;;;22898:12;;;22891:28;;;22935:12;;57427:22:0;;;;;;;;;;;;57417:33;;;;;;57339:111;;;57374:22;;;;;;22863:19:1;;;22898:12;;;22891:28;;;22935:12;;57374:22:0;;;;;;;;;;;;57364:33;;;;;;57339:111;57319:131;57236:222;-1:-1:-1;;;57236:222:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:300::-;645:3;683:5;677:12;710:6;705:3;698:19;766:6;759:4;752:5;748:16;741:4;736:3;732:14;726:47;818:1;811:4;802:6;797:3;793:16;789:27;782:38;881:4;874:2;870:7;865:2;857:6;853:15;849:29;844:3;840:39;836:50;829:57;;;592:300;;;;:::o;897:231::-;1046:2;1035:9;1028:21;1009:4;1066:56;1118:2;1107:9;1103:18;1095:6;1066:56;:::i;1133:226::-;1192:6;1245:2;1233:9;1224:7;1220:23;1216:32;1213:52;;;1261:1;1258;1251:12;1213:52;-1:-1:-1;1306:23:1;;1133:226;-1:-1:-1;1133:226:1:o;1572:173::-;1640:20;;-1:-1:-1;;;;;1689:31:1;;1679:42;;1669:70;;1735:1;1732;1725:12;1669:70;1572:173;;;:::o;1750:300::-;1818:6;1826;1879:2;1867:9;1858:7;1854:23;1850:32;1847:52;;;1895:1;1892;1885:12;1847:52;1918:29;1937:9;1918:29;:::i;:::-;1908:39;2016:2;2001:18;;;;1988:32;;-1:-1:-1;;;1750:300:1:o;2055:160::-;2120:20;;2176:13;;2169:21;2159:32;;2149:60;;2205:1;2202;2195:12;2220:180;2276:6;2329:2;2317:9;2308:7;2304:23;2300:32;2297:52;;;2345:1;2342;2335:12;2297:52;2368:26;2384:9;2368:26;:::i;2405:186::-;2464:6;2517:2;2505:9;2496:7;2492:23;2488:32;2485:52;;;2533:1;2530;2523:12;2485:52;2556:29;2575:9;2556:29;:::i;2778:374::-;2855:6;2863;2871;2924:2;2912:9;2903:7;2899:23;2895:32;2892:52;;;2940:1;2937;2930:12;2892:52;2963:29;2982:9;2963:29;:::i;:::-;2953:39;;3011:38;3045:2;3034:9;3030:18;3011:38;:::i;:::-;2778:374;;3001:48;;-1:-1:-1;;;3118:2:1;3103:18;;;;3090:32;;2778:374::o;3157:127::-;3218:10;3213:3;3209:20;3206:1;3199:31;3249:4;3246:1;3239:15;3273:4;3270:1;3263:15;3289:716;3354:5;3386:1;-1:-1:-1;;;;;3402:6:1;3399:30;3396:56;;;3432:18;;:::i;:::-;-1:-1:-1;3587:2:1;3581:9;-1:-1:-1;;3500:2:1;3479:15;;3475:29;;3645:2;3633:15;3629:29;3617:42;;3710:22;;;-1:-1:-1;;;;;3674:34:1;;3671:62;3668:88;;;3736:18;;:::i;:::-;3772:2;3765:22;3820;;;3805:6;-1:-1:-1;3805:6:1;3857:16;;;3854:25;-1:-1:-1;3851:45:1;;;3892:1;3889;3882:12;3851:45;3942:6;3937:3;3930:4;3922:6;3918:17;3905:44;3997:1;3990:4;3981:6;3973;3969:19;3965:30;3958:41;;3289:716;;;;;:::o;4010:451::-;4079:6;4132:2;4120:9;4111:7;4107:23;4103:32;4100:52;;;4148:1;4145;4138:12;4100:52;4188:9;4175:23;-1:-1:-1;;;;;4213:6:1;4210:30;4207:50;;;4253:1;4250;4243:12;4207:50;4276:22;;4329:4;4321:13;;4317:27;-1:-1:-1;4307:55:1;;4358:1;4355;4348:12;4307:55;4381:74;4447:7;4442:2;4429:16;4424:2;4420;4416:11;4381:74;:::i;4466:294::-;4531:6;4539;4592:2;4580:9;4571:7;4567:23;4563:32;4560:52;;;4608:1;4605;4598:12;4560:52;4631:26;4647:9;4631:26;:::i;4765:610::-;4851:6;4859;4912:2;4900:9;4891:7;4887:23;4883:32;4880:52;;;4928:1;4925;4918:12;4880:52;4968:9;4955:23;-1:-1:-1;;;;;4993:6:1;4990:30;4987:50;;;5033:1;5030;5023:12;4987:50;5056:22;;5109:4;5101:13;;5097:27;-1:-1:-1;5087:55:1;;5138:1;5135;5128:12;5087:55;5178:2;5165:16;-1:-1:-1;;;;;5196:6:1;5193:30;5190:50;;;5236:1;5233;5226:12;5190:50;5289:7;5284:2;5274:6;5271:1;5267:14;5263:2;5259:23;5255:32;5252:45;5249:65;;;5310:1;5307;5300:12;5249:65;5341:2;5333:11;;;;;5363:6;;-1:-1:-1;4765:610:1;-1:-1:-1;;;4765:610:1:o;5380:254::-;5445:6;5453;5506:2;5494:9;5485:7;5481:23;5477:32;5474:52;;;5522:1;5519;5512:12;5474:52;5545:29;5564:9;5545:29;:::i;:::-;5535:39;;5593:35;5624:2;5613:9;5609:18;5593:35;:::i;:::-;5583:45;;5380:254;;;;;:::o;5821:713::-;5916:6;5924;5932;5940;5993:3;5981:9;5972:7;5968:23;5964:33;5961:53;;;6010:1;6007;6000:12;5961:53;6033:29;6052:9;6033:29;:::i;:::-;6023:39;;6081:38;6115:2;6104:9;6100:18;6081:38;:::i;:::-;6071:48;-1:-1:-1;6188:2:1;6173:18;;6160:32;;-1:-1:-1;6267:2:1;6252:18;;6239:32;-1:-1:-1;;;;;6283:30:1;;6280:50;;;6326:1;6323;6316:12;6280:50;6349:22;;6402:4;6394:13;;6390:27;-1:-1:-1;6380:55:1;;6431:1;6428;6421:12;6380:55;6454:74;6520:7;6515:2;6502:16;6497:2;6493;6489:11;6454:74;:::i;:::-;6444:84;;;5821:713;;;;;;;:::o;6539:260::-;6607:6;6615;6668:2;6656:9;6647:7;6643:23;6639:32;6636:52;;;6684:1;6681;6674:12;6636:52;6707:29;6726:9;6707:29;:::i;:::-;6697:39;;6755:38;6789:2;6778:9;6774:18;6755:38;:::i;6804:294::-;6872:6;6880;6933:2;6921:9;6912:7;6908:23;6904:32;6901:52;;;6949:1;6946;6939:12;6901:52;-1:-1:-1;;6972:23:1;;;7064:2;7049:18;;;7036:32;;-1:-1:-1;6804:294:1:o;7103:380::-;7182:1;7178:12;;;;7225;;;7246:61;;7300:4;7292:6;7288:17;7278:27;;7246:61;7353:2;7345:6;7342:14;7322:18;7319:38;7316:161;;7399:10;7394:3;7390:20;7387:1;7380:31;7434:4;7431:1;7424:15;7462:4;7459:1;7452:15;7316:161;;7103:380;;;:::o;8731:355::-;8933:2;8915:21;;;8972:2;8952:18;;;8945:30;9011:33;9006:2;8991:18;;8984:61;9077:2;9062:18;;8731:355::o;9091:398::-;9293:2;9275:21;;;9332:2;9312:18;;;9305:30;9371:34;9366:2;9351:18;;9344:62;-1:-1:-1;;;9437:2:1;9422:18;;9415:32;9479:3;9464:19;;9091:398::o;9494:340::-;9696:2;9678:21;;;9735:2;9715:18;;;9708:30;-1:-1:-1;;;9769:2:1;9754:18;;9747:46;9825:2;9810:18;;9494:340::o;9839:353::-;10041:2;10023:21;;;10080:2;10060:18;;;10053:30;10119:31;10114:2;10099:18;;10092:59;10183:2;10168:18;;9839:353::o;10600:127::-;10661:10;10656:3;10652:20;10649:1;10642:31;10692:4;10689:1;10682:15;10716:4;10713:1;10706:15;10732:135;10771:3;10792:17;;;10789:43;;10812:18;;:::i;:::-;-1:-1:-1;10859:1:1;10848:13;;10732:135::o;12454:518::-;12556:2;12551:3;12548:11;12545:421;;;12592:5;12589:1;12582:16;12636:4;12633:1;12623:18;12706:2;12694:10;12690:19;12687:1;12683:27;12677:4;12673:38;12742:4;12730:10;12727:20;12724:47;;;-1:-1:-1;12765:4:1;12724:47;12820:2;12815:3;12811:12;12808:1;12804:20;12798:4;12794:31;12784:41;;12875:81;12893:2;12886:5;12883:13;12875:81;;;12952:1;12938:16;;12919:1;12908:13;12875:81;;;12879:3;;12454:518;;;:::o;13148:1299::-;13274:3;13268:10;-1:-1:-1;;;;;13293:6:1;13290:30;13287:56;;;13323:18;;:::i;:::-;13352:97;13442:6;13402:38;13434:4;13428:11;13402:38;:::i;:::-;13396:4;13352:97;:::i;:::-;13498:4;13529:2;13518:14;;13546:1;13541:649;;;;14234:1;14251:6;14248:89;;;-1:-1:-1;14303:19:1;;;14297:26;14248:89;-1:-1:-1;;13105:1:1;13101:11;;;13097:24;13093:29;13083:40;13129:1;13125:11;;;13080:57;14350:81;;13511:930;;13541:649;12401:1;12394:14;;;12438:4;12425:18;;-1:-1:-1;;13577:20:1;;;13695:222;13709:7;13706:1;13703:14;13695:222;;;13791:19;;;13785:26;13770:42;;13898:4;13883:20;;;;13851:1;13839:14;;;;13725:12;13695:222;;;13699:3;13945:6;13936:7;13933:19;13930:201;;;14006:19;;;14000:26;-1:-1:-1;;14089:1:1;14085:14;;;14101:3;14081:24;14077:37;14073:42;14058:58;14043:74;;13930:201;-1:-1:-1;;;;14177:1:1;14161:14;;;14157:22;14144:36;;-1:-1:-1;13148:1299:1:o;15912:125::-;15977:9;;;15998:10;;;15995:36;;;16011:18;;:::i;16397:212::-;16439:3;16477:5;16471:12;16521:6;16514:4;16507:5;16503:16;16498:3;16492:36;16583:1;16547:16;;16572:13;;;-1:-1:-1;16547:16:1;;16397:212;-1:-1:-1;16397:212:1:o;16614:425::-;16894:3;16922:57;16948:30;16974:3;16966:6;16948:30;:::i;:::-;16940:6;16922:57;:::i;:::-;-1:-1:-1;;;16988:19:1;;17031:1;17023:10;;16614:425;-1:-1:-1;;;;16614:425:1:o;17044:415::-;17246:2;17228:21;;;17285:2;17265:18;;;17258:30;17324:34;17319:2;17304:18;;17297:62;-1:-1:-1;;;17390:2:1;17375:18;;17368:49;17449:3;17434:19;;17044:415::o;17875:128::-;17942:9;;;17963:11;;;17960:37;;;17977:18;;:::i;18008:136::-;18047:3;18075:5;18065:39;;18084:18;;:::i;:::-;-1:-1:-1;;;18120:18:1;;18008:136::o;20094:240::-;-1:-1:-1;;;;;20163:42:1;;;20207;;;20159:91;;20262:43;;20259:69;;;20308:18;;:::i;21571:243::-;-1:-1:-1;;;;;21686:42:1;;;21642;;;21638:91;;21741:44;;21738:70;;;21788:18;;:::i;21819:496::-;-1:-1:-1;;;;;22050:32:1;;;22032:51;;22119:32;;22114:2;22099:18;;22092:60;22183:2;22168:18;;22161:34;;;22231:3;22226:2;22211:18;;22204:31;;;-1:-1:-1;;22252:57:1;;22289:19;;22281:6;22252:57;:::i;:::-;22244:65;21819:496;-1:-1:-1;;;;;;21819:496:1:o;22320:249::-;22389:6;22442:2;22430:9;22421:7;22417:23;22413:32;22410:52;;;22458:1;22455;22448:12;22410:52;22490:9;22484:16;22509:30;22533:5;22509:30;:::i;22574:127::-;22635:10;22630:3;22626:20;22623:1;22616:31;22666:4;22663:1;22656:15;22690:4;22687:1;22680:15
Swarm Source
ipfs://bbecdcba8d559cf4a519e969335cb96433e6597c1a9ea06ee274cf68294c9864
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.