Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 63 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 16782904 | 590 days ago | IN | 0 ETH | 0.00170675 | ||||
Safe Transfer Fr... | 16782878 | 590 days ago | IN | 0 ETH | 0.00177477 | ||||
Withdraw | 16382756 | 646 days ago | IN | 0 ETH | 0.00045248 | ||||
Mint | 16363500 | 648 days ago | IN | 0.005 ETH | 0.00278847 | ||||
Transfer From | 16350507 | 650 days ago | IN | 0 ETH | 0.00160069 | ||||
Mint | 16350482 | 650 days ago | IN | 0.005 ETH | 0.00294076 | ||||
Mint | 16347360 | 651 days ago | IN | 0.005 ETH | 0.0025231 | ||||
Mint | 16299649 | 657 days ago | IN | 0.005 ETH | 0.00291603 | ||||
Safe Transfer Fr... | 16263712 | 662 days ago | IN | 0 ETH | 0.00120678 | ||||
Safe Transfer Fr... | 16263700 | 662 days ago | IN | 0 ETH | 0.00105431 | ||||
Safe Transfer Fr... | 16263696 | 662 days ago | IN | 0 ETH | 0.00106136 | ||||
Safe Transfer Fr... | 16263691 | 662 days ago | IN | 0 ETH | 0.0010962 | ||||
Safe Transfer Fr... | 16263682 | 662 days ago | IN | 0 ETH | 0.00102488 | ||||
Safe Transfer Fr... | 16263676 | 662 days ago | IN | 0 ETH | 0.00103022 | ||||
Safe Transfer Fr... | 16263670 | 662 days ago | IN | 0 ETH | 0.00104815 | ||||
Safe Transfer Fr... | 16263663 | 662 days ago | IN | 0 ETH | 0.0010406 | ||||
Safe Transfer Fr... | 16263658 | 662 days ago | IN | 0 ETH | 0.00102635 | ||||
Safe Transfer Fr... | 16263652 | 662 days ago | IN | 0 ETH | 0.00106716 | ||||
Safe Transfer Fr... | 16263645 | 662 days ago | IN | 0 ETH | 0.00103723 | ||||
Safe Transfer Fr... | 16263638 | 662 days ago | IN | 0 ETH | 0.00102366 | ||||
Safe Transfer Fr... | 16263630 | 662 days ago | IN | 0 ETH | 0.0009851 | ||||
Safe Transfer Fr... | 16263622 | 662 days ago | IN | 0 ETH | 0.00105545 | ||||
Safe Transfer Fr... | 16263598 | 662 days ago | IN | 0 ETH | 0.00096496 | ||||
Safe Transfer Fr... | 16263584 | 662 days ago | IN | 0 ETH | 0.00100283 | ||||
Safe Transfer Fr... | 16263575 | 662 days ago | IN | 0 ETH | 0.00102078 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16382756 | 646 days ago | 0.2 ETH |
Loading...
Loading
Contract Name:
UGG
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-22 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @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 up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (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; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 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. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); 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 (rounding == Rounding.Up && 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 down. * * 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * 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 10, 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 + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @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) { 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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); 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); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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 caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @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/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/721.sol pragma solidity ^0.8.9; contract UGG is ERC721Enumerable,ReentrancyGuard, Ownable { using Strings for uint256; string public baseURI; uint256 public maxSupply = 3333; uint256 public cost = 0.005 ether; uint256 public maxMintAmount = 110; constructor( string memory _initBaseURI ) ERC721("UniGor Genesis", "UGG") { setBaseURI(_initBaseURI); mint(1); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // public function mint(uint256 count) public payable { uint256 supply = totalSupply(); require(saleIsActive, "Sale not active"); require(count <= maxMintAmount, "Mint at most 110 at a time"); require(supply + count <= maxSupply); if(supply != 0) { require(count*cost <= msg.value, "Value to Low"); } for (uint256 i = 1; i <= count; i++) { _safeMint(msg.sender, supply + i); } } /** ACTIVATION **/ bool public saleIsActive = true; function setSaleIsActive(bool saleIsActive_) external onlyOwner { saleIsActive = saleIsActive_; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(),".json")) : ""; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function burn(uint256 tokenId) public onlyOwner { super._burn(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsActive_","type":"bool"}],"name":"setSaleIsActive","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":"payable","type":"function"}]
Contract Creation Code
6080604052610d05600d556611c37937e08000600e55606e600f556001601060006101000a81548160ff0219169083151502179055503480156200004257600080fd5b5060405162005e2938038062005e298339818101604052810190620000689190620011e8565b6040518060400160405280600e81526020017f556e69476f722047656e657369730000000000000000000000000000000000008152506040518060400160405280600381526020017f55474700000000000000000000000000000000000000000000000000000000008152508160009081620000e5919062001484565b508060019081620000f7919062001484565b5050506001600a8190555062000122620001166200014c60201b60201c565b6200015460201b60201c565b62000133816200021a60201b60201c565b6200014560016200023f60201b60201c565b5062001d21565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022a620003b260201b60201c565b80600c90816200023b919062001484565b5050565b6000620002516200044360201b60201c565b9050601060009054906101000a900460ff16620002a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029c90620015cc565b60405180910390fd5b600f54821115620002ed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e4906200163e565b60405180910390fd5b600d548282620002fe91906200168f565b11156200030a57600080fd5b60008114620003695734600e5483620003249190620016ca565b111562000368576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035f9062001765565b60405180910390fd5b5b6000600190505b828111620003ad57620003973382846200038b91906200168f565b6200045060201b60201c565b8080620003a49062001787565b91505062000370565b505050565b620003c26200014c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003e86200047660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000441576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004389062001824565b60405180910390fd5b565b6000600880549050905090565b62000472828260405180602001604052806000815250620004a060201b60201c565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620004b283836200050e60201b60201c565b620004c760008484846200075460201b60201c565b62000509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200050090620018bc565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000577906200192e565b60405180910390fd5b6200059181620008fd60201b60201c565b15620005d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005cb90620019a0565b60405180910390fd5b620005ea6000838360016200094660201b60201c565b620005fb81620008fd60201b60201c565b156200063e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200063590620019a0565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200075060008383600162000ada60201b60201c565b5050565b6000620007828473ffffffffffffffffffffffffffffffffffffffff1662000ae060201b6200120c1760201c565b15620008f0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620007b46200014c60201b60201c565b8786866040518563ffffffff1660e01b8152600401620007d8949392919062001a75565b6020604051808303816000875af19250505080156200081757506040513d601f19601f8201168201806040525081019062000814919062001b26565b60015b6200089f573d80600081146200084a576040519150601f19603f3d011682016040523d82523d6000602084013e6200084f565b606091505b50600081510362000897576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088e90620018bc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620008f5565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff16620009278362000b0360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200095f8484848462000b4060201b6200122f1760201c565b6001811115620009a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200099d9062001bce565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603620009f757620009f18162000c6d60201b60201c565b62000a3f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161462000a3e5762000a3d858262000cb660201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362000a8b5762000a858162000e3360201b60201c565b62000ad3565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161462000ad25762000ad1848262000f0f60201b60201c565b5b5b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600181111562000c6757600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161462000bd85780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000bd0919062001bf0565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000c665780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000c5e91906200168f565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000cd08462000f9b60201b62000ce81760201c565b62000cdc919062001bf0565b905060006007600084815260200190815260200160002054905081811462000dc2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000e49919062001bf0565b905060006009600084815260200190815260200160002054905060006008838154811062000e7c5762000e7b62001c2b565b5b90600052602060002001549050806008838154811062000ea15762000ea062001c2b565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000ef35762000ef262001c5a565b5b6001900381819060005260206000200160009055905550505050565b600062000f278362000f9b60201b62000ce81760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200100e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620010059062001cff565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620010be8262001073565b810181811067ffffffffffffffff82111715620010e057620010df62001084565b5b80604052505050565b6000620010f562001055565b9050620011038282620010b3565b919050565b600067ffffffffffffffff82111562001126576200112562001084565b5b620011318262001073565b9050602081019050919050565b60005b838110156200115e57808201518184015260208101905062001141565b60008484015250505050565b6000620011816200117b8462001108565b620010e9565b905082815260208101848484011115620011a0576200119f6200106e565b5b620011ad8482856200113e565b509392505050565b600082601f830112620011cd57620011cc62001069565b5b8151620011df8482602086016200116a565b91505092915050565b6000602082840312156200120157620012006200105f565b5b600082015167ffffffffffffffff81111562001222576200122162001064565b5b6200123084828501620011b5565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200128c57607f821691505b602082108103620012a257620012a162001244565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200130c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620012cd565b620013188683620012cd565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620013656200135f620013598462001330565b6200133a565b62001330565b9050919050565b6000819050919050565b620013818362001344565b6200139962001390826200136c565b848454620012da565b825550505050565b600090565b620013b0620013a1565b620013bd81848462001376565b505050565b5b81811015620013e557620013d9600082620013a6565b600181019050620013c3565b5050565b601f8211156200143457620013fe81620012a8565b6200140984620012bd565b8101602085101562001419578190505b620014316200142885620012bd565b830182620013c2565b50505b505050565b600082821c905092915050565b6000620014596000198460080262001439565b1980831691505092915050565b600062001474838362001446565b9150826002028217905092915050565b6200148f8262001239565b67ffffffffffffffff811115620014ab57620014aa62001084565b5b620014b7825462001273565b620014c4828285620013e9565b600060209050601f831160018114620014fc5760008415620014e7578287015190505b620014f3858262001466565b86555062001563565b601f1984166200150c86620012a8565b60005b8281101562001536578489015182556001820191506020850194506020810190506200150f565b8683101562001556578489015162001552601f89168262001446565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b6000620015b4600f836200156b565b9150620015c1826200157c565b602082019050919050565b60006020820190508181036000830152620015e781620015a5565b9050919050565b7f4d696e74206174206d6f73742031313020617420612074696d65000000000000600082015250565b600062001626601a836200156b565b91506200163382620015ee565b602082019050919050565b60006020820190508181036000830152620016598162001617565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200169c8262001330565b9150620016a98362001330565b9250828201905080821115620016c457620016c362001660565b5b92915050565b6000620016d78262001330565b9150620016e48362001330565b9250828202620016f48162001330565b915082820484148315176200170e576200170d62001660565b5b5092915050565b7f56616c756520746f204c6f770000000000000000000000000000000000000000600082015250565b60006200174d600c836200156b565b91506200175a8262001715565b602082019050919050565b6000602082019050818103600083015262001780816200173e565b9050919050565b6000620017948262001330565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620017c957620017c862001660565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200180c6020836200156b565b91506200181982620017d4565b602082019050919050565b600060208201905081810360008301526200183f81620017fd565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000620018a46032836200156b565b9150620018b18262001846565b604082019050919050565b60006020820190508181036000830152620018d78162001895565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000620019166020836200156b565b91506200192382620018de565b602082019050919050565b60006020820190508181036000830152620019498162001907565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062001988601c836200156b565b9150620019958262001950565b602082019050919050565b60006020820190508181036000830152620019bb8162001979565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620019ef82620019c2565b9050919050565b62001a0181620019e2565b82525050565b62001a128162001330565b82525050565b600081519050919050565b600082825260208201905092915050565b600062001a418262001a18565b62001a4d818562001a23565b935062001a5f8185602086016200113e565b62001a6a8162001073565b840191505092915050565b600060808201905062001a8c6000830187620019f6565b62001a9b6020830186620019f6565b62001aaa604083018562001a07565b818103606083015262001abe818462001a34565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62001b008162001ac9565b811462001b0c57600080fd5b50565b60008151905062001b208162001af5565b92915050565b60006020828403121562001b3f5762001b3e6200105f565b5b600062001b4f8482850162001b0f565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b600062001bb66035836200156b565b915062001bc38262001b58565b604082019050919050565b6000602082019050818103600083015262001be98162001ba7565b9050919050565b600062001bfd8262001330565b915062001c0a8362001330565b925082820390508181111562001c255762001c2462001660565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600062001ce76029836200156b565b915062001cf48262001c89565b604082019050919050565b6000602082019050818103600083015262001d1a8162001cd8565b9050919050565b6140f88062001d316000396000f3fe6080604052600436106101c25760003560e01c806355f804b3116100f7578063a0712d6811610095578063d5abeb0111610064578063d5abeb0114610624578063e985e9c51461064f578063eb8d24441461068c578063f2fde38b146106b7576101c2565b8063a0712d6814610579578063a22cb46514610595578063b88d4fde146105be578063c87b56dd146105e7576101c2565b806370a08231116100d157806370a08231146104cf578063715018a61461050c5780638da5cb5b1461052357806395d89b411461054e576101c2565b806355f804b31461043e5780636352211e146104675780636c0360eb146104a4576101c2565b8063239c70ae116101645780633ccfd60b1161013e5780633ccfd60b146103a557806342842e0e146103af57806342966c68146103d85780634f6ccce714610401576101c2565b8063239c70ae1461031457806323b872dd1461033f5780632f745c5914610368576101c2565b8063081812fc116101a0578063081812fc14610258578063095ea7b31461029557806313faede6146102be57806318160ddd146102e9576101c2565b806301ffc9a7146101c757806302c889891461020457806306fdde031461022d575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906129b9565b6106e0565b6040516101fb9190612a01565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190612a48565b61075a565b005b34801561023957600080fd5b5061024261077f565b60405161024f9190612b05565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a9190612b5d565b610811565b60405161028c9190612bcb565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190612c12565b610857565b005b3480156102ca57600080fd5b506102d361096e565b6040516102e09190612c61565b60405180910390f35b3480156102f557600080fd5b506102fe610974565b60405161030b9190612c61565b60405180910390f35b34801561032057600080fd5b50610329610981565b6040516103369190612c61565b60405180910390f35b34801561034b57600080fd5b5061036660048036038101906103619190612c7c565b610987565b005b34801561037457600080fd5b5061038f600480360381019061038a9190612c12565b6109e7565b60405161039c9190612c61565b60405180910390f35b6103ad610a8c565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190612c7c565b610b14565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190612b5d565b610b34565b005b34801561040d57600080fd5b5061042860048036038101906104239190612b5d565b610b48565b6040516104359190612c61565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190612e04565b610bb9565b005b34801561047357600080fd5b5061048e60048036038101906104899190612b5d565b610bd4565b60405161049b9190612bcb565b60405180910390f35b3480156104b057600080fd5b506104b9610c5a565b6040516104c69190612b05565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190612e4d565b610ce8565b6040516105039190612c61565b60405180910390f35b34801561051857600080fd5b50610521610d9f565b005b34801561052f57600080fd5b50610538610db3565b6040516105459190612bcb565b60405180910390f35b34801561055a57600080fd5b50610563610ddd565b6040516105709190612b05565b60405180910390f35b610593600480360381019061058e9190612b5d565b610e6f565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190612e7a565b610fbd565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190612f5b565b610fd3565b005b3480156105f357600080fd5b5061060e60048036038101906106099190612b5d565b611035565b60405161061b9190612b05565b60405180910390f35b34801561063057600080fd5b506106396110dc565b6040516106469190612c61565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190612fde565b6110e2565b6040516106839190612a01565b60405180910390f35b34801561069857600080fd5b506106a1611176565b6040516106ae9190612a01565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d99190612e4d565b611189565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610753575061075282611355565b5b9050919050565b610762611437565b80601060006101000a81548160ff02191690831515021790555050565b60606000805461078e9061304d565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba9061304d565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b5050505050905090565b600061081c826114b5565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086282610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c9906130f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f1611500565b73ffffffffffffffffffffffffffffffffffffffff161480610920575061091f8161091a611500565b6110e2565b5b61095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095690613182565b60405180910390fd5b6109698383611508565b505050565b600e5481565b6000600880549050905090565b600f5481565b610998610992611500565b826115c1565b6109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90613214565b60405180910390fd5b6109e2838383611656565b505050565b60006109f283610ce8565b8210610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a906132a6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a94611437565b6000610a9e610db3565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ac1906132f7565b60006040518083038185875af1925050503d8060008114610afe576040519150601f19603f3d011682016040523d82523d6000602084013e610b03565b606091505b5050905080610b1157600080fd5b50565b610b2f83838360405180602001604052806000815250610fd3565b505050565b610b3c611437565b610b458161194f565b50565b6000610b52610974565b8210610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a9061337e565b60405180910390fd5b60088281548110610ba757610ba661339e565b5b90600052602060002001549050919050565b610bc1611437565b80600c9081610bd09190613579565b5050565b600080610be083611a9d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4890613697565b60405180910390fd5b80915050919050565b600c8054610c679061304d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c939061304d565b8015610ce05780601f10610cb557610100808354040283529160200191610ce0565b820191906000526020600020905b815481529060010190602001808311610cc357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90613729565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610da7611437565b610db16000611ada565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610dec9061304d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e189061304d565b8015610e655780601f10610e3a57610100808354040283529160200191610e65565b820191906000526020600020905b815481529060010190602001808311610e4857829003601f168201915b5050505050905090565b6000610e79610974565b9050601060009054906101000a900460ff16610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec190613795565b60405180910390fd5b600f54821115610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690613801565b60405180910390fd5b600d548282610f1e9190613850565b1115610f2957600080fd5b60008114610f825734600e5483610f409190613884565b1115610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7890613912565b60405180910390fd5b5b6000600190505b828111610fb857610fa5338284610fa09190613850565b611ba0565b8080610fb090613932565b915050610f89565b505050565b610fcf610fc8611500565b8383611bbe565b5050565b610fe4610fde611500565b836115c1565b611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90613214565b60405180910390fd5b61102f84848484611d2a565b50505050565b606061104082611d86565b61107f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611076906139ec565b60405180910390fd5b6000611089611dc7565b905060008151116110a957604051806020016040528060008152506110d4565b806110b384611e59565b6040516020016110c4929190613a94565b6040516020818303038152906040525b915050919050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b611191611437565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790613b35565b60405180910390fd5b61120981611ada565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600181111561134f57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146112c35780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112bb9190613b55565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461134e5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113469190613850565b925050819055505b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061142057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611430575061142f82611f27565b5b9050919050565b61143f611500565b73ffffffffffffffffffffffffffffffffffffffff1661145d610db3565b73ffffffffffffffffffffffffffffffffffffffff16146114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613bd5565b60405180910390fd5b565b6114be81611d86565b6114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490613697565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661157b83610bd4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806115cd83610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061160f575061160e81856110e2565b5b8061164d57508373ffffffffffffffffffffffffffffffffffffffff1661163584610811565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661167682610bd4565b73ffffffffffffffffffffffffffffffffffffffff16146116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390613c67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290613cf9565b60405180910390fd5b6117488383836001611f91565b8273ffffffffffffffffffffffffffffffffffffffff1661176882610bd4565b73ffffffffffffffffffffffffffffffffffffffff16146117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b590613c67565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461194a83838360016120ef565b505050565b600061195a82610bd4565b905061196a816000846001611f91565b61197382610bd4565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a998160008460016120ef565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611bba8282604051806020016040528060008152506120f5565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390613d65565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1d9190612a01565b60405180910390a3505050565b611d35848484611656565b611d4184848484612150565b611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7790613df7565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611da883611a9d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c8054611dd69061304d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e029061304d565b8015611e4f5780601f10611e2457610100808354040283529160200191611e4f565b820191906000526020600020905b815481529060010190602001808311611e3257829003601f168201915b5050505050905090565b606060006001611e68846122d7565b01905060008167ffffffffffffffff811115611e8757611e86612cd9565b5b6040519080825280601f01601f191660200182016040528015611eb95781602001600182028036833780820191505090505b509050600082602001820190505b600115611f1c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611f1057611f0f613e17565b5b04945060008503611ec7575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f9d8484848461122f565b6001811115611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890613eb8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612028576120238161242a565b612067565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612066576120658582612473565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036120a9576120a4816125e0565b6120e8565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146120e7576120e684826126b1565b5b5b5050505050565b50505050565b6120ff8383612730565b61210c6000848484612150565b61214b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214290613df7565b60405180910390fd5b505050565b60006121718473ffffffffffffffffffffffffffffffffffffffff1661120c565b156122ca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261219a611500565b8786866040518563ffffffff1660e01b81526004016121bc9493929190613f2d565b6020604051808303816000875af19250505080156121f857506040513d601f19601f820116820180604052508101906121f59190613f8e565b60015b61227a573d8060008114612228576040519150601f19603f3d011682016040523d82523d6000602084013e61222d565b606091505b506000815103612272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226990613df7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122cf565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612335577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161232b5761232a613e17565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612372576d04ee2d6d415b85acef8100000000838161236857612367613e17565b5b0492506020810190505b662386f26fc1000083106123a157662386f26fc10000838161239757612396613e17565b5b0492506010810190505b6305f5e10083106123ca576305f5e10083816123c0576123bf613e17565b5b0492506008810190505b61271083106123ef5761271083816123e5576123e4613e17565b5b0492506004810190505b60648310612412576064838161240857612407613e17565b5b0492506002810190505b600a8310612421576001810190505b80915050919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161248084610ce8565b61248a9190613b55565b905060006007600084815260200190815260200160002054905081811461256f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125f49190613b55565b90506000600960008481526020019081526020016000205490506000600883815481106126245761262361339e565b5b9060005260206000200154905080600883815481106126465761264561339e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061269557612694613fbb565b5b6001900381819060005260206000200160009055905550505050565b60006126bc83610ce8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361279f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279690614036565b60405180910390fd5b6127a881611d86565b156127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df906140a2565b60405180910390fd5b6127f6600083836001611f91565b6127ff81611d86565b1561283f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612836906140a2565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129496000838360016120ef565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61299681612961565b81146129a157600080fd5b50565b6000813590506129b38161298d565b92915050565b6000602082840312156129cf576129ce612957565b5b60006129dd848285016129a4565b91505092915050565b60008115159050919050565b6129fb816129e6565b82525050565b6000602082019050612a1660008301846129f2565b92915050565b612a25816129e6565b8114612a3057600080fd5b50565b600081359050612a4281612a1c565b92915050565b600060208284031215612a5e57612a5d612957565b5b6000612a6c84828501612a33565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612aaf578082015181840152602081019050612a94565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ad782612a75565b612ae18185612a80565b9350612af1818560208601612a91565b612afa81612abb565b840191505092915050565b60006020820190508181036000830152612b1f8184612acc565b905092915050565b6000819050919050565b612b3a81612b27565b8114612b4557600080fd5b50565b600081359050612b5781612b31565b92915050565b600060208284031215612b7357612b72612957565b5b6000612b8184828501612b48565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bb582612b8a565b9050919050565b612bc581612baa565b82525050565b6000602082019050612be06000830184612bbc565b92915050565b612bef81612baa565b8114612bfa57600080fd5b50565b600081359050612c0c81612be6565b92915050565b60008060408385031215612c2957612c28612957565b5b6000612c3785828601612bfd565b9250506020612c4885828601612b48565b9150509250929050565b612c5b81612b27565b82525050565b6000602082019050612c766000830184612c52565b92915050565b600080600060608486031215612c9557612c94612957565b5b6000612ca386828701612bfd565b9350506020612cb486828701612bfd565b9250506040612cc586828701612b48565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d1182612abb565b810181811067ffffffffffffffff82111715612d3057612d2f612cd9565b5b80604052505050565b6000612d4361294d565b9050612d4f8282612d08565b919050565b600067ffffffffffffffff821115612d6f57612d6e612cd9565b5b612d7882612abb565b9050602081019050919050565b82818337600083830152505050565b6000612da7612da284612d54565b612d39565b905082815260208101848484011115612dc357612dc2612cd4565b5b612dce848285612d85565b509392505050565b600082601f830112612deb57612dea612ccf565b5b8135612dfb848260208601612d94565b91505092915050565b600060208284031215612e1a57612e19612957565b5b600082013567ffffffffffffffff811115612e3857612e3761295c565b5b612e4484828501612dd6565b91505092915050565b600060208284031215612e6357612e62612957565b5b6000612e7184828501612bfd565b91505092915050565b60008060408385031215612e9157612e90612957565b5b6000612e9f85828601612bfd565b9250506020612eb085828601612a33565b9150509250929050565b600067ffffffffffffffff821115612ed557612ed4612cd9565b5b612ede82612abb565b9050602081019050919050565b6000612efe612ef984612eba565b612d39565b905082815260208101848484011115612f1a57612f19612cd4565b5b612f25848285612d85565b509392505050565b600082601f830112612f4257612f41612ccf565b5b8135612f52848260208601612eeb565b91505092915050565b60008060008060808587031215612f7557612f74612957565b5b6000612f8387828801612bfd565b9450506020612f9487828801612bfd565b9350506040612fa587828801612b48565b925050606085013567ffffffffffffffff811115612fc657612fc561295c565b5b612fd287828801612f2d565b91505092959194509250565b60008060408385031215612ff557612ff4612957565b5b600061300385828601612bfd565b925050602061301485828601612bfd565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061306557607f821691505b6020821081036130785761307761301e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130da602183612a80565b91506130e58261307e565b604082019050919050565b60006020820190508181036000830152613109816130cd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061316c603d83612a80565b915061317782613110565b604082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006131fe602d83612a80565b9150613209826131a2565b604082019050919050565b6000602082019050818103600083015261322d816131f1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613290602b83612a80565b915061329b82613234565b604082019050919050565b600060208201905081810360008301526132bf81613283565b9050919050565b600081905092915050565b50565b60006132e16000836132c6565b91506132ec826132d1565b600082019050919050565b6000613302826132d4565b9150819050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613368602c83612a80565b91506133738261330c565b604082019050919050565b600060208201905081810360008301526133978161335b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261342f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133f2565b61343986836133f2565b95508019841693508086168417925050509392505050565b6000819050919050565b600061347661347161346c84612b27565b613451565b612b27565b9050919050565b6000819050919050565b6134908361345b565b6134a461349c8261347d565b8484546133ff565b825550505050565b600090565b6134b96134ac565b6134c4818484613487565b505050565b5b818110156134e8576134dd6000826134b1565b6001810190506134ca565b5050565b601f82111561352d576134fe816133cd565b613507846133e2565b81016020851015613516578190505b61352a613522856133e2565b8301826134c9565b50505b505050565b600082821c905092915050565b600061355060001984600802613532565b1980831691505092915050565b6000613569838361353f565b9150826002028217905092915050565b61358282612a75565b67ffffffffffffffff81111561359b5761359a612cd9565b5b6135a5825461304d565b6135b08282856134ec565b600060209050601f8311600181146135e357600084156135d1578287015190505b6135db858261355d565b865550613643565b601f1984166135f1866133cd565b60005b82811015613619578489015182556001820191506020850194506020810190506135f4565b868310156136365784890151613632601f89168261353f565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613681601883612a80565b915061368c8261364b565b602082019050919050565b600060208201905081810360008301526136b081613674565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613713602983612a80565b915061371e826136b7565b604082019050919050565b6000602082019050818103600083015261374281613706565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b600061377f600f83612a80565b915061378a82613749565b602082019050919050565b600060208201905081810360008301526137ae81613772565b9050919050565b7f4d696e74206174206d6f73742031313020617420612074696d65000000000000600082015250565b60006137eb601a83612a80565b91506137f6826137b5565b602082019050919050565b6000602082019050818103600083015261381a816137de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061385b82612b27565b915061386683612b27565b925082820190508082111561387e5761387d613821565b5b92915050565b600061388f82612b27565b915061389a83612b27565b92508282026138a881612b27565b915082820484148315176138bf576138be613821565b5b5092915050565b7f56616c756520746f204c6f770000000000000000000000000000000000000000600082015250565b60006138fc600c83612a80565b9150613907826138c6565b602082019050919050565b6000602082019050818103600083015261392b816138ef565b9050919050565b600061393d82612b27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361396f5761396e613821565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006139d6602f83612a80565b91506139e18261397a565b604082019050919050565b60006020820190508181036000830152613a05816139c9565b9050919050565b600081905092915050565b6000613a2282612a75565b613a2c8185613a0c565b9350613a3c818560208601612a91565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a7e600583613a0c565b9150613a8982613a48565b600582019050919050565b6000613aa08285613a17565b9150613aac8284613a17565b9150613ab782613a71565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b1f602683612a80565b9150613b2a82613ac3565b604082019050919050565b60006020820190508181036000830152613b4e81613b12565b9050919050565b6000613b6082612b27565b9150613b6b83612b27565b9250828203905081811115613b8357613b82613821565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bbf602083612a80565b9150613bca82613b89565b602082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c51602583612a80565b9150613c5c82613bf5565b604082019050919050565b60006020820190508181036000830152613c8081613c44565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613ce3602483612a80565b9150613cee82613c87565b604082019050919050565b60006020820190508181036000830152613d1281613cd6565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613d4f601983612a80565b9150613d5a82613d19565b602082019050919050565b60006020820190508181036000830152613d7e81613d42565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613de1603283612a80565b9150613dec82613d85565b604082019050919050565b60006020820190508181036000830152613e1081613dd4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000613ea2603583612a80565b9150613ead82613e46565b604082019050919050565b60006020820190508181036000830152613ed181613e95565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613eff82613ed8565b613f098185613ee3565b9350613f19818560208601612a91565b613f2281612abb565b840191505092915050565b6000608082019050613f426000830187612bbc565b613f4f6020830186612bbc565b613f5c6040830185612c52565b8181036060830152613f6e8184613ef4565b905095945050505050565b600081519050613f888161298d565b92915050565b600060208284031215613fa457613fa3612957565b5b6000613fb284828501613f79565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614020602083612a80565b915061402b82613fea565b602082019050919050565b6000602082019050818103600083015261404f81614013565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061408c601c83612a80565b915061409782614056565b602082019050919050565b600060208201905081810360008301526140bb8161407f565b905091905056fea26469706673582212207019b43b8bc7bcda6954b107ab7ff0ce0d27c9dd09b4e2304bfdba0ef260f41664736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d516b7a766d73513750643450445433325747517354485243324644417962754e6f4e7a6f524846374d6e33362f00000000000000000000
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806355f804b3116100f7578063a0712d6811610095578063d5abeb0111610064578063d5abeb0114610624578063e985e9c51461064f578063eb8d24441461068c578063f2fde38b146106b7576101c2565b8063a0712d6814610579578063a22cb46514610595578063b88d4fde146105be578063c87b56dd146105e7576101c2565b806370a08231116100d157806370a08231146104cf578063715018a61461050c5780638da5cb5b1461052357806395d89b411461054e576101c2565b806355f804b31461043e5780636352211e146104675780636c0360eb146104a4576101c2565b8063239c70ae116101645780633ccfd60b1161013e5780633ccfd60b146103a557806342842e0e146103af57806342966c68146103d85780634f6ccce714610401576101c2565b8063239c70ae1461031457806323b872dd1461033f5780632f745c5914610368576101c2565b8063081812fc116101a0578063081812fc14610258578063095ea7b31461029557806313faede6146102be57806318160ddd146102e9576101c2565b806301ffc9a7146101c757806302c889891461020457806306fdde031461022d575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906129b9565b6106e0565b6040516101fb9190612a01565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190612a48565b61075a565b005b34801561023957600080fd5b5061024261077f565b60405161024f9190612b05565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a9190612b5d565b610811565b60405161028c9190612bcb565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190612c12565b610857565b005b3480156102ca57600080fd5b506102d361096e565b6040516102e09190612c61565b60405180910390f35b3480156102f557600080fd5b506102fe610974565b60405161030b9190612c61565b60405180910390f35b34801561032057600080fd5b50610329610981565b6040516103369190612c61565b60405180910390f35b34801561034b57600080fd5b5061036660048036038101906103619190612c7c565b610987565b005b34801561037457600080fd5b5061038f600480360381019061038a9190612c12565b6109e7565b60405161039c9190612c61565b60405180910390f35b6103ad610a8c565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190612c7c565b610b14565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190612b5d565b610b34565b005b34801561040d57600080fd5b5061042860048036038101906104239190612b5d565b610b48565b6040516104359190612c61565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190612e04565b610bb9565b005b34801561047357600080fd5b5061048e60048036038101906104899190612b5d565b610bd4565b60405161049b9190612bcb565b60405180910390f35b3480156104b057600080fd5b506104b9610c5a565b6040516104c69190612b05565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190612e4d565b610ce8565b6040516105039190612c61565b60405180910390f35b34801561051857600080fd5b50610521610d9f565b005b34801561052f57600080fd5b50610538610db3565b6040516105459190612bcb565b60405180910390f35b34801561055a57600080fd5b50610563610ddd565b6040516105709190612b05565b60405180910390f35b610593600480360381019061058e9190612b5d565b610e6f565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190612e7a565b610fbd565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190612f5b565b610fd3565b005b3480156105f357600080fd5b5061060e60048036038101906106099190612b5d565b611035565b60405161061b9190612b05565b60405180910390f35b34801561063057600080fd5b506106396110dc565b6040516106469190612c61565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190612fde565b6110e2565b6040516106839190612a01565b60405180910390f35b34801561069857600080fd5b506106a1611176565b6040516106ae9190612a01565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d99190612e4d565b611189565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610753575061075282611355565b5b9050919050565b610762611437565b80601060006101000a81548160ff02191690831515021790555050565b60606000805461078e9061304d565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba9061304d565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b5050505050905090565b600061081c826114b5565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086282610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c9906130f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f1611500565b73ffffffffffffffffffffffffffffffffffffffff161480610920575061091f8161091a611500565b6110e2565b5b61095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095690613182565b60405180910390fd5b6109698383611508565b505050565b600e5481565b6000600880549050905090565b600f5481565b610998610992611500565b826115c1565b6109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90613214565b60405180910390fd5b6109e2838383611656565b505050565b60006109f283610ce8565b8210610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a906132a6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a94611437565b6000610a9e610db3565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ac1906132f7565b60006040518083038185875af1925050503d8060008114610afe576040519150601f19603f3d011682016040523d82523d6000602084013e610b03565b606091505b5050905080610b1157600080fd5b50565b610b2f83838360405180602001604052806000815250610fd3565b505050565b610b3c611437565b610b458161194f565b50565b6000610b52610974565b8210610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a9061337e565b60405180910390fd5b60088281548110610ba757610ba661339e565b5b90600052602060002001549050919050565b610bc1611437565b80600c9081610bd09190613579565b5050565b600080610be083611a9d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4890613697565b60405180910390fd5b80915050919050565b600c8054610c679061304d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c939061304d565b8015610ce05780601f10610cb557610100808354040283529160200191610ce0565b820191906000526020600020905b815481529060010190602001808311610cc357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90613729565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610da7611437565b610db16000611ada565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610dec9061304d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e189061304d565b8015610e655780601f10610e3a57610100808354040283529160200191610e65565b820191906000526020600020905b815481529060010190602001808311610e4857829003601f168201915b5050505050905090565b6000610e79610974565b9050601060009054906101000a900460ff16610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec190613795565b60405180910390fd5b600f54821115610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690613801565b60405180910390fd5b600d548282610f1e9190613850565b1115610f2957600080fd5b60008114610f825734600e5483610f409190613884565b1115610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7890613912565b60405180910390fd5b5b6000600190505b828111610fb857610fa5338284610fa09190613850565b611ba0565b8080610fb090613932565b915050610f89565b505050565b610fcf610fc8611500565b8383611bbe565b5050565b610fe4610fde611500565b836115c1565b611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90613214565b60405180910390fd5b61102f84848484611d2a565b50505050565b606061104082611d86565b61107f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611076906139ec565b60405180910390fd5b6000611089611dc7565b905060008151116110a957604051806020016040528060008152506110d4565b806110b384611e59565b6040516020016110c4929190613a94565b6040516020818303038152906040525b915050919050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b611191611437565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790613b35565b60405180910390fd5b61120981611ada565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600181111561134f57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146112c35780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112bb9190613b55565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461134e5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113469190613850565b925050819055505b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061142057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611430575061142f82611f27565b5b9050919050565b61143f611500565b73ffffffffffffffffffffffffffffffffffffffff1661145d610db3565b73ffffffffffffffffffffffffffffffffffffffff16146114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613bd5565b60405180910390fd5b565b6114be81611d86565b6114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490613697565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661157b83610bd4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806115cd83610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061160f575061160e81856110e2565b5b8061164d57508373ffffffffffffffffffffffffffffffffffffffff1661163584610811565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661167682610bd4565b73ffffffffffffffffffffffffffffffffffffffff16146116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390613c67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290613cf9565b60405180910390fd5b6117488383836001611f91565b8273ffffffffffffffffffffffffffffffffffffffff1661176882610bd4565b73ffffffffffffffffffffffffffffffffffffffff16146117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b590613c67565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461194a83838360016120ef565b505050565b600061195a82610bd4565b905061196a816000846001611f91565b61197382610bd4565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a998160008460016120ef565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611bba8282604051806020016040528060008152506120f5565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390613d65565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1d9190612a01565b60405180910390a3505050565b611d35848484611656565b611d4184848484612150565b611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7790613df7565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611da883611a9d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c8054611dd69061304d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e029061304d565b8015611e4f5780601f10611e2457610100808354040283529160200191611e4f565b820191906000526020600020905b815481529060010190602001808311611e3257829003601f168201915b5050505050905090565b606060006001611e68846122d7565b01905060008167ffffffffffffffff811115611e8757611e86612cd9565b5b6040519080825280601f01601f191660200182016040528015611eb95781602001600182028036833780820191505090505b509050600082602001820190505b600115611f1c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611f1057611f0f613e17565b5b04945060008503611ec7575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f9d8484848461122f565b6001811115611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890613eb8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612028576120238161242a565b612067565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612066576120658582612473565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036120a9576120a4816125e0565b6120e8565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146120e7576120e684826126b1565b5b5b5050505050565b50505050565b6120ff8383612730565b61210c6000848484612150565b61214b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214290613df7565b60405180910390fd5b505050565b60006121718473ffffffffffffffffffffffffffffffffffffffff1661120c565b156122ca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261219a611500565b8786866040518563ffffffff1660e01b81526004016121bc9493929190613f2d565b6020604051808303816000875af19250505080156121f857506040513d601f19601f820116820180604052508101906121f59190613f8e565b60015b61227a573d8060008114612228576040519150601f19603f3d011682016040523d82523d6000602084013e61222d565b606091505b506000815103612272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226990613df7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122cf565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612335577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161232b5761232a613e17565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612372576d04ee2d6d415b85acef8100000000838161236857612367613e17565b5b0492506020810190505b662386f26fc1000083106123a157662386f26fc10000838161239757612396613e17565b5b0492506010810190505b6305f5e10083106123ca576305f5e10083816123c0576123bf613e17565b5b0492506008810190505b61271083106123ef5761271083816123e5576123e4613e17565b5b0492506004810190505b60648310612412576064838161240857612407613e17565b5b0492506002810190505b600a8310612421576001810190505b80915050919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161248084610ce8565b61248a9190613b55565b905060006007600084815260200190815260200160002054905081811461256f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125f49190613b55565b90506000600960008481526020019081526020016000205490506000600883815481106126245761262361339e565b5b9060005260206000200154905080600883815481106126465761264561339e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061269557612694613fbb565b5b6001900381819060005260206000200160009055905550505050565b60006126bc83610ce8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361279f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279690614036565b60405180910390fd5b6127a881611d86565b156127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df906140a2565b60405180910390fd5b6127f6600083836001611f91565b6127ff81611d86565b1561283f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612836906140a2565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129496000838360016120ef565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61299681612961565b81146129a157600080fd5b50565b6000813590506129b38161298d565b92915050565b6000602082840312156129cf576129ce612957565b5b60006129dd848285016129a4565b91505092915050565b60008115159050919050565b6129fb816129e6565b82525050565b6000602082019050612a1660008301846129f2565b92915050565b612a25816129e6565b8114612a3057600080fd5b50565b600081359050612a4281612a1c565b92915050565b600060208284031215612a5e57612a5d612957565b5b6000612a6c84828501612a33565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612aaf578082015181840152602081019050612a94565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ad782612a75565b612ae18185612a80565b9350612af1818560208601612a91565b612afa81612abb565b840191505092915050565b60006020820190508181036000830152612b1f8184612acc565b905092915050565b6000819050919050565b612b3a81612b27565b8114612b4557600080fd5b50565b600081359050612b5781612b31565b92915050565b600060208284031215612b7357612b72612957565b5b6000612b8184828501612b48565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bb582612b8a565b9050919050565b612bc581612baa565b82525050565b6000602082019050612be06000830184612bbc565b92915050565b612bef81612baa565b8114612bfa57600080fd5b50565b600081359050612c0c81612be6565b92915050565b60008060408385031215612c2957612c28612957565b5b6000612c3785828601612bfd565b9250506020612c4885828601612b48565b9150509250929050565b612c5b81612b27565b82525050565b6000602082019050612c766000830184612c52565b92915050565b600080600060608486031215612c9557612c94612957565b5b6000612ca386828701612bfd565b9350506020612cb486828701612bfd565b9250506040612cc586828701612b48565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d1182612abb565b810181811067ffffffffffffffff82111715612d3057612d2f612cd9565b5b80604052505050565b6000612d4361294d565b9050612d4f8282612d08565b919050565b600067ffffffffffffffff821115612d6f57612d6e612cd9565b5b612d7882612abb565b9050602081019050919050565b82818337600083830152505050565b6000612da7612da284612d54565b612d39565b905082815260208101848484011115612dc357612dc2612cd4565b5b612dce848285612d85565b509392505050565b600082601f830112612deb57612dea612ccf565b5b8135612dfb848260208601612d94565b91505092915050565b600060208284031215612e1a57612e19612957565b5b600082013567ffffffffffffffff811115612e3857612e3761295c565b5b612e4484828501612dd6565b91505092915050565b600060208284031215612e6357612e62612957565b5b6000612e7184828501612bfd565b91505092915050565b60008060408385031215612e9157612e90612957565b5b6000612e9f85828601612bfd565b9250506020612eb085828601612a33565b9150509250929050565b600067ffffffffffffffff821115612ed557612ed4612cd9565b5b612ede82612abb565b9050602081019050919050565b6000612efe612ef984612eba565b612d39565b905082815260208101848484011115612f1a57612f19612cd4565b5b612f25848285612d85565b509392505050565b600082601f830112612f4257612f41612ccf565b5b8135612f52848260208601612eeb565b91505092915050565b60008060008060808587031215612f7557612f74612957565b5b6000612f8387828801612bfd565b9450506020612f9487828801612bfd565b9350506040612fa587828801612b48565b925050606085013567ffffffffffffffff811115612fc657612fc561295c565b5b612fd287828801612f2d565b91505092959194509250565b60008060408385031215612ff557612ff4612957565b5b600061300385828601612bfd565b925050602061301485828601612bfd565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061306557607f821691505b6020821081036130785761307761301e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130da602183612a80565b91506130e58261307e565b604082019050919050565b60006020820190508181036000830152613109816130cd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061316c603d83612a80565b915061317782613110565b604082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006131fe602d83612a80565b9150613209826131a2565b604082019050919050565b6000602082019050818103600083015261322d816131f1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613290602b83612a80565b915061329b82613234565b604082019050919050565b600060208201905081810360008301526132bf81613283565b9050919050565b600081905092915050565b50565b60006132e16000836132c6565b91506132ec826132d1565b600082019050919050565b6000613302826132d4565b9150819050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613368602c83612a80565b91506133738261330c565b604082019050919050565b600060208201905081810360008301526133978161335b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261342f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133f2565b61343986836133f2565b95508019841693508086168417925050509392505050565b6000819050919050565b600061347661347161346c84612b27565b613451565b612b27565b9050919050565b6000819050919050565b6134908361345b565b6134a461349c8261347d565b8484546133ff565b825550505050565b600090565b6134b96134ac565b6134c4818484613487565b505050565b5b818110156134e8576134dd6000826134b1565b6001810190506134ca565b5050565b601f82111561352d576134fe816133cd565b613507846133e2565b81016020851015613516578190505b61352a613522856133e2565b8301826134c9565b50505b505050565b600082821c905092915050565b600061355060001984600802613532565b1980831691505092915050565b6000613569838361353f565b9150826002028217905092915050565b61358282612a75565b67ffffffffffffffff81111561359b5761359a612cd9565b5b6135a5825461304d565b6135b08282856134ec565b600060209050601f8311600181146135e357600084156135d1578287015190505b6135db858261355d565b865550613643565b601f1984166135f1866133cd565b60005b82811015613619578489015182556001820191506020850194506020810190506135f4565b868310156136365784890151613632601f89168261353f565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613681601883612a80565b915061368c8261364b565b602082019050919050565b600060208201905081810360008301526136b081613674565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613713602983612a80565b915061371e826136b7565b604082019050919050565b6000602082019050818103600083015261374281613706565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b600061377f600f83612a80565b915061378a82613749565b602082019050919050565b600060208201905081810360008301526137ae81613772565b9050919050565b7f4d696e74206174206d6f73742031313020617420612074696d65000000000000600082015250565b60006137eb601a83612a80565b91506137f6826137b5565b602082019050919050565b6000602082019050818103600083015261381a816137de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061385b82612b27565b915061386683612b27565b925082820190508082111561387e5761387d613821565b5b92915050565b600061388f82612b27565b915061389a83612b27565b92508282026138a881612b27565b915082820484148315176138bf576138be613821565b5b5092915050565b7f56616c756520746f204c6f770000000000000000000000000000000000000000600082015250565b60006138fc600c83612a80565b9150613907826138c6565b602082019050919050565b6000602082019050818103600083015261392b816138ef565b9050919050565b600061393d82612b27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361396f5761396e613821565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006139d6602f83612a80565b91506139e18261397a565b604082019050919050565b60006020820190508181036000830152613a05816139c9565b9050919050565b600081905092915050565b6000613a2282612a75565b613a2c8185613a0c565b9350613a3c818560208601612a91565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a7e600583613a0c565b9150613a8982613a48565b600582019050919050565b6000613aa08285613a17565b9150613aac8284613a17565b9150613ab782613a71565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b1f602683612a80565b9150613b2a82613ac3565b604082019050919050565b60006020820190508181036000830152613b4e81613b12565b9050919050565b6000613b6082612b27565b9150613b6b83612b27565b9250828203905081811115613b8357613b82613821565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bbf602083612a80565b9150613bca82613b89565b602082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c51602583612a80565b9150613c5c82613bf5565b604082019050919050565b60006020820190508181036000830152613c8081613c44565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613ce3602483612a80565b9150613cee82613c87565b604082019050919050565b60006020820190508181036000830152613d1281613cd6565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613d4f601983612a80565b9150613d5a82613d19565b602082019050919050565b60006020820190508181036000830152613d7e81613d42565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613de1603283612a80565b9150613dec82613d85565b604082019050919050565b60006020820190508181036000830152613e1081613dd4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000613ea2603583612a80565b9150613ead82613e46565b604082019050919050565b60006020820190508181036000830152613ed181613e95565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613eff82613ed8565b613f098185613ee3565b9350613f19818560208601612a91565b613f2281612abb565b840191505092915050565b6000608082019050613f426000830187612bbc565b613f4f6020830186612bbc565b613f5c6040830185612c52565b8181036060830152613f6e8184613ef4565b905095945050505050565b600081519050613f888161298d565b92915050565b600060208284031215613fa457613fa3612957565b5b6000613fb284828501613f79565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614020602083612a80565b915061402b82613fea565b602082019050919050565b6000602082019050818103600083015261404f81614013565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061408c601c83612a80565b915061409782614056565b602082019050919050565b600060208201905081810360008301526140bb8161407f565b905091905056fea26469706673582212207019b43b8bc7bcda6954b107ab7ff0ce0d27c9dd09b4e2304bfdba0ef260f41664736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d516b7a766d73513750643450445433325747517354485243324644417962754e6f4e7a6f524846374d6e33362f00000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmQkzvmsQ7Pd4PDT32WGQsTHRC2FDAybuNoNzoRHF7Mn36/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d516b7a766d735137506434504454333257475173544852
Arg [3] : 43324644417962754e6f4e7a6f524846374d6e33362f00000000000000000000
Deployed Bytecode Sourcemap
65438:1893:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59436:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66444:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43498:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45010:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44528:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65593:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60076:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65631:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45710:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59744:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67086:145;;;:::i;:::-;;46116:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67241:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60266:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66980:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43208:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65531:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42939:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20921:103;;;;;;;;;;;;;:::i;:::-;;20273:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43667:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65947:427;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45253:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46372:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66555:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65557:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45479:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66406:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21179:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59436:224;59538:4;59577:35;59562:50;;;:11;:50;;;;:90;;;;59616:36;59640:11;59616:23;:36::i;:::-;59562:90;59555:97;;59436:224;;;:::o;66444:105::-;20159:13;:11;:13::i;:::-;66530::::1;66515:12;;:28;;;;;;;;;;;;;;;;;;66444:105:::0;:::o;43498:100::-;43552:13;43585:5;43578:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43498:100;:::o;45010:171::-;45086:7;45106:23;45121:7;45106:14;:23::i;:::-;45149:15;:24;45165:7;45149:24;;;;;;;;;;;;;;;;;;;;;45142:31;;45010:171;;;:::o;44528:416::-;44609:13;44625:23;44640:7;44625:14;:23::i;:::-;44609:39;;44673:5;44667:11;;:2;:11;;;44659:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44767:5;44751:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44776:37;44793:5;44800:12;:10;:12::i;:::-;44776:16;:37::i;:::-;44751:62;44729:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;44915:21;44924:2;44928:7;44915:8;:21::i;:::-;44598:346;44528:416;;:::o;65593:33::-;;;;:::o;60076:113::-;60137:7;60164:10;:17;;;;60157:24;;60076:113;:::o;65631:34::-;;;;:::o;45710:335::-;45905:41;45924:12;:10;:12::i;:::-;45938:7;45905:18;:41::i;:::-;45897:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;46009:28;46019:4;46025:2;46029:7;46009:9;:28::i;:::-;45710:335;;;:::o;59744:256::-;59841:7;59877:23;59894:5;59877:16;:23::i;:::-;59869:5;:31;59861:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;59966:12;:19;59979:5;59966:19;;;;;;;;;;;;;;;:26;59986:5;59966:26;;;;;;;;;;;;59959:33;;59744:256;;;;:::o;67086:145::-;20159:13;:11;:13::i;:::-;67139:7:::1;67160;:5;:7::i;:::-;67152:21;;67181;67152:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67138:69;;;67222:2;67214:11;;;::::0;::::1;;67131:100;67086:145::o:0;46116:185::-;46254:39;46271:4;46277:2;46281:7;46254:39;;;;;;;;;;;;:16;:39::i;:::-;46116:185;;;:::o;67241:87::-;20159:13;:11;:13::i;:::-;67300:20:::1;67312:7;67300:11;:20::i;:::-;67241:87:::0;:::o;60266:233::-;60341:7;60377:30;:28;:30::i;:::-;60369:5;:38;60361:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;60474:10;60485:5;60474:17;;;;;;;;:::i;:::-;;;;;;;;;;60467:24;;60266:233;;;:::o;66980:98::-;20159:13;:11;:13::i;:::-;67061:11:::1;67051:7;:21;;;;;;:::i;:::-;;66980:98:::0;:::o;43208:223::-;43280:7;43300:13;43316:17;43325:7;43316:8;:17::i;:::-;43300:33;;43369:1;43352:19;;:5;:19;;;43344:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;43418:5;43411:12;;;43208:223;;;:::o;65531:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42939:207::-;43011:7;43056:1;43039:19;;:5;:19;;;43031:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43122:9;:16;43132:5;43122:16;;;;;;;;;;;;;;;;43115:23;;42939:207;;;:::o;20921:103::-;20159:13;:11;:13::i;:::-;20986:30:::1;21013:1;20986:18;:30::i;:::-;20921:103::o:0;20273:87::-;20319:7;20346:6;;;;;;;;;;;20339:13;;20273:87;:::o;43667:104::-;43723:13;43756:7;43749:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43667:104;:::o;65947:427::-;65998:14;66015:13;:11;:13::i;:::-;65998:30;;66043:12;;;;;;;;;;;66035:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;66099:13;;66090:5;:22;;66082:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;66176:9;;66167:5;66158:6;:14;;;;:::i;:::-;:27;;66150:36;;;;;;66206:1;66196:6;:11;66193:83;;66240:9;66232:4;;66226:5;:10;;;;:::i;:::-;:23;;66218:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;66193:83;66287:9;66299:1;66287:13;;66282:87;66307:5;66302:1;:10;66282:87;;66328:33;66338:10;66359:1;66350:6;:10;;;;:::i;:::-;66328:9;:33::i;:::-;66314:3;;;;;:::i;:::-;;;;66282:87;;;;65991:383;65947:427;:::o;45253:155::-;45348:52;45367:12;:10;:12::i;:::-;45381:8;45391;45348:18;:52::i;:::-;45253:155;;:::o;46372:322::-;46546:41;46565:12;:10;:12::i;:::-;46579:7;46546:18;:41::i;:::-;46538:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;46648:38;46662:4;46668:2;46672:7;46681:4;46648:13;:38::i;:::-;46372:322;;;;:::o;66555:416::-;66653:13;66694:16;66702:7;66694;:16::i;:::-;66678:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;66784:28;66815:10;:8;:10::i;:::-;66784:41;;66870:1;66845:14;66839:28;:32;:126;;;;;;;;;;;;;;;;;66907:14;66923:18;:7;:16;:18::i;:::-;66890:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66839:126;66832:133;;;66555:416;;;:::o;65557:31::-;;;;:::o;45479:164::-;45576:4;45600:18;:25;45619:5;45600:25;;;;;;;;;;;;;;;:35;45626:8;45600:35;;;;;;;;;;;;;;;;;;;;;;;;;45593:42;;45479:164;;;;:::o;66406:31::-;;;;;;;;;;;;;:::o;21179:201::-;20159:13;:11;:13::i;:::-;21288:1:::1;21268:22;;:8;:22;;::::0;21260:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21344:28;21363:8;21344:18;:28::i;:::-;21179:201:::0;:::o;22971:326::-;23031:4;23288:1;23266:7;:19;;;:23;23259:30;;22971:326;;;:::o;57113:410::-;57303:1;57291:9;:13;57287:229;;;57341:1;57325:18;;:4;:18;;;57321:87;;57383:9;57364;:15;57374:4;57364:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;57321:87;57440:1;57426:16;;:2;:16;;;57422:83;;57480:9;57463;:13;57473:2;57463:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;57422:83;57287:229;57113:410;;;;:::o;42570:305::-;42672:4;42724:25;42709:40;;;:11;:40;;;;:105;;;;42781:33;42766:48;;;:11;:48;;;;42709:105;:158;;;;42831:36;42855:11;42831:23;:36::i;:::-;42709:158;42689:178;;42570:305;;;:::o;20438:132::-;20513:12;:10;:12::i;:::-;20502:23;;:7;:5;:7::i;:::-;:23;;;20494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20438:132::o;54829:135::-;54911:16;54919:7;54911;:16::i;:::-;54903:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;54829:135;:::o;18824:98::-;18877:7;18904:10;18897:17;;18824:98;:::o;54108:174::-;54210:2;54183:15;:24;54199:7;54183:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54266:7;54262:2;54228:46;;54237:23;54252:7;54237:14;:23::i;:::-;54228:46;;;;;;;;;;;;54108:174;;:::o;48727:264::-;48820:4;48837:13;48853:23;48868:7;48853:14;:23::i;:::-;48837:39;;48906:5;48895:16;;:7;:16;;;:52;;;;48915:32;48932:5;48939:7;48915:16;:32::i;:::-;48895:52;:87;;;;48975:7;48951:31;;:20;48963:7;48951:11;:20::i;:::-;:31;;;48895:87;48887:96;;;48727:264;;;;:::o;52726:1263::-;52885:4;52858:31;;:23;52873:7;52858:14;:23::i;:::-;:31;;;52850:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52964:1;52950:16;;:2;:16;;;52942:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53020:42;53041:4;53047:2;53051:7;53060:1;53020:20;:42::i;:::-;53192:4;53165:31;;:23;53180:7;53165:14;:23::i;:::-;:31;;;53157:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53310:15;:24;53326:7;53310:24;;;;;;;;;;;;53303:31;;;;;;;;;;;53805:1;53786:9;:15;53796:4;53786:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;53838:1;53821:9;:13;53831:2;53821:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;53880:2;53861:7;:16;53869:7;53861:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53919:7;53915:2;53900:27;;53909:4;53900:27;;;;;;;;;;;;53940:41;53960:4;53966:2;53970:7;53979:1;53940:19;:41::i;:::-;52726:1263;;;:::o;51606:783::-;51666:13;51682:23;51697:7;51682:14;:23::i;:::-;51666:39;;51718:51;51739:5;51754:1;51758:7;51767:1;51718:20;:51::i;:::-;51882:23;51897:7;51882:14;:23::i;:::-;51874:31;;51953:15;:24;51969:7;51953:24;;;;;;;;;;;;51946:31;;;;;;;;;;;52218:1;52198:9;:16;52208:5;52198:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;52248:7;:16;52256:7;52248:16;;;;;;;;;;;;52241:23;;;;;;;;;;;52310:7;52306:1;52282:36;;52291:5;52282:36;;;;;;;;;;;;52331:50;52351:5;52366:1;52370:7;52379:1;52331:19;:50::i;:::-;51655:734;51606:783;:::o;48002:117::-;48068:7;48095;:16;48103:7;48095:16;;;;;;;;;;;;;;;;;;;;;48088:23;;48002:117;;;:::o;21540:191::-;21614:16;21633:6;;;;;;;;;;;21614:25;;21659:8;21650:6;;:17;;;;;;;;;;;;;;;;;;21714:8;21683:40;;21704:8;21683:40;;;;;;;;;;;;21603:128;21540:191;:::o;49333:110::-;49409:26;49419:2;49423:7;49409:26;;;;;;;;;;;;:9;:26::i;:::-;49333:110;;:::o;54425:315::-;54580:8;54571:17;;:5;:17;;;54563:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54667:8;54629:18;:25;54648:5;54629:25;;;;;;;;;;;;;;;:35;54655:8;54629:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;54713:8;54691:41;;54706:5;54691:41;;;54723:8;54691:41;;;;;;:::i;:::-;;;;;;;;54425:315;;;:::o;47575:313::-;47731:28;47741:4;47747:2;47751:7;47731:9;:28::i;:::-;47778:47;47801:4;47807:2;47811:7;47820:4;47778:22;:47::i;:::-;47770:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;47575:313;;;;:::o;48432:128::-;48497:4;48550:1;48521:31;;:17;48530:7;48521:8;:17::i;:::-;:31;;;;48514:38;;48432:128;;;:::o;65826:102::-;65886:13;65915:7;65908:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65826:102;:::o;16251:716::-;16307:13;16358:14;16395:1;16375:17;16386:5;16375:10;:17::i;:::-;:21;16358:38;;16411:20;16445:6;16434:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16411:41;;16467:11;16596:6;16592:2;16588:15;16580:6;16576:28;16569:35;;16633:288;16640:4;16633:288;;;16665:5;;;;;;;;16807:8;16802:2;16795:5;16791:14;16786:30;16781:3;16773:44;16863:2;16854:11;;;;;;:::i;:::-;;;;;16897:1;16888:5;:10;16633:288;16884:21;16633:288;16942:6;16935:13;;;;;16251:716;;;:::o;34002:157::-;34087:4;34126:25;34111:40;;;:11;:40;;;;34104:47;;34002:157;;;:::o;60573:915::-;60750:61;60777:4;60783:2;60787:12;60801:9;60750:26;:61::i;:::-;60840:1;60828:9;:13;60824:222;;;60971:63;;;;;;;;;;:::i;:::-;;;;;;;;60824:222;61058:15;61076:12;61058:30;;61121:1;61105:18;;:4;:18;;;61101:187;;61140:40;61172:7;61140:31;:40::i;:::-;61101:187;;;61210:2;61202:10;;:4;:10;;;61198:90;;61229:47;61262:4;61268:7;61229:32;:47::i;:::-;61198:90;61101:187;61316:1;61302:16;;:2;:16;;;61298:183;;61335:45;61372:7;61335:36;:45::i;:::-;61298:183;;;61408:4;61402:10;;:2;:10;;;61398:83;;61429:40;61457:2;61461:7;61429:27;:40::i;:::-;61398:83;61298:183;60739:749;60573:915;;;;:::o;58245:158::-;;;;;:::o;49670:319::-;49799:18;49805:2;49809:7;49799:5;:18::i;:::-;49850:53;49881:1;49885:2;49889:7;49898:4;49850:22;:53::i;:::-;49828:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;49670:319;;;:::o;55528:853::-;55682:4;55703:15;:2;:13;;;:15::i;:::-;55699:675;;;55755:2;55739:36;;;55776:12;:10;:12::i;:::-;55790:4;55796:7;55805:4;55739:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55735:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55997:1;55980:6;:13;:18;55976:328;;56023:60;;;;;;;;;;:::i;:::-;;;;;;;;55976:328;56254:6;56248:13;56239:6;56235:2;56231:15;56224:38;55735:584;55871:41;;;55861:51;;;:6;:51;;;;55854:58;;;;;55699:675;56358:4;56351:11;;55528:853;;;;;;;:::o;13117:922::-;13170:7;13190:14;13207:1;13190:18;;13257:6;13248:5;:15;13244:102;;13293:6;13284:15;;;;;;:::i;:::-;;;;;13328:2;13318:12;;;;13244:102;13373:6;13364:5;:15;13360:102;;13409:6;13400:15;;;;;;:::i;:::-;;;;;13444:2;13434:12;;;;13360:102;13489:6;13480:5;:15;13476:102;;13525:6;13516:15;;;;;;:::i;:::-;;;;;13560:2;13550:12;;;;13476:102;13605:5;13596;:14;13592:99;;13640:5;13631:14;;;;;;:::i;:::-;;;;;13674:1;13664:11;;;;13592:99;13718:5;13709;:14;13705:99;;13753:5;13744:14;;;;;;:::i;:::-;;;;;13787:1;13777:11;;;;13705:99;13831:5;13822;:14;13818:99;;13866:5;13857:14;;;;;;:::i;:::-;;;;;13900:1;13890:11;;;;13818:99;13944:5;13935;:14;13931:66;;13980:1;13970:11;;;;13931:66;14025:6;14018:13;;;13117:922;;;:::o;62211:164::-;62315:10;:17;;;;62288:15;:24;62304:7;62288:24;;;;;;;;;;;:44;;;;62343:10;62359:7;62343:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62211:164;:::o;63002:988::-;63268:22;63318:1;63293:22;63310:4;63293:16;:22::i;:::-;:26;;;;:::i;:::-;63268:51;;63330:18;63351:17;:26;63369:7;63351:26;;;;;;;;;;;;63330:47;;63498:14;63484:10;:28;63480:328;;63529:19;63551:12;:18;63564:4;63551:18;;;;;;;;;;;;;;;:34;63570:14;63551:34;;;;;;;;;;;;63529:56;;63635:11;63602:12;:18;63615:4;63602:18;;;;;;;;;;;;;;;:30;63621:10;63602:30;;;;;;;;;;;:44;;;;63752:10;63719:17;:30;63737:11;63719:30;;;;;;;;;;;:43;;;;63514:294;63480:328;63904:17;:26;63922:7;63904:26;;;;;;;;;;;63897:33;;;63948:12;:18;63961:4;63948:18;;;;;;;;;;;;;;;:34;63967:14;63948:34;;;;;;;;;;;63941:41;;;63083:907;;63002:988;;:::o;64285:1079::-;64538:22;64583:1;64563:10;:17;;;;:21;;;;:::i;:::-;64538:46;;64595:18;64616:15;:24;64632:7;64616:24;;;;;;;;;;;;64595:45;;64967:19;64989:10;65000:14;64989:26;;;;;;;;:::i;:::-;;;;;;;;;;64967:48;;65053:11;65028:10;65039;65028:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;65164:10;65133:15;:28;65149:11;65133:28;;;;;;;;;;;:41;;;;65305:15;:24;65321:7;65305:24;;;;;;;;;;;65298:31;;;65340:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64356:1008;;;64285:1079;:::o;61789:221::-;61874:14;61891:20;61908:2;61891:16;:20::i;:::-;61874:37;;61949:7;61922:12;:16;61935:2;61922:16;;;;;;;;;;;;;;;:24;61939:6;61922:24;;;;;;;;;;;:34;;;;61996:6;61967:17;:26;61985:7;61967:26;;;;;;;;;;;:35;;;;61863:147;61789:221;;:::o;50325:942::-;50419:1;50405:16;;:2;:16;;;50397:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50478:16;50486:7;50478;:16::i;:::-;50477:17;50469:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50540:48;50569:1;50573:2;50577:7;50586:1;50540:20;:48::i;:::-;50687:16;50695:7;50687;:16::i;:::-;50686:17;50678:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51102:1;51085:9;:13;51095:2;51085:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51146:2;51127:7;:16;51135:7;51127:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51191:7;51187:2;51166:33;;51183:1;51166:33;;;;;;;;;;;;51212:47;51240:1;51244:2;51248:7;51257:1;51212:19;:47::i;:::-;50325:942;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:246::-;2469:1;2479:113;2493:6;2490:1;2487:13;2479:113;;;2578:1;2573:3;2569:11;2563:18;2559:1;2554:3;2550:11;2543:39;2515:2;2512:1;2508:10;2503:15;;2479:113;;;2626:1;2617:6;2612:3;2608:16;2601:27;2450:184;2388:246;;;:::o;2640:102::-;2681:6;2732:2;2728:7;2723:2;2716:5;2712:14;2708:28;2698:38;;2640:102;;;:::o;2748:377::-;2836:3;2864:39;2897:5;2864:39;:::i;:::-;2919:71;2983:6;2978:3;2919:71;:::i;:::-;2912:78;;2999:65;3057:6;3052:3;3045:4;3038:5;3034:16;2999:65;:::i;:::-;3089:29;3111:6;3089:29;:::i;:::-;3084:3;3080:39;3073:46;;2840:285;2748:377;;;;:::o;3131:313::-;3244:4;3282:2;3271:9;3267:18;3259:26;;3331:9;3325:4;3321:20;3317:1;3306:9;3302:17;3295:47;3359:78;3432:4;3423:6;3359:78;:::i;:::-;3351:86;;3131:313;;;;:::o;3450:77::-;3487:7;3516:5;3505:16;;3450:77;;;:::o;3533:122::-;3606:24;3624:5;3606:24;:::i;:::-;3599:5;3596:35;3586:63;;3645:1;3642;3635:12;3586:63;3533:122;:::o;3661:139::-;3707:5;3745:6;3732:20;3723:29;;3761:33;3788:5;3761:33;:::i;:::-;3661:139;;;;:::o;3806:329::-;3865:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;3806:329;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:118::-;4462:24;4480:5;4462:24;:::i;:::-;4457:3;4450:37;4375:118;;:::o;4499:222::-;4592:4;4630:2;4619:9;4615:18;4607:26;;4643:71;4711:1;4700:9;4696:17;4687:6;4643:71;:::i;:::-;4499:222;;;;:::o;4727:122::-;4800:24;4818:5;4800:24;:::i;:::-;4793:5;4790:35;4780:63;;4839:1;4836;4829:12;4780:63;4727:122;:::o;4855:139::-;4901:5;4939:6;4926:20;4917:29;;4955:33;4982:5;4955:33;:::i;:::-;4855:139;;;;:::o;5000:474::-;5068:6;5076;5125:2;5113:9;5104:7;5100:23;5096:32;5093:119;;;5131:79;;:::i;:::-;5093:119;5251:1;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5222:117;5378:2;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5349:118;5000:474;;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:619::-;5909:6;5917;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6100:1;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6071:117;6227:2;6253:53;6298:7;6289:6;6278:9;6274:22;6253:53;:::i;:::-;6243:63;;6198:118;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;5832:619;;;;;:::o;6457:117::-;6566:1;6563;6556:12;6580:117;6689:1;6686;6679:12;6703:180;6751:77;6748:1;6741:88;6848:4;6845:1;6838:15;6872:4;6869:1;6862:15;6889:281;6972:27;6994:4;6972:27;:::i;:::-;6964:6;6960:40;7102:6;7090:10;7087:22;7066:18;7054:10;7051:34;7048:62;7045:88;;;7113:18;;:::i;:::-;7045:88;7153:10;7149:2;7142:22;6932:238;6889:281;;:::o;7176:129::-;7210:6;7237:20;;:::i;:::-;7227:30;;7266:33;7294:4;7286:6;7266:33;:::i;:::-;7176:129;;;:::o;7311:308::-;7373:4;7463:18;7455:6;7452:30;7449:56;;;7485:18;;:::i;:::-;7449:56;7523:29;7545:6;7523:29;:::i;:::-;7515:37;;7607:4;7601;7597:15;7589:23;;7311:308;;;:::o;7625:146::-;7722:6;7717:3;7712;7699:30;7763:1;7754:6;7749:3;7745:16;7738:27;7625:146;;;:::o;7777:425::-;7855:5;7880:66;7896:49;7938:6;7896:49;:::i;:::-;7880:66;:::i;:::-;7871:75;;7969:6;7962:5;7955:21;8007:4;8000:5;7996:16;8045:3;8036:6;8031:3;8027:16;8024:25;8021:112;;;8052:79;;:::i;:::-;8021:112;8142:54;8189:6;8184:3;8179;8142:54;:::i;:::-;7861:341;7777:425;;;;;:::o;8222:340::-;8278:5;8327:3;8320:4;8312:6;8308:17;8304:27;8294:122;;8335:79;;:::i;:::-;8294:122;8452:6;8439:20;8477:79;8552:3;8544:6;8537:4;8529:6;8525:17;8477:79;:::i;:::-;8468:88;;8284:278;8222:340;;;;:::o;8568:509::-;8637:6;8686:2;8674:9;8665:7;8661:23;8657:32;8654:119;;;8692:79;;:::i;:::-;8654:119;8840:1;8829:9;8825:17;8812:31;8870:18;8862:6;8859:30;8856:117;;;8892:79;;:::i;:::-;8856:117;8997:63;9052:7;9043:6;9032:9;9028:22;8997:63;:::i;:::-;8987:73;;8783:287;8568:509;;;;:::o;9083:329::-;9142:6;9191:2;9179:9;9170:7;9166:23;9162:32;9159:119;;;9197:79;;:::i;:::-;9159:119;9317:1;9342:53;9387:7;9378:6;9367:9;9363:22;9342:53;:::i;:::-;9332:63;;9288:117;9083:329;;;;:::o;9418:468::-;9483:6;9491;9540:2;9528:9;9519:7;9515:23;9511:32;9508:119;;;9546:79;;:::i;:::-;9508:119;9666:1;9691:53;9736:7;9727:6;9716:9;9712:22;9691:53;:::i;:::-;9681:63;;9637:117;9793:2;9819:50;9861:7;9852:6;9841:9;9837:22;9819:50;:::i;:::-;9809:60;;9764:115;9418:468;;;;;:::o;9892:307::-;9953:4;10043:18;10035:6;10032:30;10029:56;;;10065:18;;:::i;:::-;10029:56;10103:29;10125:6;10103:29;:::i;:::-;10095:37;;10187:4;10181;10177:15;10169:23;;9892:307;;;:::o;10205:423::-;10282:5;10307:65;10323:48;10364:6;10323:48;:::i;:::-;10307:65;:::i;:::-;10298:74;;10395:6;10388:5;10381:21;10433:4;10426:5;10422:16;10471:3;10462:6;10457:3;10453:16;10450:25;10447:112;;;10478:79;;:::i;:::-;10447:112;10568:54;10615:6;10610:3;10605;10568:54;:::i;:::-;10288:340;10205:423;;;;;:::o;10647:338::-;10702:5;10751:3;10744:4;10736:6;10732:17;10728:27;10718:122;;10759:79;;:::i;:::-;10718:122;10876:6;10863:20;10901:78;10975:3;10967:6;10960:4;10952:6;10948:17;10901:78;:::i;:::-;10892:87;;10708:277;10647:338;;;;:::o;10991:943::-;11086:6;11094;11102;11110;11159:3;11147:9;11138:7;11134:23;11130:33;11127:120;;;11166:79;;:::i;:::-;11127:120;11286:1;11311:53;11356:7;11347:6;11336:9;11332:22;11311:53;:::i;:::-;11301:63;;11257:117;11413:2;11439:53;11484:7;11475:6;11464:9;11460:22;11439:53;:::i;:::-;11429:63;;11384:118;11541:2;11567:53;11612:7;11603:6;11592:9;11588:22;11567:53;:::i;:::-;11557:63;;11512:118;11697:2;11686:9;11682:18;11669:32;11728:18;11720:6;11717:30;11714:117;;;11750:79;;:::i;:::-;11714:117;11855:62;11909:7;11900:6;11889:9;11885:22;11855:62;:::i;:::-;11845:72;;11640:287;10991:943;;;;;;;:::o;11940:474::-;12008:6;12016;12065:2;12053:9;12044:7;12040:23;12036:32;12033:119;;;12071:79;;:::i;:::-;12033:119;12191:1;12216:53;12261:7;12252:6;12241:9;12237:22;12216:53;:::i;:::-;12206:63;;12162:117;12318:2;12344:53;12389:7;12380:6;12369:9;12365:22;12344:53;:::i;:::-;12334:63;;12289:118;11940:474;;;;;:::o;12420:180::-;12468:77;12465:1;12458:88;12565:4;12562:1;12555:15;12589:4;12586:1;12579:15;12606:320;12650:6;12687:1;12681:4;12677:12;12667:22;;12734:1;12728:4;12724:12;12755:18;12745:81;;12811:4;12803:6;12799:17;12789:27;;12745:81;12873:2;12865:6;12862:14;12842:18;12839:38;12836:84;;12892:18;;:::i;:::-;12836:84;12657:269;12606:320;;;:::o;12932:220::-;13072:34;13068:1;13060:6;13056:14;13049:58;13141:3;13136:2;13128:6;13124:15;13117:28;12932:220;:::o;13158:366::-;13300:3;13321:67;13385:2;13380:3;13321:67;:::i;:::-;13314:74;;13397:93;13486:3;13397:93;:::i;:::-;13515:2;13510:3;13506:12;13499:19;;13158:366;;;:::o;13530:419::-;13696:4;13734:2;13723:9;13719:18;13711:26;;13783:9;13777:4;13773:20;13769:1;13758:9;13754:17;13747:47;13811:131;13937:4;13811:131;:::i;:::-;13803:139;;13530:419;;;:::o;13955:248::-;14095:34;14091:1;14083:6;14079:14;14072:58;14164:31;14159:2;14151:6;14147:15;14140:56;13955:248;:::o;14209:366::-;14351:3;14372:67;14436:2;14431:3;14372:67;:::i;:::-;14365:74;;14448:93;14537:3;14448:93;:::i;:::-;14566:2;14561:3;14557:12;14550:19;;14209:366;;;:::o;14581:419::-;14747:4;14785:2;14774:9;14770:18;14762:26;;14834:9;14828:4;14824:20;14820:1;14809:9;14805:17;14798:47;14862:131;14988:4;14862:131;:::i;:::-;14854:139;;14581:419;;;:::o;15006:232::-;15146:34;15142:1;15134:6;15130:14;15123:58;15215:15;15210:2;15202:6;15198:15;15191:40;15006:232;:::o;15244:366::-;15386:3;15407:67;15471:2;15466:3;15407:67;:::i;:::-;15400:74;;15483:93;15572:3;15483:93;:::i;:::-;15601:2;15596:3;15592:12;15585:19;;15244:366;;;:::o;15616:419::-;15782:4;15820:2;15809:9;15805:18;15797:26;;15869:9;15863:4;15859:20;15855:1;15844:9;15840:17;15833:47;15897:131;16023:4;15897:131;:::i;:::-;15889:139;;15616:419;;;:::o;16041:230::-;16181:34;16177:1;16169:6;16165:14;16158:58;16250:13;16245:2;16237:6;16233:15;16226:38;16041:230;:::o;16277:366::-;16419:3;16440:67;16504:2;16499:3;16440:67;:::i;:::-;16433:74;;16516:93;16605:3;16516:93;:::i;:::-;16634:2;16629:3;16625:12;16618:19;;16277:366;;;:::o;16649:419::-;16815:4;16853:2;16842:9;16838:18;16830:26;;16902:9;16896:4;16892:20;16888:1;16877:9;16873:17;16866:47;16930:131;17056:4;16930:131;:::i;:::-;16922:139;;16649:419;;;:::o;17074:147::-;17175:11;17212:3;17197:18;;17074:147;;;;:::o;17227:114::-;;:::o;17347:398::-;17506:3;17527:83;17608:1;17603:3;17527:83;:::i;:::-;17520:90;;17619:93;17708:3;17619:93;:::i;:::-;17737:1;17732:3;17728:11;17721:18;;17347:398;;;:::o;17751:379::-;17935:3;17957:147;18100:3;17957:147;:::i;:::-;17950:154;;18121:3;18114:10;;17751:379;;;:::o;18136:231::-;18276:34;18272:1;18264:6;18260:14;18253:58;18345:14;18340:2;18332:6;18328:15;18321:39;18136:231;:::o;18373:366::-;18515:3;18536:67;18600:2;18595:3;18536:67;:::i;:::-;18529:74;;18612:93;18701:3;18612:93;:::i;:::-;18730:2;18725:3;18721:12;18714:19;;18373:366;;;:::o;18745:419::-;18911:4;18949:2;18938:9;18934:18;18926:26;;18998:9;18992:4;18988:20;18984:1;18973:9;18969:17;18962:47;19026:131;19152:4;19026:131;:::i;:::-;19018:139;;18745:419;;;:::o;19170:180::-;19218:77;19215:1;19208:88;19315:4;19312:1;19305:15;19339:4;19336:1;19329:15;19356:141;19405:4;19428:3;19420:11;;19451:3;19448:1;19441:14;19485:4;19482:1;19472:18;19464:26;;19356:141;;;:::o;19503:93::-;19540:6;19587:2;19582;19575:5;19571:14;19567:23;19557:33;;19503:93;;;:::o;19602:107::-;19646:8;19696:5;19690:4;19686:16;19665:37;;19602:107;;;;:::o;19715:393::-;19784:6;19834:1;19822:10;19818:18;19857:97;19887:66;19876:9;19857:97;:::i;:::-;19975:39;20005:8;19994:9;19975:39;:::i;:::-;19963:51;;20047:4;20043:9;20036:5;20032:21;20023:30;;20096:4;20086:8;20082:19;20075:5;20072:30;20062:40;;19791:317;;19715:393;;;;;:::o;20114:60::-;20142:3;20163:5;20156:12;;20114:60;;;:::o;20180:142::-;20230:9;20263:53;20281:34;20290:24;20308:5;20290:24;:::i;:::-;20281:34;:::i;:::-;20263:53;:::i;:::-;20250:66;;20180:142;;;:::o;20328:75::-;20371:3;20392:5;20385:12;;20328:75;;;:::o;20409:269::-;20519:39;20550:7;20519:39;:::i;:::-;20580:91;20629:41;20653:16;20629:41;:::i;:::-;20621:6;20614:4;20608:11;20580:91;:::i;:::-;20574:4;20567:105;20485:193;20409:269;;;:::o;20684:73::-;20729:3;20684:73;:::o;20763:189::-;20840:32;;:::i;:::-;20881:65;20939:6;20931;20925:4;20881:65;:::i;:::-;20816:136;20763:189;;:::o;20958:186::-;21018:120;21035:3;21028:5;21025:14;21018:120;;;21089:39;21126:1;21119:5;21089:39;:::i;:::-;21062:1;21055:5;21051:13;21042:22;;21018:120;;;20958:186;;:::o;21150:543::-;21251:2;21246:3;21243:11;21240:446;;;21285:38;21317:5;21285:38;:::i;:::-;21369:29;21387:10;21369:29;:::i;:::-;21359:8;21355:44;21552:2;21540:10;21537:18;21534:49;;;21573:8;21558:23;;21534:49;21596:80;21652:22;21670:3;21652:22;:::i;:::-;21642:8;21638:37;21625:11;21596:80;:::i;:::-;21255:431;;21240:446;21150:543;;;:::o;21699:117::-;21753:8;21803:5;21797:4;21793:16;21772:37;;21699:117;;;;:::o;21822:169::-;21866:6;21899:51;21947:1;21943:6;21935:5;21932:1;21928:13;21899:51;:::i;:::-;21895:56;21980:4;21974;21970:15;21960:25;;21873:118;21822:169;;;;:::o;21996:295::-;22072:4;22218:29;22243:3;22237:4;22218:29;:::i;:::-;22210:37;;22280:3;22277:1;22273:11;22267:4;22264:21;22256:29;;21996:295;;;;:::o;22296:1395::-;22413:37;22446:3;22413:37;:::i;:::-;22515:18;22507:6;22504:30;22501:56;;;22537:18;;:::i;:::-;22501:56;22581:38;22613:4;22607:11;22581:38;:::i;:::-;22666:67;22726:6;22718;22712:4;22666:67;:::i;:::-;22760:1;22784:4;22771:17;;22816:2;22808:6;22805:14;22833:1;22828:618;;;;23490:1;23507:6;23504:77;;;23556:9;23551:3;23547:19;23541:26;23532:35;;23504:77;23607:67;23667:6;23660:5;23607:67;:::i;:::-;23601:4;23594:81;23463:222;22798:887;;22828:618;22880:4;22876:9;22868:6;22864:22;22914:37;22946:4;22914:37;:::i;:::-;22973:1;22987:208;23001:7;22998:1;22995:14;22987:208;;;23080:9;23075:3;23071:19;23065:26;23057:6;23050:42;23131:1;23123:6;23119:14;23109:24;;23178:2;23167:9;23163:18;23150:31;;23024:4;23021:1;23017:12;23012:17;;22987:208;;;23223:6;23214:7;23211:19;23208:179;;;23281:9;23276:3;23272:19;23266:26;23324:48;23366:4;23358:6;23354:17;23343:9;23324:48;:::i;:::-;23316:6;23309:64;23231:156;23208:179;23433:1;23429;23421:6;23417:14;23413:22;23407:4;23400:36;22835:611;;;22798:887;;22388:1303;;;22296:1395;;:::o;23697:174::-;23837:26;23833:1;23825:6;23821:14;23814:50;23697:174;:::o;23877:366::-;24019:3;24040:67;24104:2;24099:3;24040:67;:::i;:::-;24033:74;;24116:93;24205:3;24116:93;:::i;:::-;24234:2;24229:3;24225:12;24218:19;;23877:366;;;:::o;24249:419::-;24415:4;24453:2;24442:9;24438:18;24430:26;;24502:9;24496:4;24492:20;24488:1;24477:9;24473:17;24466:47;24530:131;24656:4;24530:131;:::i;:::-;24522:139;;24249:419;;;:::o;24674:228::-;24814:34;24810:1;24802:6;24798:14;24791:58;24883:11;24878:2;24870:6;24866:15;24859:36;24674:228;:::o;24908:366::-;25050:3;25071:67;25135:2;25130:3;25071:67;:::i;:::-;25064:74;;25147:93;25236:3;25147:93;:::i;:::-;25265:2;25260:3;25256:12;25249:19;;24908:366;;;:::o;25280:419::-;25446:4;25484:2;25473:9;25469:18;25461:26;;25533:9;25527:4;25523:20;25519:1;25508:9;25504:17;25497:47;25561:131;25687:4;25561:131;:::i;:::-;25553:139;;25280:419;;;:::o;25705:165::-;25845:17;25841:1;25833:6;25829:14;25822:41;25705:165;:::o;25876:366::-;26018:3;26039:67;26103:2;26098:3;26039:67;:::i;:::-;26032:74;;26115:93;26204:3;26115:93;:::i;:::-;26233:2;26228:3;26224:12;26217:19;;25876:366;;;:::o;26248:419::-;26414:4;26452:2;26441:9;26437:18;26429:26;;26501:9;26495:4;26491:20;26487:1;26476:9;26472:17;26465:47;26529:131;26655:4;26529:131;:::i;:::-;26521:139;;26248:419;;;:::o;26673:176::-;26813:28;26809:1;26801:6;26797:14;26790:52;26673:176;:::o;26855:366::-;26997:3;27018:67;27082:2;27077:3;27018:67;:::i;:::-;27011:74;;27094:93;27183:3;27094:93;:::i;:::-;27212:2;27207:3;27203:12;27196:19;;26855:366;;;:::o;27227:419::-;27393:4;27431:2;27420:9;27416:18;27408:26;;27480:9;27474:4;27470:20;27466:1;27455:9;27451:17;27444:47;27508:131;27634:4;27508:131;:::i;:::-;27500:139;;27227:419;;;:::o;27652:180::-;27700:77;27697:1;27690:88;27797:4;27794:1;27787:15;27821:4;27818:1;27811:15;27838:191;27878:3;27897:20;27915:1;27897:20;:::i;:::-;27892:25;;27931:20;27949:1;27931:20;:::i;:::-;27926:25;;27974:1;27971;27967:9;27960:16;;27995:3;27992:1;27989:10;27986:36;;;28002:18;;:::i;:::-;27986:36;27838:191;;;;:::o;28035:410::-;28075:7;28098:20;28116:1;28098:20;:::i;:::-;28093:25;;28132:20;28150:1;28132:20;:::i;:::-;28127:25;;28187:1;28184;28180:9;28209:30;28227:11;28209:30;:::i;:::-;28198:41;;28388:1;28379:7;28375:15;28372:1;28369:22;28349:1;28342:9;28322:83;28299:139;;28418:18;;:::i;:::-;28299:139;28083:362;28035:410;;;;:::o;28451:162::-;28591:14;28587:1;28579:6;28575:14;28568:38;28451:162;:::o;28619:366::-;28761:3;28782:67;28846:2;28841:3;28782:67;:::i;:::-;28775:74;;28858:93;28947:3;28858:93;:::i;:::-;28976:2;28971:3;28967:12;28960:19;;28619:366;;;:::o;28991:419::-;29157:4;29195:2;29184:9;29180:18;29172:26;;29244:9;29238:4;29234:20;29230:1;29219:9;29215:17;29208:47;29272:131;29398:4;29272:131;:::i;:::-;29264:139;;28991:419;;;:::o;29416:233::-;29455:3;29478:24;29496:5;29478:24;:::i;:::-;29469:33;;29524:66;29517:5;29514:77;29511:103;;29594:18;;:::i;:::-;29511:103;29641:1;29634:5;29630:13;29623:20;;29416:233;;;:::o;29655:234::-;29795:34;29791:1;29783:6;29779:14;29772:58;29864:17;29859:2;29851:6;29847:15;29840:42;29655:234;:::o;29895:366::-;30037:3;30058:67;30122:2;30117:3;30058:67;:::i;:::-;30051:74;;30134:93;30223:3;30134:93;:::i;:::-;30252:2;30247:3;30243:12;30236:19;;29895:366;;;:::o;30267:419::-;30433:4;30471:2;30460:9;30456:18;30448:26;;30520:9;30514:4;30510:20;30506:1;30495:9;30491:17;30484:47;30548:131;30674:4;30548:131;:::i;:::-;30540:139;;30267:419;;;:::o;30692:148::-;30794:11;30831:3;30816:18;;30692:148;;;;:::o;30846:390::-;30952:3;30980:39;31013:5;30980:39;:::i;:::-;31035:89;31117:6;31112:3;31035:89;:::i;:::-;31028:96;;31133:65;31191:6;31186:3;31179:4;31172:5;31168:16;31133:65;:::i;:::-;31223:6;31218:3;31214:16;31207:23;;30956:280;30846:390;;;;:::o;31242:155::-;31382:7;31378:1;31370:6;31366:14;31359:31;31242:155;:::o;31403:400::-;31563:3;31584:84;31666:1;31661:3;31584:84;:::i;:::-;31577:91;;31677:93;31766:3;31677:93;:::i;:::-;31795:1;31790:3;31786:11;31779:18;;31403:400;;;:::o;31809:701::-;32090:3;32112:95;32203:3;32194:6;32112:95;:::i;:::-;32105:102;;32224:95;32315:3;32306:6;32224:95;:::i;:::-;32217:102;;32336:148;32480:3;32336:148;:::i;:::-;32329:155;;32501:3;32494:10;;31809:701;;;;;:::o;32516:225::-;32656:34;32652:1;32644:6;32640:14;32633:58;32725:8;32720:2;32712:6;32708:15;32701:33;32516:225;:::o;32747:366::-;32889:3;32910:67;32974:2;32969:3;32910:67;:::i;:::-;32903:74;;32986:93;33075:3;32986:93;:::i;:::-;33104:2;33099:3;33095:12;33088:19;;32747:366;;;:::o;33119:419::-;33285:4;33323:2;33312:9;33308:18;33300:26;;33372:9;33366:4;33362:20;33358:1;33347:9;33343:17;33336:47;33400:131;33526:4;33400:131;:::i;:::-;33392:139;;33119:419;;;:::o;33544:194::-;33584:4;33604:20;33622:1;33604:20;:::i;:::-;33599:25;;33638:20;33656:1;33638:20;:::i;:::-;33633:25;;33682:1;33679;33675:9;33667:17;;33706:1;33700:4;33697:11;33694:37;;;33711:18;;:::i;:::-;33694:37;33544:194;;;;:::o;33744:182::-;33884:34;33880:1;33872:6;33868:14;33861:58;33744:182;:::o;33932:366::-;34074:3;34095:67;34159:2;34154:3;34095:67;:::i;:::-;34088:74;;34171:93;34260:3;34171:93;:::i;:::-;34289:2;34284:3;34280:12;34273:19;;33932:366;;;:::o;34304:419::-;34470:4;34508:2;34497:9;34493:18;34485:26;;34557:9;34551:4;34547:20;34543:1;34532:9;34528:17;34521:47;34585:131;34711:4;34585:131;:::i;:::-;34577:139;;34304:419;;;:::o;34729:224::-;34869:34;34865:1;34857:6;34853:14;34846:58;34938:7;34933:2;34925:6;34921:15;34914:32;34729:224;:::o;34959:366::-;35101:3;35122:67;35186:2;35181:3;35122:67;:::i;:::-;35115:74;;35198:93;35287:3;35198:93;:::i;:::-;35316:2;35311:3;35307:12;35300:19;;34959:366;;;:::o;35331:419::-;35497:4;35535:2;35524:9;35520:18;35512:26;;35584:9;35578:4;35574:20;35570:1;35559:9;35555:17;35548:47;35612:131;35738:4;35612:131;:::i;:::-;35604:139;;35331:419;;;:::o;35756:223::-;35896:34;35892:1;35884:6;35880:14;35873:58;35965:6;35960:2;35952:6;35948:15;35941:31;35756:223;:::o;35985:366::-;36127:3;36148:67;36212:2;36207:3;36148:67;:::i;:::-;36141:74;;36224:93;36313:3;36224:93;:::i;:::-;36342:2;36337:3;36333:12;36326:19;;35985:366;;;:::o;36357:419::-;36523:4;36561:2;36550:9;36546:18;36538:26;;36610:9;36604:4;36600:20;36596:1;36585:9;36581:17;36574:47;36638:131;36764:4;36638:131;:::i;:::-;36630:139;;36357:419;;;:::o;36782:175::-;36922:27;36918:1;36910:6;36906:14;36899:51;36782:175;:::o;36963:366::-;37105:3;37126:67;37190:2;37185:3;37126:67;:::i;:::-;37119:74;;37202:93;37291:3;37202:93;:::i;:::-;37320:2;37315:3;37311:12;37304:19;;36963:366;;;:::o;37335:419::-;37501:4;37539:2;37528:9;37524:18;37516:26;;37588:9;37582:4;37578:20;37574:1;37563:9;37559:17;37552:47;37616:131;37742:4;37616:131;:::i;:::-;37608:139;;37335:419;;;:::o;37760:237::-;37900:34;37896:1;37888:6;37884:14;37877:58;37969:20;37964:2;37956:6;37952:15;37945:45;37760:237;:::o;38003:366::-;38145:3;38166:67;38230:2;38225:3;38166:67;:::i;:::-;38159:74;;38242:93;38331:3;38242:93;:::i;:::-;38360:2;38355:3;38351:12;38344:19;;38003:366;;;:::o;38375:419::-;38541:4;38579:2;38568:9;38564:18;38556:26;;38628:9;38622:4;38618:20;38614:1;38603:9;38599:17;38592:47;38656:131;38782:4;38656:131;:::i;:::-;38648:139;;38375:419;;;:::o;38800:180::-;38848:77;38845:1;38838:88;38945:4;38942:1;38935:15;38969:4;38966:1;38959:15;38986:240;39126:34;39122:1;39114:6;39110:14;39103:58;39195:23;39190:2;39182:6;39178:15;39171:48;38986:240;:::o;39232:366::-;39374:3;39395:67;39459:2;39454:3;39395:67;:::i;:::-;39388:74;;39471:93;39560:3;39471:93;:::i;:::-;39589:2;39584:3;39580:12;39573:19;;39232:366;;;:::o;39604:419::-;39770:4;39808:2;39797:9;39793:18;39785:26;;39857:9;39851:4;39847:20;39843:1;39832:9;39828:17;39821:47;39885:131;40011:4;39885:131;:::i;:::-;39877:139;;39604:419;;;:::o;40029:98::-;40080:6;40114:5;40108:12;40098:22;;40029:98;;;:::o;40133:168::-;40216:11;40250:6;40245:3;40238:19;40290:4;40285:3;40281:14;40266:29;;40133:168;;;;:::o;40307:373::-;40393:3;40421:38;40453:5;40421:38;:::i;:::-;40475:70;40538:6;40533:3;40475:70;:::i;:::-;40468:77;;40554:65;40612:6;40607:3;40600:4;40593:5;40589:16;40554:65;:::i;:::-;40644:29;40666:6;40644:29;:::i;:::-;40639:3;40635:39;40628:46;;40397:283;40307:373;;;;:::o;40686:640::-;40881:4;40919:3;40908:9;40904:19;40896:27;;40933:71;41001:1;40990:9;40986:17;40977:6;40933:71;:::i;:::-;41014:72;41082:2;41071:9;41067:18;41058:6;41014:72;:::i;:::-;41096;41164:2;41153:9;41149:18;41140:6;41096:72;:::i;:::-;41215:9;41209:4;41205:20;41200:2;41189:9;41185:18;41178:48;41243:76;41314:4;41305:6;41243:76;:::i;:::-;41235:84;;40686:640;;;;;;;:::o;41332:141::-;41388:5;41419:6;41413:13;41404:22;;41435:32;41461:5;41435:32;:::i;:::-;41332:141;;;;:::o;41479:349::-;41548:6;41597:2;41585:9;41576:7;41572:23;41568:32;41565:119;;;41603:79;;:::i;:::-;41565:119;41723:1;41748:63;41803:7;41794:6;41783:9;41779:22;41748:63;:::i;:::-;41738:73;;41694:127;41479:349;;;;:::o;41834:180::-;41882:77;41879:1;41872:88;41979:4;41976:1;41969:15;42003:4;42000:1;41993:15;42020:182;42160:34;42156:1;42148:6;42144:14;42137:58;42020:182;:::o;42208:366::-;42350:3;42371:67;42435:2;42430:3;42371:67;:::i;:::-;42364:74;;42447:93;42536:3;42447:93;:::i;:::-;42565:2;42560:3;42556:12;42549:19;;42208:366;;;:::o;42580:419::-;42746:4;42784:2;42773:9;42769:18;42761:26;;42833:9;42827:4;42823:20;42819:1;42808:9;42804:17;42797:47;42861:131;42987:4;42861:131;:::i;:::-;42853:139;;42580:419;;;:::o;43005:178::-;43145:30;43141:1;43133:6;43129:14;43122:54;43005:178;:::o;43189:366::-;43331:3;43352:67;43416:2;43411:3;43352:67;:::i;:::-;43345:74;;43428:93;43517:3;43428:93;:::i;:::-;43546:2;43541:3;43537:12;43530:19;;43189:366;;;:::o;43561:419::-;43727:4;43765:2;43754:9;43750:18;43742:26;;43814:9;43808:4;43804:20;43800:1;43789:9;43785:17;43778:47;43842:131;43968:4;43842:131;:::i;:::-;43834:139;;43561:419;;;:::o
Swarm Source
ipfs://7019b43b8bc7bcda6954b107ab7ff0ce0d27c9dd09b4e2304bfdba0ef260f416
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 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.