More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 769 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 292642447 | 106 days ago | IN | 0 ETH | 0.00002413 | ||||
Set Approval For... | 281399482 | 139 days ago | IN | 0 ETH | 0.00000379 | ||||
Set Approval For... | 280861568 | 140 days ago | IN | 0 ETH | 0.00000155 | ||||
Set Approval For... | 277288601 | 151 days ago | IN | 0 ETH | 0.00000103 | ||||
Set Approval For... | 258688394 | 205 days ago | IN | 0 ETH | 0.00000097 | ||||
Set Approval For... | 241694820 | 254 days ago | IN | 0 ETH | 0.00000052 | ||||
Set Approval For... | 232818489 | 280 days ago | IN | 0 ETH | 0.00000075 | ||||
Set Approval For... | 224324900 | 305 days ago | IN | 0 ETH | 0.00000046 | ||||
Safe Transfer Fr... | 220976456 | 314 days ago | IN | 0 ETH | 0.00000135 | ||||
Safe Transfer Fr... | 220508645 | 316 days ago | IN | 0 ETH | 0.0000022 | ||||
Mint | 216288183 | 328 days ago | IN | 0 ETH | 0.00005143 | ||||
Mint | 216288042 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216287989 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216287938 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216287501 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216287435 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216287259 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216287059 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216286967 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216286866 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216286800 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216286745 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216286598 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216286546 | 328 days ago | IN | 0 ETH | 0.00023279 | ||||
Mint | 216286494 | 328 days ago | IN | 0 ETH | 0.00023279 |
Loading...
Loading
Contract Name:
MonkeyEmpireApesNFT
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2023-09-30 */ // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.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; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { 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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // 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.9.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { 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.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/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.9.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.9.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 {} /** * @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 {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // 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/test.sol pragma solidity ^0.8.18; contract MonkeyEmpireApesNFT is ERC721Enumerable, ReentrancyGuard, Ownable { using Strings for uint256; using Address for address payable; using EnumerableSet for EnumerableSet.AddressSet; EnumerableSet.AddressSet private whitelistedAddresses; uint public constant MAX_TOKENS = 5000; uint public price = 5 * 10**15; string public baseUri; string public baseExtension = ".json"; constructor() ERC721("Monkey Empire Apes NFT", "MEAN") { baseUri = "ipfs://bafybeifpzgis2yc7hgbopeooabt45vpzm3bipgzrfll5ubvgc7rpt25a4e/"; whitelistedAddresses.add(msg.sender); // Add the contract owner to the whitelist } function addToWhitelist(address[] memory addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelistedAddresses.add(addresses[i]); } } function removeFromWhitelist(address[] memory addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelistedAddresses.remove(addresses[i]); } } function isWhitelisted(address addr) public view returns (bool) { return whitelistedAddresses.contains(addr); } function mint(uint256 _numTokens) external payable nonReentrant { bool userIsWhitelisted = isWhitelisted(msg.sender); uint256 currentTotalSupply = totalSupply(); require(userIsWhitelisted || currentTotalSupply < 200, "You are not whitelisted, and the free-minting limit is reached."); require(_numTokens > 0, "You cannot mint zero tokens."); require(currentTotalSupply + _numTokens <= MAX_TOKENS, "Exceeds total supply."); if (!userIsWhitelisted) { require(_numTokens * price <= msg.value, "Insufficient funds."); } else if (msg.sender != owner()) { require(msg.value == 0, "Whitelisted users should not send ETH."); whitelistedAddresses.remove(msg.sender); } for (uint256 i = 0; i < _numTokens; ++i) { uint256 tokenId = currentTotalSupply + i + 1; _mint(msg.sender, tokenId); } } function setBaseUri(string memory _baseUri) external onlyOwner { baseUri = _baseUri; } function withdrawAll() external onlyOwner { address payable wallet = payable(owner()); wallet.sendValue(address(this).balance); } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(baseUri).length > 0 ? string(abi.encodePacked(baseUri, tokenId.toString(), baseExtension)) : ""; } function setPrice(uint256 _price) external onlyOwner { require(_price > 0, "Price cannot be zero"); price = _price; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","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":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526611c37937e08000600e556040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506010908162000055919062000588565b503480156200006357600080fd5b506040518060400160405280601681526020017f4d6f6e6b657920456d706972652041706573204e4654000000000000000000008152506040518060400160405280600481526020017f4d45414e000000000000000000000000000000000000000000000000000000008152508160009081620000e1919062000588565b508060019081620000f3919062000588565b5050506001600a819055506200011e620001126200016b60201b60201c565b6200017360201b60201c565b60405180608001604052806043815260200162004dfa60439139600f908162000148919062000588565b506200016433600c6200023960201b6200146d1790919060201c565b506200066f565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600062000269836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200027160201b60201c565b905092915050565b6000620002858383620002eb60201b60201c565b620002e0578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620002e5565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039057607f821691505b602082108103620003a657620003a562000348565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004107fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003d1565b6200041c8683620003d1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000469620004636200045d8462000434565b6200043e565b62000434565b9050919050565b6000819050919050565b620004858362000448565b6200049d620004948262000470565b848454620003de565b825550505050565b600090565b620004b4620004a5565b620004c18184846200047a565b505050565b5b81811015620004e957620004dd600082620004aa565b600181019050620004c7565b5050565b601f82111562000538576200050281620003ac565b6200050d84620003c1565b810160208510156200051d578190505b620005356200052c85620003c1565b830182620004c6565b50505b505050565b600082821c905092915050565b60006200055d600019846008026200053d565b1980831691505092915050565b60006200057883836200054a565b9150826002028217905092915050565b62000593826200030e565b67ffffffffffffffff811115620005af57620005ae62000319565b5b620005bb825462000377565b620005c8828285620004ed565b600060209050601f831160018114620006005760008415620005eb578287015190505b620005f785826200056a565b86555062000667565b601f1984166200061086620003ac565b60005b828110156200063a5784890151825560018201915060208501945060208101905062000613565b868310156200065a578489015162000656601f8916826200054a565b8355505b6001600288020188555050505b505050505050565b61477b806200067f6000396000f3fe6080604052600436106101cd5760003560e01c8063853828b6116100f7578063a0bcfc7f11610095578063c87b56dd11610064578063c87b56dd14610665578063e985e9c5146106a2578063f2fde38b146106df578063f47c84c514610708576101cd565b8063a0bcfc7f146105bf578063a22cb465146105e8578063b88d4fde14610611578063c66828621461063a576101cd565b806395d89b41116100d157806395d89b41146105225780639abc83201461054d578063a035b1fe14610578578063a0712d68146105a3576101cd565b8063853828b6146104b75780638da5cb5b146104ce57806391b7f5ed146104f9576101cd565b80633af32abf1161016f5780636352211e1161013e5780636352211e146103fd57806370a082311461043a578063715018a6146104775780637f6497831461048e576101cd565b80633af32abf1461033157806342842e0e1461036e5780634f6ccce714610397578063548db174146103d4576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612c25565b610733565b6040516102069190612c6d565b60405180910390f35b34801561021b57600080fd5b506102246107ad565b6040516102319190612d18565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d70565b61083f565b60405161026e9190612dde565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612e25565b610885565b005b3480156102ac57600080fd5b506102b561099c565b6040516102c29190612e74565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612e8f565b6109a9565b005b34801561030057600080fd5b5061031b60048036038101906103169190612e25565b610a09565b6040516103289190612e74565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190612ee2565b610aae565b6040516103659190612c6d565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190612e8f565b610acb565b005b3480156103a357600080fd5b506103be60048036038101906103b99190612d70565b610aeb565b6040516103cb9190612e74565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190613057565b610b5c565b005b34801561040957600080fd5b50610424600480360381019061041f9190612d70565b610bb6565b6040516104319190612dde565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190612ee2565b610c3c565b60405161046e9190612e74565b60405180910390f35b34801561048357600080fd5b5061048c610cf3565b005b34801561049a57600080fd5b506104b560048036038101906104b09190613057565b610d07565b005b3480156104c357600080fd5b506104cc610d61565b005b3480156104da57600080fd5b506104e3610da1565b6040516104f09190612dde565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190612d70565b610dcb565b005b34801561052e57600080fd5b50610537610e20565b6040516105449190612d18565b60405180910390f35b34801561055957600080fd5b50610562610eb2565b60405161056f9190612d18565b60405180910390f35b34801561058457600080fd5b5061058d610f40565b60405161059a9190612e74565b60405180910390f35b6105bd60048036038101906105b89190612d70565b610f46565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190613155565b611184565b005b3480156105f457600080fd5b5061060f600480360381019061060a91906131ca565b61119f565b005b34801561061d57600080fd5b50610638600480360381019061063391906132ab565b6111b5565b005b34801561064657600080fd5b5061064f611217565b60405161065c9190612d18565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190612d70565b6112a5565b6040516106999190612d18565b60405180910390f35b3480156106ae57600080fd5b506106c960048036038101906106c4919061332e565b611350565b6040516106d69190612c6d565b60405180910390f35b3480156106eb57600080fd5b5061070660048036038101906107019190612ee2565b6113e4565b005b34801561071457600080fd5b5061071d611467565b60405161072a9190612e74565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a657506107a58261149d565b5b9050919050565b6060600080546107bc9061339d565b80601f01602080910402602001604051908101604052809291908181526020018280546107e89061339d565b80156108355780601f1061080a57610100808354040283529160200191610835565b820191906000526020600020905b81548152906001019060200180831161081857829003601f168201915b5050505050905090565b600061084a8261157f565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089082610bb6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790613440565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091f6115ca565b73ffffffffffffffffffffffffffffffffffffffff16148061094e575061094d816109486115ca565b611350565b5b61098d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610984906134d2565b60405180910390fd5b61099783836115d2565b505050565b6000600880549050905090565b6109ba6109b46115ca565b8261168b565b6109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090613564565b60405180910390fd5b610a04838383611720565b505050565b6000610a1483610c3c565b8210610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c906135f6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610ac482600c611a1990919063ffffffff16565b9050919050565b610ae6838383604051806020016040528060008152506111b5565b505050565b6000610af561099c565b8210610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90613688565b60405180910390fd5b60088281548110610b4a57610b496136a8565b5b90600052602060002001549050919050565b610b64611a49565b60005b8151811015610bb257610b9e828281518110610b8657610b856136a8565b5b6020026020010151600c611ac790919063ffffffff16565b508080610baa90613706565b915050610b67565b5050565b600080610bc283611af7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a9061379a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca39061382c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cfb611a49565b610d056000611b34565b565b610d0f611a49565b60005b8151811015610d5d57610d49828281518110610d3157610d306136a8565b5b6020026020010151600c61146d90919063ffffffff16565b508080610d5590613706565b915050610d12565b5050565b610d69611a49565b6000610d73610da1565b9050610d9e478273ffffffffffffffffffffffffffffffffffffffff16611bfa90919063ffffffff16565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610dd3611a49565b60008111610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90613898565b60405180910390fd5b80600e8190555050565b606060018054610e2f9061339d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5b9061339d565b8015610ea85780601f10610e7d57610100808354040283529160200191610ea8565b820191906000526020600020905b815481529060010190602001808311610e8b57829003601f168201915b5050505050905090565b600f8054610ebf9061339d565b80601f0160208091040260200160405190810160405280929190818152602001828054610eeb9061339d565b8015610f385780601f10610f0d57610100808354040283529160200191610f38565b820191906000526020600020905b815481529060010190602001808311610f1b57829003601f168201915b505050505081565b600e5481565b610f4e611cee565b6000610f5933610aae565b90506000610f6561099c565b90508180610f73575060c881105b610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa99061392a565b60405180910390fd5b60008311610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613996565b60405180910390fd5b611388838261100491906139b6565b1115611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90613a36565b60405180910390fd5b8161109f5734600e54846110599190613a56565b111561109a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109190613ae4565b60405180910390fd5b611133565b6110a7610da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611132576000341461111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613b76565b60405180910390fd5b61113033600c611ac790919063ffffffff16565b505b5b60005b838110156111765760006001828461114e91906139b6565b61115891906139b6565b90506111643382611d3d565b508061116f90613706565b9050611136565b505050611181611f5a565b50565b61118c611a49565b80600f908161119b9190613d42565b5050565b6111b16111aa6115ca565b8383611f64565b5050565b6111c66111c06115ca565b8361168b565b611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc90613564565b60405180910390fd5b611211848484846120d0565b50505050565b601080546112249061339d565b80601f01602080910402602001604051908101604052809291908181526020018280546112509061339d565b801561129d5780601f106112725761010080835404028352916020019161129d565b820191906000526020600020905b81548152906001019060200180831161128057829003601f168201915b505050505081565b60606112b08261212c565b6112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e690613e86565b60405180910390fd5b6000600f80546112fe9061339d565b90501161131a5760405180602001604052806000815250611349565b600f6113258361216d565b601060405160200161133993929190613f65565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113ec611a49565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361145b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145290614008565b60405180910390fd5b61146481611b34565b50565b61138881565b6000611495836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61223b565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061156857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115785750611577826122ab565b5b9050919050565b6115888161212c565b6115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be9061379a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661164583610bb6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061169783610bb6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806116d957506116d88185611350565b5b8061171757508373ffffffffffffffffffffffffffffffffffffffff166116ff8461083f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661174082610bb6565b73ffffffffffffffffffffffffffffffffffffffff1614611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d9061409a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc9061412c565b60405180910390fd5b6118128383836001612315565b8273ffffffffffffffffffffffffffffffffffffffff1661183282610bb6565b73ffffffffffffffffffffffffffffffffffffffff1614611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f9061409a565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a148383836001612473565b505050565b6000611a41836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612479565b905092915050565b611a516115ca565b73ffffffffffffffffffffffffffffffffffffffff16611a6f610da1565b73ffffffffffffffffffffffffffffffffffffffff1614611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc90614198565b60405180910390fd5b565b6000611aef836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61249c565b905092915050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80471015611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490614204565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c6390614255565b60006040518083038185875af1925050503d8060008114611ca0576040519150601f19603f3d011682016040523d82523d6000602084013e611ca5565b606091505b5050905080611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce0906142dc565b60405180910390fd5b505050565b6002600a5403611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a90614348565b60405180910390fd5b6002600a81905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da3906143b4565b60405180910390fd5b611db58161212c565b15611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec90614420565b60405180910390fd5b611e03600083836001612315565b611e0c8161212c565b15611e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4390614420565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f56600083836001612473565b5050565b6001600a81905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc99061448c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120c39190612c6d565b60405180910390a3505050565b6120db848484611720565b6120e7848484846125b0565b612126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211d9061451e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661214e83611af7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000600161217c84612737565b01905060008167ffffffffffffffff81111561219b5761219a612f14565b5b6040519080825280601f01601f1916602001820160405280156121cd5781602001600182028036833780820191505090505b509050600082602001820190505b600115612230578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816122245761222361453e565b5b049450600085036121db575b819350505050919050565b60006122478383612479565b6122a05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506122a5565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123218484848461288a565b6001811115612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c906145df565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123ac576123a781612890565b6123eb565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146123ea576123e985826128d9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361242d5761242881612a46565b61246c565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461246b5761246a8482612b17565b5b5b5050505050565b50505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146125a45760006001826124ce91906145ff565b90506000600186600001805490506124e691906145ff565b9050818114612555576000866000018281548110612507576125066136a8565b5b906000526020600020015490508087600001848154811061252b5761252a6136a8565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061256957612568614633565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506125aa565b60009150505b92915050565b60006125d18473ffffffffffffffffffffffffffffffffffffffff16612b96565b1561272a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fa6115ca565b8786866040518563ffffffff1660e01b815260040161261c94939291906146b7565b6020604051808303816000875af192505050801561265857506040513d601f19601f820116820180604052508101906126559190614718565b60015b6126da573d8060008114612688576040519150601f19603f3d011682016040523d82523d6000602084013e61268d565b606091505b5060008151036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c99061451e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061272f565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612795577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161278b5761278a61453e565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106127d2576d04ee2d6d415b85acef810000000083816127c8576127c761453e565b5b0492506020810190505b662386f26fc10000831061280157662386f26fc1000083816127f7576127f661453e565b5b0492506010810190505b6305f5e100831061282a576305f5e10083816128205761281f61453e565b5b0492506008810190505b612710831061284f5761271083816128455761284461453e565b5b0492506004810190505b6064831061287257606483816128685761286761453e565b5b0492506002810190505b600a8310612881576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128e684610c3c565b6128f091906145ff565b90506000600760008481526020019081526020016000205490508181146129d5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a5a91906145ff565b9050600060096000848152602001908152602001600020549050600060088381548110612a8a57612a896136a8565b5b906000526020600020015490508060088381548110612aac57612aab6136a8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612afb57612afa614633565b5b6001900381819060005260206000200160009055905550505050565b6000612b2283610c3c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0281612bcd565b8114612c0d57600080fd5b50565b600081359050612c1f81612bf9565b92915050565b600060208284031215612c3b57612c3a612bc3565b5b6000612c4984828501612c10565b91505092915050565b60008115159050919050565b612c6781612c52565b82525050565b6000602082019050612c826000830184612c5e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cc2578082015181840152602081019050612ca7565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cea82612c88565b612cf48185612c93565b9350612d04818560208601612ca4565b612d0d81612cce565b840191505092915050565b60006020820190508181036000830152612d328184612cdf565b905092915050565b6000819050919050565b612d4d81612d3a565b8114612d5857600080fd5b50565b600081359050612d6a81612d44565b92915050565b600060208284031215612d8657612d85612bc3565b5b6000612d9484828501612d5b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dc882612d9d565b9050919050565b612dd881612dbd565b82525050565b6000602082019050612df36000830184612dcf565b92915050565b612e0281612dbd565b8114612e0d57600080fd5b50565b600081359050612e1f81612df9565b92915050565b60008060408385031215612e3c57612e3b612bc3565b5b6000612e4a85828601612e10565b9250506020612e5b85828601612d5b565b9150509250929050565b612e6e81612d3a565b82525050565b6000602082019050612e896000830184612e65565b92915050565b600080600060608486031215612ea857612ea7612bc3565b5b6000612eb686828701612e10565b9350506020612ec786828701612e10565b9250506040612ed886828701612d5b565b9150509250925092565b600060208284031215612ef857612ef7612bc3565b5b6000612f0684828501612e10565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f4c82612cce565b810181811067ffffffffffffffff82111715612f6b57612f6a612f14565b5b80604052505050565b6000612f7e612bb9565b9050612f8a8282612f43565b919050565b600067ffffffffffffffff821115612faa57612fa9612f14565b5b602082029050602081019050919050565b600080fd5b6000612fd3612fce84612f8f565b612f74565b90508083825260208201905060208402830185811115612ff657612ff5612fbb565b5b835b8181101561301f578061300b8882612e10565b845260208401935050602081019050612ff8565b5050509392505050565b600082601f83011261303e5761303d612f0f565b5b813561304e848260208601612fc0565b91505092915050565b60006020828403121561306d5761306c612bc3565b5b600082013567ffffffffffffffff81111561308b5761308a612bc8565b5b61309784828501613029565b91505092915050565b600080fd5b600067ffffffffffffffff8211156130c0576130bf612f14565b5b6130c982612cce565b9050602081019050919050565b82818337600083830152505050565b60006130f86130f3846130a5565b612f74565b905082815260208101848484011115613114576131136130a0565b5b61311f8482856130d6565b509392505050565b600082601f83011261313c5761313b612f0f565b5b813561314c8482602086016130e5565b91505092915050565b60006020828403121561316b5761316a612bc3565b5b600082013567ffffffffffffffff81111561318957613188612bc8565b5b61319584828501613127565b91505092915050565b6131a781612c52565b81146131b257600080fd5b50565b6000813590506131c48161319e565b92915050565b600080604083850312156131e1576131e0612bc3565b5b60006131ef85828601612e10565b9250506020613200858286016131b5565b9150509250929050565b600067ffffffffffffffff82111561322557613224612f14565b5b61322e82612cce565b9050602081019050919050565b600061324e6132498461320a565b612f74565b90508281526020810184848401111561326a576132696130a0565b5b6132758482856130d6565b509392505050565b600082601f83011261329257613291612f0f565b5b81356132a284826020860161323b565b91505092915050565b600080600080608085870312156132c5576132c4612bc3565b5b60006132d387828801612e10565b94505060206132e487828801612e10565b93505060406132f587828801612d5b565b925050606085013567ffffffffffffffff81111561331657613315612bc8565b5b6133228782880161327d565b91505092959194509250565b6000806040838503121561334557613344612bc3565b5b600061335385828601612e10565b925050602061336485828601612e10565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133b557607f821691505b6020821081036133c8576133c761336e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061342a602183612c93565b9150613435826133ce565b604082019050919050565b600060208201905081810360008301526134598161341d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006134bc603d83612c93565b91506134c782613460565b604082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061354e602d83612c93565b9150613559826134f2565b604082019050919050565b6000602082019050818103600083015261357d81613541565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006135e0602b83612c93565b91506135eb82613584565b604082019050919050565b6000602082019050818103600083015261360f816135d3565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613672602c83612c93565b915061367d82613616565b604082019050919050565b600060208201905081810360008301526136a181613665565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061371182612d3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613743576137426136d7565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613784601883612c93565b915061378f8261374e565b602082019050919050565b600060208201905081810360008301526137b381613777565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613816602983612c93565b9150613821826137ba565b604082019050919050565b6000602082019050818103600083015261384581613809565b9050919050565b7f50726963652063616e6e6f74206265207a65726f000000000000000000000000600082015250565b6000613882601483612c93565b915061388d8261384c565b602082019050919050565b600060208201905081810360008301526138b181613875565b9050919050565b7f596f7520617265206e6f742077686974656c69737465642c20616e642074686560008201527f20667265652d6d696e74696e67206c696d697420697320726561636865642e00602082015250565b6000613914603f83612c93565b915061391f826138b8565b604082019050919050565b6000602082019050818103600083015261394381613907565b9050919050565b7f596f752063616e6e6f74206d696e74207a65726f20746f6b656e732e00000000600082015250565b6000613980601c83612c93565b915061398b8261394a565b602082019050919050565b600060208201905081810360008301526139af81613973565b9050919050565b60006139c182612d3a565b91506139cc83612d3a565b92508282019050808211156139e4576139e36136d7565b5b92915050565b7f4578636565647320746f74616c20737570706c792e0000000000000000000000600082015250565b6000613a20601583612c93565b9150613a2b826139ea565b602082019050919050565b60006020820190508181036000830152613a4f81613a13565b9050919050565b6000613a6182612d3a565b9150613a6c83612d3a565b9250828202613a7a81612d3a565b91508282048414831517613a9157613a906136d7565b5b5092915050565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b6000613ace601383612c93565b9150613ad982613a98565b602082019050919050565b60006020820190508181036000830152613afd81613ac1565b9050919050565b7f57686974656c69737465642075736572732073686f756c64206e6f742073656e60008201527f64204554482e0000000000000000000000000000000000000000000000000000602082015250565b6000613b60602683612c93565b9150613b6b82613b04565b604082019050919050565b60006020820190508181036000830152613b8f81613b53565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613bf87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613bbb565b613c028683613bbb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c3f613c3a613c3584612d3a565b613c1a565b612d3a565b9050919050565b6000819050919050565b613c5983613c24565b613c6d613c6582613c46565b848454613bc8565b825550505050565b600090565b613c82613c75565b613c8d818484613c50565b505050565b5b81811015613cb157613ca6600082613c7a565b600181019050613c93565b5050565b601f821115613cf657613cc781613b96565b613cd084613bab565b81016020851015613cdf578190505b613cf3613ceb85613bab565b830182613c92565b50505b505050565b600082821c905092915050565b6000613d1960001984600802613cfb565b1980831691505092915050565b6000613d328383613d08565b9150826002028217905092915050565b613d4b82612c88565b67ffffffffffffffff811115613d6457613d63612f14565b5b613d6e825461339d565b613d79828285613cb5565b600060209050601f831160018114613dac5760008415613d9a578287015190505b613da48582613d26565b865550613e0c565b601f198416613dba86613b96565b60005b82811015613de257848901518255600182019150602085019450602081019050613dbd565b86831015613dff5784890151613dfb601f891682613d08565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e70602f83612c93565b9150613e7b82613e14565b604082019050919050565b60006020820190508181036000830152613e9f81613e63565b9050919050565b600081905092915050565b60008154613ebe8161339d565b613ec88186613ea6565b94506001821660008114613ee35760018114613ef857613f2b565b60ff1983168652811515820286019350613f2b565b613f0185613b96565b60005b83811015613f2357815481890152600182019150602081019050613f04565b838801955050505b50505092915050565b6000613f3f82612c88565b613f498185613ea6565b9350613f59818560208601612ca4565b80840191505092915050565b6000613f718286613eb1565b9150613f7d8285613f34565b9150613f898284613eb1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ff2602683612c93565b9150613ffd82613f96565b604082019050919050565b6000602082019050818103600083015261402181613fe5565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614084602583612c93565b915061408f82614028565b604082019050919050565b600060208201905081810360008301526140b381614077565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614116602483612c93565b9150614121826140ba565b604082019050919050565b6000602082019050818103600083015261414581614109565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614182602083612c93565b915061418d8261414c565b602082019050919050565b600060208201905081810360008301526141b181614175565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006141ee601d83612c93565b91506141f9826141b8565b602082019050919050565b6000602082019050818103600083015261421d816141e1565b9050919050565b600081905092915050565b50565b600061423f600083614224565b915061424a8261422f565b600082019050919050565b600061426082614232565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006142c6603a83612c93565b91506142d18261426a565b604082019050919050565b600060208201905081810360008301526142f5816142b9565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614332601f83612c93565b915061433d826142fc565b602082019050919050565b6000602082019050818103600083015261436181614325565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061439e602083612c93565b91506143a982614368565b602082019050919050565b600060208201905081810360008301526143cd81614391565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061440a601c83612c93565b9150614415826143d4565b602082019050919050565b60006020820190508181036000830152614439816143fd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614476601983612c93565b915061448182614440565b602082019050919050565b600060208201905081810360008301526144a581614469565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614508603283612c93565b9150614513826144ac565b604082019050919050565b60006020820190508181036000830152614537816144fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006145c9603583612c93565b91506145d48261456d565b604082019050919050565b600060208201905081810360008301526145f8816145bc565b9050919050565b600061460a82612d3a565b915061461583612d3a565b925082820390508181111561462d5761462c6136d7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061468982614662565b614693818561466d565b93506146a3818560208601612ca4565b6146ac81612cce565b840191505092915050565b60006080820190506146cc6000830187612dcf565b6146d96020830186612dcf565b6146e66040830185612e65565b81810360608301526146f8818461467e565b905095945050505050565b60008151905061471281612bf9565b92915050565b60006020828403121561472e5761472d612bc3565b5b600061473c84828501614703565b9150509291505056fea264697066735822122006d41d4e4f3a769f7043e10980e79581f8a9d019517dd5192c3b2353edf6522e64736f6c63430008120033697066733a2f2f6261667962656966707a676973327963376867626f70656f6f616274343576707a6d33626970677a72666c6c3575627667633772707432356134652f
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c8063853828b6116100f7578063a0bcfc7f11610095578063c87b56dd11610064578063c87b56dd14610665578063e985e9c5146106a2578063f2fde38b146106df578063f47c84c514610708576101cd565b8063a0bcfc7f146105bf578063a22cb465146105e8578063b88d4fde14610611578063c66828621461063a576101cd565b806395d89b41116100d157806395d89b41146105225780639abc83201461054d578063a035b1fe14610578578063a0712d68146105a3576101cd565b8063853828b6146104b75780638da5cb5b146104ce57806391b7f5ed146104f9576101cd565b80633af32abf1161016f5780636352211e1161013e5780636352211e146103fd57806370a082311461043a578063715018a6146104775780637f6497831461048e576101cd565b80633af32abf1461033157806342842e0e1461036e5780634f6ccce714610397578063548db174146103d4576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612c25565b610733565b6040516102069190612c6d565b60405180910390f35b34801561021b57600080fd5b506102246107ad565b6040516102319190612d18565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d70565b61083f565b60405161026e9190612dde565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612e25565b610885565b005b3480156102ac57600080fd5b506102b561099c565b6040516102c29190612e74565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612e8f565b6109a9565b005b34801561030057600080fd5b5061031b60048036038101906103169190612e25565b610a09565b6040516103289190612e74565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190612ee2565b610aae565b6040516103659190612c6d565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190612e8f565b610acb565b005b3480156103a357600080fd5b506103be60048036038101906103b99190612d70565b610aeb565b6040516103cb9190612e74565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190613057565b610b5c565b005b34801561040957600080fd5b50610424600480360381019061041f9190612d70565b610bb6565b6040516104319190612dde565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190612ee2565b610c3c565b60405161046e9190612e74565b60405180910390f35b34801561048357600080fd5b5061048c610cf3565b005b34801561049a57600080fd5b506104b560048036038101906104b09190613057565b610d07565b005b3480156104c357600080fd5b506104cc610d61565b005b3480156104da57600080fd5b506104e3610da1565b6040516104f09190612dde565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190612d70565b610dcb565b005b34801561052e57600080fd5b50610537610e20565b6040516105449190612d18565b60405180910390f35b34801561055957600080fd5b50610562610eb2565b60405161056f9190612d18565b60405180910390f35b34801561058457600080fd5b5061058d610f40565b60405161059a9190612e74565b60405180910390f35b6105bd60048036038101906105b89190612d70565b610f46565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190613155565b611184565b005b3480156105f457600080fd5b5061060f600480360381019061060a91906131ca565b61119f565b005b34801561061d57600080fd5b50610638600480360381019061063391906132ab565b6111b5565b005b34801561064657600080fd5b5061064f611217565b60405161065c9190612d18565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190612d70565b6112a5565b6040516106999190612d18565b60405180910390f35b3480156106ae57600080fd5b506106c960048036038101906106c4919061332e565b611350565b6040516106d69190612c6d565b60405180910390f35b3480156106eb57600080fd5b5061070660048036038101906107019190612ee2565b6113e4565b005b34801561071457600080fd5b5061071d611467565b60405161072a9190612e74565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a657506107a58261149d565b5b9050919050565b6060600080546107bc9061339d565b80601f01602080910402602001604051908101604052809291908181526020018280546107e89061339d565b80156108355780601f1061080a57610100808354040283529160200191610835565b820191906000526020600020905b81548152906001019060200180831161081857829003601f168201915b5050505050905090565b600061084a8261157f565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089082610bb6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790613440565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091f6115ca565b73ffffffffffffffffffffffffffffffffffffffff16148061094e575061094d816109486115ca565b611350565b5b61098d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610984906134d2565b60405180910390fd5b61099783836115d2565b505050565b6000600880549050905090565b6109ba6109b46115ca565b8261168b565b6109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090613564565b60405180910390fd5b610a04838383611720565b505050565b6000610a1483610c3c565b8210610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c906135f6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610ac482600c611a1990919063ffffffff16565b9050919050565b610ae6838383604051806020016040528060008152506111b5565b505050565b6000610af561099c565b8210610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90613688565b60405180910390fd5b60088281548110610b4a57610b496136a8565b5b90600052602060002001549050919050565b610b64611a49565b60005b8151811015610bb257610b9e828281518110610b8657610b856136a8565b5b6020026020010151600c611ac790919063ffffffff16565b508080610baa90613706565b915050610b67565b5050565b600080610bc283611af7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a9061379a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca39061382c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cfb611a49565b610d056000611b34565b565b610d0f611a49565b60005b8151811015610d5d57610d49828281518110610d3157610d306136a8565b5b6020026020010151600c61146d90919063ffffffff16565b508080610d5590613706565b915050610d12565b5050565b610d69611a49565b6000610d73610da1565b9050610d9e478273ffffffffffffffffffffffffffffffffffffffff16611bfa90919063ffffffff16565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610dd3611a49565b60008111610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90613898565b60405180910390fd5b80600e8190555050565b606060018054610e2f9061339d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5b9061339d565b8015610ea85780601f10610e7d57610100808354040283529160200191610ea8565b820191906000526020600020905b815481529060010190602001808311610e8b57829003601f168201915b5050505050905090565b600f8054610ebf9061339d565b80601f0160208091040260200160405190810160405280929190818152602001828054610eeb9061339d565b8015610f385780601f10610f0d57610100808354040283529160200191610f38565b820191906000526020600020905b815481529060010190602001808311610f1b57829003601f168201915b505050505081565b600e5481565b610f4e611cee565b6000610f5933610aae565b90506000610f6561099c565b90508180610f73575060c881105b610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa99061392a565b60405180910390fd5b60008311610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613996565b60405180910390fd5b611388838261100491906139b6565b1115611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90613a36565b60405180910390fd5b8161109f5734600e54846110599190613a56565b111561109a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109190613ae4565b60405180910390fd5b611133565b6110a7610da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611132576000341461111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613b76565b60405180910390fd5b61113033600c611ac790919063ffffffff16565b505b5b60005b838110156111765760006001828461114e91906139b6565b61115891906139b6565b90506111643382611d3d565b508061116f90613706565b9050611136565b505050611181611f5a565b50565b61118c611a49565b80600f908161119b9190613d42565b5050565b6111b16111aa6115ca565b8383611f64565b5050565b6111c66111c06115ca565b8361168b565b611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc90613564565b60405180910390fd5b611211848484846120d0565b50505050565b601080546112249061339d565b80601f01602080910402602001604051908101604052809291908181526020018280546112509061339d565b801561129d5780601f106112725761010080835404028352916020019161129d565b820191906000526020600020905b81548152906001019060200180831161128057829003601f168201915b505050505081565b60606112b08261212c565b6112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e690613e86565b60405180910390fd5b6000600f80546112fe9061339d565b90501161131a5760405180602001604052806000815250611349565b600f6113258361216d565b601060405160200161133993929190613f65565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113ec611a49565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361145b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145290614008565b60405180910390fd5b61146481611b34565b50565b61138881565b6000611495836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61223b565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061156857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115785750611577826122ab565b5b9050919050565b6115888161212c565b6115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be9061379a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661164583610bb6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061169783610bb6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806116d957506116d88185611350565b5b8061171757508373ffffffffffffffffffffffffffffffffffffffff166116ff8461083f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661174082610bb6565b73ffffffffffffffffffffffffffffffffffffffff1614611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d9061409a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc9061412c565b60405180910390fd5b6118128383836001612315565b8273ffffffffffffffffffffffffffffffffffffffff1661183282610bb6565b73ffffffffffffffffffffffffffffffffffffffff1614611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f9061409a565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a148383836001612473565b505050565b6000611a41836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612479565b905092915050565b611a516115ca565b73ffffffffffffffffffffffffffffffffffffffff16611a6f610da1565b73ffffffffffffffffffffffffffffffffffffffff1614611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc90614198565b60405180910390fd5b565b6000611aef836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61249c565b905092915050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80471015611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490614204565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c6390614255565b60006040518083038185875af1925050503d8060008114611ca0576040519150601f19603f3d011682016040523d82523d6000602084013e611ca5565b606091505b5050905080611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce0906142dc565b60405180910390fd5b505050565b6002600a5403611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a90614348565b60405180910390fd5b6002600a81905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da3906143b4565b60405180910390fd5b611db58161212c565b15611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec90614420565b60405180910390fd5b611e03600083836001612315565b611e0c8161212c565b15611e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4390614420565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f56600083836001612473565b5050565b6001600a81905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc99061448c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120c39190612c6d565b60405180910390a3505050565b6120db848484611720565b6120e7848484846125b0565b612126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211d9061451e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661214e83611af7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000600161217c84612737565b01905060008167ffffffffffffffff81111561219b5761219a612f14565b5b6040519080825280601f01601f1916602001820160405280156121cd5781602001600182028036833780820191505090505b509050600082602001820190505b600115612230578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816122245761222361453e565b5b049450600085036121db575b819350505050919050565b60006122478383612479565b6122a05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506122a5565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123218484848461288a565b6001811115612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c906145df565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123ac576123a781612890565b6123eb565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146123ea576123e985826128d9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361242d5761242881612a46565b61246c565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461246b5761246a8482612b17565b5b5b5050505050565b50505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146125a45760006001826124ce91906145ff565b90506000600186600001805490506124e691906145ff565b9050818114612555576000866000018281548110612507576125066136a8565b5b906000526020600020015490508087600001848154811061252b5761252a6136a8565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061256957612568614633565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506125aa565b60009150505b92915050565b60006125d18473ffffffffffffffffffffffffffffffffffffffff16612b96565b1561272a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fa6115ca565b8786866040518563ffffffff1660e01b815260040161261c94939291906146b7565b6020604051808303816000875af192505050801561265857506040513d601f19601f820116820180604052508101906126559190614718565b60015b6126da573d8060008114612688576040519150601f19603f3d011682016040523d82523d6000602084013e61268d565b606091505b5060008151036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c99061451e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061272f565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612795577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161278b5761278a61453e565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106127d2576d04ee2d6d415b85acef810000000083816127c8576127c761453e565b5b0492506020810190505b662386f26fc10000831061280157662386f26fc1000083816127f7576127f661453e565b5b0492506010810190505b6305f5e100831061282a576305f5e10083816128205761281f61453e565b5b0492506008810190505b612710831061284f5761271083816128455761284461453e565b5b0492506004810190505b6064831061287257606483816128685761286761453e565b5b0492506002810190505b600a8310612881576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128e684610c3c565b6128f091906145ff565b90506000600760008481526020019081526020016000205490508181146129d5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a5a91906145ff565b9050600060096000848152602001908152602001600020549050600060088381548110612a8a57612a896136a8565b5b906000526020600020015490508060088381548110612aac57612aab6136a8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612afb57612afa614633565b5b6001900381819060005260206000200160009055905550505050565b6000612b2283610c3c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0281612bcd565b8114612c0d57600080fd5b50565b600081359050612c1f81612bf9565b92915050565b600060208284031215612c3b57612c3a612bc3565b5b6000612c4984828501612c10565b91505092915050565b60008115159050919050565b612c6781612c52565b82525050565b6000602082019050612c826000830184612c5e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cc2578082015181840152602081019050612ca7565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cea82612c88565b612cf48185612c93565b9350612d04818560208601612ca4565b612d0d81612cce565b840191505092915050565b60006020820190508181036000830152612d328184612cdf565b905092915050565b6000819050919050565b612d4d81612d3a565b8114612d5857600080fd5b50565b600081359050612d6a81612d44565b92915050565b600060208284031215612d8657612d85612bc3565b5b6000612d9484828501612d5b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dc882612d9d565b9050919050565b612dd881612dbd565b82525050565b6000602082019050612df36000830184612dcf565b92915050565b612e0281612dbd565b8114612e0d57600080fd5b50565b600081359050612e1f81612df9565b92915050565b60008060408385031215612e3c57612e3b612bc3565b5b6000612e4a85828601612e10565b9250506020612e5b85828601612d5b565b9150509250929050565b612e6e81612d3a565b82525050565b6000602082019050612e896000830184612e65565b92915050565b600080600060608486031215612ea857612ea7612bc3565b5b6000612eb686828701612e10565b9350506020612ec786828701612e10565b9250506040612ed886828701612d5b565b9150509250925092565b600060208284031215612ef857612ef7612bc3565b5b6000612f0684828501612e10565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f4c82612cce565b810181811067ffffffffffffffff82111715612f6b57612f6a612f14565b5b80604052505050565b6000612f7e612bb9565b9050612f8a8282612f43565b919050565b600067ffffffffffffffff821115612faa57612fa9612f14565b5b602082029050602081019050919050565b600080fd5b6000612fd3612fce84612f8f565b612f74565b90508083825260208201905060208402830185811115612ff657612ff5612fbb565b5b835b8181101561301f578061300b8882612e10565b845260208401935050602081019050612ff8565b5050509392505050565b600082601f83011261303e5761303d612f0f565b5b813561304e848260208601612fc0565b91505092915050565b60006020828403121561306d5761306c612bc3565b5b600082013567ffffffffffffffff81111561308b5761308a612bc8565b5b61309784828501613029565b91505092915050565b600080fd5b600067ffffffffffffffff8211156130c0576130bf612f14565b5b6130c982612cce565b9050602081019050919050565b82818337600083830152505050565b60006130f86130f3846130a5565b612f74565b905082815260208101848484011115613114576131136130a0565b5b61311f8482856130d6565b509392505050565b600082601f83011261313c5761313b612f0f565b5b813561314c8482602086016130e5565b91505092915050565b60006020828403121561316b5761316a612bc3565b5b600082013567ffffffffffffffff81111561318957613188612bc8565b5b61319584828501613127565b91505092915050565b6131a781612c52565b81146131b257600080fd5b50565b6000813590506131c48161319e565b92915050565b600080604083850312156131e1576131e0612bc3565b5b60006131ef85828601612e10565b9250506020613200858286016131b5565b9150509250929050565b600067ffffffffffffffff82111561322557613224612f14565b5b61322e82612cce565b9050602081019050919050565b600061324e6132498461320a565b612f74565b90508281526020810184848401111561326a576132696130a0565b5b6132758482856130d6565b509392505050565b600082601f83011261329257613291612f0f565b5b81356132a284826020860161323b565b91505092915050565b600080600080608085870312156132c5576132c4612bc3565b5b60006132d387828801612e10565b94505060206132e487828801612e10565b93505060406132f587828801612d5b565b925050606085013567ffffffffffffffff81111561331657613315612bc8565b5b6133228782880161327d565b91505092959194509250565b6000806040838503121561334557613344612bc3565b5b600061335385828601612e10565b925050602061336485828601612e10565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133b557607f821691505b6020821081036133c8576133c761336e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061342a602183612c93565b9150613435826133ce565b604082019050919050565b600060208201905081810360008301526134598161341d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006134bc603d83612c93565b91506134c782613460565b604082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061354e602d83612c93565b9150613559826134f2565b604082019050919050565b6000602082019050818103600083015261357d81613541565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006135e0602b83612c93565b91506135eb82613584565b604082019050919050565b6000602082019050818103600083015261360f816135d3565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613672602c83612c93565b915061367d82613616565b604082019050919050565b600060208201905081810360008301526136a181613665565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061371182612d3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613743576137426136d7565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613784601883612c93565b915061378f8261374e565b602082019050919050565b600060208201905081810360008301526137b381613777565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613816602983612c93565b9150613821826137ba565b604082019050919050565b6000602082019050818103600083015261384581613809565b9050919050565b7f50726963652063616e6e6f74206265207a65726f000000000000000000000000600082015250565b6000613882601483612c93565b915061388d8261384c565b602082019050919050565b600060208201905081810360008301526138b181613875565b9050919050565b7f596f7520617265206e6f742077686974656c69737465642c20616e642074686560008201527f20667265652d6d696e74696e67206c696d697420697320726561636865642e00602082015250565b6000613914603f83612c93565b915061391f826138b8565b604082019050919050565b6000602082019050818103600083015261394381613907565b9050919050565b7f596f752063616e6e6f74206d696e74207a65726f20746f6b656e732e00000000600082015250565b6000613980601c83612c93565b915061398b8261394a565b602082019050919050565b600060208201905081810360008301526139af81613973565b9050919050565b60006139c182612d3a565b91506139cc83612d3a565b92508282019050808211156139e4576139e36136d7565b5b92915050565b7f4578636565647320746f74616c20737570706c792e0000000000000000000000600082015250565b6000613a20601583612c93565b9150613a2b826139ea565b602082019050919050565b60006020820190508181036000830152613a4f81613a13565b9050919050565b6000613a6182612d3a565b9150613a6c83612d3a565b9250828202613a7a81612d3a565b91508282048414831517613a9157613a906136d7565b5b5092915050565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b6000613ace601383612c93565b9150613ad982613a98565b602082019050919050565b60006020820190508181036000830152613afd81613ac1565b9050919050565b7f57686974656c69737465642075736572732073686f756c64206e6f742073656e60008201527f64204554482e0000000000000000000000000000000000000000000000000000602082015250565b6000613b60602683612c93565b9150613b6b82613b04565b604082019050919050565b60006020820190508181036000830152613b8f81613b53565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613bf87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613bbb565b613c028683613bbb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c3f613c3a613c3584612d3a565b613c1a565b612d3a565b9050919050565b6000819050919050565b613c5983613c24565b613c6d613c6582613c46565b848454613bc8565b825550505050565b600090565b613c82613c75565b613c8d818484613c50565b505050565b5b81811015613cb157613ca6600082613c7a565b600181019050613c93565b5050565b601f821115613cf657613cc781613b96565b613cd084613bab565b81016020851015613cdf578190505b613cf3613ceb85613bab565b830182613c92565b50505b505050565b600082821c905092915050565b6000613d1960001984600802613cfb565b1980831691505092915050565b6000613d328383613d08565b9150826002028217905092915050565b613d4b82612c88565b67ffffffffffffffff811115613d6457613d63612f14565b5b613d6e825461339d565b613d79828285613cb5565b600060209050601f831160018114613dac5760008415613d9a578287015190505b613da48582613d26565b865550613e0c565b601f198416613dba86613b96565b60005b82811015613de257848901518255600182019150602085019450602081019050613dbd565b86831015613dff5784890151613dfb601f891682613d08565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e70602f83612c93565b9150613e7b82613e14565b604082019050919050565b60006020820190508181036000830152613e9f81613e63565b9050919050565b600081905092915050565b60008154613ebe8161339d565b613ec88186613ea6565b94506001821660008114613ee35760018114613ef857613f2b565b60ff1983168652811515820286019350613f2b565b613f0185613b96565b60005b83811015613f2357815481890152600182019150602081019050613f04565b838801955050505b50505092915050565b6000613f3f82612c88565b613f498185613ea6565b9350613f59818560208601612ca4565b80840191505092915050565b6000613f718286613eb1565b9150613f7d8285613f34565b9150613f898284613eb1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ff2602683612c93565b9150613ffd82613f96565b604082019050919050565b6000602082019050818103600083015261402181613fe5565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614084602583612c93565b915061408f82614028565b604082019050919050565b600060208201905081810360008301526140b381614077565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614116602483612c93565b9150614121826140ba565b604082019050919050565b6000602082019050818103600083015261414581614109565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614182602083612c93565b915061418d8261414c565b602082019050919050565b600060208201905081810360008301526141b181614175565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006141ee601d83612c93565b91506141f9826141b8565b602082019050919050565b6000602082019050818103600083015261421d816141e1565b9050919050565b600081905092915050565b50565b600061423f600083614224565b915061424a8261422f565b600082019050919050565b600061426082614232565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006142c6603a83612c93565b91506142d18261426a565b604082019050919050565b600060208201905081810360008301526142f5816142b9565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614332601f83612c93565b915061433d826142fc565b602082019050919050565b6000602082019050818103600083015261436181614325565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061439e602083612c93565b91506143a982614368565b602082019050919050565b600060208201905081810360008301526143cd81614391565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061440a601c83612c93565b9150614415826143d4565b602082019050919050565b60006020820190508181036000830152614439816143fd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614476601983612c93565b915061448182614440565b602082019050919050565b600060208201905081810360008301526144a581614469565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614508603283612c93565b9150614513826144ac565b604082019050919050565b60006020820190508181036000830152614537816144fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006145c9603583612c93565b91506145d48261456d565b604082019050919050565b600060208201905081810360008301526145f8816145bc565b9050919050565b600061460a82612d3a565b915061461583612d3a565b925082820390508181111561462d5761462c6136d7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061468982614662565b614693818561466d565b93506146a3818560208601612ca4565b6146ac81612cce565b840191505092915050565b60006080820190506146cc6000830187612dcf565b6146d96020830186612dcf565b6146e66040830185612e65565b81810360608301526146f8818461467e565b905095945050505050565b60008151905061471281612bf9565b92915050565b60006020828403121561472e5761472d612bc3565b5b600061473c84828501614703565b9150509291505056fea264697066735822122006d41d4e4f3a769f7043e10980e79581f8a9d019517dd5192c3b2353edf6522e64736f6c63430008120033
Deployed Bytecode Sourcemap
81337:2937:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75329:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59378:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60890:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60408:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75969:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61590:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75637:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82446:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61962:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76159:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82229:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59088:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58819:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36708:103;;;;;;;;;;;;;:::i;:::-;;82020:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83641:152;;;;;;;;;;;;;:::i;:::-;;36067:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84131:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59547:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81694:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81655:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82579:946;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83533:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61133:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62184:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81722:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83801:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61359:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36966:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81610:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75329:224;75431:4;75470:35;75455:50;;;:11;:50;;;;:90;;;;75509:36;75533:11;75509:23;:36::i;:::-;75455:90;75448:97;;75329:224;;;:::o;59378:100::-;59432:13;59465:5;59458:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59378:100;:::o;60890:171::-;60966:7;60986:23;61001:7;60986:14;:23::i;:::-;61029:15;:24;61045:7;61029:24;;;;;;;;;;;;;;;;;;;;;61022:31;;60890:171;;;:::o;60408:416::-;60489:13;60505:23;60520:7;60505:14;:23::i;:::-;60489:39;;60553:5;60547:11;;:2;:11;;;60539:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60647:5;60631:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;60656:37;60673:5;60680:12;:10;:12::i;:::-;60656:16;:37::i;:::-;60631:62;60609:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;60795:21;60804:2;60808:7;60795:8;:21::i;:::-;60478:346;60408:416;;:::o;75969:113::-;76030:7;76057:10;:17;;;;76050:24;;75969:113;:::o;61590:301::-;61751:41;61770:12;:10;:12::i;:::-;61784:7;61751:18;:41::i;:::-;61743:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;61855:28;61865:4;61871:2;61875:7;61855:9;:28::i;:::-;61590:301;;;:::o;75637:256::-;75734:7;75770:23;75787:5;75770:16;:23::i;:::-;75762:5;:31;75754:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;75859:12;:19;75872:5;75859:19;;;;;;;;;;;;;;;:26;75879:5;75859:26;;;;;;;;;;;;75852:33;;75637:256;;;;:::o;82446:125::-;82504:4;82528:35;82558:4;82528:20;:29;;:35;;;;:::i;:::-;82521:42;;82446:125;;;:::o;61962:151::-;62066:39;62083:4;62089:2;62093:7;62066:39;;;;;;;;;;;;:16;:39::i;:::-;61962:151;;;:::o;76159:233::-;76234:7;76270:30;:28;:30::i;:::-;76262:5;:38;76254:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;76367:10;76378:5;76367:17;;;;;;;;:::i;:::-;;;;;;;;;;76360:24;;76159:233;;;:::o;82229:209::-;35953:13;:11;:13::i;:::-;82321:9:::1;82316:115;82340:9;:16;82336:1;:20;82316:115;;;82378:41;82406:9;82416:1;82406:12;;;;;;;;:::i;:::-;;;;;;;;82378:20;:27;;:41;;;;:::i;:::-;;82358:3;;;;;:::i;:::-;;;;82316:115;;;;82229:209:::0;:::o;59088:223::-;59160:7;59180:13;59196:17;59205:7;59196:8;:17::i;:::-;59180:33;;59249:1;59232:19;;:5;:19;;;59224:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;59298:5;59291:12;;;59088:223;;;:::o;58819:207::-;58891:7;58936:1;58919:19;;:5;:19;;;58911:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59002:9;:16;59012:5;59002:16;;;;;;;;;;;;;;;;58995:23;;58819:207;;;:::o;36708:103::-;35953:13;:11;:13::i;:::-;36773:30:::1;36800:1;36773:18;:30::i;:::-;36708:103::o:0;82020:201::-;35953:13;:11;:13::i;:::-;82107:9:::1;82102:112;82126:9;:16;82122:1;:20;82102:112;;;82164:38;82189:9;82199:1;82189:12;;;;;;;;:::i;:::-;;;;;;;;82164:20;:24;;:38;;;;:::i;:::-;;82144:3;;;;;:::i;:::-;;;;82102:112;;;;82020:201:::0;:::o;83641:152::-;35953:13;:11;:13::i;:::-;83694:22:::1;83727:7;:5;:7::i;:::-;83694:41;;83746:39;83763:21;83746:6;:16;;;;:39;;;;:::i;:::-;83683:110;83641:152::o:0;36067:87::-;36113:7;36140:6;;;;;;;;;;;36133:13;;36067:87;:::o;84131:140::-;35953:13;:11;:13::i;:::-;84212:1:::1;84203:6;:10;84195:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;84257:6;84249:5;:14;;;;84131:140:::0;:::o;59547:104::-;59603:13;59636:7;59629:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59547:104;:::o;81694:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81655:30::-;;;;:::o;82579:946::-;15722:21;:19;:21::i;:::-;82654:22:::1;82679:25;82693:10;82679:13;:25::i;:::-;82654:50;;82715:26;82744:13;:11;:13::i;:::-;82715:42;;82778:17;:45;;;;82820:3;82799:18;:24;82778:45;82770:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;82923:1;82910:10;:14;82902:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;81644:4;82997:10;82976:18;:31;;;;:::i;:::-;:45;;82968:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;83065:17;83060:293;;83129:9;83120:5;;83107:10;:18;;;;:::i;:::-;:31;;83099:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;83060:293;;;83198:7;:5;:7::i;:::-;83184:21;;:10;:21;;;83180:173;;83243:1;83230:9;:14;83222:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;83302:39;83330:10;83302:20;:27;;:39;;;;:::i;:::-;;83180:173;83060:293;83370:9;83365:153;83389:10;83385:1;:14;83365:153;;;83421:15;83464:1;83460;83439:18;:22;;;;:::i;:::-;:26;;;;:::i;:::-;83421:44;;83480:26;83486:10;83498:7;83480:5;:26::i;:::-;83406:112;83401:3;;;;:::i;:::-;;;83365:153;;;;82643:882;;15766:20:::0;:18;:20::i;:::-;82579:946;:::o;83533:100::-;35953:13;:11;:13::i;:::-;83617:8:::1;83607:7;:18;;;;;;:::i;:::-;;83533:100:::0;:::o;61133:155::-;61228:52;61247:12;:10;:12::i;:::-;61261:8;61271;61228:18;:52::i;:::-;61133:155;;:::o;62184:279::-;62315:41;62334:12;:10;:12::i;:::-;62348:7;62315:18;:41::i;:::-;62307:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;62417:38;62431:4;62437:2;62441:7;62450:4;62417:13;:38::i;:::-;62184:279;;;;:::o;81722:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;83801:322::-;83866:13;83900:16;83908:7;83900;:16::i;:::-;83892:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;84012:1;83994:7;83988:21;;;;;:::i;:::-;;;:25;:127;;;;;;;;;;;;;;;;;84053:7;84062:18;:7;:16;:18::i;:::-;84082:13;84036:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83988:127;83981:134;;83801:322;;;:::o;61359:164::-;61456:4;61480:18;:25;61499:5;61480:25;;;;;;;;;;;;;;;:35;61506:8;61480:35;;;;;;;;;;;;;;;;;;;;;;;;;61473:42;;61359:164;;;;:::o;36966:201::-;35953:13;:11;:13::i;:::-;37075:1:::1;37055:22;;:8;:22;;::::0;37047:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37131:28;37150:8;37131:18;:28::i;:::-;36966:201:::0;:::o;81610:38::-;81644:4;81610:38;:::o;8584:152::-;8654:4;8678:50;8683:3;:10;;8719:5;8703:23;;8695:32;;8678:4;:50::i;:::-;8671:57;;8584:152;;;;:::o;58450:305::-;58552:4;58604:25;58589:40;;;:11;:40;;;;:105;;;;58661:33;58646:48;;;:11;:48;;;;58589:105;:158;;;;58711:36;58735:11;58711:23;:36::i;:::-;58589:158;58569:178;;58450:305;;;:::o;70453:135::-;70535:16;70543:7;70535;:16::i;:::-;70527:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;70453:135;:::o;34618:98::-;34671:7;34698:10;34691:17;;34618:98;:::o;69766:174::-;69868:2;69841:15;:24;69857:7;69841:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;69924:7;69920:2;69886:46;;69895:23;69910:7;69895:14;:23::i;:::-;69886:46;;;;;;;;;;;;69766:174;;:::o;64453:264::-;64546:4;64563:13;64579:23;64594:7;64579:14;:23::i;:::-;64563:39;;64632:5;64621:16;;:7;:16;;;:52;;;;64641:32;64658:5;64665:7;64641:16;:32::i;:::-;64621:52;:87;;;;64701:7;64677:31;;:20;64689:7;64677:11;:20::i;:::-;:31;;;64621:87;64613:96;;;64453:264;;;;:::o;68418:1229::-;68543:4;68516:31;;:23;68531:7;68516:14;:23::i;:::-;:31;;;68508:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68622:1;68608:16;;:2;:16;;;68600:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;68678:42;68699:4;68705:2;68709:7;68718:1;68678:20;:42::i;:::-;68850:4;68823:31;;:23;68838:7;68823:14;:23::i;:::-;:31;;;68815:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68968:15;:24;68984:7;68968:24;;;;;;;;;;;;68961:31;;;;;;;;;;;69463:1;69444:9;:15;69454:4;69444:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;69496:1;69479:9;:13;69489:2;69479:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;69538:2;69519:7;:16;69527:7;69519:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;69577:7;69573:2;69558:27;;69567:4;69558:27;;;;;;;;;;;;69598:41;69618:4;69624:2;69628:7;69637:1;69598:19;:41::i;:::-;68418:1229;;;:::o;9156:167::-;9236:4;9260:55;9270:3;:10;;9306:5;9290:23;;9282:32;;9260:9;:55::i;:::-;9253:62;;9156:167;;;;:::o;36232:132::-;36307:12;:10;:12::i;:::-;36296:23;;:7;:5;:7::i;:::-;:23;;;36288:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36232:132::o;8912:158::-;8985:4;9009:53;9017:3;:10;;9053:5;9037:23;;9029:32;;9009:7;:53::i;:::-;9002:60;;8912:158;;;;:::o;63728:117::-;63794:7;63821;:16;63829:7;63821:16;;;;;;;;;;;;;;;;;;;;;63814:23;;63728:117;;;:::o;37327:191::-;37401:16;37420:6;;;;;;;;;;;37401:25;;37446:8;37437:6;;:17;;;;;;;;;;;;;;;;;;37501:8;37470:40;;37491:8;37470:40;;;;;;;;;;;;37390:128;37327:191;:::o;40258:317::-;40373:6;40348:21;:31;;40340:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40427:12;40445:9;:14;;40467:6;40445:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40426:52;;;40497:7;40489:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;40329:246;40258:317;;:::o;15802:293::-;15204:1;15936:7;;:19;15928:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;15204:1;16069:7;:18;;;;15802:293::o;66017:942::-;66111:1;66097:16;;:2;:16;;;66089:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;66170:16;66178:7;66170;:16::i;:::-;66169:17;66161:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66232:48;66261:1;66265:2;66269:7;66278:1;66232:20;:48::i;:::-;66379:16;66387:7;66379;:16::i;:::-;66378:17;66370:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66794:1;66777:9;:13;66787:2;66777:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;66838:2;66819:7;:16;66827:7;66819:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;66883:7;66879:2;66858:33;;66875:1;66858:33;;;;;;;;;;;;66904:47;66932:1;66936:2;66940:7;66949:1;66904:19;:47::i;:::-;66017:942;;:::o;16103:213::-;15160:1;16286:7;:22;;;;16103:213::o;70083:281::-;70204:8;70195:17;;:5;:17;;;70187:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;70291:8;70253:18;:25;70272:5;70253:25;;;;;;;;;;;;;;;:35;70279:8;70253:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;70337:8;70315:41;;70330:5;70315:41;;;70347:8;70315:41;;;;;;:::i;:::-;;;;;;;;70083:281;;;:::o;63344:270::-;63457:28;63467:4;63473:2;63477:7;63457:9;:28::i;:::-;63504:47;63527:4;63533:2;63537:7;63546:4;63504:22;:47::i;:::-;63496:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;63344:270;;;;:::o;64158:128::-;64223:4;64276:1;64247:31;;:17;64256:7;64247:8;:17::i;:::-;:31;;;;64240:38;;64158:128;;;:::o;31537:716::-;31593:13;31644:14;31681:1;31661:17;31672:5;31661:10;:17::i;:::-;:21;31644:38;;31697:20;31731:6;31720:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31697:41;;31753:11;31882:6;31878:2;31874:15;31866:6;31862:28;31855:35;;31919:288;31926:4;31919:288;;;31951:5;;;;;;;;32093:8;32088:2;32081:5;32077:14;32072:30;32067:3;32059:44;32149:2;32140:11;;;;;;:::i;:::-;;;;;32183:1;32174:5;:10;31919:288;32170:21;31919:288;32228:6;32221:13;;;;;31537:716;;;:::o;2315:414::-;2378:4;2400:21;2410:3;2415:5;2400:9;:21::i;:::-;2395:327;;2438:3;:11;;2455:5;2438:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2621:3;:11;;:18;;;;2599:3;:12;;:19;2612:5;2599:19;;;;;;;;;;;:40;;;;2661:4;2654:11;;;;2395:327;2705:5;2698:12;;2315:414;;;;;:::o;49994:157::-;50079:4;50118:25;50103:40;;;:11;:40;;;;50096:47;;49994:157;;;:::o;76466:915::-;76643:61;76670:4;76676:2;76680:12;76694:9;76643:26;:61::i;:::-;76733:1;76721:9;:13;76717:222;;;76864:63;;;;;;;;;;:::i;:::-;;;;;;;;76717:222;76951:15;76969:12;76951:30;;77014:1;76998:18;;:4;:18;;;76994:187;;77033:40;77065:7;77033:31;:40::i;:::-;76994:187;;;77103:2;77095:10;;:4;:10;;;77091:90;;77122:47;77155:4;77161:7;77122:32;:47::i;:::-;77091:90;76994:187;77209:1;77195:16;;:2;:16;;;77191:183;;77228:45;77265:7;77228:36;:45::i;:::-;77191:183;;;77301:4;77295:10;;:2;:10;;;77291:83;;77322:40;77350:2;77354:7;77322:27;:40::i;:::-;77291:83;77191:183;76632:749;76466:915;;;;:::o;73575:115::-;;;;;:::o;4411:129::-;4484:4;4531:1;4508:3;:12;;:19;4521:5;4508:19;;;;;;;;;;;;:24;;4501:31;;4411:129;;;;:::o;2905:1420::-;2971:4;3089:18;3110:3;:12;;:19;3123:5;3110:19;;;;;;;;;;;;3089:40;;3160:1;3146:10;:15;3142:1176;;3521:21;3558:1;3545:10;:14;;;;:::i;:::-;3521:38;;3574:17;3615:1;3594:3;:11;;:18;;;;:22;;;;:::i;:::-;3574:42;;3650:13;3637:9;:26;3633:405;;3684:17;3704:3;:11;;3716:9;3704:22;;;;;;;;:::i;:::-;;;;;;;;;;3684:42;;3858:9;3829:3;:11;;3841:13;3829:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3969:10;3943:3;:12;;:23;3956:9;3943:23;;;;;;;;;;;:36;;;;3665:373;3633:405;4119:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4214:3;:12;;:19;4227:5;4214:19;;;;;;;;;;;4207:26;;;4257:4;4250:11;;;;;;;3142:1176;4301:5;4294:12;;;2905:1420;;;;;:::o;71152:853::-;71306:4;71327:15;:2;:13;;;:15::i;:::-;71323:675;;;71379:2;71363:36;;;71400:12;:10;:12::i;:::-;71414:4;71420:7;71429:4;71363:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;71359:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71621:1;71604:6;:13;:18;71600:328;;71647:60;;;;;;;;;;:::i;:::-;;;;;;;;71600:328;71878:6;71872:13;71863:6;71859:2;71855:15;71848:38;71359:584;71495:41;;;71485:51;;;:6;:51;;;;71478:58;;;;;71323:675;71982:4;71975:11;;71152:853;;;;;;;:::o;28371:948::-;28424:7;28444:14;28461:1;28444:18;;28511:8;28502:5;:17;28498:106;;28549:8;28540:17;;;;;;:::i;:::-;;;;;28586:2;28576:12;;;;28498:106;28631:8;28622:5;:17;28618:106;;28669:8;28660:17;;;;;;:::i;:::-;;;;;28706:2;28696:12;;;;28618:106;28751:8;28742:5;:17;28738:106;;28789:8;28780:17;;;;;;:::i;:::-;;;;;28826:2;28816:12;;;;28738:106;28871:7;28862:5;:16;28858:103;;28908:7;28899:16;;;;;;:::i;:::-;;;;;28944:1;28934:11;;;;28858:103;28988:7;28979:5;:16;28975:103;;29025:7;29016:16;;;;;;:::i;:::-;;;;;29061:1;29051:11;;;;28975:103;29105:7;29096:5;:16;29092:103;;29142:7;29133:16;;;;;;:::i;:::-;;;;;29178:1;29168:11;;;;29092:103;29222:7;29213:5;:16;29209:68;;29260:1;29250:11;;;;29209:68;29305:6;29298:13;;;28371:948;;;:::o;72737:116::-;;;;;:::o;78104:164::-;78208:10;:17;;;;78181:15;:24;78197:7;78181:24;;;;;;;;;;;:44;;;;78236:10;78252:7;78236:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78104:164;:::o;78895:988::-;79161:22;79211:1;79186:22;79203:4;79186:16;:22::i;:::-;:26;;;;:::i;:::-;79161:51;;79223:18;79244:17;:26;79262:7;79244:26;;;;;;;;;;;;79223:47;;79391:14;79377:10;:28;79373:328;;79422:19;79444:12;:18;79457:4;79444:18;;;;;;;;;;;;;;;:34;79463:14;79444:34;;;;;;;;;;;;79422:56;;79528:11;79495:12;:18;79508:4;79495:18;;;;;;;;;;;;;;;:30;79514:10;79495:30;;;;;;;;;;;:44;;;;79645:10;79612:17;:30;79630:11;79612:30;;;;;;;;;;;:43;;;;79407:294;79373:328;79797:17;:26;79815:7;79797:26;;;;;;;;;;;79790:33;;;79841:12;:18;79854:4;79841:18;;;;;;;;;;;;;;;:34;79860:14;79841:34;;;;;;;;;;;79834:41;;;78976:907;;78895:988;;:::o;80178:1079::-;80431:22;80476:1;80456:10;:17;;;;:21;;;;:::i;:::-;80431:46;;80488:18;80509:15;:24;80525:7;80509:24;;;;;;;;;;;;80488:45;;80860:19;80882:10;80893:14;80882:26;;;;;;;;:::i;:::-;;;;;;;;;;80860:48;;80946:11;80921:10;80932;80921:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;81057:10;81026:15;:28;81042:11;81026:28;;;;;;;;;;;:41;;;;81198:15;:24;81214:7;81198:24;;;;;;;;;;;81191:31;;;81233:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;80249:1008;;;80178:1079;:::o;77682:221::-;77767:14;77784:20;77801:2;77784:16;:20::i;:::-;77767:37;;77842:7;77815:12;:16;77828:2;77815:16;;;;;;;;;;;;;;;:24;77832:6;77815:24;;;;;;;;;;;:34;;;;77889:6;77860:17;:26;77878:7;77860:26;;;;;;;;;;;:35;;;;77756:147;77682:221;;:::o;38999:326::-;39059:4;39316:1;39294:7;:19;;;:23;39287:30;;38999:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:180;6373:77;6370:1;6363:88;6470:4;6467:1;6460:15;6494:4;6491:1;6484:15;6511:281;6594:27;6616:4;6594:27;:::i;:::-;6586:6;6582:40;6724:6;6712:10;6709:22;6688:18;6676:10;6673:34;6670:62;6667:88;;;6735:18;;:::i;:::-;6667:88;6775:10;6771:2;6764:22;6554:238;6511:281;;:::o;6798:129::-;6832:6;6859:20;;:::i;:::-;6849:30;;6888:33;6916:4;6908:6;6888:33;:::i;:::-;6798:129;;;:::o;6933:311::-;7010:4;7100:18;7092:6;7089:30;7086:56;;;7122:18;;:::i;:::-;7086:56;7172:4;7164:6;7160:17;7152:25;;7232:4;7226;7222:15;7214:23;;6933:311;;;:::o;7250:117::-;7359:1;7356;7349:12;7390:710;7486:5;7511:81;7527:64;7584:6;7527:64;:::i;:::-;7511:81;:::i;:::-;7502:90;;7612:5;7641:6;7634:5;7627:21;7675:4;7668:5;7664:16;7657:23;;7728:4;7720:6;7716:17;7708:6;7704:30;7757:3;7749:6;7746:15;7743:122;;;7776:79;;:::i;:::-;7743:122;7891:6;7874:220;7908:6;7903:3;7900:15;7874:220;;;7983:3;8012:37;8045:3;8033:10;8012:37;:::i;:::-;8007:3;8000:50;8079:4;8074:3;8070:14;8063:21;;7950:144;7934:4;7929:3;7925:14;7918:21;;7874:220;;;7878:21;7492:608;;7390:710;;;;;:::o;8123:370::-;8194:5;8243:3;8236:4;8228:6;8224:17;8220:27;8210:122;;8251:79;;:::i;:::-;8210:122;8368:6;8355:20;8393:94;8483:3;8475:6;8468:4;8460:6;8456:17;8393:94;:::i;:::-;8384:103;;8200:293;8123:370;;;;:::o;8499:539::-;8583:6;8632:2;8620:9;8611:7;8607:23;8603:32;8600:119;;;8638:79;;:::i;:::-;8600:119;8786:1;8775:9;8771:17;8758:31;8816:18;8808:6;8805:30;8802:117;;;8838:79;;:::i;:::-;8802:117;8943:78;9013:7;9004:6;8993:9;8989:22;8943:78;:::i;:::-;8933:88;;8729:302;8499:539;;;;:::o;9044:117::-;9153:1;9150;9143:12;9167:308;9229:4;9319:18;9311:6;9308:30;9305:56;;;9341:18;;:::i;:::-;9305:56;9379:29;9401:6;9379:29;:::i;:::-;9371:37;;9463:4;9457;9453:15;9445:23;;9167:308;;;:::o;9481:146::-;9578:6;9573:3;9568;9555:30;9619:1;9610:6;9605:3;9601:16;9594:27;9481:146;;;:::o;9633:425::-;9711:5;9736:66;9752:49;9794:6;9752:49;:::i;:::-;9736:66;:::i;:::-;9727:75;;9825:6;9818:5;9811:21;9863:4;9856:5;9852:16;9901:3;9892:6;9887:3;9883:16;9880:25;9877:112;;;9908:79;;:::i;:::-;9877:112;9998:54;10045:6;10040:3;10035;9998:54;:::i;:::-;9717:341;9633:425;;;;;:::o;10078:340::-;10134:5;10183:3;10176:4;10168:6;10164:17;10160:27;10150:122;;10191:79;;:::i;:::-;10150:122;10308:6;10295:20;10333:79;10408:3;10400:6;10393:4;10385:6;10381:17;10333:79;:::i;:::-;10324:88;;10140:278;10078:340;;;;:::o;10424:509::-;10493:6;10542:2;10530:9;10521:7;10517:23;10513:32;10510:119;;;10548:79;;:::i;:::-;10510:119;10696:1;10685:9;10681:17;10668:31;10726:18;10718:6;10715:30;10712:117;;;10748:79;;:::i;:::-;10712:117;10853:63;10908:7;10899:6;10888:9;10884:22;10853:63;:::i;:::-;10843:73;;10639:287;10424:509;;;;:::o;10939:116::-;11009:21;11024:5;11009:21;:::i;:::-;11002:5;10999:32;10989:60;;11045:1;11042;11035:12;10989:60;10939:116;:::o;11061:133::-;11104:5;11142:6;11129:20;11120:29;;11158:30;11182:5;11158:30;:::i;:::-;11061:133;;;;:::o;11200:468::-;11265:6;11273;11322:2;11310:9;11301:7;11297:23;11293:32;11290:119;;;11328:79;;:::i;:::-;11290:119;11448:1;11473:53;11518:7;11509:6;11498:9;11494:22;11473:53;:::i;:::-;11463:63;;11419:117;11575:2;11601:50;11643:7;11634:6;11623:9;11619:22;11601:50;:::i;:::-;11591:60;;11546:115;11200:468;;;;;:::o;11674:307::-;11735:4;11825:18;11817:6;11814:30;11811:56;;;11847:18;;:::i;:::-;11811:56;11885:29;11907:6;11885:29;:::i;:::-;11877:37;;11969:4;11963;11959:15;11951:23;;11674:307;;;:::o;11987:423::-;12064:5;12089:65;12105:48;12146:6;12105:48;:::i;:::-;12089:65;:::i;:::-;12080:74;;12177:6;12170:5;12163:21;12215:4;12208:5;12204:16;12253:3;12244:6;12239:3;12235:16;12232:25;12229:112;;;12260:79;;:::i;:::-;12229:112;12350:54;12397:6;12392:3;12387;12350:54;:::i;:::-;12070:340;11987:423;;;;;:::o;12429:338::-;12484:5;12533:3;12526:4;12518:6;12514:17;12510:27;12500:122;;12541:79;;:::i;:::-;12500:122;12658:6;12645:20;12683:78;12757:3;12749:6;12742:4;12734:6;12730:17;12683:78;:::i;:::-;12674:87;;12490:277;12429:338;;;;:::o;12773:943::-;12868:6;12876;12884;12892;12941:3;12929:9;12920:7;12916:23;12912:33;12909:120;;;12948:79;;:::i;:::-;12909:120;13068:1;13093:53;13138:7;13129:6;13118:9;13114:22;13093:53;:::i;:::-;13083:63;;13039:117;13195:2;13221:53;13266:7;13257:6;13246:9;13242:22;13221:53;:::i;:::-;13211:63;;13166:118;13323:2;13349:53;13394:7;13385:6;13374:9;13370:22;13349:53;:::i;:::-;13339:63;;13294:118;13479:2;13468:9;13464:18;13451:32;13510:18;13502:6;13499:30;13496:117;;;13532:79;;:::i;:::-;13496:117;13637:62;13691:7;13682:6;13671:9;13667:22;13637:62;:::i;:::-;13627:72;;13422:287;12773:943;;;;;;;:::o;13722:474::-;13790:6;13798;13847:2;13835:9;13826:7;13822:23;13818:32;13815:119;;;13853:79;;:::i;:::-;13815:119;13973:1;13998:53;14043:7;14034:6;14023:9;14019:22;13998:53;:::i;:::-;13988:63;;13944:117;14100:2;14126:53;14171:7;14162:6;14151:9;14147:22;14126:53;:::i;:::-;14116:63;;14071:118;13722:474;;;;;:::o;14202:180::-;14250:77;14247:1;14240:88;14347:4;14344:1;14337:15;14371:4;14368:1;14361:15;14388:320;14432:6;14469:1;14463:4;14459:12;14449:22;;14516:1;14510:4;14506:12;14537:18;14527:81;;14593:4;14585:6;14581:17;14571:27;;14527:81;14655:2;14647:6;14644:14;14624:18;14621:38;14618:84;;14674:18;;:::i;:::-;14618:84;14439:269;14388:320;;;:::o;14714:220::-;14854:34;14850:1;14842:6;14838:14;14831:58;14923:3;14918:2;14910:6;14906:15;14899:28;14714:220;:::o;14940:366::-;15082:3;15103:67;15167:2;15162:3;15103:67;:::i;:::-;15096:74;;15179:93;15268:3;15179:93;:::i;:::-;15297:2;15292:3;15288:12;15281:19;;14940:366;;;:::o;15312:419::-;15478:4;15516:2;15505:9;15501:18;15493:26;;15565:9;15559:4;15555:20;15551:1;15540:9;15536:17;15529:47;15593:131;15719:4;15593:131;:::i;:::-;15585:139;;15312:419;;;:::o;15737:248::-;15877:34;15873:1;15865:6;15861:14;15854:58;15946:31;15941:2;15933:6;15929:15;15922:56;15737:248;:::o;15991:366::-;16133:3;16154:67;16218:2;16213:3;16154:67;:::i;:::-;16147:74;;16230:93;16319:3;16230:93;:::i;:::-;16348:2;16343:3;16339:12;16332:19;;15991:366;;;:::o;16363:419::-;16529:4;16567:2;16556:9;16552:18;16544:26;;16616:9;16610:4;16606:20;16602:1;16591:9;16587:17;16580:47;16644:131;16770:4;16644:131;:::i;:::-;16636:139;;16363:419;;;:::o;16788:232::-;16928:34;16924:1;16916:6;16912:14;16905:58;16997:15;16992:2;16984:6;16980:15;16973:40;16788:232;:::o;17026:366::-;17168:3;17189:67;17253:2;17248:3;17189:67;:::i;:::-;17182:74;;17265:93;17354:3;17265:93;:::i;:::-;17383:2;17378:3;17374:12;17367:19;;17026:366;;;:::o;17398:419::-;17564:4;17602:2;17591:9;17587:18;17579:26;;17651:9;17645:4;17641:20;17637:1;17626:9;17622:17;17615:47;17679:131;17805:4;17679:131;:::i;:::-;17671:139;;17398:419;;;:::o;17823:230::-;17963:34;17959:1;17951:6;17947:14;17940:58;18032:13;18027:2;18019:6;18015:15;18008:38;17823:230;:::o;18059:366::-;18201:3;18222:67;18286:2;18281:3;18222:67;:::i;:::-;18215:74;;18298:93;18387:3;18298:93;:::i;:::-;18416:2;18411:3;18407:12;18400:19;;18059:366;;;:::o;18431:419::-;18597:4;18635:2;18624:9;18620:18;18612:26;;18684:9;18678:4;18674:20;18670:1;18659:9;18655:17;18648:47;18712:131;18838:4;18712:131;:::i;:::-;18704:139;;18431:419;;;:::o;18856:231::-;18996:34;18992:1;18984:6;18980:14;18973:58;19065:14;19060:2;19052:6;19048:15;19041:39;18856:231;:::o;19093:366::-;19235:3;19256:67;19320:2;19315:3;19256:67;:::i;:::-;19249:74;;19332:93;19421:3;19332:93;:::i;:::-;19450:2;19445:3;19441:12;19434:19;;19093:366;;;:::o;19465:419::-;19631:4;19669:2;19658:9;19654:18;19646:26;;19718:9;19712:4;19708:20;19704:1;19693:9;19689:17;19682:47;19746:131;19872:4;19746:131;:::i;:::-;19738:139;;19465:419;;;:::o;19890:180::-;19938:77;19935:1;19928:88;20035:4;20032:1;20025:15;20059:4;20056:1;20049:15;20076:180;20124:77;20121:1;20114:88;20221:4;20218:1;20211:15;20245:4;20242:1;20235:15;20262:233;20301:3;20324:24;20342:5;20324:24;:::i;:::-;20315:33;;20370:66;20363:5;20360:77;20357:103;;20440:18;;:::i;:::-;20357:103;20487:1;20480:5;20476:13;20469:20;;20262:233;;;:::o;20501:174::-;20641:26;20637:1;20629:6;20625:14;20618:50;20501:174;:::o;20681:366::-;20823:3;20844:67;20908:2;20903:3;20844:67;:::i;:::-;20837:74;;20920:93;21009:3;20920:93;:::i;:::-;21038:2;21033:3;21029:12;21022:19;;20681:366;;;:::o;21053:419::-;21219:4;21257:2;21246:9;21242:18;21234:26;;21306:9;21300:4;21296:20;21292:1;21281:9;21277:17;21270:47;21334:131;21460:4;21334:131;:::i;:::-;21326:139;;21053:419;;;:::o;21478:228::-;21618:34;21614:1;21606:6;21602:14;21595:58;21687:11;21682:2;21674:6;21670:15;21663:36;21478:228;:::o;21712:366::-;21854:3;21875:67;21939:2;21934:3;21875:67;:::i;:::-;21868:74;;21951:93;22040:3;21951:93;:::i;:::-;22069:2;22064:3;22060:12;22053:19;;21712:366;;;:::o;22084:419::-;22250:4;22288:2;22277:9;22273:18;22265:26;;22337:9;22331:4;22327:20;22323:1;22312:9;22308:17;22301:47;22365:131;22491:4;22365:131;:::i;:::-;22357:139;;22084:419;;;:::o;22509:170::-;22649:22;22645:1;22637:6;22633:14;22626:46;22509:170;:::o;22685:366::-;22827:3;22848:67;22912:2;22907:3;22848:67;:::i;:::-;22841:74;;22924:93;23013:3;22924:93;:::i;:::-;23042:2;23037:3;23033:12;23026:19;;22685:366;;;:::o;23057:419::-;23223:4;23261:2;23250:9;23246:18;23238:26;;23310:9;23304:4;23300:20;23296:1;23285:9;23281:17;23274:47;23338:131;23464:4;23338:131;:::i;:::-;23330:139;;23057:419;;;:::o;23482:250::-;23622:34;23618:1;23610:6;23606:14;23599:58;23691:33;23686:2;23678:6;23674:15;23667:58;23482:250;:::o;23738:366::-;23880:3;23901:67;23965:2;23960:3;23901:67;:::i;:::-;23894:74;;23977:93;24066:3;23977:93;:::i;:::-;24095:2;24090:3;24086:12;24079:19;;23738:366;;;:::o;24110:419::-;24276:4;24314:2;24303:9;24299:18;24291:26;;24363:9;24357:4;24353:20;24349:1;24338:9;24334:17;24327:47;24391:131;24517:4;24391:131;:::i;:::-;24383:139;;24110:419;;;:::o;24535:178::-;24675:30;24671:1;24663:6;24659:14;24652:54;24535:178;:::o;24719:366::-;24861:3;24882:67;24946:2;24941:3;24882:67;:::i;:::-;24875:74;;24958:93;25047:3;24958:93;:::i;:::-;25076:2;25071:3;25067:12;25060:19;;24719:366;;;:::o;25091:419::-;25257:4;25295:2;25284:9;25280:18;25272:26;;25344:9;25338:4;25334:20;25330:1;25319:9;25315:17;25308:47;25372:131;25498:4;25372:131;:::i;:::-;25364:139;;25091:419;;;:::o;25516:191::-;25556:3;25575:20;25593:1;25575:20;:::i;:::-;25570:25;;25609:20;25627:1;25609:20;:::i;:::-;25604:25;;25652:1;25649;25645:9;25638:16;;25673:3;25670:1;25667:10;25664:36;;;25680:18;;:::i;:::-;25664:36;25516:191;;;;:::o;25713:171::-;25853:23;25849:1;25841:6;25837:14;25830:47;25713:171;:::o;25890:366::-;26032:3;26053:67;26117:2;26112:3;26053:67;:::i;:::-;26046:74;;26129:93;26218:3;26129:93;:::i;:::-;26247:2;26242:3;26238:12;26231:19;;25890:366;;;:::o;26262:419::-;26428:4;26466:2;26455:9;26451:18;26443:26;;26515:9;26509:4;26505:20;26501:1;26490:9;26486:17;26479:47;26543:131;26669:4;26543:131;:::i;:::-;26535:139;;26262:419;;;:::o;26687:410::-;26727:7;26750:20;26768:1;26750:20;:::i;:::-;26745:25;;26784:20;26802:1;26784:20;:::i;:::-;26779:25;;26839:1;26836;26832:9;26861:30;26879:11;26861:30;:::i;:::-;26850:41;;27040:1;27031:7;27027:15;27024:1;27021:22;27001:1;26994:9;26974:83;26951:139;;27070:18;;:::i;:::-;26951:139;26735:362;26687:410;;;;:::o;27103:169::-;27243:21;27239:1;27231:6;27227:14;27220:45;27103:169;:::o;27278:366::-;27420:3;27441:67;27505:2;27500:3;27441:67;:::i;:::-;27434:74;;27517:93;27606:3;27517:93;:::i;:::-;27635:2;27630:3;27626:12;27619:19;;27278:366;;;:::o;27650:419::-;27816:4;27854:2;27843:9;27839:18;27831:26;;27903:9;27897:4;27893:20;27889:1;27878:9;27874:17;27867:47;27931:131;28057:4;27931:131;:::i;:::-;27923:139;;27650:419;;;:::o;28075:225::-;28215:34;28211:1;28203:6;28199:14;28192:58;28284:8;28279:2;28271:6;28267:15;28260:33;28075:225;:::o;28306:366::-;28448:3;28469:67;28533:2;28528:3;28469:67;:::i;:::-;28462:74;;28545:93;28634:3;28545:93;:::i;:::-;28663:2;28658:3;28654:12;28647:19;;28306:366;;;:::o;28678:419::-;28844:4;28882:2;28871:9;28867:18;28859:26;;28931:9;28925:4;28921:20;28917:1;28906:9;28902:17;28895:47;28959:131;29085:4;28959:131;:::i;:::-;28951:139;;28678:419;;;:::o;29103:141::-;29152:4;29175:3;29167:11;;29198:3;29195:1;29188:14;29232:4;29229:1;29219:18;29211:26;;29103:141;;;:::o;29250:93::-;29287:6;29334:2;29329;29322:5;29318:14;29314:23;29304:33;;29250:93;;;:::o;29349:107::-;29393:8;29443:5;29437:4;29433:16;29412:37;;29349:107;;;;:::o;29462:393::-;29531:6;29581:1;29569:10;29565:18;29604:97;29634:66;29623:9;29604:97;:::i;:::-;29722:39;29752:8;29741:9;29722:39;:::i;:::-;29710:51;;29794:4;29790:9;29783:5;29779:21;29770:30;;29843:4;29833:8;29829:19;29822:5;29819:30;29809:40;;29538:317;;29462:393;;;;;:::o;29861:60::-;29889:3;29910:5;29903:12;;29861:60;;;:::o;29927:142::-;29977:9;30010:53;30028:34;30037:24;30055:5;30037:24;:::i;:::-;30028:34;:::i;:::-;30010:53;:::i;:::-;29997:66;;29927:142;;;:::o;30075:75::-;30118:3;30139:5;30132:12;;30075:75;;;:::o;30156:269::-;30266:39;30297:7;30266:39;:::i;:::-;30327:91;30376:41;30400:16;30376:41;:::i;:::-;30368:6;30361:4;30355:11;30327:91;:::i;:::-;30321:4;30314:105;30232:193;30156:269;;;:::o;30431:73::-;30476:3;30431:73;:::o;30510:189::-;30587:32;;:::i;:::-;30628:65;30686:6;30678;30672:4;30628:65;:::i;:::-;30563:136;30510:189;;:::o;30705:186::-;30765:120;30782:3;30775:5;30772:14;30765:120;;;30836:39;30873:1;30866:5;30836:39;:::i;:::-;30809:1;30802:5;30798:13;30789:22;;30765:120;;;30705:186;;:::o;30897:543::-;30998:2;30993:3;30990:11;30987:446;;;31032:38;31064:5;31032:38;:::i;:::-;31116:29;31134:10;31116:29;:::i;:::-;31106:8;31102:44;31299:2;31287:10;31284:18;31281:49;;;31320:8;31305:23;;31281:49;31343:80;31399:22;31417:3;31399:22;:::i;:::-;31389:8;31385:37;31372:11;31343:80;:::i;:::-;31002:431;;30987:446;30897:543;;;:::o;31446:117::-;31500:8;31550:5;31544:4;31540:16;31519:37;;31446:117;;;;:::o;31569:169::-;31613:6;31646:51;31694:1;31690:6;31682:5;31679:1;31675:13;31646:51;:::i;:::-;31642:56;31727:4;31721;31717:15;31707:25;;31620:118;31569:169;;;;:::o;31743:295::-;31819:4;31965:29;31990:3;31984:4;31965:29;:::i;:::-;31957:37;;32027:3;32024:1;32020:11;32014:4;32011:21;32003:29;;31743:295;;;;:::o;32043:1395::-;32160:37;32193:3;32160:37;:::i;:::-;32262:18;32254:6;32251:30;32248:56;;;32284:18;;:::i;:::-;32248:56;32328:38;32360:4;32354:11;32328:38;:::i;:::-;32413:67;32473:6;32465;32459:4;32413:67;:::i;:::-;32507:1;32531:4;32518:17;;32563:2;32555:6;32552:14;32580:1;32575:618;;;;33237:1;33254:6;33251:77;;;33303:9;33298:3;33294:19;33288:26;33279:35;;33251:77;33354:67;33414:6;33407:5;33354:67;:::i;:::-;33348:4;33341:81;33210:222;32545:887;;32575:618;32627:4;32623:9;32615:6;32611:22;32661:37;32693:4;32661:37;:::i;:::-;32720:1;32734:208;32748:7;32745:1;32742:14;32734:208;;;32827:9;32822:3;32818:19;32812:26;32804:6;32797:42;32878:1;32870:6;32866:14;32856:24;;32925:2;32914:9;32910:18;32897:31;;32771:4;32768:1;32764:12;32759:17;;32734:208;;;32970:6;32961:7;32958:19;32955:179;;;33028:9;33023:3;33019:19;33013:26;33071:48;33113:4;33105:6;33101:17;33090:9;33071:48;:::i;:::-;33063:6;33056:64;32978:156;32955:179;33180:1;33176;33168:6;33164:14;33160:22;33154:4;33147:36;32582:611;;;32545:887;;32135:1303;;;32043:1395;;:::o;33444:234::-;33584:34;33580:1;33572:6;33568:14;33561:58;33653:17;33648:2;33640:6;33636:15;33629:42;33444:234;:::o;33684:366::-;33826:3;33847:67;33911:2;33906:3;33847:67;:::i;:::-;33840:74;;33923:93;34012:3;33923:93;:::i;:::-;34041:2;34036:3;34032:12;34025:19;;33684:366;;;:::o;34056:419::-;34222:4;34260:2;34249:9;34245:18;34237:26;;34309:9;34303:4;34299:20;34295:1;34284:9;34280:17;34273:47;34337:131;34463:4;34337:131;:::i;:::-;34329:139;;34056:419;;;:::o;34481:148::-;34583:11;34620:3;34605:18;;34481:148;;;;:::o;34659:874::-;34762:3;34799:5;34793:12;34828:36;34854:9;34828:36;:::i;:::-;34880:89;34962:6;34957:3;34880:89;:::i;:::-;34873:96;;35000:1;34989:9;34985:17;35016:1;35011:166;;;;35191:1;35186:341;;;;34978:549;;35011:166;35095:4;35091:9;35080;35076:25;35071:3;35064:38;35157:6;35150:14;35143:22;35135:6;35131:35;35126:3;35122:45;35115:52;;35011:166;;35186:341;35253:38;35285:5;35253:38;:::i;:::-;35313:1;35327:154;35341:6;35338:1;35335:13;35327:154;;;35415:7;35409:14;35405:1;35400:3;35396:11;35389:35;35465:1;35456:7;35452:15;35441:26;;35363:4;35360:1;35356:12;35351:17;;35327:154;;;35510:6;35505:3;35501:16;35494:23;;35193:334;;34978:549;;34766:767;;34659:874;;;;:::o;35539:390::-;35645:3;35673:39;35706:5;35673:39;:::i;:::-;35728:89;35810:6;35805:3;35728:89;:::i;:::-;35721:96;;35826:65;35884:6;35879:3;35872:4;35865:5;35861:16;35826:65;:::i;:::-;35916:6;35911:3;35907:16;35900:23;;35649:280;35539:390;;;;:::o;35935:583::-;36157:3;36179:92;36267:3;36258:6;36179:92;:::i;:::-;36172:99;;36288:95;36379:3;36370:6;36288:95;:::i;:::-;36281:102;;36400:92;36488:3;36479:6;36400:92;:::i;:::-;36393:99;;36509:3;36502:10;;35935:583;;;;;;:::o;36524:225::-;36664:34;36660:1;36652:6;36648:14;36641:58;36733:8;36728:2;36720:6;36716:15;36709:33;36524:225;:::o;36755:366::-;36897:3;36918:67;36982:2;36977:3;36918:67;:::i;:::-;36911:74;;36994:93;37083:3;36994:93;:::i;:::-;37112:2;37107:3;37103:12;37096:19;;36755:366;;;:::o;37127:419::-;37293:4;37331:2;37320:9;37316:18;37308:26;;37380:9;37374:4;37370:20;37366:1;37355:9;37351:17;37344:47;37408:131;37534:4;37408:131;:::i;:::-;37400:139;;37127:419;;;:::o;37552:224::-;37692:34;37688:1;37680:6;37676:14;37669:58;37761:7;37756:2;37748:6;37744:15;37737:32;37552:224;:::o;37782:366::-;37924:3;37945:67;38009:2;38004:3;37945:67;:::i;:::-;37938:74;;38021:93;38110:3;38021:93;:::i;:::-;38139:2;38134:3;38130:12;38123:19;;37782:366;;;:::o;38154:419::-;38320:4;38358:2;38347:9;38343:18;38335:26;;38407:9;38401:4;38397:20;38393:1;38382:9;38378:17;38371:47;38435:131;38561:4;38435:131;:::i;:::-;38427:139;;38154:419;;;:::o;38579:223::-;38719:34;38715:1;38707:6;38703:14;38696:58;38788:6;38783:2;38775:6;38771:15;38764:31;38579:223;:::o;38808:366::-;38950:3;38971:67;39035:2;39030:3;38971:67;:::i;:::-;38964:74;;39047:93;39136:3;39047:93;:::i;:::-;39165:2;39160:3;39156:12;39149:19;;38808:366;;;:::o;39180:419::-;39346:4;39384:2;39373:9;39369:18;39361:26;;39433:9;39427:4;39423:20;39419:1;39408:9;39404:17;39397:47;39461:131;39587:4;39461:131;:::i;:::-;39453:139;;39180:419;;;:::o;39605:182::-;39745:34;39741:1;39733:6;39729:14;39722:58;39605:182;:::o;39793:366::-;39935:3;39956:67;40020:2;40015:3;39956:67;:::i;:::-;39949:74;;40032:93;40121:3;40032:93;:::i;:::-;40150:2;40145:3;40141:12;40134:19;;39793:366;;;:::o;40165:419::-;40331:4;40369:2;40358:9;40354:18;40346:26;;40418:9;40412:4;40408:20;40404:1;40393:9;40389:17;40382:47;40446:131;40572:4;40446:131;:::i;:::-;40438:139;;40165:419;;;:::o;40590:179::-;40730:31;40726:1;40718:6;40714:14;40707:55;40590:179;:::o;40775:366::-;40917:3;40938:67;41002:2;40997:3;40938:67;:::i;:::-;40931:74;;41014:93;41103:3;41014:93;:::i;:::-;41132:2;41127:3;41123:12;41116:19;;40775:366;;;:::o;41147:419::-;41313:4;41351:2;41340:9;41336:18;41328:26;;41400:9;41394:4;41390:20;41386:1;41375:9;41371:17;41364:47;41428:131;41554:4;41428:131;:::i;:::-;41420:139;;41147:419;;;:::o;41572:147::-;41673:11;41710:3;41695:18;;41572:147;;;;:::o;41725:114::-;;:::o;41845:398::-;42004:3;42025:83;42106:1;42101:3;42025:83;:::i;:::-;42018:90;;42117:93;42206:3;42117:93;:::i;:::-;42235:1;42230:3;42226:11;42219:18;;41845:398;;;:::o;42249:379::-;42433:3;42455:147;42598:3;42455:147;:::i;:::-;42448:154;;42619:3;42612:10;;42249:379;;;:::o;42634:245::-;42774:34;42770:1;42762:6;42758:14;42751:58;42843:28;42838:2;42830:6;42826:15;42819:53;42634:245;:::o;42885:366::-;43027:3;43048:67;43112:2;43107:3;43048:67;:::i;:::-;43041:74;;43124:93;43213:3;43124:93;:::i;:::-;43242:2;43237:3;43233:12;43226:19;;42885:366;;;:::o;43257:419::-;43423:4;43461:2;43450:9;43446:18;43438:26;;43510:9;43504:4;43500:20;43496:1;43485:9;43481:17;43474:47;43538:131;43664:4;43538:131;:::i;:::-;43530:139;;43257:419;;;:::o;43682:181::-;43822:33;43818:1;43810:6;43806:14;43799:57;43682:181;:::o;43869:366::-;44011:3;44032:67;44096:2;44091:3;44032:67;:::i;:::-;44025:74;;44108:93;44197:3;44108:93;:::i;:::-;44226:2;44221:3;44217:12;44210:19;;43869:366;;;:::o;44241:419::-;44407:4;44445:2;44434:9;44430:18;44422:26;;44494:9;44488:4;44484:20;44480:1;44469:9;44465:17;44458:47;44522:131;44648:4;44522:131;:::i;:::-;44514:139;;44241:419;;;:::o;44666:182::-;44806:34;44802:1;44794:6;44790:14;44783:58;44666:182;:::o;44854:366::-;44996:3;45017:67;45081:2;45076:3;45017:67;:::i;:::-;45010:74;;45093:93;45182:3;45093:93;:::i;:::-;45211:2;45206:3;45202:12;45195:19;;44854:366;;;:::o;45226:419::-;45392:4;45430:2;45419:9;45415:18;45407:26;;45479:9;45473:4;45469:20;45465:1;45454:9;45450:17;45443:47;45507:131;45633:4;45507:131;:::i;:::-;45499:139;;45226:419;;;:::o;45651:178::-;45791:30;45787:1;45779:6;45775:14;45768:54;45651:178;:::o;45835:366::-;45977:3;45998:67;46062:2;46057:3;45998:67;:::i;:::-;45991:74;;46074:93;46163:3;46074:93;:::i;:::-;46192:2;46187:3;46183:12;46176:19;;45835:366;;;:::o;46207:419::-;46373:4;46411:2;46400:9;46396:18;46388:26;;46460:9;46454:4;46450:20;46446:1;46435:9;46431:17;46424:47;46488:131;46614:4;46488:131;:::i;:::-;46480:139;;46207:419;;;:::o;46632:175::-;46772:27;46768:1;46760:6;46756:14;46749:51;46632:175;:::o;46813:366::-;46955:3;46976:67;47040:2;47035:3;46976:67;:::i;:::-;46969:74;;47052:93;47141:3;47052:93;:::i;:::-;47170:2;47165:3;47161:12;47154:19;;46813:366;;;:::o;47185:419::-;47351:4;47389:2;47378:9;47374:18;47366:26;;47438:9;47432:4;47428:20;47424:1;47413:9;47409:17;47402:47;47466:131;47592:4;47466:131;:::i;:::-;47458:139;;47185:419;;;:::o;47610:237::-;47750:34;47746:1;47738:6;47734:14;47727:58;47819:20;47814:2;47806:6;47802:15;47795:45;47610:237;:::o;47853:366::-;47995:3;48016:67;48080:2;48075:3;48016:67;:::i;:::-;48009:74;;48092:93;48181:3;48092:93;:::i;:::-;48210:2;48205:3;48201:12;48194:19;;47853:366;;;:::o;48225:419::-;48391:4;48429:2;48418:9;48414:18;48406:26;;48478:9;48472:4;48468:20;48464:1;48453:9;48449:17;48442:47;48506:131;48632:4;48506:131;:::i;:::-;48498:139;;48225:419;;;:::o;48650:180::-;48698:77;48695:1;48688:88;48795:4;48792:1;48785:15;48819:4;48816:1;48809:15;48836:240;48976:34;48972:1;48964:6;48960:14;48953:58;49045:23;49040:2;49032:6;49028:15;49021:48;48836:240;:::o;49082:366::-;49224:3;49245:67;49309:2;49304:3;49245:67;:::i;:::-;49238:74;;49321:93;49410:3;49321:93;:::i;:::-;49439:2;49434:3;49430:12;49423:19;;49082:366;;;:::o;49454:419::-;49620:4;49658:2;49647:9;49643:18;49635:26;;49707:9;49701:4;49697:20;49693:1;49682:9;49678:17;49671:47;49735:131;49861:4;49735:131;:::i;:::-;49727:139;;49454:419;;;:::o;49879:194::-;49919:4;49939:20;49957:1;49939:20;:::i;:::-;49934:25;;49973:20;49991:1;49973:20;:::i;:::-;49968:25;;50017:1;50014;50010:9;50002:17;;50041:1;50035:4;50032:11;50029:37;;;50046:18;;:::i;:::-;50029:37;49879:194;;;;:::o;50079:180::-;50127:77;50124:1;50117:88;50224:4;50221:1;50214:15;50248:4;50245:1;50238:15;50265:98;50316:6;50350:5;50344:12;50334:22;;50265:98;;;:::o;50369:168::-;50452:11;50486:6;50481:3;50474:19;50526:4;50521:3;50517:14;50502:29;;50369:168;;;;:::o;50543:373::-;50629:3;50657:38;50689:5;50657:38;:::i;:::-;50711:70;50774:6;50769:3;50711:70;:::i;:::-;50704:77;;50790:65;50848:6;50843:3;50836:4;50829:5;50825:16;50790:65;:::i;:::-;50880:29;50902:6;50880:29;:::i;:::-;50875:3;50871:39;50864:46;;50633:283;50543:373;;;;:::o;50922:640::-;51117:4;51155:3;51144:9;51140:19;51132:27;;51169:71;51237:1;51226:9;51222:17;51213:6;51169:71;:::i;:::-;51250:72;51318:2;51307:9;51303:18;51294:6;51250:72;:::i;:::-;51332;51400:2;51389:9;51385:18;51376:6;51332:72;:::i;:::-;51451:9;51445:4;51441:20;51436:2;51425:9;51421:18;51414:48;51479:76;51550:4;51541:6;51479:76;:::i;:::-;51471:84;;50922:640;;;;;;;:::o;51568:141::-;51624:5;51655:6;51649:13;51640:22;;51671:32;51697:5;51671:32;:::i;:::-;51568:141;;;;:::o;51715:349::-;51784:6;51833:2;51821:9;51812:7;51808:23;51804:32;51801:119;;;51839:79;;:::i;:::-;51801:119;51959:1;51984:63;52039:7;52030:6;52019:9;52015:22;51984:63;:::i;:::-;51974:73;;51930:127;51715:349;;;;:::o
Swarm Source
ipfs://06d41d4e4f3a769f7043e10980e79581f8a9d019517dd5192c3b2353edf6522e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.