ERC-721
Overview
Max Total Supply
402 SET
Holders
188
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
6 SETLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
setoshi
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-07 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the Merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates Merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // 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 v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // 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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: setoshi.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.18; /** * stage 1: open to whitelist and the public (4444 supply for wl and 2222 for the public) * stage 2: if the wl doesn't get fully minted in the first stage, the remaining supply will shift to the public mint in 2 hours. WL minting will no longer be available. */ contract setoshi is ERC721A, Ownable, Pausable, ReentrancyGuard { uint256 public maxSupply = 6666; //minter roles configuration struct MintersInfo { uint8 maxMintPerTransaction; //max mint per wallet and per transaction uint8 numberOfFreemint; uint256 supply; //max allocated supply per minter role uint256 mintCost; bytes32 root; //Merkle root } mapping(string => MintersInfo) minters; //map of minter types mapping(string => uint256) public mintedCount; //map of total mints per type enum Phases { N, Phase1, Public } //mint phases, N = mint not live Phases public currentPhase; mapping(address => uint256) minted; //map of addresses that minted mapping(string => mapping(address => uint8)) public mintedPerRole; //map of addresses that minted per phase and their mint counts mapping(address => uint8) public mintedFree; //map of addresses that minted free and their mint counts address[] public mintersAddresses; //addresses of minters string private baseURI; string[] private prerevealedArtworks; bool isRevealed; //events event Minted(address indexed to, uint8 numberOfTokens, uint256 amount); event SoldOut(); event PhaseChanged(address indexed to, uint256 indexed eventId, uint8 indexed phaseId); event WithdrawalSuccessful(address indexed to, uint256 amount); event CollectionRevealed(address indexed to); //errors error WithdrawalFailed(); constructor() ERC721A("SETOSHI", "SET") { _pause(); currentPhase = Phases.N; //added an invalid root here to avoid zero comparison later addMintersInfo( "WL", // mintoshi role name 6, // max per walletoshi, per txoshi 1, // numberoshi of free mint 4444, // allotoshi 0.0066 ether, // mint price 0x8ac3d4f184349fb28ebb642349f97130ce71b7bc967acb07c881b5ec27ad725c //root dummy ); addMintersInfo( "PUBLIC", // mintoshi role name 6, // max per walletoshi, per txoshi 0, // numberoshi of free mint 2222, // allotoshi 0.007 ether, // mint price 0x8ac3d4f184349fb28ebb642349f97130ce71b7bc967acb07c881b5ec27ad725c //root dummy ); } function whitelistMint(uint8 numberOfTokens, bytes32[] calldata proof) external payable nonReentrant whenNotPaused { require(currentPhase == Phases.Phase1, "ERROR: Mint is not active."); string memory _minterRole = "WL"; //set minter role uint256 _totalCost; //verify whitelist require(_isWhitelisted(msg.sender, proof, minters[_minterRole].root), "ERROR: You are not allowed to mint on this phase."); require(mintedCount[_minterRole] + numberOfTokens <= minters[_minterRole].supply, "ERROR: Maximum number of mints on this phase has been reached"); require(numberOfTokens <= minters[_minterRole].maxMintPerTransaction, "ERROR: Maximum number of mints per transaction exceeded"); require((mintedPerRole[_minterRole][msg.sender] + numberOfTokens) <= minters[_minterRole].maxMintPerTransaction, "ERROR: Your maximum NFT mint per wallet on this phase has been reached."); //Free mint check if ((mintedFree[msg.sender] > 0)) { _totalCost = minters[_minterRole].mintCost * numberOfTokens; require(msg.value >= _totalCost, "ERROR: You do not have enough funds to mint."); } else { //Block for free mint if (numberOfTokens == 1) { require(mintedFree[msg.sender] == 0, "ERROR: You do not have enough funds to mint."); } else if (numberOfTokens > 1) { _totalCost = minters[_minterRole].mintCost * (numberOfTokens - minters[_minterRole].numberOfFreemint); require(msg.value >= _totalCost, "ERROR: You do not have enough funds to mint."); } mintedFree[msg.sender] = 1; // Register free mint } payable(owner()).transfer(msg.value); _phaseMint(_minterRole, numberOfTokens, _totalCost); } function publicMint(uint8 numberOfTokens) external payable nonReentrant whenNotPaused { require(currentPhase != Phases.N, "ERROR: Mint is not active."); string memory _minterRole = "PUBLIC"; require(numberOfTokens <= minters[_minterRole].maxMintPerTransaction, "ERROR: Maximum number of mints per transaction exceeded"); require((mintedPerRole[_minterRole][msg.sender] + numberOfTokens) <= minters[_minterRole].maxMintPerTransaction, "ERROR: Your maximum NFT mint per wallet on this phase has been reached."); if (currentPhase == Phases.Phase1) { //on this phase make sure that the allocated supply count per minter role will not be exceeded require(mintedCount[_minterRole] + numberOfTokens <= minters[_minterRole].supply, "ERROR: Maximum number of mints on this phase has been reached"); } uint256 _totalCost; _totalCost = minters[_minterRole].mintCost * numberOfTokens; require(msg.value >= _totalCost, "ERROR: You do not have enough funds to mint."); payable(owner()).transfer(msg.value); _phaseMint(_minterRole, numberOfTokens, _totalCost); } function verifyWhitelist(string memory _minterType, address _address, bytes32[] calldata _merkleProof) public view returns (bool) { require(minters[_minterType].root != bytes32(0), "ERROR: Minter Type not found."); if (_isWhitelisted(_address, _merkleProof, minters[_minterType].root)) return true; return false; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (isRevealed) { // _tokenId += 1; return string(abi.encodePacked(baseURI, Strings.toString(_tokenId), ".json")); } uint _ipfsIndex = _tokenId % prerevealedArtworks.length; //distribute pre-reveal images, alternating return prerevealedArtworks[_ipfsIndex]; } function setMintPhase(uint8 _phase) public onlyOwner { currentPhase = Phases(_phase); emit PhaseChanged(msg.sender, block.timestamp, uint8(currentPhase)); } function setMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } //Function to add MintersInfo to minters function addMintersInfo( string memory _minterName, uint8 _maxMintPerTransaction, uint8 _numberOfFreeMint, uint256 _supply, uint256 _mintCost, bytes32 _root ) public onlyOwner { MintersInfo memory newMintersInfo = MintersInfo( _maxMintPerTransaction, _numberOfFreeMint, _supply, _mintCost, _root ); minters[_minterName] = newMintersInfo; } //Function to modify MintersInfo of a minterRole function modifyMintersInfo( string memory _minterName, uint8 _newMaxMintPerTransaction, uint8 _newNumberOfFreeMint, uint256 _newSupply, uint256 _newMintCost, bytes32 _newRoot ) public onlyOwner { require(minters[_minterName].root != bytes32(0), "MintersInfo not found."); MintersInfo memory updatedMintersInfo = MintersInfo( _newMaxMintPerTransaction, _newNumberOfFreeMint, _newSupply, _newMintCost, _newRoot ); minters[_minterName] = updatedMintersInfo; } function modifyMintersMintCost( string memory _minterName, uint256 _newMintCost ) public onlyOwner { require(minters[_minterName].root != bytes32(0), "MintersInfo not found."); minters[_minterName].mintCost = _newMintCost; } function modifyMintersSupply( string memory _minterName, uint256 _newSupplyCount ) public onlyOwner { require(minters[_minterName].root != bytes32(0), "MintersInfo not found."); minters[_minterName].supply = _newSupplyCount; } function modifyFreeMintCount( string memory _minterName, uint8 _newFreeMintCount ) public onlyOwner { require(minters[_minterName].root != bytes32(0), "MintersInfo not found."); minters[_minterName].numberOfFreemint = _newFreeMintCount; } function modifyMintersMaxMintPerTransaction( string memory _minterName, uint8 _newMaxMintPerTransaction ) public onlyOwner { require(minters[_minterName].root != bytes32(0), "MintersInfo not found."); minters[_minterName].maxMintPerTransaction = _newMaxMintPerTransaction; } //Function to get the MintersInfo for a specific minter function getMintInfo(string memory _minterName, address _userAddress) public view returns (uint8, uint8, uint256, uint256, uint256, uint8) { uint8 _mintedPerRole = mintedPerRole[_minterName][_userAddress]; return ( uint8(currentPhase), minters[_minterName].maxMintPerTransaction, minters[_minterName].mintCost, minters[_minterName].supply, mintedCount[_minterName], _mintedPerRole ); } function getWLMintCost() external view returns (uint256) { return minters["WL"].mintCost; } function getPublicMintCost() external view returns (uint256) { return minters["PUBLIC"].mintCost; } function getMaxWLMintPerTransaction() external view returns (uint8) { return minters["WL"].maxMintPerTransaction; } function getMaxPublicMintPerTransaction() external view returns (uint8) { return minters["PUBLIC"].maxMintPerTransaction; } function getWLMintedCount(address userAddress) external view returns (uint256) { return mintedPerRole["WL"][userAddress]; } function getPublicMintedCount(address userAddress) external view returns (uint256) { return mintedPerRole["PUBLIC"][userAddress]; } //Function to modify the root of an existing MintersInfo function modifyMintersRoot(string memory _minterName, bytes32 _newRoot) public onlyOwner { require(minters[_minterName].root != bytes32(0), "ERROR: MintersInfo not found."); //change minters[_minterName].root = _newRoot; } function modifyPrerevealImages(string[] memory _urlArray) public onlyOwner { prerevealedArtworks = _urlArray; } function revealCollection (string memory _baseURI, bool _isRevealed) public onlyOwner { isRevealed = _isRevealed; baseURI = _baseURI; if (isRevealed) emit CollectionRevealed(msg.sender); } function unPause() public onlyOwner { _unpause(); } function pause() public onlyOwner whenNotPaused { _pause(); } function internalMint(uint8 numberOfTokens) public onlyOwner { require((_totalMinted() + numberOfTokens) <= maxSupply, "ERROR: Not enough tokens"); _safeMint(msg.sender, numberOfTokens); emit Minted(msg.sender, numberOfTokens, 0); } function _phaseMint(string memory _minterRole, uint8 _numberOfTokens, uint256 _totalCost) internal { require((_totalMinted() + _numberOfTokens) <= maxSupply, "ERROR: No tokens left to mint"); require(_numberOfTokens > 0, "ERROR: Number of tokens should be greater than zero"); _safeMint(msg.sender, _numberOfTokens); //after mint registry mintedCount[_minterRole] += _numberOfTokens; //adds the newly minted token count per minter Role //mintedPerPhase[uint8(currentPhase)][msg.sender] += _numberOfTokens; //registers the address and the number of tokens of the minter mintedPerRole[_minterRole][msg.sender] += _numberOfTokens; //registers the address and the number of tokens of the minter per role mintersAddresses.push(msg.sender); //registers minters address, for future purposes emit Minted(msg.sender, _numberOfTokens, _totalCost); //if total minted reach or exceeds max supply - pause contract if (_totalMinted() >= maxSupply) { emit SoldOut(); // _pause(); } } //for whitelist check function _isWhitelisted ( address _minterLeaf, bytes32[] calldata _merkleProof, bytes32 _minterRoot ) public pure returns (bool) { bytes32 _leaf = keccak256(abi.encodePacked(_minterLeaf)); return MerkleProof.verify(_merkleProof, _minterRoot, _leaf); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WithdrawalFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"CollectionRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint8","name":"numberOfTokens","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"eventId","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"phaseId","type":"uint8"}],"name":"PhaseChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"SoldOut","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawalSuccessful","type":"event"},{"inputs":[{"internalType":"address","name":"_minterLeaf","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bytes32","name":"_minterRoot","type":"bytes32"}],"name":"_isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint8","name":"_maxMintPerTransaction","type":"uint8"},{"internalType":"uint8","name":"_numberOfFreeMint","type":"uint8"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_mintCost","type":"uint256"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"addMintersInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPhase","outputs":[{"internalType":"enum setoshi.Phases","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPublicMintPerTransaction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWLMintPerTransaction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"address","name":"_userAddress","type":"address"}],"name":"getMintInfo","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getPublicMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWLMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getWLMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"internalMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedFree","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"mintedPerRole","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintersAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint8","name":"_newFreeMintCount","type":"uint8"}],"name":"modifyFreeMintCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint8","name":"_newMaxMintPerTransaction","type":"uint8"},{"internalType":"uint8","name":"_newNumberOfFreeMint","type":"uint8"},{"internalType":"uint256","name":"_newSupply","type":"uint256"},{"internalType":"uint256","name":"_newMintCost","type":"uint256"},{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"modifyMintersInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint8","name":"_newMaxMintPerTransaction","type":"uint8"}],"name":"modifyMintersMaxMintPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint256","name":"_newMintCost","type":"uint256"}],"name":"modifyMintersMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"modifyMintersRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint256","name":"_newSupplyCount","type":"uint256"}],"name":"modifyMintersSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_urlArray","type":"string[]"}],"name":"modifyPrerevealImages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"bool","name":"_isRevealed","type":"bool"}],"name":"revealCollection","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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_phase","type":"uint8"}],"name":"setMintPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterType","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"verifyWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052611a0a600a5534801562000016575f80fd5b506040518060400160405280600781526020017f5345544f534849000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f53455400000000000000000000000000000000000000000000000000000000008152508160029081620000949190620007c5565b508060039081620000a69190620007c5565b50620000b76200023160201b60201c565b5f819055505050620000de620000d26200023560201b60201c565b6200023c60201b60201c565b5f600860146101000a81548160ff021916908315150217905550600160098190555062000110620002ff60201b60201c565b5f600d5f6101000a81548160ff02191690836002811115620001375762000136620008a9565b5b0217905550620001b46040518060400160405280600281526020017f574c0000000000000000000000000000000000000000000000000000000000008152506006600161115c661772aa3f8480007f8ac3d4f184349fb28ebb642349f97130ce71b7bc967acb07c881b5ec27ad725c5f1b6200037460201b60201c565b6200022b6040518060400160405280600681526020017f5055424c4943000000000000000000000000000000000000000000000000000081525060065f6108ae6618de76816d80007f8ac3d4f184349fb28ebb642349f97130ce71b7bc967acb07c881b5ec27ad725c5f1b6200037460201b60201c565b62000aa2565b5f90565b5f33905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200030f6200043d60201b60201c565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200035b6200023560201b60201c565b6040516200036a919062000919565b60405180910390a1565b620003846200049260201b60201c565b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b88604051620003c791906200099e565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b6200044d6200052360201b60201c565b1562000490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004879062000a14565b60405180910390fd5b565b620004a26200023560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004c86200053960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000521576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005189062000a82565b60405180910390fd5b565b5f600860149054906101000a900460ff16905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620005dd57607f821691505b602082108103620005f357620005f262000598565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620006577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200061a565b6200066386836200061a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620006ad620006a7620006a1846200067b565b62000684565b6200067b565b9050919050565b5f819050919050565b620006c8836200068d565b620006e0620006d782620006b4565b84845462000626565b825550505050565b5f90565b620006f6620006e8565b62000703818484620006bd565b505050565b5b818110156200072a576200071e5f82620006ec565b60018101905062000709565b5050565b601f82111562000779576200074381620005f9565b6200074e846200060b565b810160208510156200075e578190505b620007766200076d856200060b565b83018262000708565b50505b505050565b5f82821c905092915050565b5f6200079b5f19846008026200077e565b1980831691505092915050565b5f620007b583836200078a565b9150826002028217905092915050565b620007d08262000561565b67ffffffffffffffff811115620007ec57620007eb6200056b565b5b620007f88254620005c5565b620008058282856200072e565b5f60209050601f8311600181146200083b575f841562000826578287015190505b620008328582620007a8565b865550620008a1565b601f1984166200084b86620005f9565b5f5b8281101562000874578489015182556001820191506020850194506020810190506200084d565b8683101562000894578489015162000890601f8916826200078a565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200090182620008d6565b9050919050565b6200091381620008f5565b82525050565b5f6020820190506200092e5f83018462000908565b92915050565b5f81905092915050565b5f5b838110156200095d57808201518184015260208101905062000940565b5f8484015250505050565b5f620009748262000561565b62000980818562000934565b9350620009928185602086016200093e565b80840191505092915050565b5f620009ab828462000968565b915081905092915050565b5f82825260208201905092915050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f620009fc601083620009b6565b915062000a0982620009c6565b602082019050919050565b5f6020820190508181035f83015262000a2d81620009ee565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f62000a6a602083620009b6565b915062000a778262000a34565b602082019050919050565b5f6020820190508181035f83015262000a9b8162000a5c565b9050919050565b6159da8062000ab05f395ff3fe6080604052600436106102ac575f3560e01c80636f8b44b011610174578063ad5a6dc5116100db578063e1c6780511610094578063e985e9c51161006e578063e985e9c514610a7d578063ed7c7fe814610ab9578063f2fde38b14610ae3578063f7b188a514610b0b576102ac565b8063e1c67805146109f1578063e7d9793714610a19578063e85ada7214610a41576102ac565b8063ad5a6dc5146108f5578063b88d4fde1461091f578063c87b56dd1461093b578063cf7c0b4914610977578063d5abeb011461099f578063d89a7574146109c9576102ac565b80638456cb591161012d5780638456cb591461081d578063858e83b5146108335780638a4d367b1461084f5780638da5cb5b1461087957806395d89b41146108a3578063a22cb465146108cd576102ac565b80636f8b44b01461072957806370a0823114610751578063715018a61461078d578063733428bf146107a3578063792a873e146107cd5780637e454447146107f5576102ac565b8063209848011161021857806342842e0e116101d157806342842e0e1461062757806347d4f57814610643578063583816691461066b5780635c975abb146106875780636107896e146106b15780636352211e146106ed576102ac565b8063209848011461051657806323b872dd14610552578063293227ab1461056e5780632b5619a41461059657806331c07bbf146105d7578063411d1be5146105ff576102ac565b8063095ea7b31161026a578063095ea7b3146103f457806309945734146104105780630e6f52721461044c57806315587fc31461048857806318160ddd146104c4578063189b83bd146104ee576102ac565b8062377580146102b057806301c392f0146102ec57806301ffc9a714610328578063055ad42e1461036457806306fdde031461038e578063081812fc146103b8575b5f80fd5b3480156102bb575f80fd5b506102d660048036038101906102d19190613d49565b610b21565b6040516102e39190613df0565b60405180910390f35b3480156102f7575f80fd5b50610312600480360381019061030d9190613e09565b610bce565b60405161031f9190613e4c565b60405180910390f35b348015610333575f80fd5b5061034e60048036038101906103499190613eba565b610c3d565b60405161035b9190613df0565b60405180910390f35b34801561036f575f80fd5b50610378610cce565b6040516103859190613f58565b60405180910390f35b348015610399575f80fd5b506103a2610ce0565b6040516103af9190613feb565b60405180910390f35b3480156103c3575f80fd5b506103de60048036038101906103d99190614035565b610d70565b6040516103eb919061406f565b60405180910390f35b61040e60048036038101906104099190614088565b610dea565b005b34801561041b575f80fd5b50610436600480360381019061043191906140c6565b610f29565b6040516104439190613e4c565b60405180910390f35b348015610457575f80fd5b50610472600480360381019061046d9190614140565b610f56565b60405161047f9190613df0565b60405180910390f35b348015610493575f80fd5b506104ae60048036038101906104a991906141b1565b610fd7565b6040516104bb9190614226565b60405180910390f35b3480156104cf575f80fd5b506104d8611019565b6040516104e59190613e4c565b60405180910390f35b3480156104f9575f80fd5b50610514600480360381019061050f919061423f565b61102e565b005b348015610521575f80fd5b5061053c60048036038101906105379190613e09565b6110c5565b6040516105499190614226565b60405180910390f35b61056c60048036038101906105679190614299565b6110e2565b005b348015610579575f80fd5b50610594600480360381019061058f91906142e9565b6113f0565b005b3480156105a1575f80fd5b506105bc60048036038101906105b791906141b1565b611487565b6040516105ce96959493929190614343565b60405180910390f35b3480156105e2575f80fd5b506105fd60048036038101906105f891906143cc565b6115bf565b005b34801561060a575f80fd5b50610625600480360381019061062091906143f7565b611670565b005b610641600480360381019061063c9190614299565b611719565b005b34801561064e575f80fd5b5061066960048036038101906106649190614451565b611738565b005b610685600480360381019061068091906144f6565b6117f7565b005b348015610692575f80fd5b5061069b611def565b6040516106a89190613df0565b60405180910390f35b3480156106bc575f80fd5b506106d760048036038101906106d29190614035565b611e05565b6040516106e4919061406f565b60405180910390f35b3480156106f8575f80fd5b50610713600480360381019061070e9190614035565b611e40565b604051610720919061406f565b60405180910390f35b348015610734575f80fd5b5061074f600480360381019061074a9190614035565b611e51565b005b34801561075c575f80fd5b5061077760048036038101906107729190613e09565b611e63565b6040516107849190613e4c565b60405180910390f35b348015610798575f80fd5b506107a1611f18565b005b3480156107ae575f80fd5b506107b7611f2b565b6040516107c49190614226565b60405180910390f35b3480156107d8575f80fd5b506107f360048036038101906107ee9190614631565b611f5c565b005b348015610800575f80fd5b5061081b600480360381019061081691906143f7565b611f7e565b005b348015610828575f80fd5b50610831612028565b005b61084d600480360381019061084891906143cc565b612042565b005b34801561085a575f80fd5b506108636123fd565b6040516108709190613e4c565b60405180910390f35b348015610884575f80fd5b5061088d612423565b60405161089a919061406f565b60405180910390f35b3480156108ae575f80fd5b506108b761244b565b6040516108c49190613feb565b60405180910390f35b3480156108d8575f80fd5b506108f360048036038101906108ee91906146a2565b6124db565b005b348015610900575f80fd5b506109096125e1565b6040516109169190614226565b60405180910390f35b6109396004803603810190610934919061477e565b612612565b005b348015610946575f80fd5b50610961600480360381019061095c9190614035565b612684565b60405161096e9190613feb565b60405180910390f35b348015610982575f80fd5b5061099d600480360381019061099891906142e9565b6127d4565b005b3480156109aa575f80fd5b506109b361286b565b6040516109c09190613e4c565b60405180910390f35b3480156109d4575f80fd5b506109ef60048036038101906109ea9190614451565b612871565b005b3480156109fc575f80fd5b50610a176004803603810190610a1291906147fe565b612995565b005b348015610a24575f80fd5b50610a3f6004803603810190610a3a91906143cc565b612a22565b005b348015610a4c575f80fd5b50610a676004803603810190610a629190613e09565b612ae4565b604051610a749190613e4c565b60405180910390f35b348015610a88575f80fd5b50610aa36004803603810190610a9e9190614858565b612b53565b604051610ab09190613df0565b60405180910390f35b348015610ac4575f80fd5b50610acd612be1565b604051610ada9190613e4c565b60405180910390f35b348015610aee575f80fd5b50610b096004803603810190610b049190613e09565b612c07565b005b348015610b16575f80fd5b50610b1f612c89565b005b5f805f1b600b86604051610b3591906148d0565b90815260200160405180910390206003015403610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90614930565b60405180910390fd5b610bb4848484600b89604051610b9d91906148d0565b908152602001604051809103902060030154610f56565b15610bc25760019050610bc6565b5f90505b949350505050565b5f600f604051610bdd90614998565b90815260200160405180910390205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff169050919050565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cc75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600d5f9054906101000a900460ff1681565b606060028054610cef906149d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1b906149d9565b8015610d665780601f10610d3d57610100808354040283529160200191610d66565b820191905f5260205f20905b815481529060010190602001808311610d4957829003601f168201915b5050505050905090565b5f610d7a82612c9b565b610db0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610df482611e40565b90508073ffffffffffffffffffffffffffffffffffffffff16610e15612cf5565b73ffffffffffffffffffffffffffffffffffffffff1614610e7857610e4181610e3c612cf5565b612b53565b610e77576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b5f8085604051602001610f699190614a4e565b604051602081830303815290604052805190602001209050610fcc8585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508483612cfc565b915050949350505050565b600f82805160208101820180518482526020830160208501208183528095505050505050602052805f5260405f205f915091509054906101000a900460ff1681565b5f611022612d12565b6001545f540303905090565b611036612d16565b5f801b600b8360405161104991906148d0565b9081526020016040518091039020600301540361109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614ab2565b60405180910390fd5b80600b836040516110ac91906148d0565b9081526020016040518091039020600301819055505050565b6010602052805f5260405f205f915054906101000a900460ff1681565b5f6110ec82612d94565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611153576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061115e84612e57565b91509150611174818761116f612cf5565b612e7a565b6111c05761118986611184612cf5565b612b53565b6111bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611225576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112328686866001612ebd565b801561123c575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550611304856112e0888887612ec3565b7c020000000000000000000000000000000000000000000000000000000017612eea565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603611380575f6001850190505f60045f8381526020019081526020015f20540361137e575f54811461137d578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113e88686866001612f14565b505050505050565b6113f8612d16565b5f801b600b8360405161140b91906148d0565b9081526020016040518091039020600301540361145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490614b1a565b60405180910390fd5b80600b8360405161146e91906148d0565b9081526020016040518091039020600201819055505050565b5f805f805f805f600f8960405161149e91906148d0565b90815260200160405180910390205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050600d5f9054906101000a900460ff16600281111561151757611516613ee5565b5b600b8a60405161152791906148d0565b90815260200160405180910390205f015f9054906101000a900460ff16600b8b60405161155491906148d0565b908152602001604051809103902060020154600b8c60405161157691906148d0565b908152602001604051809103902060010154600c8d60405161159891906148d0565b90815260200160405180910390205485965096509650965096509650509295509295509295565b6115c7612d16565b8060ff1660028111156115dd576115dc613ee5565b5b600d5f6101000a81548160ff02191690836002811115611600576115ff613ee5565b5b0217905550600d5f9054906101000a900460ff16600281111561162657611625613ee5565b5b60ff16423373ffffffffffffffffffffffffffffffffffffffff167f7d7f6ed6d84cc6a4531c22effb48bb76d643459a9d3398dab7ddb04f6fb01ebc60405160405180910390a450565b611678612d16565b5f801b600b8360405161168b91906148d0565b908152602001604051809103902060030154036116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d490614b1a565b60405180910390fd5b80600b836040516116ee91906148d0565b90815260200160405180910390205f015f6101000a81548160ff021916908360ff1602179055505050565b61173383838360405180602001604052805f815250612612565b505050565b611740612d16565b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b8860405161178191906148d0565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b6117ff612f1a565b611807612f69565b6001600281111561181b5761181a613ee5565b5b600d5f9054906101000a900460ff16600281111561183c5761183b613ee5565b5b1461187c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187390614b82565b60405180910390fd5b5f6040518060400160405280600281526020017f574c00000000000000000000000000000000000000000000000000000000000081525090505f6118e3338585600b866040516118cc91906148d0565b908152602001604051809103902060030154610f56565b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614c10565b60405180910390fd5b600b8260405161193291906148d0565b9081526020016040518091039020600101548560ff16600c8460405161195891906148d0565b9081526020016040518091039020546119719190614c5b565b11156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614cfe565b60405180910390fd5b600b826040516119c291906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff168560ff161115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614d8c565b60405180910390fd5b600b82604051611a3791906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff1685600f84604051611a6891906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611ac89190614daa565b60ff161115611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0390614e74565b60405180910390fd5b5f60105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff161115611bda578460ff16600b83604051611b7491906148d0565b908152602001604051809103902060020154611b909190614e92565b905080341015611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc90614f43565b60405180910390fd5b611d8a565b60018560ff1603611c78575f60105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff1614611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614f43565b60405180910390fd5b611d33565b60018560ff161115611d3257600b82604051611c9491906148d0565b90815260200160405180910390205f0160019054906101000a900460ff1685611cbd9190614f61565b60ff16600b83604051611cd091906148d0565b908152602001604051809103902060020154611cec9190614e92565b905080341015611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614f43565b60405180910390fd5b5b5b600160105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360ff1602179055505b611d92612423565b73ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f19350505050158015611dd4573d5f803e3d5ffd5b50611de0828683612fb3565b5050611dea613214565b505050565b5f600860149054906101000a900460ff16905090565b60118181548110611e14575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611e4a82612d94565b9050919050565b611e59612d16565b80600a8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ec9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611f20612d16565b611f295f61321e565b565b5f600b604051611f3a90614998565b90815260200160405180910390205f015f9054906101000a900460ff16905090565b611f64612d16565b8060139080519060200190611f7a929190613a73565b5050565b611f86612d16565b5f801b600b83604051611f9991906148d0565b90815260200160405180910390206003015403611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614b1a565b60405180910390fd5b80600b83604051611ffc91906148d0565b90815260200160405180910390205f0160016101000a81548160ff021916908360ff1602179055505050565b612030612d16565b612038612f69565b6120406132e1565b565b61204a612f1a565b612052612f69565b5f600281111561206557612064613ee5565b5b600d5f9054906101000a900460ff16600281111561208657612085613ee5565b5b036120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90614b82565b60405180910390fd5b5f6040518060400160405280600681526020017f5055424c494300000000000000000000000000000000000000000000000000008152509050600b8160405161210f91906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff168260ff161115612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b90614d8c565b60405180910390fd5b600b8160405161218491906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff1682600f836040516121b591906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166122159190614daa565b60ff161115612259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225090614e74565b60405180910390fd5b6001600281111561226d5761226c613ee5565b5b600d5f9054906101000a900460ff16600281111561228e5761228d613ee5565b5b0361232457600b816040516122a391906148d0565b9081526020016040518091039020600101548260ff16600c836040516122c991906148d0565b9081526020016040518091039020546122e29190614c5b565b1115612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90614cfe565b60405180910390fd5b5b5f8260ff16600b8360405161233991906148d0565b9081526020016040518091039020600201546123559190614e92565b90508034101561239a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239190614f43565b60405180910390fd5b6123a2612423565b73ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f193505050501580156123e4573d5f803e3d5ffd5b506123f0828483612fb3565b50506123fa613214565b50565b5f600b60405161240c90614fdf565b908152602001604051809103902060020154905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461245a906149d9565b80601f0160208091040260200160405190810160405280929190818152602001828054612486906149d9565b80156124d15780601f106124a8576101008083540402835291602001916124d1565b820191905f5260205f20905b8154815290600101906020018083116124b457829003601f168201915b5050505050905090565b8060075f6124e7612cf5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612590612cf5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125d59190613df0565b60405180910390a35050565b5f600b6040516125f090614fdf565b90815260200160405180910390205f015f9054906101000a900460ff16905090565b61261d8484846110e2565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461267e5761264784848484613344565b61267d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061268f82612c9b565b6126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590615063565b60405180910390fd5b60145f9054906101000a900460ff16156127145760126126ed8361348f565b6040516020016126fe92919061515d565b60405160208183030381529060405290506127cf565b5f6013805490508361272691906151b8565b90506013818154811061273c5761273b6151e8565b5b905f5260205f2001805461274f906149d9565b80601f016020809104026020016040519081016040528092919081815260200182805461277b906149d9565b80156127c65780601f1061279d576101008083540402835291602001916127c6565b820191905f5260205f20905b8154815290600101906020018083116127a957829003601f168201915b50505050509150505b919050565b6127dc612d16565b5f801b600b836040516127ef91906148d0565b90815260200160405180910390206003015403612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890614b1a565b60405180910390fd5b80600b8360405161285291906148d0565b9081526020016040518091039020600101819055505050565b600a5481565b612879612d16565b5f801b600b8760405161288c91906148d0565b908152602001604051809103902060030154036128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590614b1a565b60405180910390fd5b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b8860405161291f91906148d0565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b61299d612d16565b8060145f6101000a81548160ff02191690831515021790555081601290816129c591906153a0565b5060145f9054906101000a900460ff1615612a1e573373ffffffffffffffffffffffffffffffffffffffff167f2a10c355cd3f8130b128e45782d3e92e6c0b4ba2e844d06f49a48ee23f1f21f760405160405180910390a25b5050565b612a2a612d16565b600a548160ff16612a39613559565b612a439190614c5b565b1115612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b906154b9565b60405180910390fd5b612a91338260ff1661356a565b3373ffffffffffffffffffffffffffffffffffffffff167fc06d53176829f80e4279d4c047b74872abc9e10a4c210a24abff21de3d077740825f604051612ad9929190615510565b60405180910390a250565b5f600f604051612af390614fdf565b90815260200160405180910390205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff169050919050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f600b604051612bf090614998565b908152602001604051809103902060020154905090565b612c0f612d16565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c74906155a7565b60405180910390fd5b612c868161321e565b50565b612c91612d16565b612c99613587565b565b5f81612ca5612d12565b11158015612cb357505f5482105b8015612cee57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f82612d0885846135e9565b1490509392505050565b5f90565b612d1e61363d565b73ffffffffffffffffffffffffffffffffffffffff16612d3c612423565b73ffffffffffffffffffffffffffffffffffffffff1614612d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d899061560f565b60405180910390fd5b565b5f8082905080612da2612d12565b11612e20575f54811015612e1f575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603612e1d575b5f8103612e135760045f836001900393508381526020019081526020015f20549050612dec565b8092505050612e52565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612ed9868684613644565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600260095403612f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5690615677565b60405180910390fd5b6002600981905550565b612f71611def565b15612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa8906156df565b60405180910390fd5b565b600a548260ff16612fc2613559565b612fcc9190614c5b565b111561300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490615747565b60405180910390fd5b5f8260ff1611613052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613049906157d5565b60405180910390fd5b61305f338360ff1661356a565b8160ff16600c8460405161307391906148d0565b90815260200160405180910390205f82825461308f9190614c5b565b9250508190555081600f846040516130a791906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900460ff1661310a9190614daa565b92506101000a81548160ff021916908360ff160217905550601133908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fc06d53176829f80e4279d4c047b74872abc9e10a4c210a24abff21de3d07774083836040516131ca9291906157f3565b60405180910390a2600a546131dd613559565b1061320f577f52df9fe5b9c9a7b0b4fdc2c9f89387959e35e4209c2a8d133a2b8165edad2a0460405160405180910390a15b505050565b6001600981905550565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132e9612f69565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861332d61363d565b60405161333a919061406f565b60405180910390a1565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613369612cf5565b8786866040518563ffffffff1660e01b815260040161338b949392919061586c565b6020604051808303815f875af19250505080156133c657506040513d601f19601f820116820180604052508101906133c391906158ca565b60015b61343c573d805f81146133f4576040519150601f19603f3d011682016040523d82523d5f602084013e6133f9565b606091505b505f815103613434576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60605f600161349d8461364c565b0190505f8167ffffffffffffffff8111156134bb576134ba613b6e565b5b6040519080825280601f01601f1916602001820160405280156134ed5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561354e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816135435761354261518b565b5b0494505f85036134fa575b819350505050919050565b5f613562612d12565b5f5403905090565b613583828260405180602001604052805f81525061379d565b5050565b61358f613834565b5f600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6135d261363d565b6040516135df919061406f565b60405180910390a1565b5f808290505f5b84518110156136325761361d828683815181106136105761360f6151e8565b5b602002602001015161387d565b9150808061362a906158f5565b9150506135f0565b508091505092915050565b5f33905090565b5f9392505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136a8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161369e5761369d61518b565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106136e5576d04ee2d6d415b85acef810000000083816136db576136da61518b565b5b0492506020810190505b662386f26fc10000831061371457662386f26fc10000838161370a5761370961518b565b5b0492506010810190505b6305f5e100831061373d576305f5e10083816137335761373261518b565b5b0492506008810190505b61271083106137625761271083816137585761375761518b565b5b0492506004810190505b60648310613785576064838161377b5761377a61518b565b5b0492506002810190505b600a8310613794576001810190505b80915050919050565b6137a783836138a7565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461382f575f805490505f83820390505b6137e35f868380600101945086613344565b613819576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106137d157815f541461382c575f80fd5b50505b505050565b61383c611def565b61387b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387290615986565b60405180910390fd5b565b5f8183106138945761388f8284613a50565b61389f565b61389e8383613a50565b5b905092915050565b5f805490505f82036138e5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138f15f848385612ebd565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613963836139545f865f612ec3565b61395d85613a64565b17612eea565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146139fd5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506139c4565b505f8203613a37576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819055505050613a4b5f848385612f14565b505050565b5f825f528160205260405f20905092915050565b5f6001821460e11b9050919050565b828054828255905f5260205f20908101928215613ab9579160200282015b82811115613ab8578251829081613aa891906153a0565b5091602001919060010190613a91565b5b509050613ac69190613aca565b5090565b5b80821115613ae9575f8181613ae09190613aed565b50600101613acb565b5090565b508054613af9906149d9565b5f825580601f10613b0a5750613b27565b601f0160209004905f5260205f2090810190613b269190613b2a565b5b50565b5b80821115613b41575f815f905550600101613b2b565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613ba482613b5e565b810181811067ffffffffffffffff82111715613bc357613bc2613b6e565b5b80604052505050565b5f613bd5613b45565b9050613be18282613b9b565b919050565b5f67ffffffffffffffff821115613c0057613bff613b6e565b5b613c0982613b5e565b9050602081019050919050565b828183375f83830152505050565b5f613c36613c3184613be6565b613bcc565b905082815260208101848484011115613c5257613c51613b5a565b5b613c5d848285613c16565b509392505050565b5f82601f830112613c7957613c78613b56565b5b8135613c89848260208601613c24565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613cbb82613c92565b9050919050565b613ccb81613cb1565b8114613cd5575f80fd5b50565b5f81359050613ce681613cc2565b92915050565b5f80fd5b5f80fd5b5f8083601f840112613d0957613d08613b56565b5b8235905067ffffffffffffffff811115613d2657613d25613cec565b5b602083019150836020820283011115613d4257613d41613cf0565b5b9250929050565b5f805f8060608587031215613d6157613d60613b4e565b5b5f85013567ffffffffffffffff811115613d7e57613d7d613b52565b5b613d8a87828801613c65565b9450506020613d9b87828801613cd8565b935050604085013567ffffffffffffffff811115613dbc57613dbb613b52565b5b613dc887828801613cf4565b925092505092959194509250565b5f8115159050919050565b613dea81613dd6565b82525050565b5f602082019050613e035f830184613de1565b92915050565b5f60208284031215613e1e57613e1d613b4e565b5b5f613e2b84828501613cd8565b91505092915050565b5f819050919050565b613e4681613e34565b82525050565b5f602082019050613e5f5f830184613e3d565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e9981613e65565b8114613ea3575f80fd5b50565b5f81359050613eb481613e90565b92915050565b5f60208284031215613ecf57613ece613b4e565b5b5f613edc84828501613ea6565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110613f2357613f22613ee5565b5b50565b5f819050613f3382613f12565b919050565b5f613f4282613f26565b9050919050565b613f5281613f38565b82525050565b5f602082019050613f6b5f830184613f49565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fa8578082015181840152602081019050613f8d565b5f8484015250505050565b5f613fbd82613f71565b613fc78185613f7b565b9350613fd7818560208601613f8b565b613fe081613b5e565b840191505092915050565b5f6020820190508181035f8301526140038184613fb3565b905092915050565b61401481613e34565b811461401e575f80fd5b50565b5f8135905061402f8161400b565b92915050565b5f6020828403121561404a57614049613b4e565b5b5f61405784828501614021565b91505092915050565b61406981613cb1565b82525050565b5f6020820190506140825f830184614060565b92915050565b5f806040838503121561409e5761409d613b4e565b5b5f6140ab85828601613cd8565b92505060206140bc85828601614021565b9150509250929050565b5f602082840312156140db576140da613b4e565b5b5f82013567ffffffffffffffff8111156140f8576140f7613b52565b5b61410484828501613c65565b91505092915050565b5f819050919050565b61411f8161410d565b8114614129575f80fd5b50565b5f8135905061413a81614116565b92915050565b5f805f806060858703121561415857614157613b4e565b5b5f61416587828801613cd8565b945050602085013567ffffffffffffffff81111561418657614185613b52565b5b61419287828801613cf4565b935093505060406141a58782880161412c565b91505092959194509250565b5f80604083850312156141c7576141c6613b4e565b5b5f83013567ffffffffffffffff8111156141e4576141e3613b52565b5b6141f085828601613c65565b925050602061420185828601613cd8565b9150509250929050565b5f60ff82169050919050565b6142208161420b565b82525050565b5f6020820190506142395f830184614217565b92915050565b5f806040838503121561425557614254613b4e565b5b5f83013567ffffffffffffffff81111561427257614271613b52565b5b61427e85828601613c65565b925050602061428f8582860161412c565b9150509250929050565b5f805f606084860312156142b0576142af613b4e565b5b5f6142bd86828701613cd8565b93505060206142ce86828701613cd8565b92505060406142df86828701614021565b9150509250925092565b5f80604083850312156142ff576142fe613b4e565b5b5f83013567ffffffffffffffff81111561431c5761431b613b52565b5b61432885828601613c65565b925050602061433985828601614021565b9150509250929050565b5f60c0820190506143565f830189614217565b6143636020830188614217565b6143706040830187613e3d565b61437d6060830186613e3d565b61438a6080830185613e3d565b61439760a0830184614217565b979650505050505050565b6143ab8161420b565b81146143b5575f80fd5b50565b5f813590506143c6816143a2565b92915050565b5f602082840312156143e1576143e0613b4e565b5b5f6143ee848285016143b8565b91505092915050565b5f806040838503121561440d5761440c613b4e565b5b5f83013567ffffffffffffffff81111561442a57614429613b52565b5b61443685828601613c65565b9250506020614447858286016143b8565b9150509250929050565b5f805f805f8060c0878903121561446b5761446a613b4e565b5b5f87013567ffffffffffffffff81111561448857614487613b52565b5b61449489828a01613c65565b96505060206144a589828a016143b8565b95505060406144b689828a016143b8565b94505060606144c789828a01614021565b93505060806144d889828a01614021565b92505060a06144e989828a0161412c565b9150509295509295509295565b5f805f6040848603121561450d5761450c613b4e565b5b5f61451a868287016143b8565b935050602084013567ffffffffffffffff81111561453b5761453a613b52565b5b61454786828701613cf4565b92509250509250925092565b5f67ffffffffffffffff82111561456d5761456c613b6e565b5b602082029050602081019050919050565b5f61459061458b84614553565b613bcc565b905080838252602082019050602084028301858111156145b3576145b2613cf0565b5b835b818110156145fa57803567ffffffffffffffff8111156145d8576145d7613b56565b5b8086016145e58982613c65565b855260208501945050506020810190506145b5565b5050509392505050565b5f82601f83011261461857614617613b56565b5b813561462884826020860161457e565b91505092915050565b5f6020828403121561464657614645613b4e565b5b5f82013567ffffffffffffffff81111561466357614662613b52565b5b61466f84828501614604565b91505092915050565b61468181613dd6565b811461468b575f80fd5b50565b5f8135905061469c81614678565b92915050565b5f80604083850312156146b8576146b7613b4e565b5b5f6146c585828601613cd8565b92505060206146d68582860161468e565b9150509250929050565b5f67ffffffffffffffff8211156146fa576146f9613b6e565b5b61470382613b5e565b9050602081019050919050565b5f61472261471d846146e0565b613bcc565b90508281526020810184848401111561473e5761473d613b5a565b5b614749848285613c16565b509392505050565b5f82601f83011261476557614764613b56565b5b8135614775848260208601614710565b91505092915050565b5f805f806080858703121561479657614795613b4e565b5b5f6147a387828801613cd8565b94505060206147b487828801613cd8565b93505060406147c587828801614021565b925050606085013567ffffffffffffffff8111156147e6576147e5613b52565b5b6147f287828801614751565b91505092959194509250565b5f806040838503121561481457614813613b4e565b5b5f83013567ffffffffffffffff81111561483157614830613b52565b5b61483d85828601613c65565b925050602061484e8582860161468e565b9150509250929050565b5f806040838503121561486e5761486d613b4e565b5b5f61487b85828601613cd8565b925050602061488c85828601613cd8565b9150509250929050565b5f81905092915050565b5f6148aa82613f71565b6148b48185614896565b93506148c4818560208601613f8b565b80840191505092915050565b5f6148db82846148a0565b915081905092915050565b7f4552524f523a204d696e7465722054797065206e6f7420666f756e642e0000005f82015250565b5f61491a601d83613f7b565b9150614925826148e6565b602082019050919050565b5f6020820190508181035f8301526149478161490e565b9050919050565b7f574c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614982600283614896565b915061498d8261494e565b600282019050919050565b5f6149a282614976565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806149f057607f821691505b602082108103614a0357614a026149ac565b5b50919050565b5f8160601b9050919050565b5f614a1f82614a09565b9050919050565b5f614a3082614a15565b9050919050565b614a48614a4382613cb1565b614a26565b82525050565b5f614a598284614a37565b60148201915081905092915050565b7f4552524f523a204d696e74657273496e666f206e6f7420666f756e642e0000005f82015250565b5f614a9c601d83613f7b565b9150614aa782614a68565b602082019050919050565b5f6020820190508181035f830152614ac981614a90565b9050919050565b7f4d696e74657273496e666f206e6f7420666f756e642e000000000000000000005f82015250565b5f614b04601683613f7b565b9150614b0f82614ad0565b602082019050919050565b5f6020820190508181035f830152614b3181614af8565b9050919050565b7f4552524f523a204d696e74206973206e6f74206163746976652e0000000000005f82015250565b5f614b6c601a83613f7b565b9150614b7782614b38565b602082019050919050565b5f6020820190508181035f830152614b9981614b60565b9050919050565b7f4552524f523a20596f7520617265206e6f7420616c6c6f77656420746f206d695f8201527f6e74206f6e20746869732070686173652e000000000000000000000000000000602082015250565b5f614bfa603183613f7b565b9150614c0582614ba0565b604082019050919050565b5f6020820190508181035f830152614c2781614bee565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614c6582613e34565b9150614c7083613e34565b9250828201905080821115614c8857614c87614c2e565b5b92915050565b7f4552524f523a204d6178696d756d206e756d626572206f66206d696e7473206f5f8201527f6e207468697320706861736520686173206265656e2072656163686564000000602082015250565b5f614ce8603d83613f7b565b9150614cf382614c8e565b604082019050919050565b5f6020820190508181035f830152614d1581614cdc565b9050919050565b7f4552524f523a204d6178696d756d206e756d626572206f66206d696e747320705f8201527f6572207472616e73616374696f6e206578636565646564000000000000000000602082015250565b5f614d76603783613f7b565b9150614d8182614d1c565b604082019050919050565b5f6020820190508181035f830152614da381614d6a565b9050919050565b5f614db48261420b565b9150614dbf8361420b565b9250828201905060ff811115614dd857614dd7614c2e565b5b92915050565b7f4552524f523a20596f7572206d6178696d756d204e4654206d696e74207065725f8201527f2077616c6c6574206f6e207468697320706861736520686173206265656e207260208201527f6561636865642e00000000000000000000000000000000000000000000000000604082015250565b5f614e5e604783613f7b565b9150614e6982614dde565b606082019050919050565b5f6020820190508181035f830152614e8b81614e52565b9050919050565b5f614e9c82613e34565b9150614ea783613e34565b9250828202614eb581613e34565b91508282048414831517614ecc57614ecb614c2e565b5b5092915050565b7f4552524f523a20596f7520646f206e6f74206861766520656e6f7567682066755f8201527f6e647320746f206d696e742e0000000000000000000000000000000000000000602082015250565b5f614f2d602c83613f7b565b9150614f3882614ed3565b604082019050919050565b5f6020820190508181035f830152614f5a81614f21565b9050919050565b5f614f6b8261420b565b9150614f768361420b565b9250828203905060ff811115614f8f57614f8e614c2e565b5b92915050565b7f5055424c494300000000000000000000000000000000000000000000000000005f82015250565b5f614fc9600683614896565b9150614fd482614f95565b600682019050919050565b5f614fe982614fbd565b9150819050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f61504d602f83613f7b565b915061505882614ff3565b604082019050919050565b5f6020820190508181035f83015261507a81615041565b9050919050565b5f819050815f5260205f209050919050565b5f815461509f816149d9565b6150a98186614896565b9450600182165f81146150c357600181146150d85761510a565b60ff198316865281151582028601935061510a565b6150e185615081565b5f5b83811015615102578154818901526001820191506020810190506150e3565b838801955050505b50505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f615147600583614896565b915061515282615113565b600582019050919050565b5f6151688285615093565b915061517482846148a0565b915061517f8261513b565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6151c282613e34565b91506151cd83613e34565b9250826151dd576151dc61518b565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261525f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615224565b6152698683615224565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6152a461529f61529a84613e34565b615281565b613e34565b9050919050565b5f819050919050565b6152bd8361528a565b6152d16152c9826152ab565b848454615230565b825550505050565b5f90565b6152e56152d9565b6152f08184846152b4565b505050565b5b81811015615313576153085f826152dd565b6001810190506152f6565b5050565b601f8211156153585761532981615081565b61533284615215565b81016020851015615341578190505b61535561534d85615215565b8301826152f5565b50505b505050565b5f82821c905092915050565b5f6153785f198460080261535d565b1980831691505092915050565b5f6153908383615369565b9150826002028217905092915050565b6153a982613f71565b67ffffffffffffffff8111156153c2576153c1613b6e565b5b6153cc82546149d9565b6153d7828285615317565b5f60209050601f831160018114615408575f84156153f6578287015190505b6154008582615385565b865550615467565b601f19841661541686615081565b5f5b8281101561543d57848901518255600182019150602085019450602081019050615418565b8683101561545a5784890151615456601f891682615369565b8355505b6001600288020188555050505b505050505050565b7f4552524f523a204e6f7420656e6f75676820746f6b656e7300000000000000005f82015250565b5f6154a3601883613f7b565b91506154ae8261546f565b602082019050919050565b5f6020820190508181035f8301526154d081615497565b9050919050565b5f819050919050565b5f6154fa6154f56154f0846154d7565b615281565b613e34565b9050919050565b61550a816154e0565b82525050565b5f6040820190506155235f830185614217565b6155306020830184615501565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f615591602683613f7b565b915061559c82615537565b604082019050919050565b5f6020820190508181035f8301526155be81615585565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6155f9602083613f7b565b9150615604826155c5565b602082019050919050565b5f6020820190508181035f830152615626816155ed565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f615661601f83613f7b565b915061566c8261562d565b602082019050919050565b5f6020820190508181035f83015261568e81615655565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f6156c9601083613f7b565b91506156d482615695565b602082019050919050565b5f6020820190508181035f8301526156f6816156bd565b9050919050565b7f4552524f523a204e6f20746f6b656e73206c65667420746f206d696e740000005f82015250565b5f615731601d83613f7b565b915061573c826156fd565b602082019050919050565b5f6020820190508181035f83015261575e81615725565b9050919050565b7f4552524f523a204e756d626572206f6620746f6b656e732073686f756c6420625f8201527f652067726561746572207468616e207a65726f00000000000000000000000000602082015250565b5f6157bf603383613f7b565b91506157ca82615765565b604082019050919050565b5f6020820190508181035f8301526157ec816157b3565b9050919050565b5f6040820190506158065f830185614217565b6158136020830184613e3d565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61583e8261581a565b6158488185615824565b9350615858818560208601613f8b565b61586181613b5e565b840191505092915050565b5f60808201905061587f5f830187614060565b61588c6020830186614060565b6158996040830185613e3d565b81810360608301526158ab8184615834565b905095945050505050565b5f815190506158c481613e90565b92915050565b5f602082840312156158df576158de613b4e565b5b5f6158ec848285016158b6565b91505092915050565b5f6158ff82613e34565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361593157615930614c2e565b5b600182019050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f615970601483613f7b565b915061597b8261593c565b602082019050919050565b5f6020820190508181035f83015261599d81615964565b905091905056fea264697066735822122015eb023ad3733e3f606f1a0b181ee462c5baebdccae5dbec8946121fd11a113c64736f6c63430008140033
Deployed Bytecode
0x6080604052600436106102ac575f3560e01c80636f8b44b011610174578063ad5a6dc5116100db578063e1c6780511610094578063e985e9c51161006e578063e985e9c514610a7d578063ed7c7fe814610ab9578063f2fde38b14610ae3578063f7b188a514610b0b576102ac565b8063e1c67805146109f1578063e7d9793714610a19578063e85ada7214610a41576102ac565b8063ad5a6dc5146108f5578063b88d4fde1461091f578063c87b56dd1461093b578063cf7c0b4914610977578063d5abeb011461099f578063d89a7574146109c9576102ac565b80638456cb591161012d5780638456cb591461081d578063858e83b5146108335780638a4d367b1461084f5780638da5cb5b1461087957806395d89b41146108a3578063a22cb465146108cd576102ac565b80636f8b44b01461072957806370a0823114610751578063715018a61461078d578063733428bf146107a3578063792a873e146107cd5780637e454447146107f5576102ac565b8063209848011161021857806342842e0e116101d157806342842e0e1461062757806347d4f57814610643578063583816691461066b5780635c975abb146106875780636107896e146106b15780636352211e146106ed576102ac565b8063209848011461051657806323b872dd14610552578063293227ab1461056e5780632b5619a41461059657806331c07bbf146105d7578063411d1be5146105ff576102ac565b8063095ea7b31161026a578063095ea7b3146103f457806309945734146104105780630e6f52721461044c57806315587fc31461048857806318160ddd146104c4578063189b83bd146104ee576102ac565b8062377580146102b057806301c392f0146102ec57806301ffc9a714610328578063055ad42e1461036457806306fdde031461038e578063081812fc146103b8575b5f80fd5b3480156102bb575f80fd5b506102d660048036038101906102d19190613d49565b610b21565b6040516102e39190613df0565b60405180910390f35b3480156102f7575f80fd5b50610312600480360381019061030d9190613e09565b610bce565b60405161031f9190613e4c565b60405180910390f35b348015610333575f80fd5b5061034e60048036038101906103499190613eba565b610c3d565b60405161035b9190613df0565b60405180910390f35b34801561036f575f80fd5b50610378610cce565b6040516103859190613f58565b60405180910390f35b348015610399575f80fd5b506103a2610ce0565b6040516103af9190613feb565b60405180910390f35b3480156103c3575f80fd5b506103de60048036038101906103d99190614035565b610d70565b6040516103eb919061406f565b60405180910390f35b61040e60048036038101906104099190614088565b610dea565b005b34801561041b575f80fd5b50610436600480360381019061043191906140c6565b610f29565b6040516104439190613e4c565b60405180910390f35b348015610457575f80fd5b50610472600480360381019061046d9190614140565b610f56565b60405161047f9190613df0565b60405180910390f35b348015610493575f80fd5b506104ae60048036038101906104a991906141b1565b610fd7565b6040516104bb9190614226565b60405180910390f35b3480156104cf575f80fd5b506104d8611019565b6040516104e59190613e4c565b60405180910390f35b3480156104f9575f80fd5b50610514600480360381019061050f919061423f565b61102e565b005b348015610521575f80fd5b5061053c60048036038101906105379190613e09565b6110c5565b6040516105499190614226565b60405180910390f35b61056c60048036038101906105679190614299565b6110e2565b005b348015610579575f80fd5b50610594600480360381019061058f91906142e9565b6113f0565b005b3480156105a1575f80fd5b506105bc60048036038101906105b791906141b1565b611487565b6040516105ce96959493929190614343565b60405180910390f35b3480156105e2575f80fd5b506105fd60048036038101906105f891906143cc565b6115bf565b005b34801561060a575f80fd5b50610625600480360381019061062091906143f7565b611670565b005b610641600480360381019061063c9190614299565b611719565b005b34801561064e575f80fd5b5061066960048036038101906106649190614451565b611738565b005b610685600480360381019061068091906144f6565b6117f7565b005b348015610692575f80fd5b5061069b611def565b6040516106a89190613df0565b60405180910390f35b3480156106bc575f80fd5b506106d760048036038101906106d29190614035565b611e05565b6040516106e4919061406f565b60405180910390f35b3480156106f8575f80fd5b50610713600480360381019061070e9190614035565b611e40565b604051610720919061406f565b60405180910390f35b348015610734575f80fd5b5061074f600480360381019061074a9190614035565b611e51565b005b34801561075c575f80fd5b5061077760048036038101906107729190613e09565b611e63565b6040516107849190613e4c565b60405180910390f35b348015610798575f80fd5b506107a1611f18565b005b3480156107ae575f80fd5b506107b7611f2b565b6040516107c49190614226565b60405180910390f35b3480156107d8575f80fd5b506107f360048036038101906107ee9190614631565b611f5c565b005b348015610800575f80fd5b5061081b600480360381019061081691906143f7565b611f7e565b005b348015610828575f80fd5b50610831612028565b005b61084d600480360381019061084891906143cc565b612042565b005b34801561085a575f80fd5b506108636123fd565b6040516108709190613e4c565b60405180910390f35b348015610884575f80fd5b5061088d612423565b60405161089a919061406f565b60405180910390f35b3480156108ae575f80fd5b506108b761244b565b6040516108c49190613feb565b60405180910390f35b3480156108d8575f80fd5b506108f360048036038101906108ee91906146a2565b6124db565b005b348015610900575f80fd5b506109096125e1565b6040516109169190614226565b60405180910390f35b6109396004803603810190610934919061477e565b612612565b005b348015610946575f80fd5b50610961600480360381019061095c9190614035565b612684565b60405161096e9190613feb565b60405180910390f35b348015610982575f80fd5b5061099d600480360381019061099891906142e9565b6127d4565b005b3480156109aa575f80fd5b506109b361286b565b6040516109c09190613e4c565b60405180910390f35b3480156109d4575f80fd5b506109ef60048036038101906109ea9190614451565b612871565b005b3480156109fc575f80fd5b50610a176004803603810190610a1291906147fe565b612995565b005b348015610a24575f80fd5b50610a3f6004803603810190610a3a91906143cc565b612a22565b005b348015610a4c575f80fd5b50610a676004803603810190610a629190613e09565b612ae4565b604051610a749190613e4c565b60405180910390f35b348015610a88575f80fd5b50610aa36004803603810190610a9e9190614858565b612b53565b604051610ab09190613df0565b60405180910390f35b348015610ac4575f80fd5b50610acd612be1565b604051610ada9190613e4c565b60405180910390f35b348015610aee575f80fd5b50610b096004803603810190610b049190613e09565b612c07565b005b348015610b16575f80fd5b50610b1f612c89565b005b5f805f1b600b86604051610b3591906148d0565b90815260200160405180910390206003015403610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90614930565b60405180910390fd5b610bb4848484600b89604051610b9d91906148d0565b908152602001604051809103902060030154610f56565b15610bc25760019050610bc6565b5f90505b949350505050565b5f600f604051610bdd90614998565b90815260200160405180910390205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff169050919050565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cc75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600d5f9054906101000a900460ff1681565b606060028054610cef906149d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1b906149d9565b8015610d665780601f10610d3d57610100808354040283529160200191610d66565b820191905f5260205f20905b815481529060010190602001808311610d4957829003601f168201915b5050505050905090565b5f610d7a82612c9b565b610db0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610df482611e40565b90508073ffffffffffffffffffffffffffffffffffffffff16610e15612cf5565b73ffffffffffffffffffffffffffffffffffffffff1614610e7857610e4181610e3c612cf5565b612b53565b610e77576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b5f8085604051602001610f699190614a4e565b604051602081830303815290604052805190602001209050610fcc8585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508483612cfc565b915050949350505050565b600f82805160208101820180518482526020830160208501208183528095505050505050602052805f5260405f205f915091509054906101000a900460ff1681565b5f611022612d12565b6001545f540303905090565b611036612d16565b5f801b600b8360405161104991906148d0565b9081526020016040518091039020600301540361109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614ab2565b60405180910390fd5b80600b836040516110ac91906148d0565b9081526020016040518091039020600301819055505050565b6010602052805f5260405f205f915054906101000a900460ff1681565b5f6110ec82612d94565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611153576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061115e84612e57565b91509150611174818761116f612cf5565b612e7a565b6111c05761118986611184612cf5565b612b53565b6111bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611225576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112328686866001612ebd565b801561123c575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550611304856112e0888887612ec3565b7c020000000000000000000000000000000000000000000000000000000017612eea565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603611380575f6001850190505f60045f8381526020019081526020015f20540361137e575f54811461137d578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113e88686866001612f14565b505050505050565b6113f8612d16565b5f801b600b8360405161140b91906148d0565b9081526020016040518091039020600301540361145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490614b1a565b60405180910390fd5b80600b8360405161146e91906148d0565b9081526020016040518091039020600201819055505050565b5f805f805f805f600f8960405161149e91906148d0565b90815260200160405180910390205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050600d5f9054906101000a900460ff16600281111561151757611516613ee5565b5b600b8a60405161152791906148d0565b90815260200160405180910390205f015f9054906101000a900460ff16600b8b60405161155491906148d0565b908152602001604051809103902060020154600b8c60405161157691906148d0565b908152602001604051809103902060010154600c8d60405161159891906148d0565b90815260200160405180910390205485965096509650965096509650509295509295509295565b6115c7612d16565b8060ff1660028111156115dd576115dc613ee5565b5b600d5f6101000a81548160ff02191690836002811115611600576115ff613ee5565b5b0217905550600d5f9054906101000a900460ff16600281111561162657611625613ee5565b5b60ff16423373ffffffffffffffffffffffffffffffffffffffff167f7d7f6ed6d84cc6a4531c22effb48bb76d643459a9d3398dab7ddb04f6fb01ebc60405160405180910390a450565b611678612d16565b5f801b600b8360405161168b91906148d0565b908152602001604051809103902060030154036116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d490614b1a565b60405180910390fd5b80600b836040516116ee91906148d0565b90815260200160405180910390205f015f6101000a81548160ff021916908360ff1602179055505050565b61173383838360405180602001604052805f815250612612565b505050565b611740612d16565b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b8860405161178191906148d0565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b6117ff612f1a565b611807612f69565b6001600281111561181b5761181a613ee5565b5b600d5f9054906101000a900460ff16600281111561183c5761183b613ee5565b5b1461187c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187390614b82565b60405180910390fd5b5f6040518060400160405280600281526020017f574c00000000000000000000000000000000000000000000000000000000000081525090505f6118e3338585600b866040516118cc91906148d0565b908152602001604051809103902060030154610f56565b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614c10565b60405180910390fd5b600b8260405161193291906148d0565b9081526020016040518091039020600101548560ff16600c8460405161195891906148d0565b9081526020016040518091039020546119719190614c5b565b11156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614cfe565b60405180910390fd5b600b826040516119c291906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff168560ff161115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614d8c565b60405180910390fd5b600b82604051611a3791906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff1685600f84604051611a6891906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611ac89190614daa565b60ff161115611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0390614e74565b60405180910390fd5b5f60105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff161115611bda578460ff16600b83604051611b7491906148d0565b908152602001604051809103902060020154611b909190614e92565b905080341015611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc90614f43565b60405180910390fd5b611d8a565b60018560ff1603611c78575f60105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff1614611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614f43565b60405180910390fd5b611d33565b60018560ff161115611d3257600b82604051611c9491906148d0565b90815260200160405180910390205f0160019054906101000a900460ff1685611cbd9190614f61565b60ff16600b83604051611cd091906148d0565b908152602001604051809103902060020154611cec9190614e92565b905080341015611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614f43565b60405180910390fd5b5b5b600160105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360ff1602179055505b611d92612423565b73ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f19350505050158015611dd4573d5f803e3d5ffd5b50611de0828683612fb3565b5050611dea613214565b505050565b5f600860149054906101000a900460ff16905090565b60118181548110611e14575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611e4a82612d94565b9050919050565b611e59612d16565b80600a8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ec9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611f20612d16565b611f295f61321e565b565b5f600b604051611f3a90614998565b90815260200160405180910390205f015f9054906101000a900460ff16905090565b611f64612d16565b8060139080519060200190611f7a929190613a73565b5050565b611f86612d16565b5f801b600b83604051611f9991906148d0565b90815260200160405180910390206003015403611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614b1a565b60405180910390fd5b80600b83604051611ffc91906148d0565b90815260200160405180910390205f0160016101000a81548160ff021916908360ff1602179055505050565b612030612d16565b612038612f69565b6120406132e1565b565b61204a612f1a565b612052612f69565b5f600281111561206557612064613ee5565b5b600d5f9054906101000a900460ff16600281111561208657612085613ee5565b5b036120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90614b82565b60405180910390fd5b5f6040518060400160405280600681526020017f5055424c494300000000000000000000000000000000000000000000000000008152509050600b8160405161210f91906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff168260ff161115612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b90614d8c565b60405180910390fd5b600b8160405161218491906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff1682600f836040516121b591906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166122159190614daa565b60ff161115612259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225090614e74565b60405180910390fd5b6001600281111561226d5761226c613ee5565b5b600d5f9054906101000a900460ff16600281111561228e5761228d613ee5565b5b0361232457600b816040516122a391906148d0565b9081526020016040518091039020600101548260ff16600c836040516122c991906148d0565b9081526020016040518091039020546122e29190614c5b565b1115612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90614cfe565b60405180910390fd5b5b5f8260ff16600b8360405161233991906148d0565b9081526020016040518091039020600201546123559190614e92565b90508034101561239a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239190614f43565b60405180910390fd5b6123a2612423565b73ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f193505050501580156123e4573d5f803e3d5ffd5b506123f0828483612fb3565b50506123fa613214565b50565b5f600b60405161240c90614fdf565b908152602001604051809103902060020154905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461245a906149d9565b80601f0160208091040260200160405190810160405280929190818152602001828054612486906149d9565b80156124d15780601f106124a8576101008083540402835291602001916124d1565b820191905f5260205f20905b8154815290600101906020018083116124b457829003601f168201915b5050505050905090565b8060075f6124e7612cf5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612590612cf5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125d59190613df0565b60405180910390a35050565b5f600b6040516125f090614fdf565b90815260200160405180910390205f015f9054906101000a900460ff16905090565b61261d8484846110e2565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461267e5761264784848484613344565b61267d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061268f82612c9b565b6126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590615063565b60405180910390fd5b60145f9054906101000a900460ff16156127145760126126ed8361348f565b6040516020016126fe92919061515d565b60405160208183030381529060405290506127cf565b5f6013805490508361272691906151b8565b90506013818154811061273c5761273b6151e8565b5b905f5260205f2001805461274f906149d9565b80601f016020809104026020016040519081016040528092919081815260200182805461277b906149d9565b80156127c65780601f1061279d576101008083540402835291602001916127c6565b820191905f5260205f20905b8154815290600101906020018083116127a957829003601f168201915b50505050509150505b919050565b6127dc612d16565b5f801b600b836040516127ef91906148d0565b90815260200160405180910390206003015403612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890614b1a565b60405180910390fd5b80600b8360405161285291906148d0565b9081526020016040518091039020600101819055505050565b600a5481565b612879612d16565b5f801b600b8760405161288c91906148d0565b908152602001604051809103902060030154036128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590614b1a565b60405180910390fd5b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b8860405161291f91906148d0565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b61299d612d16565b8060145f6101000a81548160ff02191690831515021790555081601290816129c591906153a0565b5060145f9054906101000a900460ff1615612a1e573373ffffffffffffffffffffffffffffffffffffffff167f2a10c355cd3f8130b128e45782d3e92e6c0b4ba2e844d06f49a48ee23f1f21f760405160405180910390a25b5050565b612a2a612d16565b600a548160ff16612a39613559565b612a439190614c5b565b1115612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b906154b9565b60405180910390fd5b612a91338260ff1661356a565b3373ffffffffffffffffffffffffffffffffffffffff167fc06d53176829f80e4279d4c047b74872abc9e10a4c210a24abff21de3d077740825f604051612ad9929190615510565b60405180910390a250565b5f600f604051612af390614fdf565b90815260200160405180910390205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff169050919050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f600b604051612bf090614998565b908152602001604051809103902060020154905090565b612c0f612d16565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c74906155a7565b60405180910390fd5b612c868161321e565b50565b612c91612d16565b612c99613587565b565b5f81612ca5612d12565b11158015612cb357505f5482105b8015612cee57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f82612d0885846135e9565b1490509392505050565b5f90565b612d1e61363d565b73ffffffffffffffffffffffffffffffffffffffff16612d3c612423565b73ffffffffffffffffffffffffffffffffffffffff1614612d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d899061560f565b60405180910390fd5b565b5f8082905080612da2612d12565b11612e20575f54811015612e1f575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603612e1d575b5f8103612e135760045f836001900393508381526020019081526020015f20549050612dec565b8092505050612e52565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612ed9868684613644565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600260095403612f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5690615677565b60405180910390fd5b6002600981905550565b612f71611def565b15612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa8906156df565b60405180910390fd5b565b600a548260ff16612fc2613559565b612fcc9190614c5b565b111561300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490615747565b60405180910390fd5b5f8260ff1611613052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613049906157d5565b60405180910390fd5b61305f338360ff1661356a565b8160ff16600c8460405161307391906148d0565b90815260200160405180910390205f82825461308f9190614c5b565b9250508190555081600f846040516130a791906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900460ff1661310a9190614daa565b92506101000a81548160ff021916908360ff160217905550601133908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fc06d53176829f80e4279d4c047b74872abc9e10a4c210a24abff21de3d07774083836040516131ca9291906157f3565b60405180910390a2600a546131dd613559565b1061320f577f52df9fe5b9c9a7b0b4fdc2c9f89387959e35e4209c2a8d133a2b8165edad2a0460405160405180910390a15b505050565b6001600981905550565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132e9612f69565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861332d61363d565b60405161333a919061406f565b60405180910390a1565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613369612cf5565b8786866040518563ffffffff1660e01b815260040161338b949392919061586c565b6020604051808303815f875af19250505080156133c657506040513d601f19601f820116820180604052508101906133c391906158ca565b60015b61343c573d805f81146133f4576040519150601f19603f3d011682016040523d82523d5f602084013e6133f9565b606091505b505f815103613434576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60605f600161349d8461364c565b0190505f8167ffffffffffffffff8111156134bb576134ba613b6e565b5b6040519080825280601f01601f1916602001820160405280156134ed5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561354e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816135435761354261518b565b5b0494505f85036134fa575b819350505050919050565b5f613562612d12565b5f5403905090565b613583828260405180602001604052805f81525061379d565b5050565b61358f613834565b5f600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6135d261363d565b6040516135df919061406f565b60405180910390a1565b5f808290505f5b84518110156136325761361d828683815181106136105761360f6151e8565b5b602002602001015161387d565b9150808061362a906158f5565b9150506135f0565b508091505092915050565b5f33905090565b5f9392505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136a8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161369e5761369d61518b565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106136e5576d04ee2d6d415b85acef810000000083816136db576136da61518b565b5b0492506020810190505b662386f26fc10000831061371457662386f26fc10000838161370a5761370961518b565b5b0492506010810190505b6305f5e100831061373d576305f5e10083816137335761373261518b565b5b0492506008810190505b61271083106137625761271083816137585761375761518b565b5b0492506004810190505b60648310613785576064838161377b5761377a61518b565b5b0492506002810190505b600a8310613794576001810190505b80915050919050565b6137a783836138a7565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461382f575f805490505f83820390505b6137e35f868380600101945086613344565b613819576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106137d157815f541461382c575f80fd5b50505b505050565b61383c611def565b61387b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387290615986565b60405180910390fd5b565b5f8183106138945761388f8284613a50565b61389f565b61389e8383613a50565b5b905092915050565b5f805490505f82036138e5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138f15f848385612ebd565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613963836139545f865f612ec3565b61395d85613a64565b17612eea565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146139fd5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506139c4565b505f8203613a37576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819055505050613a4b5f848385612f14565b505050565b5f825f528160205260405f20905092915050565b5f6001821460e11b9050919050565b828054828255905f5260205f20908101928215613ab9579160200282015b82811115613ab8578251829081613aa891906153a0565b5091602001919060010190613a91565b5b509050613ac69190613aca565b5090565b5b80821115613ae9575f8181613ae09190613aed565b50600101613acb565b5090565b508054613af9906149d9565b5f825580601f10613b0a5750613b27565b601f0160209004905f5260205f2090810190613b269190613b2a565b5b50565b5b80821115613b41575f815f905550600101613b2b565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613ba482613b5e565b810181811067ffffffffffffffff82111715613bc357613bc2613b6e565b5b80604052505050565b5f613bd5613b45565b9050613be18282613b9b565b919050565b5f67ffffffffffffffff821115613c0057613bff613b6e565b5b613c0982613b5e565b9050602081019050919050565b828183375f83830152505050565b5f613c36613c3184613be6565b613bcc565b905082815260208101848484011115613c5257613c51613b5a565b5b613c5d848285613c16565b509392505050565b5f82601f830112613c7957613c78613b56565b5b8135613c89848260208601613c24565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613cbb82613c92565b9050919050565b613ccb81613cb1565b8114613cd5575f80fd5b50565b5f81359050613ce681613cc2565b92915050565b5f80fd5b5f80fd5b5f8083601f840112613d0957613d08613b56565b5b8235905067ffffffffffffffff811115613d2657613d25613cec565b5b602083019150836020820283011115613d4257613d41613cf0565b5b9250929050565b5f805f8060608587031215613d6157613d60613b4e565b5b5f85013567ffffffffffffffff811115613d7e57613d7d613b52565b5b613d8a87828801613c65565b9450506020613d9b87828801613cd8565b935050604085013567ffffffffffffffff811115613dbc57613dbb613b52565b5b613dc887828801613cf4565b925092505092959194509250565b5f8115159050919050565b613dea81613dd6565b82525050565b5f602082019050613e035f830184613de1565b92915050565b5f60208284031215613e1e57613e1d613b4e565b5b5f613e2b84828501613cd8565b91505092915050565b5f819050919050565b613e4681613e34565b82525050565b5f602082019050613e5f5f830184613e3d565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e9981613e65565b8114613ea3575f80fd5b50565b5f81359050613eb481613e90565b92915050565b5f60208284031215613ecf57613ece613b4e565b5b5f613edc84828501613ea6565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110613f2357613f22613ee5565b5b50565b5f819050613f3382613f12565b919050565b5f613f4282613f26565b9050919050565b613f5281613f38565b82525050565b5f602082019050613f6b5f830184613f49565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fa8578082015181840152602081019050613f8d565b5f8484015250505050565b5f613fbd82613f71565b613fc78185613f7b565b9350613fd7818560208601613f8b565b613fe081613b5e565b840191505092915050565b5f6020820190508181035f8301526140038184613fb3565b905092915050565b61401481613e34565b811461401e575f80fd5b50565b5f8135905061402f8161400b565b92915050565b5f6020828403121561404a57614049613b4e565b5b5f61405784828501614021565b91505092915050565b61406981613cb1565b82525050565b5f6020820190506140825f830184614060565b92915050565b5f806040838503121561409e5761409d613b4e565b5b5f6140ab85828601613cd8565b92505060206140bc85828601614021565b9150509250929050565b5f602082840312156140db576140da613b4e565b5b5f82013567ffffffffffffffff8111156140f8576140f7613b52565b5b61410484828501613c65565b91505092915050565b5f819050919050565b61411f8161410d565b8114614129575f80fd5b50565b5f8135905061413a81614116565b92915050565b5f805f806060858703121561415857614157613b4e565b5b5f61416587828801613cd8565b945050602085013567ffffffffffffffff81111561418657614185613b52565b5b61419287828801613cf4565b935093505060406141a58782880161412c565b91505092959194509250565b5f80604083850312156141c7576141c6613b4e565b5b5f83013567ffffffffffffffff8111156141e4576141e3613b52565b5b6141f085828601613c65565b925050602061420185828601613cd8565b9150509250929050565b5f60ff82169050919050565b6142208161420b565b82525050565b5f6020820190506142395f830184614217565b92915050565b5f806040838503121561425557614254613b4e565b5b5f83013567ffffffffffffffff81111561427257614271613b52565b5b61427e85828601613c65565b925050602061428f8582860161412c565b9150509250929050565b5f805f606084860312156142b0576142af613b4e565b5b5f6142bd86828701613cd8565b93505060206142ce86828701613cd8565b92505060406142df86828701614021565b9150509250925092565b5f80604083850312156142ff576142fe613b4e565b5b5f83013567ffffffffffffffff81111561431c5761431b613b52565b5b61432885828601613c65565b925050602061433985828601614021565b9150509250929050565b5f60c0820190506143565f830189614217565b6143636020830188614217565b6143706040830187613e3d565b61437d6060830186613e3d565b61438a6080830185613e3d565b61439760a0830184614217565b979650505050505050565b6143ab8161420b565b81146143b5575f80fd5b50565b5f813590506143c6816143a2565b92915050565b5f602082840312156143e1576143e0613b4e565b5b5f6143ee848285016143b8565b91505092915050565b5f806040838503121561440d5761440c613b4e565b5b5f83013567ffffffffffffffff81111561442a57614429613b52565b5b61443685828601613c65565b9250506020614447858286016143b8565b9150509250929050565b5f805f805f8060c0878903121561446b5761446a613b4e565b5b5f87013567ffffffffffffffff81111561448857614487613b52565b5b61449489828a01613c65565b96505060206144a589828a016143b8565b95505060406144b689828a016143b8565b94505060606144c789828a01614021565b93505060806144d889828a01614021565b92505060a06144e989828a0161412c565b9150509295509295509295565b5f805f6040848603121561450d5761450c613b4e565b5b5f61451a868287016143b8565b935050602084013567ffffffffffffffff81111561453b5761453a613b52565b5b61454786828701613cf4565b92509250509250925092565b5f67ffffffffffffffff82111561456d5761456c613b6e565b5b602082029050602081019050919050565b5f61459061458b84614553565b613bcc565b905080838252602082019050602084028301858111156145b3576145b2613cf0565b5b835b818110156145fa57803567ffffffffffffffff8111156145d8576145d7613b56565b5b8086016145e58982613c65565b855260208501945050506020810190506145b5565b5050509392505050565b5f82601f83011261461857614617613b56565b5b813561462884826020860161457e565b91505092915050565b5f6020828403121561464657614645613b4e565b5b5f82013567ffffffffffffffff81111561466357614662613b52565b5b61466f84828501614604565b91505092915050565b61468181613dd6565b811461468b575f80fd5b50565b5f8135905061469c81614678565b92915050565b5f80604083850312156146b8576146b7613b4e565b5b5f6146c585828601613cd8565b92505060206146d68582860161468e565b9150509250929050565b5f67ffffffffffffffff8211156146fa576146f9613b6e565b5b61470382613b5e565b9050602081019050919050565b5f61472261471d846146e0565b613bcc565b90508281526020810184848401111561473e5761473d613b5a565b5b614749848285613c16565b509392505050565b5f82601f83011261476557614764613b56565b5b8135614775848260208601614710565b91505092915050565b5f805f806080858703121561479657614795613b4e565b5b5f6147a387828801613cd8565b94505060206147b487828801613cd8565b93505060406147c587828801614021565b925050606085013567ffffffffffffffff8111156147e6576147e5613b52565b5b6147f287828801614751565b91505092959194509250565b5f806040838503121561481457614813613b4e565b5b5f83013567ffffffffffffffff81111561483157614830613b52565b5b61483d85828601613c65565b925050602061484e8582860161468e565b9150509250929050565b5f806040838503121561486e5761486d613b4e565b5b5f61487b85828601613cd8565b925050602061488c85828601613cd8565b9150509250929050565b5f81905092915050565b5f6148aa82613f71565b6148b48185614896565b93506148c4818560208601613f8b565b80840191505092915050565b5f6148db82846148a0565b915081905092915050565b7f4552524f523a204d696e7465722054797065206e6f7420666f756e642e0000005f82015250565b5f61491a601d83613f7b565b9150614925826148e6565b602082019050919050565b5f6020820190508181035f8301526149478161490e565b9050919050565b7f574c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614982600283614896565b915061498d8261494e565b600282019050919050565b5f6149a282614976565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806149f057607f821691505b602082108103614a0357614a026149ac565b5b50919050565b5f8160601b9050919050565b5f614a1f82614a09565b9050919050565b5f614a3082614a15565b9050919050565b614a48614a4382613cb1565b614a26565b82525050565b5f614a598284614a37565b60148201915081905092915050565b7f4552524f523a204d696e74657273496e666f206e6f7420666f756e642e0000005f82015250565b5f614a9c601d83613f7b565b9150614aa782614a68565b602082019050919050565b5f6020820190508181035f830152614ac981614a90565b9050919050565b7f4d696e74657273496e666f206e6f7420666f756e642e000000000000000000005f82015250565b5f614b04601683613f7b565b9150614b0f82614ad0565b602082019050919050565b5f6020820190508181035f830152614b3181614af8565b9050919050565b7f4552524f523a204d696e74206973206e6f74206163746976652e0000000000005f82015250565b5f614b6c601a83613f7b565b9150614b7782614b38565b602082019050919050565b5f6020820190508181035f830152614b9981614b60565b9050919050565b7f4552524f523a20596f7520617265206e6f7420616c6c6f77656420746f206d695f8201527f6e74206f6e20746869732070686173652e000000000000000000000000000000602082015250565b5f614bfa603183613f7b565b9150614c0582614ba0565b604082019050919050565b5f6020820190508181035f830152614c2781614bee565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614c6582613e34565b9150614c7083613e34565b9250828201905080821115614c8857614c87614c2e565b5b92915050565b7f4552524f523a204d6178696d756d206e756d626572206f66206d696e7473206f5f8201527f6e207468697320706861736520686173206265656e2072656163686564000000602082015250565b5f614ce8603d83613f7b565b9150614cf382614c8e565b604082019050919050565b5f6020820190508181035f830152614d1581614cdc565b9050919050565b7f4552524f523a204d6178696d756d206e756d626572206f66206d696e747320705f8201527f6572207472616e73616374696f6e206578636565646564000000000000000000602082015250565b5f614d76603783613f7b565b9150614d8182614d1c565b604082019050919050565b5f6020820190508181035f830152614da381614d6a565b9050919050565b5f614db48261420b565b9150614dbf8361420b565b9250828201905060ff811115614dd857614dd7614c2e565b5b92915050565b7f4552524f523a20596f7572206d6178696d756d204e4654206d696e74207065725f8201527f2077616c6c6574206f6e207468697320706861736520686173206265656e207260208201527f6561636865642e00000000000000000000000000000000000000000000000000604082015250565b5f614e5e604783613f7b565b9150614e6982614dde565b606082019050919050565b5f6020820190508181035f830152614e8b81614e52565b9050919050565b5f614e9c82613e34565b9150614ea783613e34565b9250828202614eb581613e34565b91508282048414831517614ecc57614ecb614c2e565b5b5092915050565b7f4552524f523a20596f7520646f206e6f74206861766520656e6f7567682066755f8201527f6e647320746f206d696e742e0000000000000000000000000000000000000000602082015250565b5f614f2d602c83613f7b565b9150614f3882614ed3565b604082019050919050565b5f6020820190508181035f830152614f5a81614f21565b9050919050565b5f614f6b8261420b565b9150614f768361420b565b9250828203905060ff811115614f8f57614f8e614c2e565b5b92915050565b7f5055424c494300000000000000000000000000000000000000000000000000005f82015250565b5f614fc9600683614896565b9150614fd482614f95565b600682019050919050565b5f614fe982614fbd565b9150819050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f61504d602f83613f7b565b915061505882614ff3565b604082019050919050565b5f6020820190508181035f83015261507a81615041565b9050919050565b5f819050815f5260205f209050919050565b5f815461509f816149d9565b6150a98186614896565b9450600182165f81146150c357600181146150d85761510a565b60ff198316865281151582028601935061510a565b6150e185615081565b5f5b83811015615102578154818901526001820191506020810190506150e3565b838801955050505b50505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f615147600583614896565b915061515282615113565b600582019050919050565b5f6151688285615093565b915061517482846148a0565b915061517f8261513b565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6151c282613e34565b91506151cd83613e34565b9250826151dd576151dc61518b565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261525f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615224565b6152698683615224565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6152a461529f61529a84613e34565b615281565b613e34565b9050919050565b5f819050919050565b6152bd8361528a565b6152d16152c9826152ab565b848454615230565b825550505050565b5f90565b6152e56152d9565b6152f08184846152b4565b505050565b5b81811015615313576153085f826152dd565b6001810190506152f6565b5050565b601f8211156153585761532981615081565b61533284615215565b81016020851015615341578190505b61535561534d85615215565b8301826152f5565b50505b505050565b5f82821c905092915050565b5f6153785f198460080261535d565b1980831691505092915050565b5f6153908383615369565b9150826002028217905092915050565b6153a982613f71565b67ffffffffffffffff8111156153c2576153c1613b6e565b5b6153cc82546149d9565b6153d7828285615317565b5f60209050601f831160018114615408575f84156153f6578287015190505b6154008582615385565b865550615467565b601f19841661541686615081565b5f5b8281101561543d57848901518255600182019150602085019450602081019050615418565b8683101561545a5784890151615456601f891682615369565b8355505b6001600288020188555050505b505050505050565b7f4552524f523a204e6f7420656e6f75676820746f6b656e7300000000000000005f82015250565b5f6154a3601883613f7b565b91506154ae8261546f565b602082019050919050565b5f6020820190508181035f8301526154d081615497565b9050919050565b5f819050919050565b5f6154fa6154f56154f0846154d7565b615281565b613e34565b9050919050565b61550a816154e0565b82525050565b5f6040820190506155235f830185614217565b6155306020830184615501565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f615591602683613f7b565b915061559c82615537565b604082019050919050565b5f6020820190508181035f8301526155be81615585565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6155f9602083613f7b565b9150615604826155c5565b602082019050919050565b5f6020820190508181035f830152615626816155ed565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f615661601f83613f7b565b915061566c8261562d565b602082019050919050565b5f6020820190508181035f83015261568e81615655565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f6156c9601083613f7b565b91506156d482615695565b602082019050919050565b5f6020820190508181035f8301526156f6816156bd565b9050919050565b7f4552524f523a204e6f20746f6b656e73206c65667420746f206d696e740000005f82015250565b5f615731601d83613f7b565b915061573c826156fd565b602082019050919050565b5f6020820190508181035f83015261575e81615725565b9050919050565b7f4552524f523a204e756d626572206f6620746f6b656e732073686f756c6420625f8201527f652067726561746572207468616e207a65726f00000000000000000000000000602082015250565b5f6157bf603383613f7b565b91506157ca82615765565b604082019050919050565b5f6020820190508181035f8301526157ec816157b3565b9050919050565b5f6040820190506158065f830185614217565b6158136020830184613e3d565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61583e8261581a565b6158488185615824565b9350615858818560208601613f8b565b61586181613b5e565b840191505092915050565b5f60808201905061587f5f830187614060565b61588c6020830186614060565b6158996040830185613e3d565b81810360608301526158ab8184615834565b905095945050505050565b5f815190506158c481613e90565b92915050565b5f602082840312156158df576158de613b4e565b5b5f6158ec848285016158b6565b91505092915050565b5f6158ff82613e34565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361593157615930614c2e565b5b600182019050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f615970601483613f7b565b915061597b8261593c565b602082019050919050565b5f6020820190508181035f83015261599d81615964565b905091905056fea264697066735822122015eb023ad3733e3f606f1a0b181ee462c5baebdccae5dbec8946121fd11a113c64736f6c63430008140033
Deployed Bytecode Sourcemap
91363:13259:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96933:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101712:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57963:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92013:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58865:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65356:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64789:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91853:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104303:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92120:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54616:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102074:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92256:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68995:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99435:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100674:512;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;97906:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100285:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71916:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98247:495;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93782:1922;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35886:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92366:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60258:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98093:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55800:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38744:103;;;;;;;;;;;;;:::i;:::-;;101430:129;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102327:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99993:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102776:75;;;;;;;;;;;;;:::i;:::-;;95712:1213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101309:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38103:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59041:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65914:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101567:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72707:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97300:598;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99713:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91436:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98804:623;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102460:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102859:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101857:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66305:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101196:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39002:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102703:65;;;;;;;;;;;;;:::i;:::-;;96933:359;97057:4;97119:1;97111:10;;97082:7;97090:11;97082:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39;97074:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;97170:65;97185:8;97195:12;;97209:7;97217:11;97209:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;97170:14;:65::i;:::-;97166:95;;;97257:4;97250:11;;;;97166:95;97279:5;97272:12;;96933:359;;;;;;;:::o;101712:137::-;101782:7;101809:13;:19;;;;;:::i;:::-;;;;;;;;;;;;;:32;101829:11;101809:32;;;;;;;;;;;;;;;;;;;;;;;;;101802:39;;;;101712:137;;;:::o;57963:639::-;58048:4;58387:10;58372:25;;:11;:25;;;;:102;;;;58464:10;58449:25;;:11;:25;;;;58372:102;:179;;;;58541:10;58526:25;;:11;:25;;;;58372:179;58352:199;;57963:639;;;:::o;92013:26::-;;;;;;;;;;;;;:::o;58865:100::-;58919:13;58952:5;58945:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58865:100;:::o;65356:218::-;65432:7;65457:16;65465:7;65457;:16::i;:::-;65452:64;;65482:34;;;;;;;;;;;;;;65452:64;65536:15;:24;65552:7;65536:24;;;;;;;;;;;:30;;;;;;;;;;;;65529:37;;65356:218;;;:::o;64789:408::-;64878:13;64894:16;64902:7;64894;:16::i;:::-;64878:32;;64950:5;64927:28;;:19;:17;:19::i;:::-;:28;;;64923:175;;64975:44;64992:5;64999:19;:17;:19::i;:::-;64975:16;:44::i;:::-;64970:128;;65047:35;;;;;;;;;;;;;;64970:128;64923:175;65143:2;65110:15;:24;65126:7;65110:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;65181:7;65177:2;65161:28;;65170:5;65161:28;;;;;;;;;;;;64867:330;64789:408;;:::o;91853:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;104303:308::-;104460:4;104477:13;104520:11;104503:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;104493:40;;;;;;104477:56;;104551:52;104570:12;;104551:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104584:11;104597:5;104551:18;:52::i;:::-;104544:59;;;104303:308;;;;;;:::o;92120:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54616:323::-;54677:7;54905:15;:13;:15::i;:::-;54890:12;;54874:13;;:28;:46;54867:53;;54616:323;:::o;102074:245::-;37989:13;:11;:13::i;:::-;102219:1:::1;102211:10:::0;::::1;102182:7;102190:11;102182:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;102174:81:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;102303:8;102275:7;102283:11;102275:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;:36;;;;102074:245:::0;;:::o;92256:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;68995:2825::-;69137:27;69167;69186:7;69167:18;:27::i;:::-;69137:57;;69252:4;69211:45;;69227:19;69211:45;;;69207:86;;69265:28;;;;;;;;;;;;;;69207:86;69307:27;69336:23;69363:35;69390:7;69363:26;:35::i;:::-;69306:92;;;;69498:68;69523:15;69540:4;69546:19;:17;:19::i;:::-;69498:24;:68::i;:::-;69493:180;;69586:43;69603:4;69609:19;:17;:19::i;:::-;69586:16;:43::i;:::-;69581:92;;69638:35;;;;;;;;;;;;;;69581:92;69493:180;69704:1;69690:16;;:2;:16;;;69686:52;;69715:23;;;;;;;;;;;;;;69686:52;69751:43;69773:4;69779:2;69783:7;69792:1;69751:21;:43::i;:::-;69887:15;69884:160;;;70027:1;70006:19;69999:30;69884:160;70424:18;:24;70443:4;70424:24;;;;;;;;;;;;;;;;70422:26;;;;;;;;;;;;70493:18;:22;70512:2;70493:22;;;;;;;;;;;;;;;;70491:24;;;;;;;;;;;70815:146;70852:2;70901:45;70916:4;70922:2;70926:19;70901:14;:45::i;:::-;51015:8;70873:73;70815:18;:146::i;:::-;70786:17;:26;70804:7;70786:26;;;;;;;;;;;:175;;;;71132:1;51015:8;71081:19;:47;:52;71077:627;;71154:19;71186:1;71176:7;:11;71154:33;;71343:1;71309:17;:30;71327:11;71309:30;;;;;;;;;;;;:35;71305:384;;71447:13;;71432:11;:28;71428:242;;71627:19;71594:17;:30;71612:11;71594:30;;;;;;;;;;;:52;;;;71428:242;71305:384;71135:569;71077:627;71751:7;71747:2;71732:27;;71741:4;71732:27;;;;;;;;;;;;71770:42;71791:4;71797:2;71801:7;71810:1;71770:20;:42::i;:::-;69126:2694;;;68995:2825;;;:::o;99435:270::-;37989:13;:11;:13::i;:::-;99613:1:::1;99605:10:::0;::::1;99576:7;99584:11;99576:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;99568:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;99685:12;99653:7;99661:11;99653:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;:44;;;;99435:270:::0;;:::o;100674:512::-;100765:5;100772;100779:7;100788;100797;100806:5;100826:20;100849:13;100863:11;100849:26;;;;;;:::i;:::-;;;;;;;;;;;;;:40;100876:12;100849:40;;;;;;;;;;;;;;;;;;;;;;;;;100826:63;;100941:12;;;;;;;;;;;100935:19;;;;;;;;:::i;:::-;;100969:7;100977:11;100969:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;101026:7;101034:11;101026:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;101071:7;101079:11;101071:20;;;;;;:::i;:::-;;;;;;;;;;;;;:27;;;101114:11;101126;101114:24;;;;;;:::i;:::-;;;;;;;;;;;;;;101153:14;100900:278;;;;;;;;;;;;;100674:512;;;;;;;;:::o;97906:179::-;37989:13;:11;:13::i;:::-;97992:6:::1;97985:14;;;;;;;;;;:::i;:::-;;97970:12;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;98063:12;;;;;;;;;;;98057:19;;;;;;;;:::i;:::-;;98015:62;;98040:15;98028:10;98015:62;;;;;;;;;;;;97906:179:::0;:::o;100285:320::-;37989:13;:11;:13::i;:::-;100487:1:::1;100479:10:::0;::::1;100450:7;100458:11;100450:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;100442:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;100572:25;100527:7;100535:11;100527:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;:70;;;;;;;;;;;;;;;;;;100285:320:::0;;:::o;71916:193::-;72062:39;72079:4;72085:2;72089:7;72062:39;;;;;;;;;;;;:16;:39::i;:::-;71916:193;;;:::o;98247:495::-;37989:13;:11;:13::i;:::-;98493:33:::1;98529:157;;;;;;;;98555:22;98529:157;;;;;;98592:17;98529:157;;;;;;98624:7;98529:157;;;;98646:9;98529:157;;;;98670:5;98529:157;;::::0;98493:193:::1;;98720:14;98697:7;98705:11;98697:20;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98482:260;98247:495:::0;;;;;;:::o;93782:1922::-;12379:21;:19;:21::i;:::-;35491:19:::1;:17;:19::i;:::-;93934:13:::2;93918:29;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;;93910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;93989:25;:32;;;;;;;;;;;;;;;;::::0;::::2;;94059:18;94126:60;94141:10;94153:5;;94160:7;94168:11;94160:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;94126:14;:60::i;:::-;94118:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;94306:7;94314:11;94306:20;;;;;;:::i;:::-;;;;;;;;;;;;;:27;;;94288:14;94261:41;;:11;94273;94261:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:41;;;;:::i;:::-;:72;;94253:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;94436:7;94444:11;94436:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;94418:60;;:14;:60;;;;94410:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;94618:7;94626:11;94618:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;94557:103;;94599:14;94558:13;94572:11;94558:26;;;;;;:::i;:::-;;;;;;;;;;;;;:38;94585:10;94558:38;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;;:::i;:::-;94557:103;;;;94549:187;;;;;;;;;;;;:::i;:::-;;;;;;;;;94806:1;94781:10;:22;94792:10;94781:22;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;94776:810;;;94872:14;94840:46;;:7;94848:11;94840:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;:46;;;;:::i;:::-;94827:59;;94922:10;94909:9;:23;;94901:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;94776:810;;;95075:1;95057:14;:19;;::::0;95053:445:::2;;95149:1;95123:10;:22;95134:10;95123:22;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;95115:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;95053:445;;;95244:1;95227:14;:18;;;95223:275;;;95331:7;95339:11;95331:20;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;;;;;;;;;;95314:14;:54;;;;:::i;:::-;95281:88;;:7;95289:11;95281:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;:88;;;;:::i;:::-;95268:101;;95409:10;95396:9;:23;;95388:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;95223:275;95053:445;95551:1;95526:10;:22;95537:10;95526:22;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;94776:810;95606:7;:5;:7::i;:::-;95598:25;;:36;95624:9;95598:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;95645:51;95656:11;95669:14;95685:10;95645;:51::i;:::-;93897:1807;;12423:20:::0;:18;:20::i;:::-;93782:1922;;;:::o;35886:86::-;35933:4;35957:7;;;;;;;;;;;35950:14;;35886:86;:::o;92366:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60258:152::-;60330:7;60373:27;60392:7;60373:18;:27::i;:::-;60350:52;;60258:152;;;:::o;98093:100::-;37989:13;:11;:13::i;:::-;98175:10:::1;98163:9;:22;;;;98093:100:::0;:::o;55800:233::-;55872:7;55913:1;55896:19;;:5;:19;;;55892:60;;55924:28;;;;;;;;;;;;;;55892:60;49959:13;55970:18;:25;55989:5;55970:25;;;;;;;;;;;;;;;;:55;55963:62;;55800:233;;;:::o;38744:103::-;37989:13;:11;:13::i;:::-;38809:30:::1;38836:1;38809:18;:30::i;:::-;38744:103::o:0;101430:129::-;101491:5;101516:7;:13;;;;;:::i;:::-;;;;;;;;;;;;;:35;;;;;;;;;;;;101509:42;;101430:129;:::o;102327:125::-;37989:13;:11;:13::i;:::-;102435:9:::1;102413:19;:31;;;;;;;;;;;;:::i;:::-;;102327:125:::0;:::o;99993:284::-;37989:13;:11;:13::i;:::-;100172:1:::1;100164:10:::0;::::1;100135:7;100143:11;100135:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;100127:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;100252:17;100212:7;100220:11;100212:20;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;:57;;;;;;;;;;;;;;;;;;99993:284:::0;;:::o;102776:75::-;37989:13;:11;:13::i;:::-;35491:19:::1;:17;:19::i;:::-;102835:8:::2;:6;:8::i;:::-;102776:75::o:0;95712:1213::-;12379:21;:19;:21::i;:::-;35491:19:::1;:17;:19::i;:::-;95843:8:::2;95827:24;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:24;;;;;;;;:::i;:::-;;::::0;95819:63:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;95893:25;:36;;;;;;;;;;;;;;;;::::0;::::2;;95968:7;95976:11;95968:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;95950:60;;:14;:60;;;;95942:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;96150:7;96158:11;96150:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;96089:103;;96131:14;96090:13;96104:11;96090:26;;;;;;:::i;:::-;;;;;;;;;;;;;:38;96117:10;96090:38;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;;:::i;:::-;96089:103;;;;96081:187;;;;;;;;;;;;:::i;:::-;;;;;;;;;96301:13;96285:29;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;::::0;96281:316:::2;;96492:7;96500:11;96492:20;;;;;;:::i;:::-;;;;;;;;;;;;;:27;;;96474:14;96447:41;;:11;96459;96447:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:41;;;;:::i;:::-;:72;;96439:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;96281:316;96609:18;96683:14;96651:46;;:7;96659:11;96651:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;:46;;;;:::i;:::-;96638:59;;96729:10;96716:9;:23;;96708:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;96807:7;:5;:7::i;:::-;96799:25;;:36;96825:9;96799:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;96856:51;96867:11;96880:14;96896:10;96856;:51::i;:::-;95798:1127;;12423:20:::0;:18;:20::i;:::-;95712:1213;:::o;101309:113::-;101361:7;101388;:17;;;;;:::i;:::-;;;;;;;;;;;;;:26;;;101381:33;;101309:113;:::o;38103:87::-;38149:7;38176:6;;;;;;;;;;;38169:13;;38103:87;:::o;59041:104::-;59097:13;59130:7;59123:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59041:104;:::o;65914:234::-;66061:8;66009:18;:39;66028:19;:17;:19::i;:::-;66009:39;;;;;;;;;;;;;;;:49;66049:8;66009:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;66121:8;66085:55;;66100:19;:17;:19::i;:::-;66085:55;;;66131:8;66085:55;;;;;;:::i;:::-;;;;;;;;65914:234;;:::o;101567:137::-;101632:5;101657:7;:17;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;;;;;;;;;101650:46;;101567:137;:::o;72707:407::-;72882:31;72895:4;72901:2;72905:7;72882:12;:31::i;:::-;72946:1;72928:2;:14;;;:19;72924:183;;72967:56;72998:4;73004:2;73008:7;73017:5;72967:30;:56::i;:::-;72962:145;;73051:40;;;;;;;;;;;;;;72962:145;72924:183;72707:407;;;;:::o;97300:598::-;97419:13;97472:17;97480:8;97472:7;:17::i;:::-;97450:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;97581:10;;;;;;;;;;;97577:151;;;97670:7;97679:26;97696:8;97679:16;:26::i;:::-;97653:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;97639:77;;;;97577:151;97740:15;97769:19;:26;;;;97758:8;:37;;;;:::i;:::-;97740:55;;97859:19;97879:10;97859:31;;;;;;;;:::i;:::-;;;;;;;;;97852:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97300:598;;;;:::o;99713:272::-;37989:13;:11;:13::i;:::-;99892:1:::1;99884:10:::0;::::1;99855:7;99863:11;99855:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;99847:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;99962:15;99932:7;99940:11;99932:20;;;;;;:::i;:::-;;;;;;;;;;;;;:27;;:45;;;;99713:272:::0;;:::o;91436:31::-;;;;:::o;98804:623::-;37989:13;:11;:13::i;:::-;99113:1:::1;99105:10:::0;::::1;99076:7;99084:11;99076:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;99068:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;99153:37;99193:172;;;;;;;;99219:25;99193:172;;;;;;99259:20;99193:172;;;;;;99294:10;99193:172;;;;99319:12;99193:172;;;;99346:8;99193:172;;::::0;99153:212:::1;;99401:18;99378:7;99386:11;99378:20;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99057:370;98804:623:::0;;;;;;:::o;102460:235::-;37989:13;:11;:13::i;:::-;102570:11:::1;102557:10;;:24;;;;;;;;;;;;;;;;;;102602:8;102592:7;:18;;;;;;:::i;:::-;;102627:10;;;;;;;;;;;102623:64;;;102676:10;102657:30;;;;;;;;;;;;102623:64;102460:235:::0;;:::o;102859:264::-;37989:13;:11;:13::i;:::-;102976:9:::1;;102957:14;102940:31;;:14;:12;:14::i;:::-;:31;;;;:::i;:::-;102939:46;;102931:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;103025:37;103035:10;103047:14;103025:37;;:9;:37::i;:::-;103085:10;103078:37;;;103097:14;103113:1;103078:37;;;;;;;:::i;:::-;;;;;;;;102859:264:::0;:::o;101857:145::-;101931:7;101958:13;:23;;;;;:::i;:::-;;;;;;;;;;;;;:36;101982:11;101958:36;;;;;;;;;;;;;;;;;;;;;;;;;101951:43;;;;101857:145;;;:::o;66305:164::-;66402:4;66426:18;:25;66445:5;66426:25;;;;;;;;;;;;;;;:35;66452:8;66426:35;;;;;;;;;;;;;;;;;;;;;;;;;66419:42;;66305:164;;;;:::o;101196:105::-;101244:7;101271;:13;;;;;:::i;:::-;;;;;;;;;;;;;:22;;;101264:29;;101196:105;:::o;39002:201::-;37989:13;:11;:13::i;:::-;39111:1:::1;39091:22;;:8;:22;;::::0;39083:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39167:28;39186:8;39167:18;:28::i;:::-;39002:201:::0;:::o;102703:65::-;37989:13;:11;:13::i;:::-;102750:10:::1;:8;:10::i;:::-;102703:65::o:0;66727:282::-;66792:4;66848:7;66829:15;:13;:15::i;:::-;:26;;:66;;;;;66882:13;;66872:7;:23;66829:66;:153;;;;;66981:1;50735:8;66933:17;:26;66951:7;66933:26;;;;;;;;;;;;:44;:49;66829:153;66809:173;;66727:282;;;:::o;89035:105::-;89095:7;89122:10;89115:17;;89035:105;:::o;1336:156::-;1427:4;1480;1451:25;1464:5;1471:4;1451:12;:25::i;:::-;:33;1444:40;;1336:156;;;;;:::o;54132:92::-;54188:7;54132:92;:::o;38268:132::-;38343:12;:10;:12::i;:::-;38332:23;;:7;:5;:7::i;:::-;:23;;;38324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38268:132::o;61413:1275::-;61480:7;61500:12;61515:7;61500:22;;61583:4;61564:15;:13;:15::i;:::-;:23;61560:1061;;61617:13;;61610:4;:20;61606:1015;;;61655:14;61672:17;:23;61690:4;61672:23;;;;;;;;;;;;61655:40;;61789:1;50735:8;61761:6;:24;:29;61757:845;;62426:113;62443:1;62433:6;:11;62426:113;;62486:17;:25;62504:6;;;;;;;62486:25;;;;;;;;;;;;62477:34;;62426:113;;;62572:6;62565:13;;;;;;61757:845;61632:989;61606:1015;61560:1061;62649:31;;;;;;;;;;;;;;61413:1275;;;;:::o;67890:485::-;67992:27;68021:23;68062:38;68103:15;:24;68119:7;68103:24;;;;;;;;;;;68062:65;;68280:18;68257:41;;68337:19;68331:26;68312:45;;68242:126;67890:485;;;:::o;67118:659::-;67267:11;67432:16;67425:5;67421:28;67412:37;;67592:16;67581:9;67577:32;67564:45;;67742:15;67731:9;67728:30;67720:5;67709:9;67706:20;67703:56;67693:66;;67118:659;;;;;:::o;73776:159::-;;;;;:::o;88344:311::-;88479:7;88499:16;51139:3;88525:19;:41;;88499:68;;51139:3;88593:31;88604:4;88610:2;88614:9;88593:10;:31::i;:::-;88585:40;;:62;;88578:69;;;88344:311;;;;;:::o;63236:450::-;63316:14;63484:16;63477:5;63473:28;63464:37;;63661:5;63647:11;63622:23;63618:41;63615:52;63608:5;63605:63;63595:73;;63236:450;;;;:::o;74600:158::-;;;;;:::o;12459:293::-;11861:1;12593:7;;:19;12585:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11861:1;12726:7;:18;;;;12459:293::o;36045:108::-;36116:8;:6;:8::i;:::-;36115:9;36107:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;36045:108::o;103131:1136::-;103297:9;;103277:15;103260:32;;:14;:12;:14::i;:::-;:32;;;;:::i;:::-;103259:47;;103251:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;103377:1;103359:15;:19;;;103351:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;103447:38;103457:10;103469:15;103447:38;;:9;:38::i;:::-;103557:15;103529:43;;:11;103541;103529:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;103819:15;103777:13;103791:11;103777:26;;;;;;:::i;:::-;;;;;;;;;;;;;:38;103804:10;103777:38;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;103917:16;103939:10;103917:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104024:10;104017:47;;;104036:15;104053:10;104017:47;;;;;;;:::i;:::-;;;;;;;;104179:9;;104161:14;:12;:14::i;:::-;:27;104157:99;;104210:9;;;;;;;;;;104157:99;103131:1136;;;:::o;12760:213::-;11817:1;12943:7;:22;;;;12760:213::o;39363:191::-;39437:16;39456:6;;;;;;;;;;;39437:25;;39482:8;39473:6;;:17;;;;;;;;;;;;;;;;;;39537:8;39506:40;;39527:8;39506:40;;;;;;;;;;;;39426:128;39363:191;:::o;36482:118::-;35491:19;:17;:19::i;:::-;36552:4:::1;36542:7;;:14;;;;;;;;;;;;;;;;;;36572:20;36579:12;:10;:12::i;:::-;36572:20;;;;;;:::i;:::-;;;;;;;;36482:118::o:0;75198:716::-;75361:4;75407:2;75382:45;;;75428:19;:17;:19::i;:::-;75449:4;75455:7;75464:5;75382:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;75378:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75682:1;75665:6;:13;:18;75661:235;;75711:40;;;;;;;;;;;;;;75661:235;75854:6;75848:13;75839:6;75835:2;75831:15;75824:38;75378:529;75551:54;;;75541:64;;;:6;:64;;;;75534:71;;;75198:716;;;;;;:::o;30769:718::-;30825:13;30876:14;30913:1;30893:17;30904:5;30893:10;:17::i;:::-;:21;30876:38;;30929:20;30963:6;30952:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30929:41;;30985:11;31114:6;31110:2;31106:15;31098:6;31094:28;31087:35;;31151:290;31158:4;31151:290;;;31183:5;;;;;;;;31325:10;31320:2;31313:5;31309:14;31304:32;31299:3;31291:46;31383:2;31374:11;;;;;;:::i;:::-;;;;;31417:1;31408:5;:10;31151:290;31404:21;31151:290;31462:6;31455:13;;;;;30769:718;;;:::o;55037:296::-;55092:7;55299:15;:13;:15::i;:::-;55283:13;;:31;55276:38;;55037:296;:::o;82867:112::-;82944:27;82954:2;82958:8;82944:27;;;;;;;;;;;;:9;:27::i;:::-;82867:112;;:::o;36741:120::-;35750:16;:14;:16::i;:::-;36810:5:::1;36800:7;;:15;;;;;;;;;;;;;;;;;;36831:22;36840:12;:10;:12::i;:::-;36831:22;;;;;;:::i;:::-;;;;;;;;36741:120::o:0;2055:296::-;2138:7;2158:20;2181:4;2158:27;;2201:9;2196:118;2220:5;:12;2216:1;:16;2196:118;;;2269:33;2279:12;2293:5;2299:1;2293:8;;;;;;;;:::i;:::-;;;;;;;;2269:9;:33::i;:::-;2254:48;;2234:3;;;;;:::i;:::-;;;;2196:118;;;;2331:12;2324:19;;;2055:296;;;;:::o;33999:98::-;34052:7;34079:10;34072:17;;33999:98;:::o;88045:147::-;88182:6;88045:147;;;;;:::o;27173:948::-;27226:7;27246:14;27263:1;27246:18;;27313:8;27304:5;:17;27300:106;;27351:8;27342:17;;;;;;:::i;:::-;;;;;27388:2;27378:12;;;;27300:106;27433:8;27424:5;:17;27420:106;;27471:8;27462:17;;;;;;:::i;:::-;;;;;27508:2;27498:12;;;;27420:106;27553:8;27544:5;:17;27540:106;;27591:8;27582:17;;;;;;:::i;:::-;;;;;27628:2;27618:12;;;;27540:106;27673:7;27664:5;:16;27660:103;;27710:7;27701:16;;;;;;:::i;:::-;;;;;27746:1;27736:11;;;;27660:103;27790:7;27781:5;:16;27777:103;;27827:7;27818:16;;;;;;:::i;:::-;;;;;27863:1;27853:11;;;;27777:103;27907:7;27898:5;:16;27894:103;;27944:7;27935:16;;;;;;:::i;:::-;;;;;27980:1;27970:11;;;;27894:103;28024:7;28015:5;:16;28011:68;;28062:1;28052:11;;;;28011:68;28107:6;28100:13;;;27173:948;;;:::o;82094:689::-;82225:19;82231:2;82235:8;82225:5;:19::i;:::-;82304:1;82286:2;:14;;;:19;82282:483;;82326:11;82340:13;;82326:27;;82372:13;82394:8;82388:3;:14;82372:30;;82421:233;82452:62;82491:1;82495:2;82499:7;;;;;;82508:5;82452:30;:62::i;:::-;82447:167;;82550:40;;;;;;;;;;;;;;82447:167;82649:3;82641:5;:11;82421:233;;82736:3;82719:13;;:20;82715:34;;82741:8;;;82715:34;82307:458;;82282:483;82094:689;;;:::o;36230:108::-;36297:8;:6;:8::i;:::-;36289:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;36230:108::o;9485:149::-;9548:7;9579:1;9575;:5;:51;;9606:20;9621:1;9624;9606:14;:20::i;:::-;9575:51;;;9583:20;9598:1;9601;9583:14;:20::i;:::-;9575:51;9568:58;;9485:149;;;;:::o;76376:2966::-;76449:20;76472:13;;76449:36;;76512:1;76500:8;:13;76496:44;;76522:18;;;;;;;;;;;;;;76496:44;76553:61;76583:1;76587:2;76591:12;76605:8;76553:21;:61::i;:::-;77097:1;50097:2;77067:1;:26;;77066:32;77054:8;:45;77028:18;:22;77047:2;77028:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;77376:139;77413:2;77467:33;77490:1;77494:2;77498:1;77467:14;:33::i;:::-;77434:30;77455:8;77434:20;:30::i;:::-;:66;77376:18;:139::i;:::-;77342:17;:31;77360:12;77342:31;;;;;;;;;;;:173;;;;77532:16;77563:11;77592:8;77577:12;:23;77563:37;;78113:16;78109:2;78105:25;78093:37;;78485:12;78445:8;78404:1;78342:25;78283:1;78222;78195:335;78856:1;78842:12;78838:20;78796:346;78897:3;78888:7;78885:16;78796:346;;79115:7;79105:8;79102:1;79075:25;79072:1;79069;79064:59;78950:1;78941:7;78937:15;78926:26;;78796:346;;;78800:77;79187:1;79175:8;:13;79171:45;;79197:19;;;;;;;;;;;;;;79171:45;79249:3;79233:13;:19;;;;76802:2462;;79274:60;79303:1;79307:2;79311:12;79325:8;79274:20;:60::i;:::-;76438:2904;76376:2966;;:::o;9759:268::-;9827:13;9934:1;9928:4;9921:15;9963:1;9957:4;9950:15;10004:4;9998;9988:21;9979:30;;9759:268;;;;:::o;63788:324::-;63858:14;64091:1;64081:8;64078:15;64052:24;64048:46;64038:56;;63788:324;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:117;443:1;440;433:12;457:117;566:1;563;556:12;580:102;621:6;672:2;668:7;663:2;656:5;652:14;648:28;638:38;;580:102;;;:::o;688:180::-;736:77;733:1;726:88;833:4;830:1;823:15;857:4;854:1;847:15;874:281;957:27;979:4;957:27;:::i;:::-;949:6;945:40;1087:6;1075:10;1072:22;1051:18;1039:10;1036:34;1033:62;1030:88;;;1098:18;;:::i;:::-;1030:88;1138:10;1134:2;1127:22;917:238;874:281;;:::o;1161:129::-;1195:6;1222:20;;:::i;:::-;1212:30;;1251:33;1279:4;1271:6;1251:33;:::i;:::-;1161:129;;;:::o;1296:308::-;1358:4;1448:18;1440:6;1437:30;1434:56;;;1470:18;;:::i;:::-;1434:56;1508:29;1530:6;1508:29;:::i;:::-;1500:37;;1592:4;1586;1582:15;1574:23;;1296:308;;;:::o;1610:146::-;1707:6;1702:3;1697;1684:30;1748:1;1739:6;1734:3;1730:16;1723:27;1610:146;;;:::o;1762:425::-;1840:5;1865:66;1881:49;1923:6;1881:49;:::i;:::-;1865:66;:::i;:::-;1856:75;;1954:6;1947:5;1940:21;1992:4;1985:5;1981:16;2030:3;2021:6;2016:3;2012:16;2009:25;2006:112;;;2037:79;;:::i;:::-;2006:112;2127:54;2174:6;2169:3;2164;2127:54;:::i;:::-;1846:341;1762:425;;;;;:::o;2207:340::-;2263:5;2312:3;2305:4;2297:6;2293:17;2289:27;2279:122;;2320:79;;:::i;:::-;2279:122;2437:6;2424:20;2462:79;2537:3;2529:6;2522:4;2514:6;2510:17;2462:79;:::i;:::-;2453:88;;2269:278;2207:340;;;;:::o;2553:126::-;2590:7;2630:42;2623:5;2619:54;2608:65;;2553:126;;;:::o;2685:96::-;2722:7;2751:24;2769:5;2751:24;:::i;:::-;2740:35;;2685:96;;;:::o;2787:122::-;2860:24;2878:5;2860:24;:::i;:::-;2853:5;2850:35;2840:63;;2899:1;2896;2889:12;2840:63;2787:122;:::o;2915:139::-;2961:5;2999:6;2986:20;2977:29;;3015:33;3042:5;3015:33;:::i;:::-;2915:139;;;;:::o;3060:117::-;3169:1;3166;3159:12;3183:117;3292:1;3289;3282:12;3323:568;3396:8;3406:6;3456:3;3449:4;3441:6;3437:17;3433:27;3423:122;;3464:79;;:::i;:::-;3423:122;3577:6;3564:20;3554:30;;3607:18;3599:6;3596:30;3593:117;;;3629:79;;:::i;:::-;3593:117;3743:4;3735:6;3731:17;3719:29;;3797:3;3789:4;3781:6;3777:17;3767:8;3763:32;3760:41;3757:128;;;3804:79;;:::i;:::-;3757:128;3323:568;;;;;:::o;3897:1029::-;4011:6;4019;4027;4035;4084:2;4072:9;4063:7;4059:23;4055:32;4052:119;;;4090:79;;:::i;:::-;4052:119;4238:1;4227:9;4223:17;4210:31;4268:18;4260:6;4257:30;4254:117;;;4290:79;;:::i;:::-;4254:117;4395:63;4450:7;4441:6;4430:9;4426:22;4395:63;:::i;:::-;4385:73;;4181:287;4507:2;4533:53;4578:7;4569:6;4558:9;4554:22;4533:53;:::i;:::-;4523:63;;4478:118;4663:2;4652:9;4648:18;4635:32;4694:18;4686:6;4683:30;4680:117;;;4716:79;;:::i;:::-;4680:117;4829:80;4901:7;4892:6;4881:9;4877:22;4829:80;:::i;:::-;4811:98;;;;4606:313;3897:1029;;;;;;;:::o;4932:90::-;4966:7;5009:5;5002:13;4995:21;4984:32;;4932:90;;;:::o;5028:109::-;5109:21;5124:5;5109:21;:::i;:::-;5104:3;5097:34;5028:109;;:::o;5143:210::-;5230:4;5268:2;5257:9;5253:18;5245:26;;5281:65;5343:1;5332:9;5328:17;5319:6;5281:65;:::i;:::-;5143:210;;;;:::o;5359:329::-;5418:6;5467:2;5455:9;5446:7;5442:23;5438:32;5435:119;;;5473:79;;:::i;:::-;5435:119;5593:1;5618:53;5663:7;5654:6;5643:9;5639:22;5618:53;:::i;:::-;5608:63;;5564:117;5359:329;;;;:::o;5694:77::-;5731:7;5760:5;5749:16;;5694:77;;;:::o;5777:118::-;5864:24;5882:5;5864:24;:::i;:::-;5859:3;5852:37;5777:118;;:::o;5901:222::-;5994:4;6032:2;6021:9;6017:18;6009:26;;6045:71;6113:1;6102:9;6098:17;6089:6;6045:71;:::i;:::-;5901:222;;;;:::o;6129:149::-;6165:7;6205:66;6198:5;6194:78;6183:89;;6129:149;;;:::o;6284:120::-;6356:23;6373:5;6356:23;:::i;:::-;6349:5;6346:34;6336:62;;6394:1;6391;6384:12;6336:62;6284:120;:::o;6410:137::-;6455:5;6493:6;6480:20;6471:29;;6509:32;6535:5;6509:32;:::i;:::-;6410:137;;;;:::o;6553:327::-;6611:6;6660:2;6648:9;6639:7;6635:23;6631:32;6628:119;;;6666:79;;:::i;:::-;6628:119;6786:1;6811:52;6855:7;6846:6;6835:9;6831:22;6811:52;:::i;:::-;6801:62;;6757:116;6553:327;;;;:::o;6886:180::-;6934:77;6931:1;6924:88;7031:4;7028:1;7021:15;7055:4;7052:1;7045:15;7072:116;7156:1;7149:5;7146:12;7136:46;;7162:18;;:::i;:::-;7136:46;7072:116;:::o;7194:133::-;7242:7;7271:5;7260:16;;7277:44;7315:5;7277:44;:::i;:::-;7194:133;;;:::o;7333:::-;7392:9;7425:35;7454:5;7425:35;:::i;:::-;7412:48;;7333:133;;;:::o;7472:149::-;7568:46;7608:5;7568:46;:::i;:::-;7563:3;7556:59;7472:149;;:::o;7627:240::-;7729:4;7767:2;7756:9;7752:18;7744:26;;7780:80;7857:1;7846:9;7842:17;7833:6;7780:80;:::i;:::-;7627:240;;;;:::o;7873:99::-;7925:6;7959:5;7953:12;7943:22;;7873:99;;;:::o;7978:169::-;8062:11;8096:6;8091:3;8084:19;8136:4;8131:3;8127:14;8112:29;;7978:169;;;;:::o;8153:246::-;8234:1;8244:113;8258:6;8255:1;8252:13;8244:113;;;8343:1;8338:3;8334:11;8328:18;8324:1;8319:3;8315:11;8308:39;8280:2;8277:1;8273:10;8268:15;;8244:113;;;8391:1;8382:6;8377:3;8373:16;8366:27;8215:184;8153:246;;;:::o;8405:377::-;8493:3;8521:39;8554:5;8521:39;:::i;:::-;8576:71;8640:6;8635:3;8576:71;:::i;:::-;8569:78;;8656:65;8714:6;8709:3;8702:4;8695:5;8691:16;8656:65;:::i;:::-;8746:29;8768:6;8746:29;:::i;:::-;8741:3;8737:39;8730:46;;8497:285;8405:377;;;;:::o;8788:313::-;8901:4;8939:2;8928:9;8924:18;8916:26;;8988:9;8982:4;8978:20;8974:1;8963:9;8959:17;8952:47;9016:78;9089:4;9080:6;9016:78;:::i;:::-;9008:86;;8788:313;;;;:::o;9107:122::-;9180:24;9198:5;9180:24;:::i;:::-;9173:5;9170:35;9160:63;;9219:1;9216;9209:12;9160:63;9107:122;:::o;9235:139::-;9281:5;9319:6;9306:20;9297:29;;9335:33;9362:5;9335:33;:::i;:::-;9235:139;;;;:::o;9380:329::-;9439:6;9488:2;9476:9;9467:7;9463:23;9459:32;9456:119;;;9494:79;;:::i;:::-;9456:119;9614:1;9639:53;9684:7;9675:6;9664:9;9660:22;9639:53;:::i;:::-;9629:63;;9585:117;9380:329;;;;:::o;9715:118::-;9802:24;9820:5;9802:24;:::i;:::-;9797:3;9790:37;9715:118;;:::o;9839:222::-;9932:4;9970:2;9959:9;9955:18;9947:26;;9983:71;10051:1;10040:9;10036:17;10027:6;9983:71;:::i;:::-;9839:222;;;;:::o;10067:474::-;10135:6;10143;10192:2;10180:9;10171:7;10167:23;10163:32;10160:119;;;10198:79;;:::i;:::-;10160:119;10318:1;10343:53;10388:7;10379:6;10368:9;10364:22;10343:53;:::i;:::-;10333:63;;10289:117;10445:2;10471:53;10516:7;10507:6;10496:9;10492:22;10471:53;:::i;:::-;10461:63;;10416:118;10067:474;;;;;:::o;10547:509::-;10616:6;10665:2;10653:9;10644:7;10640:23;10636:32;10633:119;;;10671:79;;:::i;:::-;10633:119;10819:1;10808:9;10804:17;10791:31;10849:18;10841:6;10838:30;10835:117;;;10871:79;;:::i;:::-;10835:117;10976:63;11031:7;11022:6;11011:9;11007:22;10976:63;:::i;:::-;10966:73;;10762:287;10547:509;;;;:::o;11062:77::-;11099:7;11128:5;11117:16;;11062:77;;;:::o;11145:122::-;11218:24;11236:5;11218:24;:::i;:::-;11211:5;11208:35;11198:63;;11257:1;11254;11247:12;11198:63;11145:122;:::o;11273:139::-;11319:5;11357:6;11344:20;11335:29;;11373:33;11400:5;11373:33;:::i;:::-;11273:139;;;;:::o;11418:849::-;11522:6;11530;11538;11546;11595:2;11583:9;11574:7;11570:23;11566:32;11563:119;;;11601:79;;:::i;:::-;11563:119;11721:1;11746:53;11791:7;11782:6;11771:9;11767:22;11746:53;:::i;:::-;11736:63;;11692:117;11876:2;11865:9;11861:18;11848:32;11907:18;11899:6;11896:30;11893:117;;;11929:79;;:::i;:::-;11893:117;12042:80;12114:7;12105:6;12094:9;12090:22;12042:80;:::i;:::-;12024:98;;;;11819:313;12171:2;12197:53;12242:7;12233:6;12222:9;12218:22;12197:53;:::i;:::-;12187:63;;12142:118;11418:849;;;;;;;:::o;12273:654::-;12351:6;12359;12408:2;12396:9;12387:7;12383:23;12379:32;12376:119;;;12414:79;;:::i;:::-;12376:119;12562:1;12551:9;12547:17;12534:31;12592:18;12584:6;12581:30;12578:117;;;12614:79;;:::i;:::-;12578:117;12719:63;12774:7;12765:6;12754:9;12750:22;12719:63;:::i;:::-;12709:73;;12505:287;12831:2;12857:53;12902:7;12893:6;12882:9;12878:22;12857:53;:::i;:::-;12847:63;;12802:118;12273:654;;;;;:::o;12933:86::-;12968:7;13008:4;13001:5;12997:16;12986:27;;12933:86;;;:::o;13025:112::-;13108:22;13124:5;13108:22;:::i;:::-;13103:3;13096:35;13025:112;;:::o;13143:214::-;13232:4;13270:2;13259:9;13255:18;13247:26;;13283:67;13347:1;13336:9;13332:17;13323:6;13283:67;:::i;:::-;13143:214;;;;:::o;13363:654::-;13441:6;13449;13498:2;13486:9;13477:7;13473:23;13469:32;13466:119;;;13504:79;;:::i;:::-;13466:119;13652:1;13641:9;13637:17;13624:31;13682:18;13674:6;13671:30;13668:117;;;13704:79;;:::i;:::-;13668:117;13809:63;13864:7;13855:6;13844:9;13840:22;13809:63;:::i;:::-;13799:73;;13595:287;13921:2;13947:53;13992:7;13983:6;13972:9;13968:22;13947:53;:::i;:::-;13937:63;;13892:118;13363:654;;;;;:::o;14023:619::-;14100:6;14108;14116;14165:2;14153:9;14144:7;14140:23;14136:32;14133:119;;;14171:79;;:::i;:::-;14133:119;14291:1;14316:53;14361:7;14352:6;14341:9;14337:22;14316:53;:::i;:::-;14306:63;;14262:117;14418:2;14444:53;14489:7;14480:6;14469:9;14465:22;14444:53;:::i;:::-;14434:63;;14389:118;14546:2;14572:53;14617:7;14608:6;14597:9;14593:22;14572:53;:::i;:::-;14562:63;;14517:118;14023:619;;;;;:::o;14648:654::-;14726:6;14734;14783:2;14771:9;14762:7;14758:23;14754:32;14751:119;;;14789:79;;:::i;:::-;14751:119;14937:1;14926:9;14922:17;14909:31;14967:18;14959:6;14956:30;14953:117;;;14989:79;;:::i;:::-;14953:117;15094:63;15149:7;15140:6;15129:9;15125:22;15094:63;:::i;:::-;15084:73;;14880:287;15206:2;15232:53;15277:7;15268:6;15257:9;15253:22;15232:53;:::i;:::-;15222:63;;15177:118;14648:654;;;;;:::o;15308:751::-;15529:4;15567:3;15556:9;15552:19;15544:27;;15581:67;15645:1;15634:9;15630:17;15621:6;15581:67;:::i;:::-;15658:68;15722:2;15711:9;15707:18;15698:6;15658:68;:::i;:::-;15736:72;15804:2;15793:9;15789:18;15780:6;15736:72;:::i;:::-;15818;15886:2;15875:9;15871:18;15862:6;15818:72;:::i;:::-;15900:73;15968:3;15957:9;15953:19;15944:6;15900:73;:::i;:::-;15983:69;16047:3;16036:9;16032:19;16023:6;15983:69;:::i;:::-;15308:751;;;;;;;;;:::o;16065:118::-;16136:22;16152:5;16136:22;:::i;:::-;16129:5;16126:33;16116:61;;16173:1;16170;16163:12;16116:61;16065:118;:::o;16189:135::-;16233:5;16271:6;16258:20;16249:29;;16287:31;16312:5;16287:31;:::i;:::-;16189:135;;;;:::o;16330:325::-;16387:6;16436:2;16424:9;16415:7;16411:23;16407:32;16404:119;;;16442:79;;:::i;:::-;16404:119;16562:1;16587:51;16630:7;16621:6;16610:9;16606:22;16587:51;:::i;:::-;16577:61;;16533:115;16330:325;;;;:::o;16661:650::-;16737:6;16745;16794:2;16782:9;16773:7;16769:23;16765:32;16762:119;;;16800:79;;:::i;:::-;16762:119;16948:1;16937:9;16933:17;16920:31;16978:18;16970:6;16967:30;16964:117;;;17000:79;;:::i;:::-;16964:117;17105:63;17160:7;17151:6;17140:9;17136:22;17105:63;:::i;:::-;17095:73;;16891:287;17217:2;17243:51;17286:7;17277:6;17266:9;17262:22;17243:51;:::i;:::-;17233:61;;17188:116;16661:650;;;;;:::o;17317:1229::-;17427:6;17435;17443;17451;17459;17467;17516:3;17504:9;17495:7;17491:23;17487:33;17484:120;;;17523:79;;:::i;:::-;17484:120;17671:1;17660:9;17656:17;17643:31;17701:18;17693:6;17690:30;17687:117;;;17723:79;;:::i;:::-;17687:117;17828:63;17883:7;17874:6;17863:9;17859:22;17828:63;:::i;:::-;17818:73;;17614:287;17940:2;17966:51;18009:7;18000:6;17989:9;17985:22;17966:51;:::i;:::-;17956:61;;17911:116;18066:2;18092:51;18135:7;18126:6;18115:9;18111:22;18092:51;:::i;:::-;18082:61;;18037:116;18192:2;18218:53;18263:7;18254:6;18243:9;18239:22;18218:53;:::i;:::-;18208:63;;18163:118;18320:3;18347:53;18392:7;18383:6;18372:9;18368:22;18347:53;:::i;:::-;18337:63;;18291:119;18449:3;18476:53;18521:7;18512:6;18501:9;18497:22;18476:53;:::i;:::-;18466:63;;18420:119;17317:1229;;;;;;;;:::o;18552:700::-;18645:6;18653;18661;18710:2;18698:9;18689:7;18685:23;18681:32;18678:119;;;18716:79;;:::i;:::-;18678:119;18836:1;18861:51;18904:7;18895:6;18884:9;18880:22;18861:51;:::i;:::-;18851:61;;18807:115;18989:2;18978:9;18974:18;18961:32;19020:18;19012:6;19009:30;19006:117;;;19042:79;;:::i;:::-;19006:117;19155:80;19227:7;19218:6;19207:9;19203:22;19155:80;:::i;:::-;19137:98;;;;18932:313;18552:700;;;;;:::o;19258:321::-;19345:4;19435:18;19427:6;19424:30;19421:56;;;19457:18;;:::i;:::-;19421:56;19507:4;19499:6;19495:17;19487:25;;19567:4;19561;19557:15;19549:23;;19258:321;;;:::o;19601:945::-;19707:5;19732:91;19748:74;19815:6;19748:74;:::i;:::-;19732:91;:::i;:::-;19723:100;;19843:5;19872:6;19865:5;19858:21;19906:4;19899:5;19895:16;19888:23;;19959:4;19951:6;19947:17;19939:6;19935:30;19988:3;19980:6;19977:15;19974:122;;;20007:79;;:::i;:::-;19974:122;20122:6;20105:435;20139:6;20134:3;20131:15;20105:435;;;20228:3;20215:17;20264:18;20251:11;20248:35;20245:122;;;20286:79;;:::i;:::-;20245:122;20410:11;20402:6;20398:24;20448:47;20491:3;20479:10;20448:47;:::i;:::-;20443:3;20436:60;20525:4;20520:3;20516:14;20509:21;;20181:359;;20165:4;20160:3;20156:14;20149:21;;20105:435;;;20109:21;19713:833;;19601:945;;;;;:::o;20568:390::-;20649:5;20698:3;20691:4;20683:6;20679:17;20675:27;20665:122;;20706:79;;:::i;:::-;20665:122;20823:6;20810:20;20848:104;20948:3;20940:6;20933:4;20925:6;20921:17;20848:104;:::i;:::-;20839:113;;20655:303;20568:390;;;;:::o;20964:559::-;21058:6;21107:2;21095:9;21086:7;21082:23;21078:32;21075:119;;;21113:79;;:::i;:::-;21075:119;21261:1;21250:9;21246:17;21233:31;21291:18;21283:6;21280:30;21277:117;;;21313:79;;:::i;:::-;21277:117;21418:88;21498:7;21489:6;21478:9;21474:22;21418:88;:::i;:::-;21408:98;;21204:312;20964:559;;;;:::o;21529:116::-;21599:21;21614:5;21599:21;:::i;:::-;21592:5;21589:32;21579:60;;21635:1;21632;21625:12;21579:60;21529:116;:::o;21651:133::-;21694:5;21732:6;21719:20;21710:29;;21748:30;21772:5;21748:30;:::i;:::-;21651:133;;;;:::o;21790:468::-;21855:6;21863;21912:2;21900:9;21891:7;21887:23;21883:32;21880:119;;;21918:79;;:::i;:::-;21880:119;22038:1;22063:53;22108:7;22099:6;22088:9;22084:22;22063:53;:::i;:::-;22053:63;;22009:117;22165:2;22191:50;22233:7;22224:6;22213:9;22209:22;22191:50;:::i;:::-;22181:60;;22136:115;21790:468;;;;;:::o;22264:307::-;22325:4;22415:18;22407:6;22404:30;22401:56;;;22437:18;;:::i;:::-;22401:56;22475:29;22497:6;22475:29;:::i;:::-;22467:37;;22559:4;22553;22549:15;22541:23;;22264:307;;;:::o;22577:423::-;22654:5;22679:65;22695:48;22736:6;22695:48;:::i;:::-;22679:65;:::i;:::-;22670:74;;22767:6;22760:5;22753:21;22805:4;22798:5;22794:16;22843:3;22834:6;22829:3;22825:16;22822:25;22819:112;;;22850:79;;:::i;:::-;22819:112;22940:54;22987:6;22982:3;22977;22940:54;:::i;:::-;22660:340;22577:423;;;;;:::o;23019:338::-;23074:5;23123:3;23116:4;23108:6;23104:17;23100:27;23090:122;;23131:79;;:::i;:::-;23090:122;23248:6;23235:20;23273:78;23347:3;23339:6;23332:4;23324:6;23320:17;23273:78;:::i;:::-;23264:87;;23080:277;23019:338;;;;:::o;23363:943::-;23458:6;23466;23474;23482;23531:3;23519:9;23510:7;23506:23;23502:33;23499:120;;;23538:79;;:::i;:::-;23499:120;23658:1;23683:53;23728:7;23719:6;23708:9;23704:22;23683:53;:::i;:::-;23673:63;;23629:117;23785:2;23811:53;23856:7;23847:6;23836:9;23832:22;23811:53;:::i;:::-;23801:63;;23756:118;23913:2;23939:53;23984:7;23975:6;23964:9;23960:22;23939:53;:::i;:::-;23929:63;;23884:118;24069:2;24058:9;24054:18;24041:32;24100:18;24092:6;24089:30;24086:117;;;24122:79;;:::i;:::-;24086:117;24227:62;24281:7;24272:6;24261:9;24257:22;24227:62;:::i;:::-;24217:72;;24012:287;23363:943;;;;;;;:::o;24312:648::-;24387:6;24395;24444:2;24432:9;24423:7;24419:23;24415:32;24412:119;;;24450:79;;:::i;:::-;24412:119;24598:1;24587:9;24583:17;24570:31;24628:18;24620:6;24617:30;24614:117;;;24650:79;;:::i;:::-;24614:117;24755:63;24810:7;24801:6;24790:9;24786:22;24755:63;:::i;:::-;24745:73;;24541:287;24867:2;24893:50;24935:7;24926:6;24915:9;24911:22;24893:50;:::i;:::-;24883:60;;24838:115;24312:648;;;;;:::o;24966:474::-;25034:6;25042;25091:2;25079:9;25070:7;25066:23;25062:32;25059:119;;;25097:79;;:::i;:::-;25059:119;25217:1;25242:53;25287:7;25278:6;25267:9;25263:22;25242:53;:::i;:::-;25232:63;;25188:117;25344:2;25370:53;25415:7;25406:6;25395:9;25391:22;25370:53;:::i;:::-;25360:63;;25315:118;24966:474;;;;;:::o;25446:148::-;25548:11;25585:3;25570:18;;25446:148;;;;:::o;25600:390::-;25706:3;25734:39;25767:5;25734:39;:::i;:::-;25789:89;25871:6;25866:3;25789:89;:::i;:::-;25782:96;;25887:65;25945:6;25940:3;25933:4;25926:5;25922:16;25887:65;:::i;:::-;25977:6;25972:3;25968:16;25961:23;;25710:280;25600:390;;;;:::o;25996:275::-;26128:3;26150:95;26241:3;26232:6;26150:95;:::i;:::-;26143:102;;26262:3;26255:10;;25996:275;;;;:::o;26277:179::-;26417:31;26413:1;26405:6;26401:14;26394:55;26277:179;:::o;26462:366::-;26604:3;26625:67;26689:2;26684:3;26625:67;:::i;:::-;26618:74;;26701:93;26790:3;26701:93;:::i;:::-;26819:2;26814:3;26810:12;26803:19;;26462:366;;;:::o;26834:419::-;27000:4;27038:2;27027:9;27023:18;27015:26;;27087:9;27081:4;27077:20;27073:1;27062:9;27058:17;27051:47;27115:131;27241:4;27115:131;:::i;:::-;27107:139;;26834:419;;;:::o;27259:152::-;27399:4;27395:1;27387:6;27383:14;27376:28;27259:152;:::o;27417:400::-;27577:3;27598:84;27680:1;27675:3;27598:84;:::i;:::-;27591:91;;27691:93;27780:3;27691:93;:::i;:::-;27809:1;27804:3;27800:11;27793:18;;27417:400;;;:::o;27823:381::-;28008:3;28030:148;28174:3;28030:148;:::i;:::-;28023:155;;28195:3;28188:10;;27823:381;;;:::o;28210:180::-;28258:77;28255:1;28248:88;28355:4;28352:1;28345:15;28379:4;28376:1;28369:15;28396:320;28440:6;28477:1;28471:4;28467:12;28457:22;;28524:1;28518:4;28514:12;28545:18;28535:81;;28601:4;28593:6;28589:17;28579:27;;28535:81;28663:2;28655:6;28652:14;28632:18;28629:38;28626:84;;28682:18;;:::i;:::-;28626:84;28447:269;28396:320;;;:::o;28722:94::-;28755:8;28803:5;28799:2;28795:14;28774:35;;28722:94;;;:::o;28822:::-;28861:7;28890:20;28904:5;28890:20;:::i;:::-;28879:31;;28822:94;;;:::o;28922:100::-;28961:7;28990:26;29010:5;28990:26;:::i;:::-;28979:37;;28922:100;;;:::o;29028:157::-;29133:45;29153:24;29171:5;29153:24;:::i;:::-;29133:45;:::i;:::-;29128:3;29121:58;29028:157;;:::o;29191:256::-;29303:3;29318:75;29389:3;29380:6;29318:75;:::i;:::-;29418:2;29413:3;29409:12;29402:19;;29438:3;29431:10;;29191:256;;;;:::o;29453:179::-;29593:31;29589:1;29581:6;29577:14;29570:55;29453:179;:::o;29638:366::-;29780:3;29801:67;29865:2;29860:3;29801:67;:::i;:::-;29794:74;;29877:93;29966:3;29877:93;:::i;:::-;29995:2;29990:3;29986:12;29979:19;;29638:366;;;:::o;30010:419::-;30176:4;30214:2;30203:9;30199:18;30191:26;;30263:9;30257:4;30253:20;30249:1;30238:9;30234:17;30227:47;30291:131;30417:4;30291:131;:::i;:::-;30283:139;;30010:419;;;:::o;30435:172::-;30575:24;30571:1;30563:6;30559:14;30552:48;30435:172;:::o;30613:366::-;30755:3;30776:67;30840:2;30835:3;30776:67;:::i;:::-;30769:74;;30852:93;30941:3;30852:93;:::i;:::-;30970:2;30965:3;30961:12;30954:19;;30613:366;;;:::o;30985:419::-;31151:4;31189:2;31178:9;31174:18;31166:26;;31238:9;31232:4;31228:20;31224:1;31213:9;31209:17;31202:47;31266:131;31392:4;31266:131;:::i;:::-;31258:139;;30985:419;;;:::o;31410:176::-;31550:28;31546:1;31538:6;31534:14;31527:52;31410:176;:::o;31592:366::-;31734:3;31755:67;31819:2;31814:3;31755:67;:::i;:::-;31748:74;;31831:93;31920:3;31831:93;:::i;:::-;31949:2;31944:3;31940:12;31933:19;;31592:366;;;:::o;31964:419::-;32130:4;32168:2;32157:9;32153:18;32145:26;;32217:9;32211:4;32207:20;32203:1;32192:9;32188:17;32181:47;32245:131;32371:4;32245:131;:::i;:::-;32237:139;;31964:419;;;:::o;32389:236::-;32529:34;32525:1;32517:6;32513:14;32506:58;32598:19;32593:2;32585:6;32581:15;32574:44;32389:236;:::o;32631:366::-;32773:3;32794:67;32858:2;32853:3;32794:67;:::i;:::-;32787:74;;32870:93;32959:3;32870:93;:::i;:::-;32988:2;32983:3;32979:12;32972:19;;32631:366;;;:::o;33003:419::-;33169:4;33207:2;33196:9;33192:18;33184:26;;33256:9;33250:4;33246:20;33242:1;33231:9;33227:17;33220:47;33284:131;33410:4;33284:131;:::i;:::-;33276:139;;33003:419;;;:::o;33428:180::-;33476:77;33473:1;33466:88;33573:4;33570:1;33563:15;33597:4;33594:1;33587:15;33614:191;33654:3;33673:20;33691:1;33673:20;:::i;:::-;33668:25;;33707:20;33725:1;33707:20;:::i;:::-;33702:25;;33750:1;33747;33743:9;33736:16;;33771:3;33768:1;33765:10;33762:36;;;33778:18;;:::i;:::-;33762:36;33614:191;;;;:::o;33811:248::-;33951:34;33947:1;33939:6;33935:14;33928:58;34020:31;34015:2;34007:6;34003:15;33996:56;33811:248;:::o;34065:366::-;34207:3;34228:67;34292:2;34287:3;34228:67;:::i;:::-;34221:74;;34304:93;34393:3;34304:93;:::i;:::-;34422:2;34417:3;34413:12;34406:19;;34065:366;;;:::o;34437:419::-;34603:4;34641:2;34630:9;34626:18;34618:26;;34690:9;34684:4;34680:20;34676:1;34665:9;34661:17;34654:47;34718:131;34844:4;34718:131;:::i;:::-;34710:139;;34437:419;;;:::o;34862:242::-;35002:34;34998:1;34990:6;34986:14;34979:58;35071:25;35066:2;35058:6;35054:15;35047:50;34862:242;:::o;35110:366::-;35252:3;35273:67;35337:2;35332:3;35273:67;:::i;:::-;35266:74;;35349:93;35438:3;35349:93;:::i;:::-;35467:2;35462:3;35458:12;35451:19;;35110:366;;;:::o;35482:419::-;35648:4;35686:2;35675:9;35671:18;35663:26;;35735:9;35729:4;35725:20;35721:1;35710:9;35706:17;35699:47;35763:131;35889:4;35763:131;:::i;:::-;35755:139;;35482:419;;;:::o;35907:188::-;35945:3;35964:18;35980:1;35964:18;:::i;:::-;35959:23;;35996:18;36012:1;35996:18;:::i;:::-;35991:23;;36037:1;36034;36030:9;36023:16;;36060:4;36055:3;36052:13;36049:39;;;36068:18;;:::i;:::-;36049:39;35907:188;;;;:::o;36101:295::-;36241:34;36237:1;36229:6;36225:14;36218:58;36310:34;36305:2;36297:6;36293:15;36286:59;36379:9;36374:2;36366:6;36362:15;36355:34;36101:295;:::o;36402:366::-;36544:3;36565:67;36629:2;36624:3;36565:67;:::i;:::-;36558:74;;36641:93;36730:3;36641:93;:::i;:::-;36759:2;36754:3;36750:12;36743:19;;36402:366;;;:::o;36774:419::-;36940:4;36978:2;36967:9;36963:18;36955:26;;37027:9;37021:4;37017:20;37013:1;37002:9;36998:17;36991:47;37055:131;37181:4;37055:131;:::i;:::-;37047:139;;36774:419;;;:::o;37199:410::-;37239:7;37262:20;37280:1;37262:20;:::i;:::-;37257:25;;37296:20;37314:1;37296:20;:::i;:::-;37291:25;;37351:1;37348;37344:9;37373:30;37391:11;37373:30;:::i;:::-;37362:41;;37552:1;37543:7;37539:15;37536:1;37533:22;37513:1;37506:9;37486:83;37463:139;;37582:18;;:::i;:::-;37463:139;37247:362;37199:410;;;;:::o;37615:231::-;37755:34;37751:1;37743:6;37739:14;37732:58;37824:14;37819:2;37811:6;37807:15;37800:39;37615:231;:::o;37852:366::-;37994:3;38015:67;38079:2;38074:3;38015:67;:::i;:::-;38008:74;;38091:93;38180:3;38091:93;:::i;:::-;38209:2;38204:3;38200:12;38193:19;;37852:366;;;:::o;38224:419::-;38390:4;38428:2;38417:9;38413:18;38405:26;;38477:9;38471:4;38467:20;38463:1;38452:9;38448:17;38441:47;38505:131;38631:4;38505:131;:::i;:::-;38497:139;;38224:419;;;:::o;38649:191::-;38687:4;38707:18;38723:1;38707:18;:::i;:::-;38702:23;;38739:18;38755:1;38739:18;:::i;:::-;38734:23;;38781:1;38778;38774:9;38766:17;;38805:4;38799;38796:14;38793:40;;;38813:18;;:::i;:::-;38793:40;38649:191;;;;:::o;38846:156::-;38986:8;38982:1;38974:6;38970:14;38963:32;38846:156;:::o;39008:400::-;39168:3;39189:84;39271:1;39266:3;39189:84;:::i;:::-;39182:91;;39282:93;39371:3;39282:93;:::i;:::-;39400:1;39395:3;39391:11;39384:18;;39008:400;;;:::o;39414:381::-;39599:3;39621:148;39765:3;39621:148;:::i;:::-;39614:155;;39786:3;39779:10;;39414:381;;;:::o;39801:234::-;39941:34;39937:1;39929:6;39925:14;39918:58;40010:17;40005:2;39997:6;39993:15;39986:42;39801:234;:::o;40041:366::-;40183:3;40204:67;40268:2;40263:3;40204:67;:::i;:::-;40197:74;;40280:93;40369:3;40280:93;:::i;:::-;40398:2;40393:3;40389:12;40382:19;;40041:366;;;:::o;40413:419::-;40579:4;40617:2;40606:9;40602:18;40594:26;;40666:9;40660:4;40656:20;40652:1;40641:9;40637:17;40630:47;40694:131;40820:4;40694:131;:::i;:::-;40686:139;;40413:419;;;:::o;40838:141::-;40887:4;40910:3;40902:11;;40933:3;40930:1;40923:14;40967:4;40964:1;40954:18;40946:26;;40838:141;;;:::o;41009:874::-;41112:3;41149:5;41143:12;41178:36;41204:9;41178:36;:::i;:::-;41230:89;41312:6;41307:3;41230:89;:::i;:::-;41223:96;;41350:1;41339:9;41335:17;41366:1;41361:166;;;;41541:1;41536:341;;;;41328:549;;41361:166;41445:4;41441:9;41430;41426:25;41421:3;41414:38;41507:6;41500:14;41493:22;41485:6;41481:35;41476:3;41472:45;41465:52;;41361:166;;41536:341;41603:38;41635:5;41603:38;:::i;:::-;41663:1;41677:154;41691:6;41688:1;41685:13;41677:154;;;41765:7;41759:14;41755:1;41750:3;41746:11;41739:35;41815:1;41806:7;41802:15;41791:26;;41713:4;41710:1;41706:12;41701:17;;41677:154;;;41860:6;41855:3;41851:16;41844:23;;41543:334;;41328:549;;41116:767;;41009:874;;;;:::o;41889:155::-;42029:7;42025:1;42017:6;42013:14;42006:31;41889:155;:::o;42050:400::-;42210:3;42231:84;42313:1;42308:3;42231:84;:::i;:::-;42224:91;;42324:93;42413:3;42324:93;:::i;:::-;42442:1;42437:3;42433:11;42426:18;;42050:400;;;:::o;42456:695::-;42734:3;42756:92;42844:3;42835:6;42756:92;:::i;:::-;42749:99;;42865:95;42956:3;42947:6;42865:95;:::i;:::-;42858:102;;42977:148;43121:3;42977:148;:::i;:::-;42970:155;;43142:3;43135:10;;42456:695;;;;;:::o;43157:180::-;43205:77;43202:1;43195:88;43302:4;43299:1;43292:15;43326:4;43323:1;43316:15;43343:176;43375:1;43392:20;43410:1;43392:20;:::i;:::-;43387:25;;43426:20;43444:1;43426:20;:::i;:::-;43421:25;;43465:1;43455:35;;43470:18;;:::i;:::-;43455:35;43511:1;43508;43504:9;43499:14;;43343:176;;;;:::o;43525:180::-;43573:77;43570:1;43563:88;43670:4;43667:1;43660:15;43694:4;43691:1;43684:15;43711:93;43748:6;43795:2;43790;43783:5;43779:14;43775:23;43765:33;;43711:93;;;:::o;43810:107::-;43854:8;43904:5;43898:4;43894:16;43873:37;;43810:107;;;;:::o;43923:393::-;43992:6;44042:1;44030:10;44026:18;44065:97;44095:66;44084:9;44065:97;:::i;:::-;44183:39;44213:8;44202:9;44183:39;:::i;:::-;44171:51;;44255:4;44251:9;44244:5;44240:21;44231:30;;44304:4;44294:8;44290:19;44283:5;44280:30;44270:40;;43999:317;;43923:393;;;;;:::o;44322:60::-;44350:3;44371:5;44364:12;;44322:60;;;:::o;44388:142::-;44438:9;44471:53;44489:34;44498:24;44516:5;44498:24;:::i;:::-;44489:34;:::i;:::-;44471:53;:::i;:::-;44458:66;;44388:142;;;:::o;44536:75::-;44579:3;44600:5;44593:12;;44536:75;;;:::o;44617:269::-;44727:39;44758:7;44727:39;:::i;:::-;44788:91;44837:41;44861:16;44837:41;:::i;:::-;44829:6;44822:4;44816:11;44788:91;:::i;:::-;44782:4;44775:105;44693:193;44617:269;;;:::o;44892:73::-;44937:3;44892:73;:::o;44971:189::-;45048:32;;:::i;:::-;45089:65;45147:6;45139;45133:4;45089:65;:::i;:::-;45024:136;44971:189;;:::o;45166:186::-;45226:120;45243:3;45236:5;45233:14;45226:120;;;45297:39;45334:1;45327:5;45297:39;:::i;:::-;45270:1;45263:5;45259:13;45250:22;;45226:120;;;45166:186;;:::o;45358:543::-;45459:2;45454:3;45451:11;45448:446;;;45493:38;45525:5;45493:38;:::i;:::-;45577:29;45595:10;45577:29;:::i;:::-;45567:8;45563:44;45760:2;45748:10;45745:18;45742:49;;;45781:8;45766:23;;45742:49;45804:80;45860:22;45878:3;45860:22;:::i;:::-;45850:8;45846:37;45833:11;45804:80;:::i;:::-;45463:431;;45448:446;45358:543;;;:::o;45907:117::-;45961:8;46011:5;46005:4;46001:16;45980:37;;45907:117;;;;:::o;46030:169::-;46074:6;46107:51;46155:1;46151:6;46143:5;46140:1;46136:13;46107:51;:::i;:::-;46103:56;46188:4;46182;46178:15;46168:25;;46081:118;46030:169;;;;:::o;46204:295::-;46280:4;46426:29;46451:3;46445:4;46426:29;:::i;:::-;46418:37;;46488:3;46485:1;46481:11;46475:4;46472:21;46464:29;;46204:295;;;;:::o;46504:1395::-;46621:37;46654:3;46621:37;:::i;:::-;46723:18;46715:6;46712:30;46709:56;;;46745:18;;:::i;:::-;46709:56;46789:38;46821:4;46815:11;46789:38;:::i;:::-;46874:67;46934:6;46926;46920:4;46874:67;:::i;:::-;46968:1;46992:4;46979:17;;47024:2;47016:6;47013:14;47041:1;47036:618;;;;47698:1;47715:6;47712:77;;;47764:9;47759:3;47755:19;47749:26;47740:35;;47712:77;47815:67;47875:6;47868:5;47815:67;:::i;:::-;47809:4;47802:81;47671:222;47006:887;;47036:618;47088:4;47084:9;47076:6;47072:22;47122:37;47154:4;47122:37;:::i;:::-;47181:1;47195:208;47209:7;47206:1;47203:14;47195:208;;;47288:9;47283:3;47279:19;47273:26;47265:6;47258:42;47339:1;47331:6;47327:14;47317:24;;47386:2;47375:9;47371:18;47358:31;;47232:4;47229:1;47225:12;47220:17;;47195:208;;;47431:6;47422:7;47419:19;47416:179;;;47489:9;47484:3;47480:19;47474:26;47532:48;47574:4;47566:6;47562:17;47551:9;47532:48;:::i;:::-;47524:6;47517:64;47439:156;47416:179;47641:1;47637;47629:6;47625:14;47621:22;47615:4;47608:36;47043:611;;;47006:887;;46596:1303;;;46504:1395;;:::o;47905:174::-;48045:26;48041:1;48033:6;48029:14;48022:50;47905:174;:::o;48085:366::-;48227:3;48248:67;48312:2;48307:3;48248:67;:::i;:::-;48241:74;;48324:93;48413:3;48324:93;:::i;:::-;48442:2;48437:3;48433:12;48426:19;;48085:366;;;:::o;48457:419::-;48623:4;48661:2;48650:9;48646:18;48638:26;;48710:9;48704:4;48700:20;48696:1;48685:9;48681:17;48674:47;48738:131;48864:4;48738:131;:::i;:::-;48730:139;;48457:419;;;:::o;48882:85::-;48927:7;48956:5;48945:16;;48882:85;;;:::o;48973:158::-;49031:9;49064:61;49082:42;49091:32;49117:5;49091:32;:::i;:::-;49082:42;:::i;:::-;49064:61;:::i;:::-;49051:74;;48973:158;;;:::o;49137:147::-;49232:45;49271:5;49232:45;:::i;:::-;49227:3;49220:58;49137:147;;:::o;49290:340::-;49415:4;49453:2;49442:9;49438:18;49430:26;;49466:67;49530:1;49519:9;49515:17;49506:6;49466:67;:::i;:::-;49543:80;49619:2;49608:9;49604:18;49595:6;49543:80;:::i;:::-;49290:340;;;;;:::o;49636:225::-;49776:34;49772:1;49764:6;49760:14;49753:58;49845:8;49840:2;49832:6;49828:15;49821:33;49636:225;:::o;49867:366::-;50009:3;50030:67;50094:2;50089:3;50030:67;:::i;:::-;50023:74;;50106:93;50195:3;50106:93;:::i;:::-;50224:2;50219:3;50215:12;50208:19;;49867:366;;;:::o;50239:419::-;50405:4;50443:2;50432:9;50428:18;50420:26;;50492:9;50486:4;50482:20;50478:1;50467:9;50463:17;50456:47;50520:131;50646:4;50520:131;:::i;:::-;50512:139;;50239:419;;;:::o;50664:182::-;50804:34;50800:1;50792:6;50788:14;50781:58;50664:182;:::o;50852:366::-;50994:3;51015:67;51079:2;51074:3;51015:67;:::i;:::-;51008:74;;51091:93;51180:3;51091:93;:::i;:::-;51209:2;51204:3;51200:12;51193:19;;50852:366;;;:::o;51224:419::-;51390:4;51428:2;51417:9;51413:18;51405:26;;51477:9;51471:4;51467:20;51463:1;51452:9;51448:17;51441:47;51505:131;51631:4;51505:131;:::i;:::-;51497:139;;51224:419;;;:::o;51649:181::-;51789:33;51785:1;51777:6;51773:14;51766:57;51649:181;:::o;51836:366::-;51978:3;51999:67;52063:2;52058:3;51999:67;:::i;:::-;51992:74;;52075:93;52164:3;52075:93;:::i;:::-;52193:2;52188:3;52184:12;52177:19;;51836:366;;;:::o;52208:419::-;52374:4;52412:2;52401:9;52397:18;52389:26;;52461:9;52455:4;52451:20;52447:1;52436:9;52432:17;52425:47;52489:131;52615:4;52489:131;:::i;:::-;52481:139;;52208:419;;;:::o;52633:166::-;52773:18;52769:1;52761:6;52757:14;52750:42;52633:166;:::o;52805:366::-;52947:3;52968:67;53032:2;53027:3;52968:67;:::i;:::-;52961:74;;53044:93;53133:3;53044:93;:::i;:::-;53162:2;53157:3;53153:12;53146:19;;52805:366;;;:::o;53177:419::-;53343:4;53381:2;53370:9;53366:18;53358:26;;53430:9;53424:4;53420:20;53416:1;53405:9;53401:17;53394:47;53458:131;53584:4;53458:131;:::i;:::-;53450:139;;53177:419;;;:::o;53602:179::-;53742:31;53738:1;53730:6;53726:14;53719:55;53602:179;:::o;53787:366::-;53929:3;53950:67;54014:2;54009:3;53950:67;:::i;:::-;53943:74;;54026:93;54115:3;54026:93;:::i;:::-;54144:2;54139:3;54135:12;54128:19;;53787:366;;;:::o;54159:419::-;54325:4;54363:2;54352:9;54348:18;54340:26;;54412:9;54406:4;54402:20;54398:1;54387:9;54383:17;54376:47;54440:131;54566:4;54440:131;:::i;:::-;54432:139;;54159:419;;;:::o;54584:238::-;54724:34;54720:1;54712:6;54708:14;54701:58;54793:21;54788:2;54780:6;54776:15;54769:46;54584:238;:::o;54828:366::-;54970:3;54991:67;55055:2;55050:3;54991:67;:::i;:::-;54984:74;;55067:93;55156:3;55067:93;:::i;:::-;55185:2;55180:3;55176:12;55169:19;;54828:366;;;:::o;55200:419::-;55366:4;55404:2;55393:9;55389:18;55381:26;;55453:9;55447:4;55443:20;55439:1;55428:9;55424:17;55417:47;55481:131;55607:4;55481:131;:::i;:::-;55473:139;;55200:419;;;:::o;55625:324::-;55742:4;55780:2;55769:9;55765:18;55757:26;;55793:67;55857:1;55846:9;55842:17;55833:6;55793:67;:::i;:::-;55870:72;55938:2;55927:9;55923:18;55914:6;55870:72;:::i;:::-;55625:324;;;;;:::o;55955:98::-;56006:6;56040:5;56034:12;56024:22;;55955:98;;;:::o;56059:168::-;56142:11;56176:6;56171:3;56164:19;56216:4;56211:3;56207:14;56192:29;;56059:168;;;;:::o;56233:373::-;56319:3;56347:38;56379:5;56347:38;:::i;:::-;56401:70;56464:6;56459:3;56401:70;:::i;:::-;56394:77;;56480:65;56538:6;56533:3;56526:4;56519:5;56515:16;56480:65;:::i;:::-;56570:29;56592:6;56570:29;:::i;:::-;56565:3;56561:39;56554:46;;56323:283;56233:373;;;;:::o;56612:640::-;56807:4;56845:3;56834:9;56830:19;56822:27;;56859:71;56927:1;56916:9;56912:17;56903:6;56859:71;:::i;:::-;56940:72;57008:2;56997:9;56993:18;56984:6;56940:72;:::i;:::-;57022;57090:2;57079:9;57075:18;57066:6;57022:72;:::i;:::-;57141:9;57135:4;57131:20;57126:2;57115:9;57111:18;57104:48;57169:76;57240:4;57231:6;57169:76;:::i;:::-;57161:84;;56612:640;;;;;;;:::o;57258:141::-;57314:5;57345:6;57339:13;57330:22;;57361:32;57387:5;57361:32;:::i;:::-;57258:141;;;;:::o;57405:349::-;57474:6;57523:2;57511:9;57502:7;57498:23;57494:32;57491:119;;;57529:79;;:::i;:::-;57491:119;57649:1;57674:63;57729:7;57720:6;57709:9;57705:22;57674:63;:::i;:::-;57664:73;;57620:127;57405:349;;;;:::o;57760:233::-;57799:3;57822:24;57840:5;57822:24;:::i;:::-;57813:33;;57868:66;57861:5;57858:77;57855:103;;57938:18;;:::i;:::-;57855:103;57985:1;57978:5;57974:13;57967:20;;57760:233;;;:::o;57999:170::-;58139:22;58135:1;58127:6;58123:14;58116:46;57999:170;:::o;58175:366::-;58317:3;58338:67;58402:2;58397:3;58338:67;:::i;:::-;58331:74;;58414:93;58503:3;58414:93;:::i;:::-;58532:2;58527:3;58523:12;58516:19;;58175:366;;;:::o;58547:419::-;58713:4;58751:2;58740:9;58736:18;58728:26;;58800:9;58794:4;58790:20;58786:1;58775:9;58771:17;58764:47;58828:131;58954:4;58828:131;:::i;:::-;58820:139;;58547:419;;;:::o
Swarm Source
ipfs://15eb023ad3733e3f606f1a0b181ee462c5baebdccae5dbec8946121fd11a113c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.