ERC-721
Overview
Max Total Supply
150 Moona Lisa (Print) Original
Holders
109
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 Moona Lisa (Print) OriginalLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Moona_Lisa_Print_Original
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-05 */ // File: @openzeppelin/contracts/cryptography/MerkleProof.sol pragma solidity >=0.8.0; /** * @dev These functions deal with verification of Merkle trees (hash trees), */ library MerkleProof { /** * @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) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Moonalisa.sol pragma solidity ^0.8.0; /** * @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 ); } /** * @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 1; } /** * @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) } } } /// @notice Optimized and flexible operator filterer to abide to OpenSea's /// mandatory on-chain royalty enforcement in order for new collections to /// receive royalties. /// For more information, see: /// See: https://github.com/ProjectOpenSea/operator-filter-registry abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering( address subscriptionOrRegistrantToCopy, bool subscribe ) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr( 96, shl(96, subscriptionOrRegistrantToCopy) ) // prettier-ignore for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. pop( call( gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x00 ) ) // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if `from` is a blocked operator. /// Can be turned on / off via `enabled`. /// For gas efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperator(address from, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // This code prioritizes runtime gas costs on a chain with the registry. // As such, we will not use `extcodesize`, but rather abuse the behavior // of `staticcall` returning 1 when called on an empty / missing contract, // to avoid reverting when a chain does not have the registry. if enabled { // Check if `from` is not equal to `msg.sender`, // discarding the upper 96 bits of `from` in case they are dirty. if iszero(eq(shr(96, shl(96, from)), caller())) { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `msg.sender`. mstore(0x3a, caller()) // `isOperatorAllowed` always returns true if it does not revert. if iszero( staticcall( gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00 ) ) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } } _; } /// @dev Modifier to guard a function from approving a blocked operator. /// Can be turned on / off via `enabled`. /// For efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperatorApproval(address operator, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // For more information on the optimization techniques used, // see the comments in `onlyAllowedOperator`. if enabled { // Store the function selector of `isOperatorAllowed(address,address)`, mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`, discarding the upper 96 bits in case they are dirty. mstore(0x3a, shr(96, shl(96, operator))) // `isOperatorAllowed` always returns true if it does not revert. if iszero( staticcall( gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00 ) ) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // Restore the part of the free memory pointer that was overwritten. mstore(0x3a, 0) } } _; } } error AlreadyReservedTokens(); error CallerNotOffsetter(); error FunctionLocked(); error InsufficientValue(); error InsufficientMints(); error InsufficientSupply(); error InvalidSignature(); error NoContractMinting(); error ProvenanceHashAlreadySet(); error ProvenanceHashNotSet(); error TokenOffsetAlreadySet(); error TokenOffsetNotSet(); error WithdrawFailed(); interface Offsetable { function setOffset(uint256 randomness) external; } contract Moona_Lisa_Print_Original is ERC721A, ERC2981, OperatorFilterer, Ownable { using ECDSA for bytes32; string private _baseTokenURI; bytes32 public merkleRoot; string public baseExtension = ".json"; address public contractAddress1; address public contractAddress2; uint256 public constant RESERVED = 1; uint256 public SEC_RESERVED = 14; uint256 public constant MAX_SUPPLY = 150; uint256 public PUBLIC_SUPPLY = 0; uint256 public WHITELIST_SUPPLY = 135; uint256 public mintPrice = 0.031 ether; uint256 public whiteListPrice = 0.031 ether; string public provenanceHash; bool public operatorFilteringEnabled; mapping(bytes4 => bool) public functionLocked; bool public publicSaleStatus = false; bool public whiteListSaleStatus = false; mapping(address => bool) public isUk; mapping(address => bool) public minter; mapping(address => uint256) public Claimed; uint256 public totalClaimed = 0; constructor( address _royaltyReceiver, uint96 _royaltyFraction ) ERC721A("Moona Lisa (Print) Original", "Moona Lisa (Print) Original") { _registerForOperatorFiltering(); operatorFilteringEnabled = true; minter[0xa8C10eC49dF815e73A881ABbE0Aa7b210f39E2Df] = true; minter[0x79bB164367BB64742E993f381372961a945BF447] = true; minter[0xFd88229910A28D6B319E147b40c822FA5CF38a45] = true; minter[0x6b40a842e05D60081F5474046c713b294B4BbC63] = true; minter[0x8528fA2503c49893B704B981e0cBAC021E678789] = true; contractAddress1 = 0xfCca30504374f54EdDD0b5C43A07f170B75df42A; contractAddress2 = 0xFE9E420370f0e3b0f13b6089e5b8bFBB585D0Ea9; _setDefaultRoyalty(_royaltyReceiver, _royaltyFraction); } /** * @notice Modifier applied to functions that will be disabled when they're no longer needed */ modifier lockable() { if (functionLocked[msg.sig]) revert FunctionLocked(); _; } modifier onlyMinter() { require(minter[msg.sender] == true, "You're not a minter"); _; } /** * @inheritdoc ERC721A */ function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } /** * @notice Override ERC721A _baseURI function to use base URI pattern */ function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, Strings.toString(tokenId), baseExtension ) ) : ""; } /** * @notice Return the number of tokens an address has minted * @param account Address to return the number of tokens minted for */ function numberMinted(address account) external view returns (uint256) { return _numberMinted(account); } /** * @notice Lock a function so that it can no longer be called * @dev WARNING: THIS CANNOT BE UNDONE * @param id Function signature */ function lockFunction(bytes4 id) external onlyOwner { functionLocked[id] = true; } function assignMinterRole(address _minter) external onlyOwner { require(minter[_minter] == false, "already a minter"); minter[_minter] = true; } function revokeMinterRole(address _minter) external onlyOwner { require(minter[_minter] == true, "minter doesn't exist"); minter[_minter] = false; } /** * @notice Set the state of the OpenSea operator filter * @param value Flag indicating if the operator filter should be applied to transfers and approvals */ function setOperatorFilteringEnabled(bool value) external lockable onlyOwner { operatorFilteringEnabled = value; } /** * @notice Set new royalties settings for the collection * @param receiver Address to receive royalties * @param royaltyFraction Royalty fee respective to fee denominator (10_000) */ function setRoyalties(address receiver, uint96 royaltyFraction) external onlyOwner { _setDefaultRoyalty(receiver, royaltyFraction); } /** * @notice Set token metadata base URI * @param _newBaseURI New base URI */ function setBaseURI(string calldata _newBaseURI) external lockable onlyOwner { _baseTokenURI = _newBaseURI; } /** * @notice Set provenance hash for the collection * @param _provenanceHash New hash of the metadata */ function setProvenanceHash(string calldata _provenanceHash) external lockable onlyOwner { if (bytes(provenanceHash).length != 0) revert ProvenanceHashAlreadySet(); provenanceHash = _provenanceHash; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } /** * @notice Mint `RESERVED` amount of tokens to an address * @param to Address to send the reserved tokens */ function reserve(address to) external lockable onlyOwner { if (_totalMinted() >= RESERVED) revert AlreadyReservedTokens(); _mint(to, RESERVED); } function secondaryReserve(address to, uint256 quantity) external lockable onlyOwner { require( _totalMinted() + SEC_RESERVED <= MAX_SUPPLY, "Exceeds Maximum Supply" ); _mint(to, quantity); } function whiteListMint( address to, uint256 quantity, bool _isUk, bytes32[] calldata merkleProof ) external payable onlyMinter { require(publicSaleStatus == true, "Minting is not yet open."); IERC721A whiteListContract1 = IERC721A(contractAddress1); IERC721A whiteListContract2 = IERC721A(contractAddress2); require( Claimed[to] < whiteListContract1.balanceOf(to) || Claimed[to] < whiteListContract2.balanceOf(to), "Invalid Whitelist Proof or Already Claimed" ); require( totalClaimed + quantity <= WHITELIST_SUPPLY, "All NFTs Claimed." ); require( _totalMinted() + quantity <= MAX_SUPPLY, "Exceeds Maximum Supply" ); bytes32 node = keccak256(abi.encodePacked(to, quantity)); require( MerkleProof.verify(merkleProof, merkleRoot, node), "Invalid Whitelist Proof." ); uint256 totalCost = quantity * whiteListPrice; require(msg.value >= totalCost, "Ether sent is not correct."); _mint(to, quantity); totalClaimed += quantity; Claimed[to] += quantity; isUk[to] = _isUk; if (msg.value > totalCost) { payable(msg.sender).transfer(msg.value - totalCost); } } function publicMint( address to, uint256 quantity, bool _isUk ) external payable onlyMinter { require(publicSaleStatus == true, "Minting is not yet open."); require(quantity <= PUBLIC_SUPPLY, "NFT amount exceeds"); require( _totalMinted() + quantity <= MAX_SUPPLY, "Exceeds Maximum Supply" ); uint256 totalCost = quantity * mintPrice; require(msg.value >= totalCost, "Ether sent is not correct."); _mint(to, quantity); PUBLIC_SUPPLY -= quantity; isUk[to] = _isUk; if (msg.value > totalCost) { payable(msg.sender).transfer(msg.value - totalCost); } } function setMintPrice(uint256 _newPrice) external onlyOwner { mintPrice = _newPrice; } function setWhiteListPrice(uint256 _newPrice) external onlyOwner { whiteListPrice = _newPrice; } function setPublicSupply(uint256 _newSupply) external onlyOwner { PUBLIC_SUPPLY = _newSupply; } function setWhiteListSupply(uint256 _newSupply) external onlyOwner { WHITELIST_SUPPLY = _newSupply; } function setSecondaryReserve(uint256 amount) external onlyOwner { SEC_RESERVED = amount; } function publicSale(bool _enable) external onlyOwner { publicSaleStatus = _enable; } function whiteListSale(bool _enable) external onlyOwner { whiteListSaleStatus = _enable; } /** * @notice Withdraw all ETH sent to the contract */ function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); if (!success) revert WithdrawFailed(); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator, operatorFilteringEnabled) { super.setApprovalForAll(operator, approved); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator, operatorFilteringEnabled) { super.approve(operator, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function transferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.transferFrom(from, to, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.safeTransferFrom(from, to, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFraction","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyReservedTokens","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"FunctionLocked","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":"ProvenanceHashAlreadySet","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":"WithdrawFailed","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":"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEC_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"assignMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractAddress1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractAddress2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"functionLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUk","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"id","type":"bytes4"}],"name":"lockFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"_isUk","type":"bool"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"publicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"revokeMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"secondaryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setPublicSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"royaltyFraction","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSecondaryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setWhiteListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setWhiteListSupply","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":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"_isUk","type":"bool"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whiteListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"whiteListSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200004a919062000a3a565b50600e60105560006011556087601255666e2255f4098000601355666e2255f40980006014556000601860006101000a81548160ff0219169083151502179055506000601860016101000a81548160ff0219169083151502179055506000601c55348015620000b857600080fd5b5060405162006546380380620065468339818101604052810190620000de919062000bd4565b6040518060400160405280601b81526020017f4d6f6f6e61204c69736120285072696e7429204f726967696e616c00000000008152506040518060400160405280601b81526020017f4d6f6f6e61204c69736120285072696e7429204f726967696e616c000000000081525081600290816200015b919062000a3a565b5080600390816200016d919062000a3a565b506200017e620004b160201b60201c565b6000819055505050620001a66200019a620004ba60201b60201c565b620004c260201b60201c565b620001b66200058860201b60201c565b6001601660006101000a81548160ff0219169083151502179055506001601a600073a8c10ec49df815e73a881abbe0aa7b210f39e2df73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a60007379bb164367bb64742e993f381372961a945bf44773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a600073fd88229910a28d6b319e147b40c822fa5cf38a4573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a6000736b40a842e05d60081f5474046c713b294b4bbc6373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a6000738528fa2503c49893b704b981e0cbac021e67878973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555073fcca30504374f54eddd0b5c43a07f170b75df42a600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fe9e420370f0e3b0f13b6089e5b8bfbb585d0ea9600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004a98282620005b160201b60201c565b505062000d36565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005af733cc6cdda760b79bafa08df41ecfa224f810dceb660016200075460201b60201c565b565b620005c1620007b660201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006199062000ca2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000694576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068b9062000d14565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b637d3e3dbe8260601b60601c9250816200078357826200077b57634420e486905062000783565b63a0af290390505b8060e01b600052306004528260245260008060446000806daaeb6d7670e522a718067333cd4e5af1506000602452505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200084257607f821691505b602082108103620008585762000857620007fa565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008c27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000883565b620008ce868362000883565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200091b620009156200090f84620008e6565b620008f0565b620008e6565b9050919050565b6000819050919050565b6200093783620008fa565b6200094f620009468262000922565b84845462000890565b825550505050565b600090565b6200096662000957565b620009738184846200092c565b505050565b5b818110156200099b576200098f6000826200095c565b60018101905062000979565b5050565b601f821115620009ea57620009b4816200085e565b620009bf8462000873565b81016020851015620009cf578190505b620009e7620009de8562000873565b83018262000978565b50505b505050565b600082821c905092915050565b600062000a0f60001984600802620009ef565b1980831691505092915050565b600062000a2a8383620009fc565b9150826002028217905092915050565b62000a4582620007c0565b67ffffffffffffffff81111562000a615762000a60620007cb565b5b62000a6d825462000829565b62000a7a8282856200099f565b600060209050601f83116001811462000ab2576000841562000a9d578287015190505b62000aa9858262000a1c565b86555062000b19565b601f19841662000ac2866200085e565b60005b8281101562000aec5784890151825560018201915060208501945060208101905062000ac5565b8683101562000b0c578489015162000b08601f891682620009fc565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b538262000b26565b9050919050565b62000b658162000b46565b811462000b7157600080fd5b50565b60008151905062000b858162000b5a565b92915050565b60006bffffffffffffffffffffffff82169050919050565b62000bae8162000b8b565b811462000bba57600080fd5b50565b60008151905062000bce8162000ba3565b92915050565b6000806040838503121562000bee5762000bed62000b21565b5b600062000bfe8582860162000b74565b925050602062000c118582860162000bbd565b9150509250929050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000c8a602a8362000c1b565b915062000c978262000c2c565b604082019050919050565b6000602082019050818103600083015262000cbd8162000c7b565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000cfc60198362000c1b565b915062000d098262000cc4565b602082019050919050565b6000602082019050818103600083015262000d2f8162000ced565b9050919050565b6158008062000d466000396000f3fe6080604052600436106103975760003560e01c80637bc02806116101dc578063bbadfe7611610102578063d54ad2a1116100a0578063e985e9c51161006f578063e985e9c514610d25578063f2fde38b14610d62578063f4a0a52814610d8b578063fb796e6c14610db457610397565b8063d54ad2a114610c6b578063da3ef23f14610c96578063dc33e68114610cbf578063e75179a414610cfc57610397565b8063c6682862116100dc578063c668286214610baf578063c6ab67a314610bda578063c87b56dd14610c05578063caab918214610c4257610397565b8063bbadfe7614610b20578063beafc89b14610b5d578063c21b471b14610b8657610397565b8063a22cb4651161017a578063b629f19211610149578063b629f19214610a73578063b6c693e514610ab0578063b7c0b8e814610adb578063b88d4fde14610b0457610397565b8063a22cb465146109b9578063aa592f25146109e2578063b366d61314610a0d578063b449c24d14610a3657610397565b80637ec9e156116101b65780637ec9e1561461090d5780638342083a146109385780638da5cb5b1461096357806395d89b411461098e57610397565b80637bc02806146108905780637c976322146108bb5780637cb64759146108e457610397565b80633dd08c38116102c15780636817c76c1161025f57806370a082311161022e57806370a08231146107f7578063715018a61461083457806374d0101d1461084b57806378bfbdbb1461087457610397565b80636817c76c1461074d578063685756851461077857806369e2f0fb146107a35780636e56539b146107cc57610397565b8063559c55b91161029b578063559c55b91461069357806355f804b3146106bc578063601e5e77146106e55780636352211e1461071057610397565b80633dd08c381461061e578063402c38561461065b57806342842e0e1461067757610397565b806323b872dd1161033957806332cb6b0c1161030857806332cb6b0c1461058a57806334531828146105b5578063381a3506146105de5780633ccfd60b1461060757610397565b806323b872dd146104dc57806326aa420a146104f85780632a55205a146105215780632eb4a7ab1461055f57610397565b8063095ea7b311610375578063095ea7b3146104415780630de4cd801461045d578063109695231461048857806318160ddd146104b157610397565b806301ffc9a71461039c57806306fdde03146103d9578063081812fc14610404575b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be9190613e7b565b610ddf565b6040516103d09190613ec3565b60405180910390f35b3480156103e557600080fd5b506103ee610e01565b6040516103fb9190613f6e565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190613fc6565b610e93565b6040516104389190614034565b60405180910390f35b61045b6004803603810190610456919061407b565b610f12565b005b34801561046957600080fd5b50610472610f81565b60405161047f9190613ec3565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190614120565b610f94565b005b3480156104bd57600080fd5b506104c66110b3565b6040516104d3919061417c565b60405180910390f35b6104f660048036038101906104f19190614197565b6110ca565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613fc6565b611143565b005b34801561052d57600080fd5b50610548600480360381019061054391906141ea565b611155565b60405161055692919061422a565b60405180910390f35b34801561056b57600080fd5b5061057461133f565b604051610581919061426c565b60405180910390f35b34801561059657600080fd5b5061059f611345565b6040516105ac919061417c565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d79190613e7b565b61134a565b005b3480156105ea57600080fd5b5061060560048036038101906106009190613fc6565b6113bf565b005b34801561061357600080fd5b5061061c6113d1565b005b34801561062a57600080fd5b5061064560048036038101906106409190614287565b61147f565b6040516106529190613ec3565b60405180910390f35b610675600480360381019061067091906142e0565b61149f565b005b610691600480360381019061068c9190614197565b611753565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613fc6565b6117cc565b005b3480156106c857600080fd5b506106e360048036038101906106de9190614120565b6117de565b005b3480156106f157600080fd5b506106fa6118b5565b604051610707919061417c565b60405180910390f35b34801561071c57600080fd5b5061073760048036038101906107329190613fc6565b6118bb565b6040516107449190614034565b60405180910390f35b34801561075957600080fd5b506107626118cd565b60405161076f919061417c565b60405180910390f35b34801561078457600080fd5b5061078d6118d3565b60405161079a919061417c565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c59190614287565b6118d9565b005b3480156107d857600080fd5b506107e16119cf565b6040516107ee919061417c565b60405180910390f35b34801561080357600080fd5b5061081e60048036038101906108199190614287565b6119d5565b60405161082b919061417c565b60405180910390f35b34801561084057600080fd5b50610849611a8d565b005b34801561085757600080fd5b50610872600480360381019061086d919061407b565b611aa1565b005b61088e60048036038101906108899190614389565b611bc8565b005b34801561089c57600080fd5b506108a56121a8565b6040516108b29190614034565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd9190614411565b6121ce565b005b3480156108f057600080fd5b5061090b6004803603810190610906919061446a565b6121f3565b005b34801561091957600080fd5b50610922612205565b60405161092f9190614034565b60405180910390f35b34801561094457600080fd5b5061094d61222b565b60405161095a919061417c565b60405180910390f35b34801561096f57600080fd5b50610978612231565b6040516109859190614034565b60405180910390f35b34801561099a57600080fd5b506109a361225b565b6040516109b09190613f6e565b60405180910390f35b3480156109c557600080fd5b506109e060048036038101906109db9190614497565b6122ed565b005b3480156109ee57600080fd5b506109f761235c565b604051610a04919061417c565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f9190614287565b612361565b005b348015610a4257600080fd5b50610a5d6004803603810190610a589190614287565b612457565b604051610a6a919061417c565b60405180910390f35b348015610a7f57600080fd5b50610a9a6004803603810190610a959190614287565b61246f565b604051610aa79190613ec3565b60405180910390f35b348015610abc57600080fd5b50610ac561248f565b604051610ad29190613ec3565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd9190614411565b6124a2565b005b610b1e6004803603810190610b199190614607565b612580565b005b348015610b2c57600080fd5b50610b476004803603810190610b429190613e7b565b6125fb565b604051610b549190613ec3565b60405180910390f35b348015610b6957600080fd5b50610b846004803603810190610b7f9190613fc6565b61261b565b005b348015610b9257600080fd5b50610bad6004803603810190610ba891906146ce565b61262d565b005b348015610bbb57600080fd5b50610bc4612643565b604051610bd19190613f6e565b60405180910390f35b348015610be657600080fd5b50610bef6126d1565b604051610bfc9190613f6e565b60405180910390f35b348015610c1157600080fd5b50610c2c6004803603810190610c279190613fc6565b61275f565b604051610c399190613f6e565b60405180910390f35b348015610c4e57600080fd5b50610c696004803603810190610c649190614411565b612809565b005b348015610c7757600080fd5b50610c8061282e565b604051610c8d919061417c565b60405180910390f35b348015610ca257600080fd5b50610cbd6004803603810190610cb891906147af565b612834565b005b348015610ccb57600080fd5b50610ce66004803603810190610ce19190614287565b61284f565b604051610cf3919061417c565b60405180910390f35b348015610d0857600080fd5b50610d236004803603810190610d1e9190614287565b612861565b005b348015610d3157600080fd5b50610d4c6004803603810190610d4791906147f8565b612971565b604051610d599190613ec3565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d849190614287565b612a05565b005b348015610d9757600080fd5b50610db26004803603810190610dad9190613fc6565b612a88565b005b348015610dc057600080fd5b50610dc9612a9a565b604051610dd69190613ec3565b60405180910390f35b6000610dea82612aad565b80610dfa5750610df982612b3f565b5b9050919050565b606060028054610e1090614867565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614867565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b6000610e9e82612bb9565b610ed4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601660009054906101000a900460ff168015610f715769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610f6b573d6000803e3d6000fd5b6000603a525b610f7b8484612c18565b50505050565b601860019054906101000a900460ff1681565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561104d576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611055612d5c565b60006015805461106490614867565b90501461109d576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181601591826110ae929190614a4f565b505050565b60006110bd612dda565b6001546000540303905090565b82601660009054906101000a900460ff16801561113157338260601b60601c146111305769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa61112a573d6000803e3d6000fd5b6000603a525b5b61113c858585612de3565b5050505050565b61114b612d5c565b8060118190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112ea5760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112f4613105565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866113209190614b4e565b61132a9190614bbf565b90508160000151819350935050509250929050565b600c5481565b609681565b611352612d5c565b600160176000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6113c7612d5c565b8060128190555050565b6113d9612d5c565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516113ff90614c21565b60006040518083038185875af1925050503d806000811461143c576040519150601f19603f3d011682016040523d82523d6000602084013e611441565b606091505b505090508061147c576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b601a6020528060005260406000206000915054906101000a900460ff1681565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990614c82565b60405180910390fd5b60011515601860009054906101000a900460ff16151514611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90614cee565b60405180910390fd5b6011548211156115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c490614d5a565b60405180910390fd5b6096826115d861310f565b6115e29190614d7a565b1115611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90614dfa565b60405180910390fd5b6000601354836116339190614b4e565b905080341015611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f90614e66565b60405180910390fd5b6116828484613122565b82601160008282546116949190614e86565b9250508190555081601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508034111561174d573373ffffffffffffffffffffffffffffffffffffffff166108fc82346117209190614e86565b9081150290604051600060405180830381858888f1935050505015801561174b573d6000803e3d6000fd5b505b50505050565b82601660009054906101000a900460ff1680156117ba57338260601b60601c146117b95769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6117b3573d6000803e3d6000fd5b6000603a525b5b6117c58585856132dd565b5050505050565b6117d4612d5c565b8060108190555050565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611897576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61189f612d5c565b8181600b91826118b0929190614a4f565b505050565b60105481565b60006118c6826132fd565b9050919050565b60135481565b60145481565b6118e1612d5c565b60011515601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b90614f06565b60405180910390fd5b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a3c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a95612d5c565b611a9f60006133c9565b565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611b5a576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b62612d5c565b6096601054611b6f61310f565b611b799190614d7a565b1115611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb190614dfa565b60405180910390fd5b611bc48282613122565b5050565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290614c82565b60405180910390fd5b60011515601860009054906101000a900460ff16151514611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca890614cee565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611d389190614034565b602060405180830381865afa158015611d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d799190614f3b565b601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541080611e7c57508073ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611df99190614034565b602060405180830381865afa158015611e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3a9190614f3b565b601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb290614fda565b60405180910390fd5b60125486601c54611ecc9190614d7a565b1115611f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0490615046565b60405180910390fd5b609686611f1861310f565b611f229190614d7a565b1115611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a90614dfa565b60405180910390fd5b60008787604051602001611f789291906150cf565b604051602081830303815290604052805190602001209050611fde858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c548361348f565b61201d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201490615147565b60405180910390fd5b60006014548861202d9190614b4e565b905080341015612072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206990614e66565b60405180910390fd5b61207c8989613122565b87601c600082825461208e9190614d7a565b9250508190555087601b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e49190614d7a565b9250508190555086601960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508034111561219d573373ffffffffffffffffffffffffffffffffffffffff166108fc82346121709190614e86565b9081150290604051600060405180830381858888f1935050505015801561219b573d6000803e3d6000fd5b505b505050505050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121d6612d5c565b80601860016101000a81548160ff02191690831515021790555050565b6121fb612d5c565b80600c8190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461226a90614867565b80601f016020809104026020016040519081016040528092919081815260200182805461229690614867565b80156122e35780601f106122b8576101008083540402835291602001916122e3565b820191906000526020600020905b8154815290600101906020018083116122c657829003601f168201915b5050505050905090565b81601660009054906101000a900460ff16801561234c5769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa612346573d6000803e3d6000fd5b6000603a525b6123568484613545565b50505050565b600181565b612369612d5c565b60001515601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146123fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f3906151b3565b60405180910390fd5b6001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601b6020528060005260406000206000915090505481565b60196020528060005260406000206000915054906101000a900460ff1681565b601860009054906101000a900460ff1681565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561255b576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612563612d5c565b80601660006101000a81548160ff02191690831515021790555050565b83601660009054906101000a900460ff1680156125e757338260601b60601c146125e65769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6125e0573d6000803e3d6000fd5b6000603a525b5b6125f386868686613650565b505050505050565b60176020528060005260406000206000915054906101000a900460ff1681565b612623612d5c565b8060148190555050565b612635612d5c565b61263f82826136c3565b5050565b600d805461265090614867565b80601f016020809104026020016040519081016040528092919081815260200182805461267c90614867565b80156126c95780601f1061269e576101008083540402835291602001916126c9565b820191906000526020600020905b8154815290600101906020018083116126ac57829003601f168201915b505050505081565b601580546126de90614867565b80601f016020809104026020016040519081016040528092919081815260200182805461270a90614867565b80156127575780601f1061272c57610100808354040283529160200191612757565b820191906000526020600020905b81548152906001019060200180831161273a57829003601f168201915b505050505081565b606061276a82612bb9565b6127a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a090615245565b60405180910390fd5b60006127b3613858565b905060008151116127d35760405180602001604052806000815250612801565b806127dd846138ea565b600d6040516020016127f193929190615324565b6040516020818303038152906040525b915050919050565b612811612d5c565b80601860006101000a81548160ff02191690831515021790555050565b601c5481565b61283c612d5c565b80600d908161284b9190615355565b5050565b600061285a826139b8565b9050919050565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561291a576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612922612d5c565b600161292c61310f565b10612963576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61296e816001613122565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612a0d612d5c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7390615499565b60405180910390fd5b612a85816133c9565b50565b612a90612d5c565b8060138190555050565b601660009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b0857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b385750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bb25750612bb182613a0f565b5b9050919050565b600081612bc4612dda565b11158015612bd3575060005482105b8015612c11575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000612c23826118bb565b90508073ffffffffffffffffffffffffffffffffffffffff16612c44613a79565b73ffffffffffffffffffffffffffffffffffffffff1614612ca757612c7081612c6b613a79565b612971565b612ca6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612d64613a81565b73ffffffffffffffffffffffffffffffffffffffff16612d82612231565b73ffffffffffffffffffffffffffffffffffffffff1614612dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcf90615505565b60405180910390fd5b565b60006001905090565b6000612dee826132fd565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e55576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612e6184613a89565b91509150612e778187612e72613a79565b613ab0565b612ec357612e8c86612e87613a79565b612971565b612ec2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f29576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f368686866001613af4565b8015612f4157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061300f85612feb888887613afa565b7c020000000000000000000000000000000000000000000000000000000017613b22565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036130955760006001850190506000600460008381526020019081526020016000205403613093576000548114613092578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130fd8686866001613b4d565b505050505050565b6000612710905090565b6000613119612dda565b60005403905090565b60008054905060008203613162576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61316f6000848385613af4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131e6836131d76000866000613afa565b6131e085613b53565b17613b22565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461328757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061324c565b50600082036132c2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506132d86000848385613b4d565b505050565b6132f883838360405180602001604052806000815250612580565b505050565b6000808290508061330c612dda565b11613392576000548110156133915760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361338f575b6000810361338557600460008360019003935083815260200190815260200160002054905061335b565b80925050506133c4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b85518110156135375760008682815181106134b6576134b5615525565b5b602002602001015190508083116134f75782816040516020016134da929190615575565b604051602081830303815290604052805190602001209250613523565b808360405160200161350a929190615575565b6040516020818303038152906040528051906020012092505b50808061352f906155a1565b915050613498565b508381149150509392505050565b8060076000613552613a79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166135ff613a79565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516136449190613ec3565b60405180910390a35050565b61365b8484846110ca565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136bd5761368684848484613b63565b6136bc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6136cb613105565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115613729576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137209061565b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378f906156c7565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b805461386790614867565b80601f016020809104026020016040519081016040528092919081815260200182805461389390614867565b80156138e05780601f106138b5576101008083540402835291602001916138e0565b820191906000526020600020905b8154815290600101906020018083116138c357829003601f168201915b5050505050905090565b6060600060016138f984613cb3565b01905060008167ffffffffffffffff811115613918576139176144dc565b5b6040519080825280601f01601f19166020018201604052801561394a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156139ad578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816139a1576139a0614b90565b5b04945060008503613958575b819350505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613b11868684613e06565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b89613a79565b8786866040518563ffffffff1660e01b8152600401613bab949392919061573c565b6020604051808303816000875af1925050508015613be757506040513d601f19601f82011682018060405250810190613be4919061579d565b60015b613c60573d8060008114613c17576040519150601f19603f3d011682016040523d82523d6000602084013e613c1c565b606091505b506000815103613c58576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613d11577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613d0757613d06614b90565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613d4e576d04ee2d6d415b85acef81000000008381613d4457613d43614b90565b5b0492506020810190505b662386f26fc100008310613d7d57662386f26fc100008381613d7357613d72614b90565b5b0492506010810190505b6305f5e1008310613da6576305f5e1008381613d9c57613d9b614b90565b5b0492506008810190505b6127108310613dcb576127108381613dc157613dc0614b90565b5b0492506004810190505b60648310613dee5760648381613de457613de3614b90565b5b0492506002810190505b600a8310613dfd576001810190505b80915050919050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e5881613e23565b8114613e6357600080fd5b50565b600081359050613e7581613e4f565b92915050565b600060208284031215613e9157613e90613e19565b5b6000613e9f84828501613e66565b91505092915050565b60008115159050919050565b613ebd81613ea8565b82525050565b6000602082019050613ed86000830184613eb4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f18578082015181840152602081019050613efd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613f4082613ede565b613f4a8185613ee9565b9350613f5a818560208601613efa565b613f6381613f24565b840191505092915050565b60006020820190508181036000830152613f888184613f35565b905092915050565b6000819050919050565b613fa381613f90565b8114613fae57600080fd5b50565b600081359050613fc081613f9a565b92915050565b600060208284031215613fdc57613fdb613e19565b5b6000613fea84828501613fb1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061401e82613ff3565b9050919050565b61402e81614013565b82525050565b60006020820190506140496000830184614025565b92915050565b61405881614013565b811461406357600080fd5b50565b6000813590506140758161404f565b92915050565b6000806040838503121561409257614091613e19565b5b60006140a085828601614066565b92505060206140b185828601613fb1565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126140e0576140df6140bb565b5b8235905067ffffffffffffffff8111156140fd576140fc6140c0565b5b602083019150836001820283011115614119576141186140c5565b5b9250929050565b6000806020838503121561413757614136613e19565b5b600083013567ffffffffffffffff81111561415557614154613e1e565b5b614161858286016140ca565b92509250509250929050565b61417681613f90565b82525050565b6000602082019050614191600083018461416d565b92915050565b6000806000606084860312156141b0576141af613e19565b5b60006141be86828701614066565b93505060206141cf86828701614066565b92505060406141e086828701613fb1565b9150509250925092565b6000806040838503121561420157614200613e19565b5b600061420f85828601613fb1565b925050602061422085828601613fb1565b9150509250929050565b600060408201905061423f6000830185614025565b61424c602083018461416d565b9392505050565b6000819050919050565b61426681614253565b82525050565b6000602082019050614281600083018461425d565b92915050565b60006020828403121561429d5761429c613e19565b5b60006142ab84828501614066565b91505092915050565b6142bd81613ea8565b81146142c857600080fd5b50565b6000813590506142da816142b4565b92915050565b6000806000606084860312156142f9576142f8613e19565b5b600061430786828701614066565b935050602061431886828701613fb1565b9250506040614329868287016142cb565b9150509250925092565b60008083601f840112614349576143486140bb565b5b8235905067ffffffffffffffff811115614366576143656140c0565b5b602083019150836020820283011115614382576143816140c5565b5b9250929050565b6000806000806000608086880312156143a5576143a4613e19565b5b60006143b388828901614066565b95505060206143c488828901613fb1565b94505060406143d5888289016142cb565b935050606086013567ffffffffffffffff8111156143f6576143f5613e1e565b5b61440288828901614333565b92509250509295509295909350565b60006020828403121561442757614426613e19565b5b6000614435848285016142cb565b91505092915050565b61444781614253565b811461445257600080fd5b50565b6000813590506144648161443e565b92915050565b6000602082840312156144805761447f613e19565b5b600061448e84828501614455565b91505092915050565b600080604083850312156144ae576144ad613e19565b5b60006144bc85828601614066565b92505060206144cd858286016142cb565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61451482613f24565b810181811067ffffffffffffffff82111715614533576145326144dc565b5b80604052505050565b6000614546613e0f565b9050614552828261450b565b919050565b600067ffffffffffffffff821115614572576145716144dc565b5b61457b82613f24565b9050602081019050919050565b82818337600083830152505050565b60006145aa6145a584614557565b61453c565b9050828152602081018484840111156145c6576145c56144d7565b5b6145d1848285614588565b509392505050565b600082601f8301126145ee576145ed6140bb565b5b81356145fe848260208601614597565b91505092915050565b6000806000806080858703121561462157614620613e19565b5b600061462f87828801614066565b945050602061464087828801614066565b935050604061465187828801613fb1565b925050606085013567ffffffffffffffff81111561467257614671613e1e565b5b61467e878288016145d9565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6146ab8161468a565b81146146b657600080fd5b50565b6000813590506146c8816146a2565b92915050565b600080604083850312156146e5576146e4613e19565b5b60006146f385828601614066565b9250506020614704858286016146b9565b9150509250929050565b600067ffffffffffffffff821115614729576147286144dc565b5b61473282613f24565b9050602081019050919050565b600061475261474d8461470e565b61453c565b90508281526020810184848401111561476e5761476d6144d7565b5b614779848285614588565b509392505050565b600082601f830112614796576147956140bb565b5b81356147a684826020860161473f565b91505092915050565b6000602082840312156147c5576147c4613e19565b5b600082013567ffffffffffffffff8111156147e3576147e2613e1e565b5b6147ef84828501614781565b91505092915050565b6000806040838503121561480f5761480e613e19565b5b600061481d85828601614066565b925050602061482e85828601614066565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061487f57607f821691505b60208210810361489257614891614838565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149057fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148c8565b61490f86836148c8565b95508019841693508086168417925050509392505050565b6000819050919050565b600061494c61494761494284613f90565b614927565b613f90565b9050919050565b6000819050919050565b61496683614931565b61497a61497282614953565b8484546148d5565b825550505050565b600090565b61498f614982565b61499a81848461495d565b505050565b5b818110156149be576149b3600082614987565b6001810190506149a0565b5050565b601f821115614a03576149d4816148a3565b6149dd846148b8565b810160208510156149ec578190505b614a006149f8856148b8565b83018261499f565b50505b505050565b600082821c905092915050565b6000614a2660001984600802614a08565b1980831691505092915050565b6000614a3f8383614a15565b9150826002028217905092915050565b614a598383614898565b67ffffffffffffffff811115614a7257614a716144dc565b5b614a7c8254614867565b614a878282856149c2565b6000601f831160018114614ab65760008415614aa4578287013590505b614aae8582614a33565b865550614b16565b601f198416614ac4866148a3565b60005b82811015614aec57848901358255600182019150602085019450602081019050614ac7565b86831015614b095784890135614b05601f891682614a15565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b5982613f90565b9150614b6483613f90565b9250828202614b7281613f90565b91508282048414831517614b8957614b88614b1f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bca82613f90565b9150614bd583613f90565b925082614be557614be4614b90565b5b828204905092915050565b600081905092915050565b50565b6000614c0b600083614bf0565b9150614c1682614bfb565b600082019050919050565b6000614c2c82614bfe565b9150819050919050565b7f596f75277265206e6f742061206d696e74657200000000000000000000000000600082015250565b6000614c6c601383613ee9565b9150614c7782614c36565b602082019050919050565b60006020820190508181036000830152614c9b81614c5f565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000614cd8601883613ee9565b9150614ce382614ca2565b602082019050919050565b60006020820190508181036000830152614d0781614ccb565b9050919050565b7f4e465420616d6f756e7420657863656564730000000000000000000000000000600082015250565b6000614d44601283613ee9565b9150614d4f82614d0e565b602082019050919050565b60006020820190508181036000830152614d7381614d37565b9050919050565b6000614d8582613f90565b9150614d9083613f90565b9250828201905080821115614da857614da7614b1f565b5b92915050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000614de4601683613ee9565b9150614def82614dae565b602082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b6000614e50601a83613ee9565b9150614e5b82614e1a565b602082019050919050565b60006020820190508181036000830152614e7f81614e43565b9050919050565b6000614e9182613f90565b9150614e9c83613f90565b9250828203905081811115614eb457614eb3614b1f565b5b92915050565b7f6d696e74657220646f65736e2774206578697374000000000000000000000000600082015250565b6000614ef0601483613ee9565b9150614efb82614eba565b602082019050919050565b60006020820190508181036000830152614f1f81614ee3565b9050919050565b600081519050614f3581613f9a565b92915050565b600060208284031215614f5157614f50613e19565b5b6000614f5f84828501614f26565b91505092915050565b7f496e76616c69642057686974656c6973742050726f6f66206f7220416c72656160008201527f647920436c61696d656400000000000000000000000000000000000000000000602082015250565b6000614fc4602a83613ee9565b9150614fcf82614f68565b604082019050919050565b60006020820190508181036000830152614ff381614fb7565b9050919050565b7f416c6c204e46547320436c61696d65642e000000000000000000000000000000600082015250565b6000615030601183613ee9565b915061503b82614ffa565b602082019050919050565b6000602082019050818103600083015261505f81615023565b9050919050565b60008160601b9050919050565b600061507e82615066565b9050919050565b600061509082615073565b9050919050565b6150a86150a382614013565b615085565b82525050565b6000819050919050565b6150c96150c482613f90565b6150ae565b82525050565b60006150db8285615097565b6014820191506150eb82846150b8565b6020820191508190509392505050565b7f496e76616c69642057686974656c6973742050726f6f662e0000000000000000600082015250565b6000615131601883613ee9565b915061513c826150fb565b602082019050919050565b6000602082019050818103600083015261516081615124565b9050919050565b7f616c72656164792061206d696e74657200000000000000000000000000000000600082015250565b600061519d601083613ee9565b91506151a882615167565b602082019050919050565b600060208201905081810360008301526151cc81615190565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061522f602f83613ee9565b915061523a826151d3565b604082019050919050565b6000602082019050818103600083015261525e81615222565b9050919050565b600081905092915050565b600061527b82613ede565b6152858185615265565b9350615295818560208601613efa565b80840191505092915050565b600081546152ae81614867565b6152b88186615265565b945060018216600081146152d357600181146152e85761531b565b60ff198316865281151582028601935061531b565b6152f1856148a3565b60005b83811015615313578154818901526001820191506020810190506152f4565b838801955050505b50505092915050565b60006153308286615270565b915061533c8285615270565b915061534882846152a1565b9150819050949350505050565b61535e82613ede565b67ffffffffffffffff811115615377576153766144dc565b5b6153818254614867565b61538c8282856149c2565b600060209050601f8311600181146153bf57600084156153ad578287015190505b6153b78582614a33565b86555061541f565b601f1984166153cd866148a3565b60005b828110156153f5578489015182556001820191506020850194506020810190506153d0565b86831015615412578489015161540e601f891682614a15565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615483602683613ee9565b915061548e82615427565b604082019050919050565b600060208201905081810360008301526154b281615476565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006154ef602083613ee9565b91506154fa826154b9565b602082019050919050565b6000602082019050818103600083015261551e816154e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b61556f61556a82614253565b615554565b82525050565b6000615581828561555e565b602082019150615591828461555e565b6020820191508190509392505050565b60006155ac82613f90565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036155de576155dd614b1f565b5b600182019050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615645602a83613ee9565b9150615650826155e9565b604082019050919050565b6000602082019050818103600083015261567481615638565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006156b1601983613ee9565b91506156bc8261567b565b602082019050919050565b600060208201905081810360008301526156e0816156a4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061570e826156e7565b61571881856156f2565b9350615728818560208601613efa565b61573181613f24565b840191505092915050565b60006080820190506157516000830187614025565b61575e6020830186614025565b61576b604083018561416d565b818103606083015261577d8184615703565b905095945050505050565b60008151905061579781613e4f565b92915050565b6000602082840312156157b3576157b2613e19565b5b60006157c184828501615788565b9150509291505056fea26469706673582212200739ac436e1e36a840365ad6a5e73c06cd6036fc520ab7d3fcf11a6662d824a164736f6c6343000812003300000000000000000000000004d601c7101fe1d271ee18340be5dc37ba016d9100000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106103975760003560e01c80637bc02806116101dc578063bbadfe7611610102578063d54ad2a1116100a0578063e985e9c51161006f578063e985e9c514610d25578063f2fde38b14610d62578063f4a0a52814610d8b578063fb796e6c14610db457610397565b8063d54ad2a114610c6b578063da3ef23f14610c96578063dc33e68114610cbf578063e75179a414610cfc57610397565b8063c6682862116100dc578063c668286214610baf578063c6ab67a314610bda578063c87b56dd14610c05578063caab918214610c4257610397565b8063bbadfe7614610b20578063beafc89b14610b5d578063c21b471b14610b8657610397565b8063a22cb4651161017a578063b629f19211610149578063b629f19214610a73578063b6c693e514610ab0578063b7c0b8e814610adb578063b88d4fde14610b0457610397565b8063a22cb465146109b9578063aa592f25146109e2578063b366d61314610a0d578063b449c24d14610a3657610397565b80637ec9e156116101b65780637ec9e1561461090d5780638342083a146109385780638da5cb5b1461096357806395d89b411461098e57610397565b80637bc02806146108905780637c976322146108bb5780637cb64759146108e457610397565b80633dd08c38116102c15780636817c76c1161025f57806370a082311161022e57806370a08231146107f7578063715018a61461083457806374d0101d1461084b57806378bfbdbb1461087457610397565b80636817c76c1461074d578063685756851461077857806369e2f0fb146107a35780636e56539b146107cc57610397565b8063559c55b91161029b578063559c55b91461069357806355f804b3146106bc578063601e5e77146106e55780636352211e1461071057610397565b80633dd08c381461061e578063402c38561461065b57806342842e0e1461067757610397565b806323b872dd1161033957806332cb6b0c1161030857806332cb6b0c1461058a57806334531828146105b5578063381a3506146105de5780633ccfd60b1461060757610397565b806323b872dd146104dc57806326aa420a146104f85780632a55205a146105215780632eb4a7ab1461055f57610397565b8063095ea7b311610375578063095ea7b3146104415780630de4cd801461045d578063109695231461048857806318160ddd146104b157610397565b806301ffc9a71461039c57806306fdde03146103d9578063081812fc14610404575b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be9190613e7b565b610ddf565b6040516103d09190613ec3565b60405180910390f35b3480156103e557600080fd5b506103ee610e01565b6040516103fb9190613f6e565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190613fc6565b610e93565b6040516104389190614034565b60405180910390f35b61045b6004803603810190610456919061407b565b610f12565b005b34801561046957600080fd5b50610472610f81565b60405161047f9190613ec3565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190614120565b610f94565b005b3480156104bd57600080fd5b506104c66110b3565b6040516104d3919061417c565b60405180910390f35b6104f660048036038101906104f19190614197565b6110ca565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613fc6565b611143565b005b34801561052d57600080fd5b50610548600480360381019061054391906141ea565b611155565b60405161055692919061422a565b60405180910390f35b34801561056b57600080fd5b5061057461133f565b604051610581919061426c565b60405180910390f35b34801561059657600080fd5b5061059f611345565b6040516105ac919061417c565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d79190613e7b565b61134a565b005b3480156105ea57600080fd5b5061060560048036038101906106009190613fc6565b6113bf565b005b34801561061357600080fd5b5061061c6113d1565b005b34801561062a57600080fd5b5061064560048036038101906106409190614287565b61147f565b6040516106529190613ec3565b60405180910390f35b610675600480360381019061067091906142e0565b61149f565b005b610691600480360381019061068c9190614197565b611753565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613fc6565b6117cc565b005b3480156106c857600080fd5b506106e360048036038101906106de9190614120565b6117de565b005b3480156106f157600080fd5b506106fa6118b5565b604051610707919061417c565b60405180910390f35b34801561071c57600080fd5b5061073760048036038101906107329190613fc6565b6118bb565b6040516107449190614034565b60405180910390f35b34801561075957600080fd5b506107626118cd565b60405161076f919061417c565b60405180910390f35b34801561078457600080fd5b5061078d6118d3565b60405161079a919061417c565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c59190614287565b6118d9565b005b3480156107d857600080fd5b506107e16119cf565b6040516107ee919061417c565b60405180910390f35b34801561080357600080fd5b5061081e60048036038101906108199190614287565b6119d5565b60405161082b919061417c565b60405180910390f35b34801561084057600080fd5b50610849611a8d565b005b34801561085757600080fd5b50610872600480360381019061086d919061407b565b611aa1565b005b61088e60048036038101906108899190614389565b611bc8565b005b34801561089c57600080fd5b506108a56121a8565b6040516108b29190614034565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd9190614411565b6121ce565b005b3480156108f057600080fd5b5061090b6004803603810190610906919061446a565b6121f3565b005b34801561091957600080fd5b50610922612205565b60405161092f9190614034565b60405180910390f35b34801561094457600080fd5b5061094d61222b565b60405161095a919061417c565b60405180910390f35b34801561096f57600080fd5b50610978612231565b6040516109859190614034565b60405180910390f35b34801561099a57600080fd5b506109a361225b565b6040516109b09190613f6e565b60405180910390f35b3480156109c557600080fd5b506109e060048036038101906109db9190614497565b6122ed565b005b3480156109ee57600080fd5b506109f761235c565b604051610a04919061417c565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f9190614287565b612361565b005b348015610a4257600080fd5b50610a5d6004803603810190610a589190614287565b612457565b604051610a6a919061417c565b60405180910390f35b348015610a7f57600080fd5b50610a9a6004803603810190610a959190614287565b61246f565b604051610aa79190613ec3565b60405180910390f35b348015610abc57600080fd5b50610ac561248f565b604051610ad29190613ec3565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd9190614411565b6124a2565b005b610b1e6004803603810190610b199190614607565b612580565b005b348015610b2c57600080fd5b50610b476004803603810190610b429190613e7b565b6125fb565b604051610b549190613ec3565b60405180910390f35b348015610b6957600080fd5b50610b846004803603810190610b7f9190613fc6565b61261b565b005b348015610b9257600080fd5b50610bad6004803603810190610ba891906146ce565b61262d565b005b348015610bbb57600080fd5b50610bc4612643565b604051610bd19190613f6e565b60405180910390f35b348015610be657600080fd5b50610bef6126d1565b604051610bfc9190613f6e565b60405180910390f35b348015610c1157600080fd5b50610c2c6004803603810190610c279190613fc6565b61275f565b604051610c399190613f6e565b60405180910390f35b348015610c4e57600080fd5b50610c696004803603810190610c649190614411565b612809565b005b348015610c7757600080fd5b50610c8061282e565b604051610c8d919061417c565b60405180910390f35b348015610ca257600080fd5b50610cbd6004803603810190610cb891906147af565b612834565b005b348015610ccb57600080fd5b50610ce66004803603810190610ce19190614287565b61284f565b604051610cf3919061417c565b60405180910390f35b348015610d0857600080fd5b50610d236004803603810190610d1e9190614287565b612861565b005b348015610d3157600080fd5b50610d4c6004803603810190610d4791906147f8565b612971565b604051610d599190613ec3565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d849190614287565b612a05565b005b348015610d9757600080fd5b50610db26004803603810190610dad9190613fc6565b612a88565b005b348015610dc057600080fd5b50610dc9612a9a565b604051610dd69190613ec3565b60405180910390f35b6000610dea82612aad565b80610dfa5750610df982612b3f565b5b9050919050565b606060028054610e1090614867565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614867565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b6000610e9e82612bb9565b610ed4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601660009054906101000a900460ff168015610f715769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610f6b573d6000803e3d6000fd5b6000603a525b610f7b8484612c18565b50505050565b601860019054906101000a900460ff1681565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561104d576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611055612d5c565b60006015805461106490614867565b90501461109d576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181601591826110ae929190614a4f565b505050565b60006110bd612dda565b6001546000540303905090565b82601660009054906101000a900460ff16801561113157338260601b60601c146111305769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa61112a573d6000803e3d6000fd5b6000603a525b5b61113c858585612de3565b5050505050565b61114b612d5c565b8060118190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112ea5760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112f4613105565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866113209190614b4e565b61132a9190614bbf565b90508160000151819350935050509250929050565b600c5481565b609681565b611352612d5c565b600160176000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6113c7612d5c565b8060128190555050565b6113d9612d5c565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516113ff90614c21565b60006040518083038185875af1925050503d806000811461143c576040519150601f19603f3d011682016040523d82523d6000602084013e611441565b606091505b505090508061147c576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b601a6020528060005260406000206000915054906101000a900460ff1681565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990614c82565b60405180910390fd5b60011515601860009054906101000a900460ff16151514611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90614cee565b60405180910390fd5b6011548211156115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c490614d5a565b60405180910390fd5b6096826115d861310f565b6115e29190614d7a565b1115611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90614dfa565b60405180910390fd5b6000601354836116339190614b4e565b905080341015611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f90614e66565b60405180910390fd5b6116828484613122565b82601160008282546116949190614e86565b9250508190555081601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508034111561174d573373ffffffffffffffffffffffffffffffffffffffff166108fc82346117209190614e86565b9081150290604051600060405180830381858888f1935050505015801561174b573d6000803e3d6000fd5b505b50505050565b82601660009054906101000a900460ff1680156117ba57338260601b60601c146117b95769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6117b3573d6000803e3d6000fd5b6000603a525b5b6117c58585856132dd565b5050505050565b6117d4612d5c565b8060108190555050565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611897576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61189f612d5c565b8181600b91826118b0929190614a4f565b505050565b60105481565b60006118c6826132fd565b9050919050565b60135481565b60145481565b6118e1612d5c565b60011515601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b90614f06565b60405180910390fd5b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a3c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a95612d5c565b611a9f60006133c9565b565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611b5a576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b62612d5c565b6096601054611b6f61310f565b611b799190614d7a565b1115611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb190614dfa565b60405180910390fd5b611bc48282613122565b5050565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290614c82565b60405180910390fd5b60011515601860009054906101000a900460ff16151514611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca890614cee565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611d389190614034565b602060405180830381865afa158015611d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d799190614f3b565b601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541080611e7c57508073ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611df99190614034565b602060405180830381865afa158015611e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3a9190614f3b565b601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb290614fda565b60405180910390fd5b60125486601c54611ecc9190614d7a565b1115611f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0490615046565b60405180910390fd5b609686611f1861310f565b611f229190614d7a565b1115611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a90614dfa565b60405180910390fd5b60008787604051602001611f789291906150cf565b604051602081830303815290604052805190602001209050611fde858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c548361348f565b61201d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201490615147565b60405180910390fd5b60006014548861202d9190614b4e565b905080341015612072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206990614e66565b60405180910390fd5b61207c8989613122565b87601c600082825461208e9190614d7a565b9250508190555087601b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e49190614d7a565b9250508190555086601960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508034111561219d573373ffffffffffffffffffffffffffffffffffffffff166108fc82346121709190614e86565b9081150290604051600060405180830381858888f1935050505015801561219b573d6000803e3d6000fd5b505b505050505050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121d6612d5c565b80601860016101000a81548160ff02191690831515021790555050565b6121fb612d5c565b80600c8190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461226a90614867565b80601f016020809104026020016040519081016040528092919081815260200182805461229690614867565b80156122e35780601f106122b8576101008083540402835291602001916122e3565b820191906000526020600020905b8154815290600101906020018083116122c657829003601f168201915b5050505050905090565b81601660009054906101000a900460ff16801561234c5769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa612346573d6000803e3d6000fd5b6000603a525b6123568484613545565b50505050565b600181565b612369612d5c565b60001515601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146123fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f3906151b3565b60405180910390fd5b6001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601b6020528060005260406000206000915090505481565b60196020528060005260406000206000915054906101000a900460ff1681565b601860009054906101000a900460ff1681565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561255b576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612563612d5c565b80601660006101000a81548160ff02191690831515021790555050565b83601660009054906101000a900460ff1680156125e757338260601b60601c146125e65769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6125e0573d6000803e3d6000fd5b6000603a525b5b6125f386868686613650565b505050505050565b60176020528060005260406000206000915054906101000a900460ff1681565b612623612d5c565b8060148190555050565b612635612d5c565b61263f82826136c3565b5050565b600d805461265090614867565b80601f016020809104026020016040519081016040528092919081815260200182805461267c90614867565b80156126c95780601f1061269e576101008083540402835291602001916126c9565b820191906000526020600020905b8154815290600101906020018083116126ac57829003601f168201915b505050505081565b601580546126de90614867565b80601f016020809104026020016040519081016040528092919081815260200182805461270a90614867565b80156127575780601f1061272c57610100808354040283529160200191612757565b820191906000526020600020905b81548152906001019060200180831161273a57829003601f168201915b505050505081565b606061276a82612bb9565b6127a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a090615245565b60405180910390fd5b60006127b3613858565b905060008151116127d35760405180602001604052806000815250612801565b806127dd846138ea565b600d6040516020016127f193929190615324565b6040516020818303038152906040525b915050919050565b612811612d5c565b80601860006101000a81548160ff02191690831515021790555050565b601c5481565b61283c612d5c565b80600d908161284b9190615355565b5050565b600061285a826139b8565b9050919050565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561291a576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612922612d5c565b600161292c61310f565b10612963576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61296e816001613122565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612a0d612d5c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7390615499565b60405180910390fd5b612a85816133c9565b50565b612a90612d5c565b8060138190555050565b601660009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b0857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b385750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bb25750612bb182613a0f565b5b9050919050565b600081612bc4612dda565b11158015612bd3575060005482105b8015612c11575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000612c23826118bb565b90508073ffffffffffffffffffffffffffffffffffffffff16612c44613a79565b73ffffffffffffffffffffffffffffffffffffffff1614612ca757612c7081612c6b613a79565b612971565b612ca6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612d64613a81565b73ffffffffffffffffffffffffffffffffffffffff16612d82612231565b73ffffffffffffffffffffffffffffffffffffffff1614612dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcf90615505565b60405180910390fd5b565b60006001905090565b6000612dee826132fd565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e55576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612e6184613a89565b91509150612e778187612e72613a79565b613ab0565b612ec357612e8c86612e87613a79565b612971565b612ec2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f29576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f368686866001613af4565b8015612f4157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061300f85612feb888887613afa565b7c020000000000000000000000000000000000000000000000000000000017613b22565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036130955760006001850190506000600460008381526020019081526020016000205403613093576000548114613092578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130fd8686866001613b4d565b505050505050565b6000612710905090565b6000613119612dda565b60005403905090565b60008054905060008203613162576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61316f6000848385613af4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131e6836131d76000866000613afa565b6131e085613b53565b17613b22565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461328757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061324c565b50600082036132c2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506132d86000848385613b4d565b505050565b6132f883838360405180602001604052806000815250612580565b505050565b6000808290508061330c612dda565b11613392576000548110156133915760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361338f575b6000810361338557600460008360019003935083815260200190815260200160002054905061335b565b80925050506133c4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b85518110156135375760008682815181106134b6576134b5615525565b5b602002602001015190508083116134f75782816040516020016134da929190615575565b604051602081830303815290604052805190602001209250613523565b808360405160200161350a929190615575565b6040516020818303038152906040528051906020012092505b50808061352f906155a1565b915050613498565b508381149150509392505050565b8060076000613552613a79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166135ff613a79565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516136449190613ec3565b60405180910390a35050565b61365b8484846110ca565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136bd5761368684848484613b63565b6136bc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6136cb613105565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115613729576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137209061565b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378f906156c7565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b805461386790614867565b80601f016020809104026020016040519081016040528092919081815260200182805461389390614867565b80156138e05780601f106138b5576101008083540402835291602001916138e0565b820191906000526020600020905b8154815290600101906020018083116138c357829003601f168201915b5050505050905090565b6060600060016138f984613cb3565b01905060008167ffffffffffffffff811115613918576139176144dc565b5b6040519080825280601f01601f19166020018201604052801561394a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156139ad578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816139a1576139a0614b90565b5b04945060008503613958575b819350505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613b11868684613e06565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b89613a79565b8786866040518563ffffffff1660e01b8152600401613bab949392919061573c565b6020604051808303816000875af1925050508015613be757506040513d601f19601f82011682018060405250810190613be4919061579d565b60015b613c60573d8060008114613c17576040519150601f19603f3d011682016040523d82523d6000602084013e613c1c565b606091505b506000815103613c58576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613d11577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613d0757613d06614b90565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613d4e576d04ee2d6d415b85acef81000000008381613d4457613d43614b90565b5b0492506020810190505b662386f26fc100008310613d7d57662386f26fc100008381613d7357613d72614b90565b5b0492506010810190505b6305f5e1008310613da6576305f5e1008381613d9c57613d9b614b90565b5b0492506008810190505b6127108310613dcb576127108381613dc157613dc0614b90565b5b0492506004810190505b60648310613dee5760648381613de457613de3614b90565b5b0492506002810190505b600a8310613dfd576001810190505b80915050919050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e5881613e23565b8114613e6357600080fd5b50565b600081359050613e7581613e4f565b92915050565b600060208284031215613e9157613e90613e19565b5b6000613e9f84828501613e66565b91505092915050565b60008115159050919050565b613ebd81613ea8565b82525050565b6000602082019050613ed86000830184613eb4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f18578082015181840152602081019050613efd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613f4082613ede565b613f4a8185613ee9565b9350613f5a818560208601613efa565b613f6381613f24565b840191505092915050565b60006020820190508181036000830152613f888184613f35565b905092915050565b6000819050919050565b613fa381613f90565b8114613fae57600080fd5b50565b600081359050613fc081613f9a565b92915050565b600060208284031215613fdc57613fdb613e19565b5b6000613fea84828501613fb1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061401e82613ff3565b9050919050565b61402e81614013565b82525050565b60006020820190506140496000830184614025565b92915050565b61405881614013565b811461406357600080fd5b50565b6000813590506140758161404f565b92915050565b6000806040838503121561409257614091613e19565b5b60006140a085828601614066565b92505060206140b185828601613fb1565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126140e0576140df6140bb565b5b8235905067ffffffffffffffff8111156140fd576140fc6140c0565b5b602083019150836001820283011115614119576141186140c5565b5b9250929050565b6000806020838503121561413757614136613e19565b5b600083013567ffffffffffffffff81111561415557614154613e1e565b5b614161858286016140ca565b92509250509250929050565b61417681613f90565b82525050565b6000602082019050614191600083018461416d565b92915050565b6000806000606084860312156141b0576141af613e19565b5b60006141be86828701614066565b93505060206141cf86828701614066565b92505060406141e086828701613fb1565b9150509250925092565b6000806040838503121561420157614200613e19565b5b600061420f85828601613fb1565b925050602061422085828601613fb1565b9150509250929050565b600060408201905061423f6000830185614025565b61424c602083018461416d565b9392505050565b6000819050919050565b61426681614253565b82525050565b6000602082019050614281600083018461425d565b92915050565b60006020828403121561429d5761429c613e19565b5b60006142ab84828501614066565b91505092915050565b6142bd81613ea8565b81146142c857600080fd5b50565b6000813590506142da816142b4565b92915050565b6000806000606084860312156142f9576142f8613e19565b5b600061430786828701614066565b935050602061431886828701613fb1565b9250506040614329868287016142cb565b9150509250925092565b60008083601f840112614349576143486140bb565b5b8235905067ffffffffffffffff811115614366576143656140c0565b5b602083019150836020820283011115614382576143816140c5565b5b9250929050565b6000806000806000608086880312156143a5576143a4613e19565b5b60006143b388828901614066565b95505060206143c488828901613fb1565b94505060406143d5888289016142cb565b935050606086013567ffffffffffffffff8111156143f6576143f5613e1e565b5b61440288828901614333565b92509250509295509295909350565b60006020828403121561442757614426613e19565b5b6000614435848285016142cb565b91505092915050565b61444781614253565b811461445257600080fd5b50565b6000813590506144648161443e565b92915050565b6000602082840312156144805761447f613e19565b5b600061448e84828501614455565b91505092915050565b600080604083850312156144ae576144ad613e19565b5b60006144bc85828601614066565b92505060206144cd858286016142cb565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61451482613f24565b810181811067ffffffffffffffff82111715614533576145326144dc565b5b80604052505050565b6000614546613e0f565b9050614552828261450b565b919050565b600067ffffffffffffffff821115614572576145716144dc565b5b61457b82613f24565b9050602081019050919050565b82818337600083830152505050565b60006145aa6145a584614557565b61453c565b9050828152602081018484840111156145c6576145c56144d7565b5b6145d1848285614588565b509392505050565b600082601f8301126145ee576145ed6140bb565b5b81356145fe848260208601614597565b91505092915050565b6000806000806080858703121561462157614620613e19565b5b600061462f87828801614066565b945050602061464087828801614066565b935050604061465187828801613fb1565b925050606085013567ffffffffffffffff81111561467257614671613e1e565b5b61467e878288016145d9565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6146ab8161468a565b81146146b657600080fd5b50565b6000813590506146c8816146a2565b92915050565b600080604083850312156146e5576146e4613e19565b5b60006146f385828601614066565b9250506020614704858286016146b9565b9150509250929050565b600067ffffffffffffffff821115614729576147286144dc565b5b61473282613f24565b9050602081019050919050565b600061475261474d8461470e565b61453c565b90508281526020810184848401111561476e5761476d6144d7565b5b614779848285614588565b509392505050565b600082601f830112614796576147956140bb565b5b81356147a684826020860161473f565b91505092915050565b6000602082840312156147c5576147c4613e19565b5b600082013567ffffffffffffffff8111156147e3576147e2613e1e565b5b6147ef84828501614781565b91505092915050565b6000806040838503121561480f5761480e613e19565b5b600061481d85828601614066565b925050602061482e85828601614066565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061487f57607f821691505b60208210810361489257614891614838565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149057fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148c8565b61490f86836148c8565b95508019841693508086168417925050509392505050565b6000819050919050565b600061494c61494761494284613f90565b614927565b613f90565b9050919050565b6000819050919050565b61496683614931565b61497a61497282614953565b8484546148d5565b825550505050565b600090565b61498f614982565b61499a81848461495d565b505050565b5b818110156149be576149b3600082614987565b6001810190506149a0565b5050565b601f821115614a03576149d4816148a3565b6149dd846148b8565b810160208510156149ec578190505b614a006149f8856148b8565b83018261499f565b50505b505050565b600082821c905092915050565b6000614a2660001984600802614a08565b1980831691505092915050565b6000614a3f8383614a15565b9150826002028217905092915050565b614a598383614898565b67ffffffffffffffff811115614a7257614a716144dc565b5b614a7c8254614867565b614a878282856149c2565b6000601f831160018114614ab65760008415614aa4578287013590505b614aae8582614a33565b865550614b16565b601f198416614ac4866148a3565b60005b82811015614aec57848901358255600182019150602085019450602081019050614ac7565b86831015614b095784890135614b05601f891682614a15565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b5982613f90565b9150614b6483613f90565b9250828202614b7281613f90565b91508282048414831517614b8957614b88614b1f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bca82613f90565b9150614bd583613f90565b925082614be557614be4614b90565b5b828204905092915050565b600081905092915050565b50565b6000614c0b600083614bf0565b9150614c1682614bfb565b600082019050919050565b6000614c2c82614bfe565b9150819050919050565b7f596f75277265206e6f742061206d696e74657200000000000000000000000000600082015250565b6000614c6c601383613ee9565b9150614c7782614c36565b602082019050919050565b60006020820190508181036000830152614c9b81614c5f565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000614cd8601883613ee9565b9150614ce382614ca2565b602082019050919050565b60006020820190508181036000830152614d0781614ccb565b9050919050565b7f4e465420616d6f756e7420657863656564730000000000000000000000000000600082015250565b6000614d44601283613ee9565b9150614d4f82614d0e565b602082019050919050565b60006020820190508181036000830152614d7381614d37565b9050919050565b6000614d8582613f90565b9150614d9083613f90565b9250828201905080821115614da857614da7614b1f565b5b92915050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000614de4601683613ee9565b9150614def82614dae565b602082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b6000614e50601a83613ee9565b9150614e5b82614e1a565b602082019050919050565b60006020820190508181036000830152614e7f81614e43565b9050919050565b6000614e9182613f90565b9150614e9c83613f90565b9250828203905081811115614eb457614eb3614b1f565b5b92915050565b7f6d696e74657220646f65736e2774206578697374000000000000000000000000600082015250565b6000614ef0601483613ee9565b9150614efb82614eba565b602082019050919050565b60006020820190508181036000830152614f1f81614ee3565b9050919050565b600081519050614f3581613f9a565b92915050565b600060208284031215614f5157614f50613e19565b5b6000614f5f84828501614f26565b91505092915050565b7f496e76616c69642057686974656c6973742050726f6f66206f7220416c72656160008201527f647920436c61696d656400000000000000000000000000000000000000000000602082015250565b6000614fc4602a83613ee9565b9150614fcf82614f68565b604082019050919050565b60006020820190508181036000830152614ff381614fb7565b9050919050565b7f416c6c204e46547320436c61696d65642e000000000000000000000000000000600082015250565b6000615030601183613ee9565b915061503b82614ffa565b602082019050919050565b6000602082019050818103600083015261505f81615023565b9050919050565b60008160601b9050919050565b600061507e82615066565b9050919050565b600061509082615073565b9050919050565b6150a86150a382614013565b615085565b82525050565b6000819050919050565b6150c96150c482613f90565b6150ae565b82525050565b60006150db8285615097565b6014820191506150eb82846150b8565b6020820191508190509392505050565b7f496e76616c69642057686974656c6973742050726f6f662e0000000000000000600082015250565b6000615131601883613ee9565b915061513c826150fb565b602082019050919050565b6000602082019050818103600083015261516081615124565b9050919050565b7f616c72656164792061206d696e74657200000000000000000000000000000000600082015250565b600061519d601083613ee9565b91506151a882615167565b602082019050919050565b600060208201905081810360008301526151cc81615190565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061522f602f83613ee9565b915061523a826151d3565b604082019050919050565b6000602082019050818103600083015261525e81615222565b9050919050565b600081905092915050565b600061527b82613ede565b6152858185615265565b9350615295818560208601613efa565b80840191505092915050565b600081546152ae81614867565b6152b88186615265565b945060018216600081146152d357600181146152e85761531b565b60ff198316865281151582028601935061531b565b6152f1856148a3565b60005b83811015615313578154818901526001820191506020810190506152f4565b838801955050505b50505092915050565b60006153308286615270565b915061533c8285615270565b915061534882846152a1565b9150819050949350505050565b61535e82613ede565b67ffffffffffffffff811115615377576153766144dc565b5b6153818254614867565b61538c8282856149c2565b600060209050601f8311600181146153bf57600084156153ad578287015190505b6153b78582614a33565b86555061541f565b601f1984166153cd866148a3565b60005b828110156153f5578489015182556001820191506020850194506020810190506153d0565b86831015615412578489015161540e601f891682614a15565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615483602683613ee9565b915061548e82615427565b604082019050919050565b600060208201905081810360008301526154b281615476565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006154ef602083613ee9565b91506154fa826154b9565b602082019050919050565b6000602082019050818103600083015261551e816154e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b61556f61556a82614253565b615554565b82525050565b6000615581828561555e565b602082019150615591828461555e565b6020820191508190509392505050565b60006155ac82613f90565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036155de576155dd614b1f565b5b600182019050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615645602a83613ee9565b9150615650826155e9565b604082019050919050565b6000602082019050818103600083015261567481615638565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006156b1601983613ee9565b91506156bc8261567b565b602082019050919050565b600060208201905081810360008301526156e0816156a4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061570e826156e7565b61571881856156f2565b9350615728818560208601613efa565b61573181613f24565b840191505092915050565b60006080820190506157516000830187614025565b61575e6020830186614025565b61576b604083018561416d565b818103606083015261577d8184615703565b905095945050505050565b60008151905061579781613e4f565b92915050565b6000602082840312156157b3576157b2613e19565b5b60006157c184828501615788565b9150509291505056fea26469706673582212200739ac436e1e36a840365ad6a5e73c06cd6036fc520ab7d3fcf11a6662d824a164736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000004d601c7101fe1d271ee18340be5dc37ba016d9100000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0x04D601C7101fE1D271EE18340bE5dc37Ba016d91
Arg [1] : _royaltyFraction (uint96): 1000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000004d601c7101fe1d271ee18340be5dc37ba016d91
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode Sourcemap
99573:11923:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101785:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58067:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65005:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109915:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100361:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105145:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53640:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110307:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108512:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32527:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;99729:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99963:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103548:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108629:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109154:207;;;;;;;;;;;;;:::i;:::-;;100450:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107554:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;110739:280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108752:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104853:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99924:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59557:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100093:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100138:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103827:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100049:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54824:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37755:103;;;;;;;;;;;;;:::i;:::-;;105847:280;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106135:1411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99805:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108970:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105422:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99843:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100010:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37114:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58243:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109521:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99881:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103652:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100495:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100407:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100318;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104190:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111179:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100266:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108394:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104573:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99761:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100188:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102441:649;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108864:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100544:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102282:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103255:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105671:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66036:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38013:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108286:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100223:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101785:274;101916:4;101958:38;101984:11;101958:25;:38::i;:::-;:93;;;;102013:38;102039:11;102013:25;:38::i;:::-;101958:93;101938:113;;101785:274;;;:::o;58067:100::-;58121:13;58154:5;58147:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58067:100;:::o;65005:268::-;65126:7;65156:16;65164:7;65156;:16::i;:::-;65151:64;;65181:34;;;;;;;;;;;;;;65151:64;65235:15;:24;65251:7;65235:24;;;;;;;;;;;:30;;;;;;;;;;;;65228:37;;65005:268;;;:::o;109915:232::-;110055:8;110065:24;;;;;;;;;;;97939:7;97936:1138;;;98068:22;98062:4;98055:36;98169:9;98163:4;98156:23;98321:8;98317:2;98313:17;98309:2;98305:26;98299:4;98292:40;98681:4;98650;98619;98588;98536:25;98504:5;98467:241;98435:503;;98850:16;98844:4;98838;98823:44;98902:16;98896:4;98889:30;98435:503;99057:1;99051:4;99044:15;97936:1138;110107:32:::1;110121:8;110131:7;110107:13;:32::i;:::-;109915:232:::0;;;;:::o;100361:39::-;;;;;;;;;;;;;:::o;105145:269::-;101544:14;:23;101559:7;;;;101544:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101540:52;;;101576:16;;;;;;;;;;;;;;101540:52;37000:13:::1;:11;:13::i;:::-;105312:1:::2;105286:14;105280:28;;;;;:::i;:::-;;;:33;105276:85;;105335:26;;;;;;;;;;;;;;105276:85;105391:15;;105374:14;:32;;;;;;;:::i;:::-;;105145:269:::0;;:::o;53640:323::-;53701:7;53929:15;:13;:15::i;:::-;53914:12;;53898:13;;:28;:46;53891:53;;53640:323;:::o;110307:272::-;110486:4;110492:24;;;;;;;;;;;95454:7;95451:1892;;;95667:8;95659:4;95655:2;95651:13;95647:2;95643:22;95640:36;95630:1698;;95982:22;95976:4;95969:36;96091:9;96085:4;96078:23;96184:8;96178:4;96171:22;96578:4;96543;96508;96473;96417:25;96381:5;96340:269;96304:555;;96763:16;96757:4;96751;96736:44;96819:16;96813:4;96806:30;96304:555;97307:1;97301:4;97294:15;95630:1698;95451:1892;110534:37:::1;110553:4;110559:2;110563:7;110534:18;:37::i;:::-;110307:272:::0;;;;;:::o;108512:109::-;37000:13;:11;:13::i;:::-;108603:10:::1;108587:13;:26;;;;108512:109:::0;:::o;32527:438::-;32622:7;32631;32651:26;32680:17;:26;32698:7;32680:26;;;;;;;;;;;32651:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32751:1;32723:30;;:7;:16;;;:30;;;32719:92;;32780:19;32770:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32719:92;32823:21;32887:17;:15;:17::i;:::-;32847:57;;32860:7;:23;;;32848:35;;:9;:35;;;;:::i;:::-;32847:57;;;;:::i;:::-;32823:81;;32925:7;:16;;;32943:13;32917:40;;;;;;32527:438;;;;;:::o;99729:25::-;;;;:::o;99963:40::-;100000:3;99963:40;:::o;103548:96::-;37000:13;:11;:13::i;:::-;103632:4:::1;103611:14;:18;103626:2;103611:18;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;103548:96:::0;:::o;108629:115::-;37000:13;:11;:13::i;:::-;108726:10:::1;108707:16;:29;;;;108629:115:::0;:::o;109154:207::-;37000:13;:11;:13::i;:::-;109205:12:::1;109231:10;109223:24;;109269:21;109223:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109204:101;;;109321:7;109316:37;;109337:16;;;;;;;;;;;;;;109316:37;109193:168;109154:207::o:0;100450:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;107554:724::-;101683:4;101661:26;;:6;:18;101668:10;101661:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;101653:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;107717:4:::1;107697:24;;:16;;;;;;;;;;;:24;;;107689:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;107781:13;;107769:8;:25;;107761:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;100000:3;107867:8;107850:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;107828:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;107950:17;107981:9;;107970:8;:20;;;;:::i;:::-;107950:40;;108022:9;108009;:22;;108001:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;108073:19;108079:2;108083:8;108073:5;:19::i;:::-;108120:8;108103:13;;:25;;;;;;;:::i;:::-;;;;;;;;108150:5;108139:4;:8;108144:2;108139:8;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;108182:9;108170;:21;108166:105;;;108216:10;108208:28;;:51;108249:9;108237;:21;;;;:::i;:::-;108208:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;108166:105;107678:600;107554:724:::0;;;:::o;110739:280::-;110922:4;110928:24;;;;;;;;;;;95454:7;95451:1892;;;95667:8;95659:4;95655:2;95651:13;95647:2;95643:22;95640:36;95630:1698;;95982:22;95976:4;95969:36;96091:9;96085:4;96078:23;96184:8;96178:4;96171:22;96578:4;96543;96508;96473;96417:25;96381:5;96340:269;96304:555;;96763:16;96757:4;96751;96736:44;96819:16;96813:4;96806:30;96304:555;97307:1;97301:4;97294:15;95630:1698;95451:1892;110970:41:::1;110993:4;110999:2;111003:7;110970:22;:41::i;:::-;110739:280:::0;;;;;:::o;108752:104::-;37000:13;:11;:13::i;:::-;108842:6:::1;108827:12;:21;;;;108752:104:::0;:::o;104853:155::-;101544:14;:23;101559:7;;;;101544:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101540:52;;;101576:16;;;;;;;;;;;;;;101540:52;37000:13:::1;:11;:13::i;:::-;104989:11:::2;;104973:13;:27;;;;;;;:::i;:::-;;104853:155:::0;;:::o;99924:32::-;;;;:::o;59557:202::-;59674:7;59722:27;59741:7;59722:18;:27::i;:::-;59699:52;;59557:202;;;:::o;100093:38::-;;;;:::o;100138:43::-;;;;:::o;103827:171::-;37000:13;:11;:13::i;:::-;103927:4:::1;103908:23;;:6;:15;103915:7;103908:15;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;103900:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;103985:5;103967:6;:15;103974:7;103967:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;103827:171:::0;:::o;100049:37::-;;;;:::o;54824:283::-;54941:7;54987:1;54970:19;;:5;:19;;;54966:60;;54998:28;;;;;;;;;;;;;;54966:60;48983:13;55044:18;:25;55063:5;55044:25;;;;;;;;;;;;;;;;:55;55037:62;;54824:283;;;:::o;37755:103::-;37000:13;:11;:13::i;:::-;37820:30:::1;37847:1;37820:18;:30::i;:::-;37755:103::o:0;105847:280::-;101544:14;:23;101559:7;;;;101544:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101540:52;;;101576:16;;;;;;;;;;;;;;101540:52;37000:13:::1;:11;:13::i;:::-;100000:3:::2;106013:12;;105996:14;:12;:14::i;:::-;:29;;;;:::i;:::-;:43;;105974:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;106100:19;106106:2;106110:8;106100:5;:19::i;:::-;105847:280:::0;;:::o;106135:1411::-;101683:4;101661:26;;:6;:18;101668:10;101661:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;101653:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;106342:4:::1;106322:24;;:16;;;;;;;;;;;:24;;;106314:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;106386:27;106425:16;;;;;;;;;;;106386:56;;106453:27;106492:16;;;;;;;;;;;106453:56;;106556:18;:28;;;106585:2;106556:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106542:7;:11;106550:2;106542:11;;;;;;;;;;;;;;;;:46;:113;;;;106623:18;:28;;;106652:2;106623:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106609:7;:11;106617:2;106609:11;;;;;;;;;;;;;;;;:46;106542:113;106520:205;;;;;;;;;;;;:::i;:::-;;;;;;;;;106785:16;;106773:8;106758:12;;:23;;;;:::i;:::-;:43;;106736:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;100000:3;106896:8;106879:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;106857:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;106979:12;107021:2;107025:8;107004:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;106994:41;;;;;;106979:56;;107068:49;107087:11;;107068:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107100:10;;107112:4;107068:18;:49::i;:::-;107046:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;107180:17;107211:14;;107200:8;:25;;;;:::i;:::-;107180:45;;107257:9;107244;:22;;107236:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;107308:19;107314:2;107318:8;107308:5;:19::i;:::-;107354:8;107338:12;;:24;;;;;;;:::i;:::-;;;;;;;;107388:8;107373:7;:11;107381:2;107373:11;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;107418:5;107407:4;:8;107412:2;107407:8;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;107450:9;107438;:21;107434:105;;;107484:10;107476:28;;:51;107517:9;107505;:21;;;;:::i;:::-;107476:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;107434:105;106303:1243;;;;106135:1411:::0;;;;;:::o;99805:31::-;;;;;;;;;;;;;:::o;108970:104::-;37000:13;:11;:13::i;:::-;109059:7:::1;109037:19;;:29;;;;;;;;;;;;;;;;;;108970:104:::0;:::o;105422:106::-;37000:13;:11;:13::i;:::-;105509:11:::1;105496:10;:24;;;;105422:106:::0;:::o;99843:31::-;;;;;;;;;;;;;:::o;100010:32::-;;;;:::o;37114:87::-;37160:7;37187:6;;;;;;;;;;;37180:13;;37114:87;:::o;58243:104::-;58299:13;58332:7;58325:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58243:104;:::o;109521:234::-;109652:8;109662:24;;;;;;;;;;;97939:7;97936:1138;;;98068:22;98062:4;98055:36;98169:9;98163:4;98156:23;98321:8;98317:2;98313:17;98309:2;98305:26;98299:4;98292:40;98681:4;98650;98619;98588;98536:25;98504:5;98467:241;98435:503;;98850:16;98844:4;98838;98823:44;98902:16;98896:4;98889:30;98435:503;99057:1;99051:4;99044:15;97936:1138;109704:43:::1;109728:8;109738;109704:23;:43::i;:::-;109521:234:::0;;;;:::o;99881:36::-;99916:1;99881:36;:::o;103652:167::-;37000:13;:11;:13::i;:::-;103752:5:::1;103733:24;;:6;:15;103740:7;103733:15;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;103725:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;103807:4;103789:6;:15;103796:7;103789:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;103652:167:::0;:::o;100495:42::-;;;;;;;;;;;;;;;;;:::o;100407:36::-;;;;;;;;;;;;;;;;;;;;;;:::o;100318:::-;;;;;;;;;;;;;:::o;104190:160::-;101544:14;:23;101559:7;;;;101544:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101540:52;;;101576:16;;;;;;;;;;;;;;101540:52;37000:13:::1;:11;:13::i;:::-;104337:5:::2;104310:24;;:32;;;;;;;;;;;;;;;;;;104190:160:::0;:::o;111179:314::-;111390:4;111396:24;;;;;;;;;;;95454:7;95451:1892;;;95667:8;95659:4;95655:2;95651:13;95647:2;95643:22;95640:36;95630:1698;;95982:22;95976:4;95969:36;96091:9;96085:4;96078:23;96184:8;96178:4;96171:22;96578:4;96543;96508;96473;96417:25;96381:5;96340:269;96304:555;;96763:16;96757:4;96751;96736:44;96819:16;96813:4;96806:30;96304:555;97307:1;97301:4;97294:15;95630:1698;95451:1892;111438:47:::1;111461:4;111467:2;111471:7;111480:4;111438:22;:47::i;:::-;111179:314:::0;;;;;;:::o;100266:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;108394:110::-;37000:13;:11;:13::i;:::-;108487:9:::1;108470:14;:26;;;;108394:110:::0;:::o;104573:170::-;37000:13;:11;:13::i;:::-;104690:45:::1;104709:8;104719:15;104690:18;:45::i;:::-;104573:170:::0;;:::o;99761:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;100188:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;102441:649::-;102559:13;102612:16;102620:7;102612;:16::i;:::-;102590:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;102716:28;102747:10;:8;:10::i;:::-;102716:41;;102819:1;102794:14;102788:28;:32;:294;;;;;;;;;;;;;;;;;102912:14;102953:25;102970:7;102953:16;:25::i;:::-;103005:13;102869:172;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;102788:294;102768:314;;;102441:649;;;:::o;108864:98::-;37000:13;:11;:13::i;:::-;108947:7:::1;108928:16;;:26;;;;;;;;;;;;;;;;;;108864:98:::0;:::o;100544:31::-;;;;:::o;102282:151::-;37000:13;:11;:13::i;:::-;102408:17:::1;102392:13;:33;;;;;;:::i;:::-;;102282:151:::0;:::o;103255:119::-;103317:7;103344:22;103358:7;103344:13;:22::i;:::-;103337:29;;103255:119;;;:::o;105671:168::-;101544:14;:23;101559:7;;;;101544:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101540:52;;;101576:16;;;;;;;;;;;;;;101540:52;37000:13:::1;:11;:13::i;:::-;99916:1:::2;105743:14;:12;:14::i;:::-;:26;105739:62;;105778:23;;;;;;;;;;;;;;105739:62;105812:19;105818:2;99916:1;105812:5;:19::i;:::-;105671:168:::0;:::o;66036:214::-;66178:4;66207:18;:25;66226:5;66207:25;;;;;;;;;;;;;;;:35;66233:8;66207:35;;;;;;;;;;;;;;;;;;;;;;;;;66200:42;;66036:214;;;;:::o;38013:201::-;37000:13;:11;:13::i;:::-;38122:1:::1;38102:22;;:8;:22;;::::0;38094:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38178:28;38197:8;38178:18;:28::i;:::-;38013:201:::0;:::o;108286:100::-;37000:13;:11;:13::i;:::-;108369:9:::1;108357;:21;;;;108286:100:::0;:::o;100223:36::-;;;;;;;;;;;;;:::o;57115:689::-;57245:4;57589:10;57574:25;;:11;:25;;;;:102;;;;57666:10;57651:25;;:11;:25;;;;57574:102;:179;;;;57743:10;57728:25;;:11;:25;;;;57574:179;57554:199;;57115:689;;;:::o;32257:215::-;32359:4;32398:26;32383:41;;;:11;:41;;;;:81;;;;32428:36;32452:11;32428:23;:36::i;:::-;32383:81;32376:88;;32257:215;;;:::o;66508:282::-;66573:4;66629:7;66610:15;:13;:15::i;:::-;:26;;:66;;;;;66663:13;;66653:7;:23;66610:66;:153;;;;;66762:1;49759:8;66714:17;:26;66732:7;66714:26;;;;;;;;;;;;:44;:49;66610:153;66590:173;;66508:282;;;:::o;64397:449::-;64527:13;64543:16;64551:7;64543;:16::i;:::-;64527:32;;64599:5;64576:28;;:19;:17;:19::i;:::-;:28;;;64572:175;;64624:44;64641:5;64648:19;:17;:19::i;:::-;64624:16;:44::i;:::-;64619:128;;64696:35;;;;;;;;;;;;;;64619:128;64572:175;64792:2;64759:15;:24;64775:7;64759:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;64830:7;64826:2;64810:28;;64819:5;64810:28;;;;;;;;;;;;64516:330;64397:449;;:::o;37279:132::-;37354:12;:10;:12::i;:::-;37343:23;;:7;:5;:7::i;:::-;:23;;;37335:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37279:132::o;53156:92::-;53212:7;53239:1;53232:8;;53156:92;:::o;68776:3003::-;68918:27;68948;68967:7;68948:18;:27::i;:::-;68918:57;;69033:4;68992:45;;69008:19;68992:45;;;68988:99;;69059:28;;;;;;;;;;;;;;68988:99;69115:27;69157:23;69194:35;69221:7;69194:26;:35::i;:::-;69100:129;;;;69343:134;69386:15;69420:4;69443:19;:17;:19::i;:::-;69343:24;:134::i;:::-;69324:287;;69507:43;69524:4;69530:19;:17;:19::i;:::-;69507:16;:43::i;:::-;69502:109;;69576:35;;;;;;;;;;;;;;69502:109;69324:287;69642:1;69628:16;;:2;:16;;;69624:52;;69653:23;;;;;;;;;;;;;;69624:52;69689:43;69711:4;69717:2;69721:7;69730:1;69689:21;:43::i;:::-;69825:15;69822:160;;;69965:1;69944:19;69937:30;69822:160;70362:18;:24;70381:4;70362:24;;;;;;;;;;;;;;;;70360:26;;;;;;;;;;;;70431:18;:22;70450:2;70431:22;;;;;;;;;;;;;;;;70429:24;;;;;;;;;;;70753:167;70790:2;70860:45;70875:4;70881:2;70885:19;70860:14;:45::i;:::-;50039:8;70811:94;70753:18;:167::i;:::-;70724:17;:26;70742:7;70724:26;;;;;;;;;;;:196;;;;71091:1;50039:8;71040:19;:47;:52;71036:627;;71113:19;71145:1;71135:7;:11;71113:33;;71302:1;71268:17;:30;71286:11;71268:30;;;;;;;;;;;;:35;71264:384;;71406:13;;71391:11;:28;71387:242;;71586:19;71553:17;:30;71571:11;71553:30;;;;;;;;;;;:52;;;;71387:242;71264:384;71094:569;71036:627;71710:7;71706:2;71691:27;;71700:4;71691:27;;;;;;;;;;;;71729:42;71750:4;71756:2;71760:7;71769:1;71729:20;:42::i;:::-;68907:2872;;;68776:3003;;;:::o;33247:97::-;33305:6;33331:5;33324:12;;33247:97;:::o;54061:296::-;54116:7;54323:15;:13;:15::i;:::-;54307:13;;:31;54300:38;;54061:296;:::o;76450:3021::-;76523:20;76546:13;;76523:36;;76586:1;76574:8;:13;76570:44;;76596:18;;;;;;;;;;;;;;76570:44;76627:61;76657:1;76661:2;76665:12;76679:8;76627:21;:61::i;:::-;77205:1;49121:2;77175:1;:26;;77174:32;77145:8;:62;77102:18;:22;77121:2;77102:22;;;;;;;;;;;;;;;;:105;;;;;;;;;;;77484:160;77521:2;77596:33;77619:1;77623:2;77627:1;77596:14;:33::i;:::-;77542:30;77563:8;77542:20;:30::i;:::-;:87;77484:18;:160::i;:::-;77450:17;:31;77468:12;77450:31;;;;;;;;;;;:194;;;;77661:16;77692:11;77721:8;77706:12;:23;77692:37;;78242:16;78238:2;78234:25;78222:37;;78614:12;78574:8;78533:1;78471:25;78412:1;78351;78324:335;78985:1;78971:12;78967:20;78925:346;79026:3;79017:7;79014:16;78925:346;;79244:7;79234:8;79231:1;79204:25;79201:1;79198;79193:59;79079:1;79070:7;79066:15;79055:26;;78925:346;;;78929:77;79316:1;79304:8;:13;79300:45;;79326:19;;;;;;;;;;;;;;79300:45;79378:3;79362:13;:19;;;;76876:2517;;79403:60;79432:1;79436:2;79440:12;79454:8;79403:20;:60::i;:::-;76512:2959;76450:3021;;:::o;71875:193::-;72021:39;72038:4;72044:2;72048:7;72021:39;;;;;;;;;;;;:16;:39::i;:::-;71875:193;;;:::o;60844:1307::-;60938:7;60963:12;60978:7;60963:22;;61046:4;61027:15;:13;:15::i;:::-;:23;61023:1061;;61080:13;;61073:4;:20;61069:1015;;;61118:14;61135:17;:23;61153:4;61135:23;;;;;;;;;;;;61118:40;;61252:1;49759:8;61224:6;:24;:29;61220:845;;61889:113;61906:1;61896:6;:11;61889:113;;61949:17;:25;61967:6;;;;;;;61949:25;;;;;;;;;;;;61940:34;;61889:113;;;62035:6;62028:13;;;;;;61220:845;61095:989;61069:1015;61023:1061;62112:31;;;;;;;;;;;;;;60844:1307;;;;:::o;38374:191::-;38448:16;38467:6;;;;;;;;;;;38448:25;;38493:8;38484:6;;:17;;;;;;;;;;;;;;;;;;38548:8;38517:40;;38538:8;38517:40;;;;;;;;;;;;38437:128;38374:191;:::o;546:796::-;637:4;654:20;677:4;654:27;;699:9;694:525;718:5;:12;714:1;:16;694:525;;;752:20;775:5;781:1;775:8;;;;;;;;:::i;:::-;;;;;;;;752:31;;820:12;804;:28;800:408;;974:12;988;957:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;947:55;;;;;;932:70;;800:408;;;1164:12;1178;1147:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1137:55;;;;;;1122:70;;800:408;737:482;732:3;;;;;:::i;:::-;;;;694:525;;;;1330:4;1314:12;:20;1307:27;;;546:796;;;;;:::o;65613:266::-;65792:8;65740:18;:39;65759:19;:17;:19::i;:::-;65740:39;;;;;;;;;;;;;;;:49;65780:8;65740:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;65852:8;65816:55;;65831:19;:17;:19::i;:::-;65816:55;;;65862:8;65816:55;;;;;;:::i;:::-;;;;;;;;65613:266;;:::o;72666:407::-;72841:31;72854:4;72860:2;72864:7;72841:12;:31::i;:::-;72905:1;72887:2;:14;;;:19;72883:183;;72926:56;72957:4;72963:2;72967:7;72976:5;72926:30;:56::i;:::-;72921:145;;73010:40;;;;;;;;;;;;;;72921:145;72883:183;72666:407;;;;:::o;33615:332::-;33734:17;:15;:17::i;:::-;33718:33;;:12;:33;;;;33710:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;33837:1;33817:22;;:8;:22;;;33809:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;33904:35;;;;;;;;33916:8;33904:35;;;;;;33926:12;33904:35;;;;;33882:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33615:332;;:::o;102160:114::-;102220:13;102253;102246:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102160:114;:::o;16269:716::-;16325:13;16376:14;16413:1;16393:17;16404:5;16393:10;:17::i;:::-;:21;16376:38;;16429:20;16463:6;16452:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16429:41;;16485:11;16614:6;16610:2;16606:15;16598:6;16594:28;16587:35;;16651:288;16658:4;16651:288;;;16683:5;;;;;;;;16825:8;16820:2;16813:5;16809:14;16804:30;16799:3;16791:44;16881:2;16872:11;;;;;;:::i;:::-;;;;;16915:1;16906:5;:10;16651:288;16902:21;16651:288;16960:6;16953:13;;;;;16269:716;;;:::o;55189:204::-;55250:7;48983:13;49121:2;55291:18;:25;55310:5;55291:25;;;;;;;;;;;;;;;;:50;;55290:95;55270:115;;55189:204;;;:::o;29811:157::-;29896:4;29935:25;29920:40;;;:11;:40;;;;29913:47;;29811:157;;;:::o;89725:105::-;89785:7;89812:10;89805:17;;89725:105;:::o;35665:98::-;35718:7;35745:10;35738:17;;35665:98;:::o;67671:485::-;67773:27;67802:23;67843:38;67884:15;:24;67900:7;67884:24;;;;;;;;;;;67843:65;;68061:18;68038:41;;68118:19;68112:26;68093:45;;68023:126;67671:485;;;:::o;66899:659::-;67048:11;67213:16;67206:5;67202:28;67193:37;;67373:16;67362:9;67358:32;67345:45;;67523:15;67512:9;67509:30;67501:5;67490:9;67487:20;67484:56;67474:66;;66899:659;;;;;:::o;73735:159::-;;;;;:::o;89034:311::-;89169:7;89189:16;50163:3;89215:19;:41;;89189:68;;50163:3;89283:31;89294:4;89300:2;89304:9;89283:10;:31::i;:::-;89275:40;;:62;;89268:69;;;89034:311;;;;;:::o;62731:531::-;62838:14;63011:16;63004:5;63000:28;62991:37;;63223:5;63209:11;63184:23;63180:41;63177:52;63153:5;63132:112;63122:122;;62731:531;;;;:::o;74559:158::-;;;;;:::o;63364:356::-;63461:14;63699:1;63689:8;63686:15;63660:24;63656:46;63646:56;;63364:356;;;:::o;75157:831::-;75320:4;75379:2;75354:45;;;75418:19;:17;:19::i;:::-;75456:4;75479:7;75505:5;75354:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;75337:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75756:1;75739:6;:13;:18;75735:235;;75785:40;;;;;;;;;;;;;;75735:235;75928:6;75922:13;75913:6;75909:2;75905:15;75898:38;75337:644;75625:54;;;75598:81;;;:6;:81;;;;75574:105;;;75157:831;;;;;;:::o;13103:948::-;13156:7;13176:14;13193:1;13176:18;;13243:8;13234:5;:17;13230:106;;13281:8;13272:17;;;;;;:::i;:::-;;;;;13318:2;13308:12;;;;13230:106;13363:8;13354:5;:17;13350:106;;13401:8;13392:17;;;;;;:::i;:::-;;;;;13438:2;13428:12;;;;13350:106;13483:8;13474:5;:17;13470:106;;13521:8;13512:17;;;;;;:::i;:::-;;;;;13558:2;13548:12;;;;13470:106;13603:7;13594:5;:16;13590:103;;13640:7;13631:16;;;;;;:::i;:::-;;;;;13676:1;13666:11;;;;13590:103;13720:7;13711:5;:16;13707:103;;13757:7;13748:16;;;;;;:::i;:::-;;;;;13793:1;13783:11;;;;13707:103;13837:7;13828:5;:16;13824:103;;13874:7;13865:16;;;;;;:::i;:::-;;;;;13910:1;13900:11;;;;13824:103;13954:7;13945:5;:16;13941:68;;13992:1;13982:11;;;;13941:68;14037:6;14030:13;;;13103:948;;;:::o;88735:147::-;88872:6;88735:147;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:117;5245:1;5242;5235:12;5273:553;5331:8;5341:6;5391:3;5384:4;5376:6;5372:17;5368:27;5358:122;;5399:79;;:::i;:::-;5358:122;5512:6;5499:20;5489:30;;5542:18;5534:6;5531:30;5528:117;;;5564:79;;:::i;:::-;5528:117;5678:4;5670:6;5666:17;5654:29;;5732:3;5724:4;5716:6;5712:17;5702:8;5698:32;5695:41;5692:128;;;5739:79;;:::i;:::-;5692:128;5273:553;;;;;:::o;5832:529::-;5903:6;5911;5960:2;5948:9;5939:7;5935:23;5931:32;5928:119;;;5966:79;;:::i;:::-;5928:119;6114:1;6103:9;6099:17;6086:31;6144:18;6136:6;6133:30;6130:117;;;6166:79;;:::i;:::-;6130:117;6279:65;6336:7;6327:6;6316:9;6312:22;6279:65;:::i;:::-;6261:83;;;;6057:297;5832:529;;;;;:::o;6367:118::-;6454:24;6472:5;6454:24;:::i;:::-;6449:3;6442:37;6367:118;;:::o;6491:222::-;6584:4;6622:2;6611:9;6607:18;6599:26;;6635:71;6703:1;6692:9;6688:17;6679:6;6635:71;:::i;:::-;6491:222;;;;:::o;6719:619::-;6796:6;6804;6812;6861:2;6849:9;6840:7;6836:23;6832:32;6829:119;;;6867:79;;:::i;:::-;6829:119;6987:1;7012:53;7057:7;7048:6;7037:9;7033:22;7012:53;:::i;:::-;7002:63;;6958:117;7114:2;7140:53;7185:7;7176:6;7165:9;7161:22;7140:53;:::i;:::-;7130:63;;7085:118;7242:2;7268:53;7313:7;7304:6;7293:9;7289:22;7268:53;:::i;:::-;7258:63;;7213:118;6719:619;;;;;:::o;7344:474::-;7412:6;7420;7469:2;7457:9;7448:7;7444:23;7440:32;7437:119;;;7475:79;;:::i;:::-;7437:119;7595:1;7620:53;7665:7;7656:6;7645:9;7641:22;7620:53;:::i;:::-;7610:63;;7566:117;7722:2;7748:53;7793:7;7784:6;7773:9;7769:22;7748:53;:::i;:::-;7738:63;;7693:118;7344:474;;;;;:::o;7824:332::-;7945:4;7983:2;7972:9;7968:18;7960:26;;7996:71;8064:1;8053:9;8049:17;8040:6;7996:71;:::i;:::-;8077:72;8145:2;8134:9;8130:18;8121:6;8077:72;:::i;:::-;7824:332;;;;;:::o;8162:77::-;8199:7;8228:5;8217:16;;8162:77;;;:::o;8245:118::-;8332:24;8350:5;8332:24;:::i;:::-;8327:3;8320:37;8245:118;;:::o;8369:222::-;8462:4;8500:2;8489:9;8485:18;8477:26;;8513:71;8581:1;8570:9;8566:17;8557:6;8513:71;:::i;:::-;8369:222;;;;:::o;8597:329::-;8656:6;8705:2;8693:9;8684:7;8680:23;8676:32;8673:119;;;8711:79;;:::i;:::-;8673:119;8831:1;8856:53;8901:7;8892:6;8881:9;8877:22;8856:53;:::i;:::-;8846:63;;8802:117;8597:329;;;;:::o;8932:116::-;9002:21;9017:5;9002:21;:::i;:::-;8995:5;8992:32;8982:60;;9038:1;9035;9028:12;8982:60;8932:116;:::o;9054:133::-;9097:5;9135:6;9122:20;9113:29;;9151:30;9175:5;9151:30;:::i;:::-;9054:133;;;;:::o;9193:613::-;9267:6;9275;9283;9332:2;9320:9;9311:7;9307:23;9303:32;9300:119;;;9338:79;;:::i;:::-;9300:119;9458:1;9483:53;9528:7;9519:6;9508:9;9504:22;9483:53;:::i;:::-;9473:63;;9429:117;9585:2;9611:53;9656:7;9647:6;9636:9;9632:22;9611:53;:::i;:::-;9601:63;;9556:118;9713:2;9739:50;9781:7;9772:6;9761:9;9757:22;9739:50;:::i;:::-;9729:60;;9684:115;9193:613;;;;;:::o;9829:568::-;9902:8;9912:6;9962:3;9955:4;9947:6;9943:17;9939:27;9929:122;;9970:79;;:::i;:::-;9929:122;10083:6;10070:20;10060:30;;10113:18;10105:6;10102:30;10099:117;;;10135:79;;:::i;:::-;10099:117;10249:4;10241:6;10237:17;10225:29;;10303:3;10295:4;10287:6;10283:17;10273:8;10269:32;10266:41;10263:128;;;10310:79;;:::i;:::-;10263:128;9829:568;;;;;:::o;10403:989::-;10513:6;10521;10529;10537;10545;10594:3;10582:9;10573:7;10569:23;10565:33;10562:120;;;10601:79;;:::i;:::-;10562:120;10721:1;10746:53;10791:7;10782:6;10771:9;10767:22;10746:53;:::i;:::-;10736:63;;10692:117;10848:2;10874:53;10919:7;10910:6;10899:9;10895:22;10874:53;:::i;:::-;10864:63;;10819:118;10976:2;11002:50;11044:7;11035:6;11024:9;11020:22;11002:50;:::i;:::-;10992:60;;10947:115;11129:2;11118:9;11114:18;11101:32;11160:18;11152:6;11149:30;11146:117;;;11182:79;;:::i;:::-;11146:117;11295:80;11367:7;11358:6;11347:9;11343:22;11295:80;:::i;:::-;11277:98;;;;11072:313;10403:989;;;;;;;;:::o;11398:323::-;11454:6;11503:2;11491:9;11482:7;11478:23;11474:32;11471:119;;;11509:79;;:::i;:::-;11471:119;11629:1;11654:50;11696:7;11687:6;11676:9;11672:22;11654:50;:::i;:::-;11644:60;;11600:114;11398:323;;;;:::o;11727:122::-;11800:24;11818:5;11800:24;:::i;:::-;11793:5;11790:35;11780:63;;11839:1;11836;11829:12;11780:63;11727:122;:::o;11855:139::-;11901:5;11939:6;11926:20;11917:29;;11955:33;11982:5;11955:33;:::i;:::-;11855:139;;;;:::o;12000:329::-;12059:6;12108:2;12096:9;12087:7;12083:23;12079:32;12076:119;;;12114:79;;:::i;:::-;12076:119;12234:1;12259:53;12304:7;12295:6;12284:9;12280:22;12259:53;:::i;:::-;12249:63;;12205:117;12000:329;;;;:::o;12335:468::-;12400:6;12408;12457:2;12445:9;12436:7;12432:23;12428:32;12425:119;;;12463:79;;:::i;:::-;12425:119;12583:1;12608:53;12653:7;12644:6;12633:9;12629:22;12608:53;:::i;:::-;12598:63;;12554:117;12710:2;12736:50;12778:7;12769:6;12758:9;12754:22;12736:50;:::i;:::-;12726:60;;12681:115;12335:468;;;;;:::o;12809:117::-;12918:1;12915;12908:12;12932:180;12980:77;12977:1;12970:88;13077:4;13074:1;13067:15;13101:4;13098:1;13091:15;13118:281;13201:27;13223:4;13201:27;:::i;:::-;13193:6;13189:40;13331:6;13319:10;13316:22;13295:18;13283:10;13280:34;13277:62;13274:88;;;13342:18;;:::i;:::-;13274:88;13382:10;13378:2;13371:22;13161:238;13118:281;;:::o;13405:129::-;13439:6;13466:20;;:::i;:::-;13456:30;;13495:33;13523:4;13515:6;13495:33;:::i;:::-;13405:129;;;:::o;13540:307::-;13601:4;13691:18;13683:6;13680:30;13677:56;;;13713:18;;:::i;:::-;13677:56;13751:29;13773:6;13751:29;:::i;:::-;13743:37;;13835:4;13829;13825:15;13817:23;;13540:307;;;:::o;13853:146::-;13950:6;13945:3;13940;13927:30;13991:1;13982:6;13977:3;13973:16;13966:27;13853:146;;;:::o;14005:423::-;14082:5;14107:65;14123:48;14164:6;14123:48;:::i;:::-;14107:65;:::i;:::-;14098:74;;14195:6;14188:5;14181:21;14233:4;14226:5;14222:16;14271:3;14262:6;14257:3;14253:16;14250:25;14247:112;;;14278:79;;:::i;:::-;14247:112;14368:54;14415:6;14410:3;14405;14368:54;:::i;:::-;14088:340;14005:423;;;;;:::o;14447:338::-;14502:5;14551:3;14544:4;14536:6;14532:17;14528:27;14518:122;;14559:79;;:::i;:::-;14518:122;14676:6;14663:20;14701:78;14775:3;14767:6;14760:4;14752:6;14748:17;14701:78;:::i;:::-;14692:87;;14508:277;14447:338;;;;:::o;14791:943::-;14886:6;14894;14902;14910;14959:3;14947:9;14938:7;14934:23;14930:33;14927:120;;;14966:79;;:::i;:::-;14927:120;15086:1;15111:53;15156:7;15147:6;15136:9;15132:22;15111:53;:::i;:::-;15101:63;;15057:117;15213:2;15239:53;15284:7;15275:6;15264:9;15260:22;15239:53;:::i;:::-;15229:63;;15184:118;15341:2;15367:53;15412:7;15403:6;15392:9;15388:22;15367:53;:::i;:::-;15357:63;;15312:118;15497:2;15486:9;15482:18;15469:32;15528:18;15520:6;15517:30;15514:117;;;15550:79;;:::i;:::-;15514:117;15655:62;15709:7;15700:6;15689:9;15685:22;15655:62;:::i;:::-;15645:72;;15440:287;14791:943;;;;;;;:::o;15740:109::-;15776:7;15816:26;15809:5;15805:38;15794:49;;15740:109;;;:::o;15855:120::-;15927:23;15944:5;15927:23;:::i;:::-;15920:5;15917:34;15907:62;;15965:1;15962;15955:12;15907:62;15855:120;:::o;15981:137::-;16026:5;16064:6;16051:20;16042:29;;16080:32;16106:5;16080:32;:::i;:::-;15981:137;;;;:::o;16124:472::-;16191:6;16199;16248:2;16236:9;16227:7;16223:23;16219:32;16216:119;;;16254:79;;:::i;:::-;16216:119;16374:1;16399:53;16444:7;16435:6;16424:9;16420:22;16399:53;:::i;:::-;16389:63;;16345:117;16501:2;16527:52;16571:7;16562:6;16551:9;16547:22;16527:52;:::i;:::-;16517:62;;16472:117;16124:472;;;;;:::o;16602:308::-;16664:4;16754:18;16746:6;16743:30;16740:56;;;16776:18;;:::i;:::-;16740:56;16814:29;16836:6;16814:29;:::i;:::-;16806:37;;16898:4;16892;16888:15;16880:23;;16602:308;;;:::o;16916:425::-;16994:5;17019:66;17035:49;17077:6;17035:49;:::i;:::-;17019:66;:::i;:::-;17010:75;;17108:6;17101:5;17094:21;17146:4;17139:5;17135:16;17184:3;17175:6;17170:3;17166:16;17163:25;17160:112;;;17191:79;;:::i;:::-;17160:112;17281:54;17328:6;17323:3;17318;17281:54;:::i;:::-;17000:341;16916:425;;;;;:::o;17361:340::-;17417:5;17466:3;17459:4;17451:6;17447:17;17443:27;17433:122;;17474:79;;:::i;:::-;17433:122;17591:6;17578:20;17616:79;17691:3;17683:6;17676:4;17668:6;17664:17;17616:79;:::i;:::-;17607:88;;17423:278;17361:340;;;;:::o;17707:509::-;17776:6;17825:2;17813:9;17804:7;17800:23;17796:32;17793:119;;;17831:79;;:::i;:::-;17793:119;17979:1;17968:9;17964:17;17951:31;18009:18;18001:6;17998:30;17995:117;;;18031:79;;:::i;:::-;17995:117;18136:63;18191:7;18182:6;18171:9;18167:22;18136:63;:::i;:::-;18126:73;;17922:287;17707:509;;;;:::o;18222:474::-;18290:6;18298;18347:2;18335:9;18326:7;18322:23;18318:32;18315:119;;;18353:79;;:::i;:::-;18315:119;18473:1;18498:53;18543:7;18534:6;18523:9;18519:22;18498:53;:::i;:::-;18488:63;;18444:117;18600:2;18626:53;18671:7;18662:6;18651:9;18647:22;18626:53;:::i;:::-;18616:63;;18571:118;18222:474;;;;;:::o;18702:180::-;18750:77;18747:1;18740:88;18847:4;18844:1;18837:15;18871:4;18868:1;18861:15;18888:320;18932:6;18969:1;18963:4;18959:12;18949:22;;19016:1;19010:4;19006:12;19037:18;19027:81;;19093:4;19085:6;19081:17;19071:27;;19027:81;19155:2;19147:6;19144:14;19124:18;19121:38;19118:84;;19174:18;;:::i;:::-;19118:84;18939:269;18888:320;;;:::o;19214:97::-;19273:6;19301:3;19291:13;;19214:97;;;;:::o;19317:141::-;19366:4;19389:3;19381:11;;19412:3;19409:1;19402:14;19446:4;19443:1;19433:18;19425:26;;19317:141;;;:::o;19464:93::-;19501:6;19548:2;19543;19536:5;19532:14;19528:23;19518:33;;19464:93;;;:::o;19563:107::-;19607:8;19657:5;19651:4;19647:16;19626:37;;19563:107;;;;:::o;19676:393::-;19745:6;19795:1;19783:10;19779:18;19818:97;19848:66;19837:9;19818:97;:::i;:::-;19936:39;19966:8;19955:9;19936:39;:::i;:::-;19924:51;;20008:4;20004:9;19997:5;19993:21;19984:30;;20057:4;20047:8;20043:19;20036:5;20033:30;20023:40;;19752:317;;19676:393;;;;;:::o;20075:60::-;20103:3;20124:5;20117:12;;20075:60;;;:::o;20141:142::-;20191:9;20224:53;20242:34;20251:24;20269:5;20251:24;:::i;:::-;20242:34;:::i;:::-;20224:53;:::i;:::-;20211:66;;20141:142;;;:::o;20289:75::-;20332:3;20353:5;20346:12;;20289:75;;;:::o;20370:269::-;20480:39;20511:7;20480:39;:::i;:::-;20541:91;20590:41;20614:16;20590:41;:::i;:::-;20582:6;20575:4;20569:11;20541:91;:::i;:::-;20535:4;20528:105;20446:193;20370:269;;;:::o;20645:73::-;20690:3;20645:73;:::o;20724:189::-;20801:32;;:::i;:::-;20842:65;20900:6;20892;20886:4;20842:65;:::i;:::-;20777:136;20724:189;;:::o;20919:186::-;20979:120;20996:3;20989:5;20986:14;20979:120;;;21050:39;21087:1;21080:5;21050:39;:::i;:::-;21023:1;21016:5;21012:13;21003:22;;20979:120;;;20919:186;;:::o;21111:543::-;21212:2;21207:3;21204:11;21201:446;;;21246:38;21278:5;21246:38;:::i;:::-;21330:29;21348:10;21330:29;:::i;:::-;21320:8;21316:44;21513:2;21501:10;21498:18;21495:49;;;21534:8;21519:23;;21495:49;21557:80;21613:22;21631:3;21613:22;:::i;:::-;21603:8;21599:37;21586:11;21557:80;:::i;:::-;21216:431;;21201:446;21111:543;;;:::o;21660:117::-;21714:8;21764:5;21758:4;21754:16;21733:37;;21660:117;;;;:::o;21783:169::-;21827:6;21860:51;21908:1;21904:6;21896:5;21893:1;21889:13;21860:51;:::i;:::-;21856:56;21941:4;21935;21931:15;21921:25;;21834:118;21783:169;;;;:::o;21957:295::-;22033:4;22179:29;22204:3;22198:4;22179:29;:::i;:::-;22171:37;;22241:3;22238:1;22234:11;22228:4;22225:21;22217:29;;21957:295;;;;:::o;22257:1403::-;22381:44;22421:3;22416;22381:44;:::i;:::-;22490:18;22482:6;22479:30;22476:56;;;22512:18;;:::i;:::-;22476:56;22556:38;22588:4;22582:11;22556:38;:::i;:::-;22641:67;22701:6;22693;22687:4;22641:67;:::i;:::-;22735:1;22764:2;22756:6;22753:14;22781:1;22776:632;;;;23452:1;23469:6;23466:84;;;23525:9;23520:3;23516:19;23503:33;23494:42;;23466:84;23576:67;23636:6;23629:5;23576:67;:::i;:::-;23570:4;23563:81;23425:229;22746:908;;22776:632;22828:4;22824:9;22816:6;22812:22;22862:37;22894:4;22862:37;:::i;:::-;22921:1;22935:215;22949:7;22946:1;22943:14;22935:215;;;23035:9;23030:3;23026:19;23013:33;23005:6;22998:49;23086:1;23078:6;23074:14;23064:24;;23133:2;23122:9;23118:18;23105:31;;22972:4;22969:1;22965:12;22960:17;;22935:215;;;23178:6;23169:7;23166:19;23163:186;;;23243:9;23238:3;23234:19;23221:33;23286:48;23328:4;23320:6;23316:17;23305:9;23286:48;:::i;:::-;23278:6;23271:64;23186:163;23163:186;23395:1;23391;23383:6;23379:14;23375:22;23369:4;23362:36;22783:625;;;22746:908;;22356:1304;;;22257:1403;;;:::o;23666:180::-;23714:77;23711:1;23704:88;23811:4;23808:1;23801:15;23835:4;23832:1;23825:15;23852:410;23892:7;23915:20;23933:1;23915:20;:::i;:::-;23910:25;;23949:20;23967:1;23949:20;:::i;:::-;23944:25;;24004:1;24001;23997:9;24026:30;24044:11;24026:30;:::i;:::-;24015:41;;24205:1;24196:7;24192:15;24189:1;24186:22;24166:1;24159:9;24139:83;24116:139;;24235:18;;:::i;:::-;24116:139;23900:362;23852:410;;;;:::o;24268:180::-;24316:77;24313:1;24306:88;24413:4;24410:1;24403:15;24437:4;24434:1;24427:15;24454:185;24494:1;24511:20;24529:1;24511:20;:::i;:::-;24506:25;;24545:20;24563:1;24545:20;:::i;:::-;24540:25;;24584:1;24574:35;;24589:18;;:::i;:::-;24574:35;24631:1;24628;24624:9;24619:14;;24454:185;;;;:::o;24645:147::-;24746:11;24783:3;24768:18;;24645:147;;;;:::o;24798:114::-;;:::o;24918:398::-;25077:3;25098:83;25179:1;25174:3;25098:83;:::i;:::-;25091:90;;25190:93;25279:3;25190:93;:::i;:::-;25308:1;25303:3;25299:11;25292:18;;24918:398;;;:::o;25322:379::-;25506:3;25528:147;25671:3;25528:147;:::i;:::-;25521:154;;25692:3;25685:10;;25322:379;;;:::o;25707:169::-;25847:21;25843:1;25835:6;25831:14;25824:45;25707:169;:::o;25882:366::-;26024:3;26045:67;26109:2;26104:3;26045:67;:::i;:::-;26038:74;;26121:93;26210:3;26121:93;:::i;:::-;26239:2;26234:3;26230:12;26223:19;;25882:366;;;:::o;26254:419::-;26420:4;26458:2;26447:9;26443:18;26435:26;;26507:9;26501:4;26497:20;26493:1;26482:9;26478:17;26471:47;26535:131;26661:4;26535:131;:::i;:::-;26527:139;;26254:419;;;:::o;26679:174::-;26819:26;26815:1;26807:6;26803:14;26796:50;26679:174;:::o;26859:366::-;27001:3;27022:67;27086:2;27081:3;27022:67;:::i;:::-;27015:74;;27098:93;27187:3;27098:93;:::i;:::-;27216:2;27211:3;27207:12;27200:19;;26859:366;;;:::o;27231:419::-;27397:4;27435:2;27424:9;27420:18;27412:26;;27484:9;27478:4;27474:20;27470:1;27459:9;27455:17;27448:47;27512:131;27638:4;27512:131;:::i;:::-;27504:139;;27231:419;;;:::o;27656:168::-;27796:20;27792:1;27784:6;27780:14;27773:44;27656:168;:::o;27830:366::-;27972:3;27993:67;28057:2;28052:3;27993:67;:::i;:::-;27986:74;;28069:93;28158:3;28069:93;:::i;:::-;28187:2;28182:3;28178:12;28171:19;;27830:366;;;:::o;28202:419::-;28368:4;28406:2;28395:9;28391:18;28383:26;;28455:9;28449:4;28445:20;28441:1;28430:9;28426:17;28419:47;28483:131;28609:4;28483:131;:::i;:::-;28475:139;;28202:419;;;:::o;28627:191::-;28667:3;28686:20;28704:1;28686:20;:::i;:::-;28681:25;;28720:20;28738:1;28720:20;:::i;:::-;28715:25;;28763:1;28760;28756:9;28749:16;;28784:3;28781:1;28778:10;28775:36;;;28791:18;;:::i;:::-;28775:36;28627:191;;;;:::o;28824:172::-;28964:24;28960:1;28952:6;28948:14;28941:48;28824:172;:::o;29002:366::-;29144:3;29165:67;29229:2;29224:3;29165:67;:::i;:::-;29158:74;;29241:93;29330:3;29241:93;:::i;:::-;29359:2;29354:3;29350:12;29343:19;;29002:366;;;:::o;29374:419::-;29540:4;29578:2;29567:9;29563:18;29555:26;;29627:9;29621:4;29617:20;29613:1;29602:9;29598:17;29591:47;29655:131;29781:4;29655:131;:::i;:::-;29647:139;;29374:419;;;:::o;29799:176::-;29939:28;29935:1;29927:6;29923:14;29916:52;29799:176;:::o;29981:366::-;30123:3;30144:67;30208:2;30203:3;30144:67;:::i;:::-;30137:74;;30220:93;30309:3;30220:93;:::i;:::-;30338:2;30333:3;30329:12;30322:19;;29981:366;;;:::o;30353:419::-;30519:4;30557:2;30546:9;30542:18;30534:26;;30606:9;30600:4;30596:20;30592:1;30581:9;30577:17;30570:47;30634:131;30760:4;30634:131;:::i;:::-;30626:139;;30353:419;;;:::o;30778:194::-;30818:4;30838:20;30856:1;30838:20;:::i;:::-;30833:25;;30872:20;30890:1;30872:20;:::i;:::-;30867:25;;30916:1;30913;30909:9;30901:17;;30940:1;30934:4;30931:11;30928:37;;;30945:18;;:::i;:::-;30928:37;30778:194;;;;:::o;30978:170::-;31118:22;31114:1;31106:6;31102:14;31095:46;30978:170;:::o;31154:366::-;31296:3;31317:67;31381:2;31376:3;31317:67;:::i;:::-;31310:74;;31393:93;31482:3;31393:93;:::i;:::-;31511:2;31506:3;31502:12;31495:19;;31154:366;;;:::o;31526:419::-;31692:4;31730:2;31719:9;31715:18;31707:26;;31779:9;31773:4;31769:20;31765:1;31754:9;31750:17;31743:47;31807:131;31933:4;31807:131;:::i;:::-;31799:139;;31526:419;;;:::o;31951:143::-;32008:5;32039:6;32033:13;32024:22;;32055:33;32082:5;32055:33;:::i;:::-;31951:143;;;;:::o;32100:351::-;32170:6;32219:2;32207:9;32198:7;32194:23;32190:32;32187:119;;;32225:79;;:::i;:::-;32187:119;32345:1;32370:64;32426:7;32417:6;32406:9;32402:22;32370:64;:::i;:::-;32360:74;;32316:128;32100:351;;;;:::o;32457:229::-;32597:34;32593:1;32585:6;32581:14;32574:58;32666:12;32661:2;32653:6;32649:15;32642:37;32457:229;:::o;32692:366::-;32834:3;32855:67;32919:2;32914:3;32855:67;:::i;:::-;32848:74;;32931:93;33020:3;32931:93;:::i;:::-;33049:2;33044:3;33040:12;33033:19;;32692:366;;;:::o;33064:419::-;33230:4;33268:2;33257:9;33253:18;33245:26;;33317:9;33311:4;33307:20;33303:1;33292:9;33288:17;33281:47;33345:131;33471:4;33345:131;:::i;:::-;33337:139;;33064:419;;;:::o;33489:167::-;33629:19;33625:1;33617:6;33613:14;33606:43;33489:167;:::o;33662:366::-;33804:3;33825:67;33889:2;33884:3;33825:67;:::i;:::-;33818:74;;33901:93;33990:3;33901:93;:::i;:::-;34019:2;34014:3;34010:12;34003:19;;33662:366;;;:::o;34034:419::-;34200:4;34238:2;34227:9;34223:18;34215:26;;34287:9;34281:4;34277:20;34273:1;34262:9;34258:17;34251:47;34315:131;34441:4;34315:131;:::i;:::-;34307:139;;34034:419;;;:::o;34459:94::-;34492:8;34540:5;34536:2;34532:14;34511:35;;34459:94;;;:::o;34559:::-;34598:7;34627:20;34641:5;34627:20;:::i;:::-;34616:31;;34559:94;;;:::o;34659:100::-;34698:7;34727:26;34747:5;34727:26;:::i;:::-;34716:37;;34659:100;;;:::o;34765:157::-;34870:45;34890:24;34908:5;34890:24;:::i;:::-;34870:45;:::i;:::-;34865:3;34858:58;34765:157;;:::o;34928:79::-;34967:7;34996:5;34985:16;;34928:79;;;:::o;35013:157::-;35118:45;35138:24;35156:5;35138:24;:::i;:::-;35118:45;:::i;:::-;35113:3;35106:58;35013:157;;:::o;35176:397::-;35316:3;35331:75;35402:3;35393:6;35331:75;:::i;:::-;35431:2;35426:3;35422:12;35415:19;;35444:75;35515:3;35506:6;35444:75;:::i;:::-;35544:2;35539:3;35535:12;35528:19;;35564:3;35557:10;;35176:397;;;;;:::o;35579:174::-;35719:26;35715:1;35707:6;35703:14;35696:50;35579:174;:::o;35759:366::-;35901:3;35922:67;35986:2;35981:3;35922:67;:::i;:::-;35915:74;;35998:93;36087:3;35998:93;:::i;:::-;36116:2;36111:3;36107:12;36100:19;;35759:366;;;:::o;36131:419::-;36297:4;36335:2;36324:9;36320:18;36312:26;;36384:9;36378:4;36374:20;36370:1;36359:9;36355:17;36348:47;36412:131;36538:4;36412:131;:::i;:::-;36404:139;;36131:419;;;:::o;36556:166::-;36696:18;36692:1;36684:6;36680:14;36673:42;36556:166;:::o;36728:366::-;36870:3;36891:67;36955:2;36950:3;36891:67;:::i;:::-;36884:74;;36967:93;37056:3;36967:93;:::i;:::-;37085:2;37080:3;37076:12;37069:19;;36728:366;;;:::o;37100:419::-;37266:4;37304:2;37293:9;37289:18;37281:26;;37353:9;37347:4;37343:20;37339:1;37328:9;37324:17;37317:47;37381:131;37507:4;37381:131;:::i;:::-;37373:139;;37100:419;;;:::o;37525:234::-;37665:34;37661:1;37653:6;37649:14;37642:58;37734:17;37729:2;37721:6;37717:15;37710:42;37525:234;:::o;37765:366::-;37907:3;37928:67;37992:2;37987:3;37928:67;:::i;:::-;37921:74;;38004:93;38093:3;38004:93;:::i;:::-;38122:2;38117:3;38113:12;38106:19;;37765:366;;;:::o;38137:419::-;38303:4;38341:2;38330:9;38326:18;38318:26;;38390:9;38384:4;38380:20;38376:1;38365:9;38361:17;38354:47;38418:131;38544:4;38418:131;:::i;:::-;38410:139;;38137:419;;;:::o;38562:148::-;38664:11;38701:3;38686:18;;38562:148;;;;:::o;38716:390::-;38822:3;38850:39;38883:5;38850:39;:::i;:::-;38905:89;38987:6;38982:3;38905:89;:::i;:::-;38898:96;;39003:65;39061:6;39056:3;39049:4;39042:5;39038:16;39003:65;:::i;:::-;39093:6;39088:3;39084:16;39077:23;;38826:280;38716:390;;;;:::o;39136:874::-;39239:3;39276:5;39270:12;39305:36;39331:9;39305:36;:::i;:::-;39357:89;39439:6;39434:3;39357:89;:::i;:::-;39350:96;;39477:1;39466:9;39462:17;39493:1;39488:166;;;;39668:1;39663:341;;;;39455:549;;39488:166;39572:4;39568:9;39557;39553:25;39548:3;39541:38;39634:6;39627:14;39620:22;39612:6;39608:35;39603:3;39599:45;39592:52;;39488:166;;39663:341;39730:38;39762:5;39730:38;:::i;:::-;39790:1;39804:154;39818:6;39815:1;39812:13;39804:154;;;39892:7;39886:14;39882:1;39877:3;39873:11;39866:35;39942:1;39933:7;39929:15;39918:26;;39840:4;39837:1;39833:12;39828:17;;39804:154;;;39987:6;39982:3;39978:16;39971:23;;39670:334;;39455:549;;39243:767;;39136:874;;;;:::o;40016:589::-;40241:3;40263:95;40354:3;40345:6;40263:95;:::i;:::-;40256:102;;40375:95;40466:3;40457:6;40375:95;:::i;:::-;40368:102;;40487:92;40575:3;40566:6;40487:92;:::i;:::-;40480:99;;40596:3;40589:10;;40016:589;;;;;;:::o;40611:1395::-;40728:37;40761:3;40728:37;:::i;:::-;40830:18;40822:6;40819:30;40816:56;;;40852:18;;:::i;:::-;40816:56;40896:38;40928:4;40922:11;40896:38;:::i;:::-;40981:67;41041:6;41033;41027:4;40981:67;:::i;:::-;41075:1;41099:4;41086:17;;41131:2;41123:6;41120:14;41148:1;41143:618;;;;41805:1;41822:6;41819:77;;;41871:9;41866:3;41862:19;41856:26;41847:35;;41819:77;41922:67;41982:6;41975:5;41922:67;:::i;:::-;41916:4;41909:81;41778:222;41113:887;;41143:618;41195:4;41191:9;41183:6;41179:22;41229:37;41261:4;41229:37;:::i;:::-;41288:1;41302:208;41316:7;41313:1;41310:14;41302:208;;;41395:9;41390:3;41386:19;41380:26;41372:6;41365:42;41446:1;41438:6;41434:14;41424:24;;41493:2;41482:9;41478:18;41465:31;;41339:4;41336:1;41332:12;41327:17;;41302:208;;;41538:6;41529:7;41526:19;41523:179;;;41596:9;41591:3;41587:19;41581:26;41639:48;41681:4;41673:6;41669:17;41658:9;41639:48;:::i;:::-;41631:6;41624:64;41546:156;41523:179;41748:1;41744;41736:6;41732:14;41728:22;41722:4;41715:36;41150:611;;;41113:887;;40703:1303;;;40611:1395;;:::o;42012:225::-;42152:34;42148:1;42140:6;42136:14;42129:58;42221:8;42216:2;42208:6;42204:15;42197:33;42012:225;:::o;42243:366::-;42385:3;42406:67;42470:2;42465:3;42406:67;:::i;:::-;42399:74;;42482:93;42571:3;42482:93;:::i;:::-;42600:2;42595:3;42591:12;42584:19;;42243:366;;;:::o;42615:419::-;42781:4;42819:2;42808:9;42804:18;42796:26;;42868:9;42862:4;42858:20;42854:1;42843:9;42839:17;42832:47;42896:131;43022:4;42896:131;:::i;:::-;42888:139;;42615:419;;;:::o;43040:182::-;43180:34;43176:1;43168:6;43164:14;43157:58;43040:182;:::o;43228:366::-;43370:3;43391:67;43455:2;43450:3;43391:67;:::i;:::-;43384:74;;43467:93;43556:3;43467:93;:::i;:::-;43585:2;43580:3;43576:12;43569:19;;43228:366;;;:::o;43600:419::-;43766:4;43804:2;43793:9;43789:18;43781:26;;43853:9;43847:4;43843:20;43839:1;43828:9;43824:17;43817:47;43881:131;44007:4;43881:131;:::i;:::-;43873:139;;43600:419;;;:::o;44025:180::-;44073:77;44070:1;44063:88;44170:4;44167:1;44160:15;44194:4;44191:1;44184:15;44211:79;44250:7;44279:5;44268:16;;44211:79;;;:::o;44296:157::-;44401:45;44421:24;44439:5;44421:24;:::i;:::-;44401:45;:::i;:::-;44396:3;44389:58;44296:157;;:::o;44459:397::-;44599:3;44614:75;44685:3;44676:6;44614:75;:::i;:::-;44714:2;44709:3;44705:12;44698:19;;44727:75;44798:3;44789:6;44727:75;:::i;:::-;44827:2;44822:3;44818:12;44811:19;;44847:3;44840:10;;44459:397;;;;;:::o;44862:233::-;44901:3;44924:24;44942:5;44924:24;:::i;:::-;44915:33;;44970:66;44963:5;44960:77;44957:103;;45040:18;;:::i;:::-;44957:103;45087:1;45080:5;45076:13;45069:20;;44862:233;;;:::o;45101:229::-;45241:34;45237:1;45229:6;45225:14;45218:58;45310:12;45305:2;45297:6;45293:15;45286:37;45101:229;:::o;45336:366::-;45478:3;45499:67;45563:2;45558:3;45499:67;:::i;:::-;45492:74;;45575:93;45664:3;45575:93;:::i;:::-;45693:2;45688:3;45684:12;45677:19;;45336:366;;;:::o;45708:419::-;45874:4;45912:2;45901:9;45897:18;45889:26;;45961:9;45955:4;45951:20;45947:1;45936:9;45932:17;45925:47;45989:131;46115:4;45989:131;:::i;:::-;45981:139;;45708:419;;;:::o;46133:175::-;46273:27;46269:1;46261:6;46257:14;46250:51;46133:175;:::o;46314:366::-;46456:3;46477:67;46541:2;46536:3;46477:67;:::i;:::-;46470:74;;46553:93;46642:3;46553:93;:::i;:::-;46671:2;46666:3;46662:12;46655:19;;46314:366;;;:::o;46686:419::-;46852:4;46890:2;46879:9;46875:18;46867:26;;46939:9;46933:4;46929:20;46925:1;46914:9;46910:17;46903:47;46967:131;47093:4;46967:131;:::i;:::-;46959:139;;46686:419;;;:::o;47111:98::-;47162:6;47196:5;47190:12;47180:22;;47111:98;;;:::o;47215:168::-;47298:11;47332:6;47327:3;47320:19;47372:4;47367:3;47363:14;47348:29;;47215:168;;;;:::o;47389:373::-;47475:3;47503:38;47535:5;47503:38;:::i;:::-;47557:70;47620:6;47615:3;47557:70;:::i;:::-;47550:77;;47636:65;47694:6;47689:3;47682:4;47675:5;47671:16;47636:65;:::i;:::-;47726:29;47748:6;47726:29;:::i;:::-;47721:3;47717:39;47710:46;;47479:283;47389:373;;;;:::o;47768:640::-;47963:4;48001:3;47990:9;47986:19;47978:27;;48015:71;48083:1;48072:9;48068:17;48059:6;48015:71;:::i;:::-;48096:72;48164:2;48153:9;48149:18;48140:6;48096:72;:::i;:::-;48178;48246:2;48235:9;48231:18;48222:6;48178:72;:::i;:::-;48297:9;48291:4;48287:20;48282:2;48271:9;48267:18;48260:48;48325:76;48396:4;48387:6;48325:76;:::i;:::-;48317:84;;47768:640;;;;;;;:::o;48414:141::-;48470:5;48501:6;48495:13;48486:22;;48517:32;48543:5;48517:32;:::i;:::-;48414:141;;;;:::o;48561:349::-;48630:6;48679:2;48667:9;48658:7;48654:23;48650:32;48647:119;;;48685:79;;:::i;:::-;48647:119;48805:1;48830:63;48885:7;48876:6;48865:9;48861:22;48830:63;:::i;:::-;48820:73;;48776:127;48561:349;;;;:::o
Swarm Source
ipfs://0739ac436e1e36a840365ad6a5e73c06cd6036fc520ab7d3fcf11a6662d824a1
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.