MicroMigos (MICROMIGOS) Token Tracker | BaseSepolia (2024)

Contract Source Code (Solidity)

Outline

- function _nonReentrantBefore() - function _nonReentrantAfter() - function _reentrancyGuardEntered() library SignedMath - function max(int256 a, int256 b) - function min(int256 a, int256 b) - function average(int256 a, int256 b) - function abs(int256 n) library Math - function tryAdd(uint256 a, uint256 b) - function trySub(uint256 a, uint256 b) - function tryMul(uint256 a, uint256 b) - function tryDiv(uint256 a, uint256 b) - function tryMod(uint256 a, uint256 b) - function max(uint256 a, uint256 b) - function min(uint256 a, uint256 b) - function average(uint256 a, uint256 b ... - function ceilDiv(uint256 a, uint256 b ... - function mulDiv(uint256 x, uint256 y, ... - function mulDiv(uint256 x, uint256 y, ... - function sqrt(uint256 a) - function sqrt(uint256 a, Rounding rou ... - function log2(uint256 value) - function log2(uint256 value, Rounding ... - function log10(uint256 value) - function log10(uint256 value, Roundin ... - function log256(uint256 value) - function log256(uint256 value, Roundi ... - function unsignedRoundsUp(Rounding ro ... library Strings - function toString(uint256 value) - function toStringSigned(int256 value) - function toHexString(uint256 value) - function toHexString(uint256 value, u ... - function toHexString(address addr) - function equal(string memory a, strin ... library MerkleProof - function verify(bytes32[] memory proo ... - function verifyCalldata(bytes32[] cal ... - function processProof(bytes32[] memor ... - function processProofCalldata(bytes32 ... - function multiProofVerify( - function multiProofVerifyCalldata( - function processMultiProof( - function processMultiProofCalldata( - function _hashPair(bytes32 a, bytes32 ... - function _efficientHash(bytes32 a, by ... - function _msgSender() - function _msgData() - function owner() - function _checkOwner() - function renounceOwnership() - function transferOwnership(address ne ... - function _transferOwnership(address n ... interface IDelegationRegistry - function checkDelegateForAll(address ... interface IERC721A - function totalSupply() - function supportsInterface(bytes4 int ... - function balanceOf(address owner) - function ownerOf(uint256 tokenId) - function safeTransferFrom( - function safeTransferFrom( - function transferFrom( - function approve(address to, uint256 ... - function setApprovalForAll(address op ... - function getApproved(uint256 tokenId) - function isApprovedForAll(address own ... - function name() - function symbol() - function tokenURI(uint256 tokenId) interface ERC721A__IERC721Receiver - function onERC721Received( contract ERC721A is IERC721A - function _startTokenId() - function _nextTokenId() - function totalSupply() - function _totalMinted() - function _totalBurned() - function balanceOf(address owner) - function _numberMinted(address owner) - function _numberBurned(address owner) - function _getAux(address owner) - function _setAux(address owner, uint6 ... - function supportsInterface(bytes4 int ... - function name() - function symbol() - function tokenURI(uint256 tokenId) - function _baseURI() - function ownerOf(uint256 tokenId) - function _ownershipOf(uint256 tokenId ... - function _ownershipAt(uint256 index) - function _initializeOwnershipAt(uint2 ... - function _packedOwnershipOf(uint256 t ... - function _unpackedOwnership(uint256 p ... - function _packOwnershipData(address o ... - function _nextInitializedFlag(uint256 ... - function approve(address to, uint256 ... - function getApproved(uint256 tokenId) - function setApprovalForAll(address op ... - function isApprovedForAll(address own ... - function _exists(uint256 tokenId) - function _isSenderApprovedOrOwner( - function _getApprovedSlotAndAddress(u ... - function transferFrom( - function safeTransferFrom( - function safeTransferFrom( - function _beforeTokenTransfers( - function _afterTokenTransfers( - function _checkContractOnERC721Receiv ... - function _mint(address to, uint256 qu ... - function _mintERC2309(address to, uin ... - function _safeMint( - function _safeMint(address to, uint25 ... - function _burn(uint256 tokenId) - function _burn(uint256 tokenId, bool ... - function _setExtraDataAt(uint256 inde ... - function _extraData( - function _nextExtraData( - function _msgSenderERC721A() - function _toString(uint256 value) interface IERC721AQueryable is IERC72 ... - function explicitOwnershipOf(uint256 ... - function explicitOwnershipsOf(uint256 ... - function tokensOfOwnerIn( - function tokensOfOwner(address owner) - function explicitOwnershipOf(uint256 ... - function explicitOwnershipsOf(uint256 ... - function tokensOfOwnerIn( - function tokensOfOwner(address owner) contract MicroMigos is ERC721AQuer ... * - function isDelegate(address _mintForA ... - function updateFreeMintsByAddress(add ... - function whitelistMint(address _mintF ... - function mint(uint256 _mintAmount) - function setMaxFreeAmountPerAddress(u ... - function setMaxMintAmountPerAddress(u ... - function mintForAddress(uint256 _mint ... - function _startTokenId() - function tokenURI(uint256 _tokenId) - function setMaxSupply(uint256 _maxSup ... - function setRevealed(bool _state) - function setCost(uint256 _cost) - function setHiddenMetadataUri(string ... - function setUriPrefix(string memory _ ... - function setUriSuffix(string memory _ ... - function setPaused(bool _state) - function setMerkleRoot(bytes32 _merkl ... - function setWhitelistMintEnabled(bool ... - function withdraw() - function _baseURI()

/** *Submitted for verification at sepolia.basescan.org on 2024-04-10*/// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)pragma solidity ^0.8.20;/** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; }}// File: @openzeppelin/contracts/utils/math/SignedMath.sol// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)pragma solidity ^0.8.20;/** * @dev Standard signed math utilities missing in the Solidity language. */library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } }}// File: @openzeppelin/contracts/utils/math/Math.sol// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)pragma solidity ^0.8.20;/** * @dev Standard math utilities missing in the Solidity language. */library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; }}// File: @openzeppelin/contracts/utils/Strings.sol// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)pragma solidity ^0.8.20;/** * @dev String operations. */library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); }}// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol)pragma solidity ^0.8.20;/** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the Merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates Merkle trees that are safe * against this attack out of the box. */library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } }}// File: @openzeppelin/contracts/utils/Context.sol// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)pragma solidity ^0.8.20;/** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; }}// File: @openzeppelin/contracts/access/Ownable.sol// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)pragma solidity ^0.8.20;/** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); }}// File: contracts/IDelegationRegistryExcerpt.solpragma solidity ^0.8.19;/** * @title A partial interface taken from the IDelegationRegistry provided under * the CC0-1.0 Creative Commons license by delegate.xyz */interface IDelegationRegistry { /** * @notice Returns true if the address is delegated to act on the entire vault * @param delegate The hotwallet to act on your behalf * @param vault The cold wallet who issued the delegation */ function checkDelegateForAll(address delegate, address vault) external view returns (bool);}// File: erc721a/contracts/IERC721A.sol// ERC721A Contracts v4.2.3// Creator: Chiru Labspragma solidity ^0.8.4;/** * @dev Interface of ERC721A. */interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);}// File: erc721a/contracts/ERC721A.sol// ERC721A Contracts v4.2.3// Creator: Chiru Labspragma solidity ^0.8.4;/** * @dev Interface of ERC721 token receiver. */interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4);}/** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } }}// File: erc721a/contracts/extensions/IERC721AQueryable.sol// ERC721A Contracts v4.2.3// Creator: Chiru Labspragma solidity ^0.8.4;/** * @dev Interface of ERC721AQueryable. */interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory);}// File: erc721a/contracts/extensions/ERC721AQueryable.sol// ERC721A Contracts v4.2.3// Creator: Chiru Labspragma solidity ^0.8.4;/** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } }}// File: contracts/MicroMigosDelegate.solpragma solidity >=0.8.9 <0.9.0;/*███╗ ███╗██╗ ██████╗██████╗ ██████╗ ███╗ ███╗██╗ ██████╗ ██████╗ ███████╗████╗ ████║██║██╔════╝██╔══██╗██╔═══██╗████╗ ████║██║██╔════╝ ██╔═══██╗██╔════╝██╔████╔██║██║██║ ██████╔╝██║ ██║██╔████╔██║██║██║ ███╗██║ ██║███████╗██║╚██╔╝██║██║██║ ██╔══██╗██║ ██║██║╚██╔╝██║██║██║ ██║██║ ██║╚════██║██║ ╚═╝ ██║██║╚██████╗██║ ██║╚██████╔╝██║ ╚═╝ ██║██║╚██████╔╝╚██████╔╝███████║╚═╝ ╚═╝╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═════╝ ╚══════╝*/contract MicroMigos is ERC721AQueryable, ReentrancyGuard, Ownable(msg.sender) { using Strings for uint256; address private constant _DELEGATION_REGISTRY_V1 = 0x00000000000076A84feF008CDAbe6409d2FE638B; address private constant _DELEGATION_REGISTRY_V2 = 0x00000000000000447e69651d841bD8D104Bed493; bytes32 public merkleRoot; mapping(address => uint256) public freeMintsByAddress; mapping(address => uint256) public mintedAmountByAddress; string public uriPrefix = ""; string public uriSuffix = ".json"; string public hiddenMetadataUri; uint256 public maxFreeAmountPerAddress; uint256 public maxMintAmountPerAddress; uint256 public maxSupply; uint256 public cost; bool public paused = true; bool public whitelistMintEnabled = false; bool public revealed = false; constructor( string memory _tokenName, string memory _tokenSymbol, uint256 _cost, uint256 _maxSupply, uint256 _maxFreeAmountPerAddress, uint256 _maxMintAmountPerAddress, string memory _hiddenMetadataUri ) ERC721A(_tokenName, _tokenSymbol) { setCost(_cost); maxSupply = _maxSupply; setMaxFreeAmountPerAddress(_maxFreeAmountPerAddress); setMaxMintAmountPerAddress(_maxMintAmountPerAddress); setHiddenMetadataUri(_hiddenMetadataUri); } modifier teamMintCompliance(uint256 _mintAmount) { require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); _; } function isDelegate(address _mintForAddress) private view returns (bool) { bool _isDelegate = false; if (_mintForAddress != address(0) && _mintForAddress != msg.sender) { if (IDelegationRegistry(_DELEGATION_REGISTRY_V1).checkDelegateForAll(msg.sender, _mintForAddress)) { _isDelegate = true; } if (!_isDelegate && IDelegationRegistry(_DELEGATION_REGISTRY_V2).checkDelegateForAll(msg.sender, _mintForAddress)) { _isDelegate = true; } } return _isDelegate; } modifier mintComplianceWL(address _mintForAddress, uint256 _mintAmount) { require(tx.origin == msg.sender, 'No Contract Minting!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); address minter = isDelegate(_mintForAddress) ? _mintForAddress : msg.sender; require(_mintAmount > 0 && mintedAmountByAddress[minter] + _mintAmount <= maxMintAmountPerAddress, 'Minted max amount for address!'); _; } modifier mintPriceComplianceWL(address _mintForAddress, uint256 _mintAmount) { uint256 _mintCost = cost * _mintAmount; address minter = isDelegate(_mintForAddress) ? _mintForAddress : msg.sender; uint256 _freeMintsRemainingForAddress = maxFreeAmountPerAddress - freeMintsByAddress[minter] > 0 ? maxFreeAmountPerAddress - freeMintsByAddress[minter] : 0; uint256 _freeMintsToDiscount = 0; if (_freeMintsRemainingForAddress > 0) { _freeMintsToDiscount = _freeMintsRemainingForAddress <= _mintAmount ? _freeMintsRemainingForAddress : _mintAmount; } _mintCost = _mintCost - (_freeMintsToDiscount * cost) ; require(msg.value >= _mintCost, 'Insufficient funds!'); _; } modifier mintCompliance(uint256 _mintAmount) { require(tx.origin == msg.sender, 'No Contract Minting!'); require(_mintAmount > 0 && mintedAmountByAddress[msg.sender] + _mintAmount <= maxMintAmountPerAddress, 'Minted max amount for address!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); _; } modifier mintPriceCompliance(uint256 _mintAmount) { uint256 _mintCost = cost * _mintAmount; require(msg.value >= _mintCost, 'Insufficient funds!'); _; } function updateFreeMintsByAddress(address _minterForAddress, uint256 _mintAmount) private { uint256 freeMints = _mintAmount <= maxFreeAmountPerAddress - freeMintsByAddress[_minterForAddress] ? _mintAmount : maxFreeAmountPerAddress - freeMintsByAddress[_minterForAddress]; if (freeMints > 0) { freeMintsByAddress[_minterForAddress] += freeMints; } } function whitelistMint(address _mintForAddress, uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintComplianceWL(_mintForAddress, _mintAmount) mintPriceComplianceWL(_mintForAddress, _mintAmount) nonReentrant { require(whitelistMintEnabled, 'The whitelist sale is not enabled!'); address minter = isDelegate(_mintForAddress) ? _mintForAddress : msg.sender; bytes32 leaf = keccak256(abi.encodePacked(minter)); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!'); updateFreeMintsByAddress(minter, _mintAmount); mintedAmountByAddress[minter] += _mintAmount; _safeMint(msg.sender, _mintAmount); } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) nonReentrant { require(!paused, 'The contract is paused!'); mintedAmountByAddress[msg.sender] += _mintAmount; _safeMint(msg.sender, _mintAmount); } function setMaxFreeAmountPerAddress(uint256 _maxFreeAmountPerAddress) public onlyOwner { maxFreeAmountPerAddress = _maxFreeAmountPerAddress; } function setMaxMintAmountPerAddress(uint256 _maxMintAmountPerAddress) public onlyOwner { maxMintAmountPerAddress = _maxMintAmountPerAddress; } function mintForAddress(uint256 _mintAmount, address _receiver) public teamMintCompliance(_mintAmount) onlyOwner { _safeMint(_receiver, _mintAmount); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function setWhitelistMintEnabled(bool _state) public onlyOwner { whitelistMintEnabled = _state; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _baseURI() internal view virtual override(ERC721A) returns (string memory) { return uriPrefix; }}

Contract ABI

JSON Format RAW/Text Format

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxFreeAmountPerAddress","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerAddress","type":"uint256"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","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"},{"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintsByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeAmountPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedAmountByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeAmountPerAddress","type":"uint256"}],"name":"setMaxFreeAmountPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerAddress","type":"uint256"}],"name":"setMaxMintAmountPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_mintForAddress","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Contract Creation Code

Decompile ByteCode Switch to Opcodes View

608060405260405180602001604052805f815250600d90816100219190610627565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90816100669190610627565b50600160145f6101000a81548160ff0219169083151502179055505f601460016101000a81548160ff0219169083151502179055505f601460026101000a81548160ff0219169083151502179055503480156100c0575f80fd5b5060405161546f38038061546f83398181016040528101906100e29190610840565b33878781600290816100f49190610627565b5080600390816101049190610627565b506101136101f160201b60201c565b5f81905550505060016008819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610192575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101899190610970565b60405180910390fd5b6101a1816101f960201b60201c565b506101b1856102bc60201b60201c565b836012819055506101c7836102d460201b60201c565b6101d6826102ec60201b60201c565b6101e58161030460201b60201c565b50505050505050610989565b5f6001905090565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6102ca61032560201b60201c565b8060138190555050565b6102e261032560201b60201c565b8060108190555050565b6102fa61032560201b60201c565b8060118190555050565b61031261032560201b60201c565b80600f90816103219190610627565b5050565b6103336103be60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166103576103c560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146103bc576103806103be60201b60201c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016103b39190610970565b60405180910390fd5b565b5f33905090565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061046857607f821691505b60208210810361047b5761047a610424565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104dd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104a2565b6104e786836104a2565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61052b610526610521846104ff565b610508565b6104ff565b9050919050565b5f819050919050565b61054483610511565b61055861055082610532565b8484546104ae565b825550505050565b5f90565b61056c610560565b61057781848461053b565b505050565b5b8181101561059a5761058f5f82610564565b60018101905061057d565b5050565b601f8211156105df576105b081610481565b6105b984610493565b810160208510156105c8578190505b6105dc6105d485610493565b83018261057c565b50505b505050565b5f82821c905092915050565b5f6105ff5f19846008026105e4565b1980831691505092915050565b5f61061783836105f0565b9150826002028217905092915050565b610630826103ed565b67ffffffffffffffff811115610649576106486103f7565b5b6106538254610451565b61065e82828561059e565b5f60209050601f83116001811461068f575f841561067d578287015190505b610687858261060c565b8655506106ee565b601f19841661069d86610481565b5f5b828110156106c45784890151825560018201915060208501945060208101905061069f565b868310156106e157848901516106dd601f8916826105f0565b8355505b6001600288020188555050505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b6107288261070f565b810181811067ffffffffffffffff82111715610747576107466103f7565b5b80604052505050565b5f6107596106f6565b9050610765828261071f565b919050565b5f67ffffffffffffffff821115610784576107836103f7565b5b61078d8261070f565b9050602081019050919050565b8281835e5f83830152505050565b5f6107ba6107b58461076a565b610750565b9050828152602081018484840111156107d6576107d561070b565b5b6107e184828561079a565b509392505050565b5f82601f8301126107fd576107fc610707565b5b815161080d8482602086016107a8565b91505092915050565b61081f816104ff565b8114610829575f80fd5b50565b5f8151905061083a81610816565b92915050565b5f805f805f805f60e0888a03121561085b5761085a6106ff565b5b5f88015167ffffffffffffffff81111561087857610877610703565b5b6108848a828b016107e9565b975050602088015167ffffffffffffffff8111156108a5576108a4610703565b5b6108b18a828b016107e9565b96505060406108c28a828b0161082c565b95505060606108d38a828b0161082c565b94505060806108e48a828b0161082c565b93505060a06108f58a828b0161082c565b92505060c088015167ffffffffffffffff81111561091657610915610703565b5b6109228a828b016107e9565b91505092959891949750929550565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61095a82610931565b9050919050565b61096a81610950565b82525050565b5f6020820190506109835f830184610961565b92915050565b614ad9806109965f395ff3fe6080604052600436106102ad575f3560e01c806362b99ad411610174578063a0712d68116100db578063c87b56dd11610094578063e985e9c51161006e578063e985e9c514610a47578063efbd73f414610a83578063f2fde38b14610aab578063ff94ac1814610ad3576102ad565b8063c87b56dd146109b9578063d5abeb01146109f5578063e0a8085314610a1f576102ad565b8063a0712d68146108cb578063a22cb465146108e7578063a45ba8e71461090f578063b767a09814610939578063b88d4fde14610961578063c23dc68f1461097d576102ad565b80637cb647591161012d5780637cb64759146107af5780637ec4a659146107d75780638462151c146107ff5780638da5cb5b1461083b57806395d89b411461086557806399a2557a1461088f576102ad565b806362b99ad4146106a55780636352211e146106cf5780636caede3d1461070b5780636f8b44b01461073557806370a082311461075d578063715018a614610799576102ad565b806342842e0e116102185780635697f53e116101d15780635697f53e146105875780635bbb2177146105af5780635c41d75e146105eb5780635c975abb146106155780635d3155f31461063f5780635f17e26514610669576102ad565b806342842e0e146104ab57806344a0d68a146104c75780634b11faaf146104ef5780634fdd43cb1461050b57806351830227146105335780635503a0e81461055d576102ad565b806316c38b3c1161026a57806316c38b3c146103c157806318160ddd146103e957806323b872dd1461041357806328a601121461042f5780632eb4a7ab1461046b5780633ccfd60b14610495576102ad565b806301ffc9a7146102b157806306fdde03146102ed578063081812fc14610317578063095ea7b31461035357806313faede61461036f57806316ba10e014610399575b5f80fd5b3480156102bc575f80fd5b506102d760048036038101906102d29190613507565b610afb565b6040516102e4919061354c565b60405180910390f35b3480156102f8575f80fd5b50610301610b8c565b60405161030e91906135d5565b60405180910390f35b348015610322575f80fd5b5061033d60048036038101906103389190613628565b610c1c565b60405161034a9190613692565b60405180910390f35b61036d600480360381019061036891906136d5565b610c96565b005b34801561037a575f80fd5b50610383610dd5565b6040516103909190613722565b60405180910390f35b3480156103a4575f80fd5b506103bf60048036038101906103ba9190613867565b610ddb565b005b3480156103cc575f80fd5b506103e760048036038101906103e291906138d8565b610df6565b005b3480156103f4575f80fd5b506103fd610e1a565b60405161040a9190613722565b60405180910390f35b61042d60048036038101906104289190613903565b610e2f565b005b34801561043a575f80fd5b5061045560048036038101906104509190613953565b61113d565b6040516104629190613722565b60405180910390f35b348015610476575f80fd5b5061047f611152565b60405161048c9190613996565b60405180910390f35b3480156104a0575f80fd5b506104a9611158565b005b6104c560048036038101906104c09190613903565b6111eb565b005b3480156104d2575f80fd5b506104ed60048036038101906104e89190613628565b61120a565b005b61050960048036038101906105049190613a0c565b61121c565b005b348015610516575f80fd5b50610531600480360381019061052c9190613867565b611683565b005b34801561053e575f80fd5b5061054761169e565b604051610554919061354c565b60405180910390f35b348015610568575f80fd5b506105716116b1565b60405161057e91906135d5565b60405180910390f35b348015610592575f80fd5b506105ad60048036038101906105a89190613628565b61173d565b005b3480156105ba575f80fd5b506105d560048036038101906105d09190613ad2565b61174f565b6040516105e29190613c75565b60405180910390f35b3480156105f6575f80fd5b506105ff61180f565b60405161060c9190613722565b60405180910390f35b348015610620575f80fd5b50610629611815565b604051610636919061354c565b60405180910390f35b34801561064a575f80fd5b50610653611827565b6040516106609190613722565b60405180910390f35b348015610674575f80fd5b5061068f600480360381019061068a9190613953565b61182d565b60405161069c9190613722565b60405180910390f35b3480156106b0575f80fd5b506106b9611842565b6040516106c691906135d5565b60405180910390f35b3480156106da575f80fd5b506106f560048036038101906106f09190613628565b6118ce565b6040516107029190613692565b60405180910390f35b348015610716575f80fd5b5061071f6118df565b60405161072c919061354c565b60405180910390f35b348015610740575f80fd5b5061075b60048036038101906107569190613628565b6118f2565b005b348015610768575f80fd5b50610783600480360381019061077e9190613953565b611904565b6040516107909190613722565b60405180910390f35b3480156107a4575f80fd5b506107ad6119b9565b005b3480156107ba575f80fd5b506107d560048036038101906107d09190613cbf565b6119cc565b005b3480156107e2575f80fd5b506107fd60048036038101906107f89190613867565b6119de565b005b34801561080a575f80fd5b5061082560048036038101906108209190613953565b6119f9565b6040516108329190613da1565b60405180910390f35b348015610846575f80fd5b5061084f611b35565b60405161085c9190613692565b60405180910390f35b348015610870575f80fd5b50610879611b5d565b60405161088691906135d5565b60405180910390f35b34801561089a575f80fd5b506108b560048036038101906108b09190613dc1565b611bed565b6040516108c29190613da1565b60405180910390f35b6108e560048036038101906108e09190613628565b611dec565b005b3480156108f2575f80fd5b5061090d60048036038101906109089190613e11565b612061565b005b34801561091a575f80fd5b50610923612167565b60405161093091906135d5565b60405180910390f35b348015610944575f80fd5b5061095f600480360381019061095a91906138d8565b6121f3565b005b61097b60048036038101906109769190613eed565b612218565b005b348015610988575f80fd5b506109a3600480360381019061099e9190613628565b61228a565b6040516109b09190613fc0565b60405180910390f35b3480156109c4575f80fd5b506109df60048036038101906109da9190613628565b6122f4565b6040516109ec91906135d5565b60405180910390f35b348015610a00575f80fd5b50610a09612446565b604051610a169190613722565b60405180910390f35b348015610a2a575f80fd5b50610a456004803603810190610a4091906138d8565b61244c565b005b348015610a52575f80fd5b50610a6d6004803603810190610a689190613fd9565b612471565b604051610a7a919061354c565b60405180910390f35b348015610a8e575f80fd5b50610aa96004803603810190610aa49190614017565b6124ff565b005b348015610ab6575f80fd5b50610ad16004803603810190610acc9190613953565b61256e565b005b348015610ade575f80fd5b50610af96004803603810190610af49190613628565b6125f2565b005b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b5557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b855750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b9b90614082565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc790614082565b8015610c125780601f10610be957610100808354040283529160200191610c12565b820191905f5260205f20905b815481529060010190602001808311610bf557829003601f168201915b5050505050905090565b5f610c2682612604565b610c5c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610ca0826118ce565b90508073ffffffffffffffffffffffffffffffffffffffff16610cc161265e565b73ffffffffffffffffffffffffffffffffffffffff1614610d2457610ced81610ce861265e565b612471565b610d23576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60135481565b610de3612665565b80600e9081610df2919061424f565b5050565b610dfe612665565b8060145f6101000a81548160ff02191690831515021790555050565b5f610e236126ec565b6001545f540303905090565b5f610e39826126f4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80610eab846127b7565b91509150610ec18187610ebc61265e565b6127da565b610f0d57610ed686610ed161265e565b612471565b610f0c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f72576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f7f868686600161281d565b8015610f89575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600101919050819055506110518561102d888887612823565b7c02000000000000000000000000000000000000000000000000000000001761284a565b60045f8681526020019081526020015f20819055505f7c02000000000000000000000000000000000000000000000000000000008416036110cd575f6001850190505f60045f8381526020019081526020015f2054036110cb575f5481146110ca578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111358686866001612874565b505050505050565b600c602052805f5260405f205f915090505481565b600a5481565b611160612665565b61116861287a565b5f611171611b35565b73ffffffffffffffffffffffffffffffffffffffff16476040516111949061434b565b5f6040518083038185875af1925050503d805f81146111ce576040519150601f19603f3d011682016040523d82523d5f602084013e6111d3565b606091505b50509050806111e0575f80fd5b506111e96128c0565b565b61120583838360405180602001604052805f815250612218565b505050565b611212612665565b8060138190555050565b83833373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461128c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611283906143a9565b60405180910390fd5b60125481611298610e1a565b6112a291906143f4565b11156112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da90614471565b60405180910390fd5b5f6112ed836128ca565b6112f757336112f9565b825b90505f82118015611354575060115482600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461135191906143f4565b11155b611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a906144d9565b60405180910390fd5b86865f816013546113a491906144f7565b90505f6113b0846128ca565b6113ba57336113bc565b835b90505f80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460105461140b9190614538565b11611416575f611462565b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546010546114619190614538565b5b90505f80821115611480578482111561147b578461147d565b815b90505b6013548161148e91906144f7565b846114999190614538565b9350833410156114de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d5906145b5565b60405180910390fd5b6114e661287a565b601460019054906101000a900460ff16611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90614643565b60405180910390fd5b5f61153f8e6128ca565b611549573361154b565b8d5b90505f8160405160200161155f91906146a6565b6040516020818303038152906040528051906020012090506115c48d8d808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050600a5483612a73565b611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa9061470a565b60405180910390fd5b61160d828f612a89565b8d600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461165991906143f4565b9250508190555061166a338f612b91565b50506116746128c0565b50505050505050505050505050565b61168b612665565b80600f908161169a919061424f565b5050565b601460029054906101000a900460ff1681565b600e80546116be90614082565b80601f01602080910402602001604051908101604052809291908181526020018280546116ea90614082565b80156117355780601f1061170c57610100808354040283529160200191611735565b820191905f5260205f20905b81548152906001019060200180831161171857829003601f168201915b505050505081565b611745612665565b8060118190555050565b60605f8383905090505f8167ffffffffffffffff81111561177357611772613743565b5b6040519080825280602002602001820160405280156117ac57816020015b611799613456565b8152602001906001900390816117915790505b5090505f5b828114611803576117da8686838181106117ce576117cd614728565b5b9050602002013561228a565b8282815181106117ed576117ec614728565b5b60200260200101819052508060010190506117b1565b50809250505092915050565b60115481565b60145f9054906101000a900460ff1681565b60105481565b600b602052805f5260405f205f915090505481565b600d805461184f90614082565b80601f016020809104026020016040519081016040528092919081815260200182805461187b90614082565b80156118c65780601f1061189d576101008083540402835291602001916118c6565b820191905f5260205f20905b8154815290600101906020018083116118a957829003601f168201915b505050505081565b5f6118d8826126f4565b9050919050565b601460019054906101000a900460ff1681565b6118fa612665565b8060128190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361196a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6119c1612665565b6119ca5f612bae565b565b6119d4612665565b80600a8190555050565b6119e6612665565b80600d90816119f5919061424f565b5050565b60605f805f611a0785611904565b90505f8167ffffffffffffffff811115611a2457611a23613743565b5b604051908082528060200260200182016040528015611a525781602001602082028036833780820191505090505b509050611a5d613456565b5f611a666126ec565b90505b838614611b2757611a7981612c71565b91508160400151611b1c575f73ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614611ac157815f015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b1b5780838780600101985081518110611b0e57611b0d614728565b5b6020026020010181815250505b5b806001019050611a69565b508195505050505050919050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611b6c90614082565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9890614082565b8015611be35780601f10611bba57610100808354040283529160200191611be3565b820191905f5260205f20905b815481529060010190602001808311611bc657829003601f168201915b5050505050905090565b6060818310611c28576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611c32612c9a565b9050611c3c6126ec565b851015611c4e57611c4b6126ec565b94505b80841115611c5a578093505b5f611c6487611904565b905084861015611c86575f868603905081811015611c80578091505b50611c8a565b5f90505b5f8167ffffffffffffffff811115611ca557611ca4613743565b5b604051908082528060200260200182016040528015611cd35781602001602082028036833780820191505090505b5090505f8203611ce95780945050505050611de5565b5f611cf38861228a565b90505f8160400151611d0657815f015190505b5f8990505b888114158015611d1b5750848714155b15611dd757611d2981612c71565b92508260400151611dcc575f73ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614611d7157825f015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dcb5780848880600101995081518110611dbe57611dbd614728565b5b6020026020010181815250505b5b806001019050611d0b565b508583528296505050505050505b9392505050565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e52906143a9565b60405180910390fd5b5f81118015611eb4575060115481600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611eb191906143f4565b11155b611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea906144d9565b60405180910390fd5b60125481611eff610e1a565b611f0991906143f4565b1115611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4190614471565b60405180910390fd5b815f81601354611f5a91906144f7565b905080341015611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f96906145b5565b60405180910390fd5b611fa761287a565b60145f9054906101000a900460ff1615611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed9061479f565b60405180910390fd5b83600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461204291906143f4565b925050819055506120533385612b91565b61205b6128c0565b50505050565b8060075f61206d61265e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661211661265e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161215b919061354c565b60405180910390a35050565b600f805461217490614082565b80601f01602080910402602001604051908101604052809291908181526020018280546121a090614082565b80156121eb5780601f106121c2576101008083540402835291602001916121eb565b820191905f5260205f20905b8154815290600101906020018083116121ce57829003601f168201915b505050505081565b6121fb612665565b80601460016101000a81548160ff02191690831515021790555050565b612223848484610e2f565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146122845761224d84848484612ca2565b612283576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612292613456565b61229a613456565b6122a26126ec565b8310806122b657506122b2612c9a565b8310155b156122c457809150506122ef565b6122cd83612c71565b90508060400151156122e257809150506122ef565b6122eb83612ded565b9150505b919050565b60606122ff82612604565b61233e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123359061482d565b60405180910390fd5b5f1515601460029054906101000a900460ff161515036123e857600f805461236590614082565b80601f016020809104026020016040519081016040528092919081815260200182805461239190614082565b80156123dc5780601f106123b3576101008083540402835291602001916123dc565b820191905f5260205f20905b8154815290600101906020018083116123bf57829003601f168201915b50505050509050612441565b5f6123f1612e0d565b90505f81511161240f5760405180602001604052805f81525061243d565b8061241984612e9d565b600e60405160200161242d93929190614905565b6040516020818303038152906040525b9150505b919050565b60125481565b612454612665565b80601460026101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b816012548161250c610e1a565b61251691906143f4565b1115612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e90614471565b60405180910390fd5b61255f612665565b6125698284612b91565b505050565b612576612665565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125e6575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016125dd9190613692565b60405180910390fd5b6125ef81612bae565b50565b6125fa612665565b8060108190555050565b5f8161260e6126ec565b1115801561261c57505f5482105b801561265757505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b61266d612f67565b73ffffffffffffffffffffffffffffffffffffffff1661268b611b35565b73ffffffffffffffffffffffffffffffffffffffff16146126ea576126ae612f67565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016126e19190613692565b60405180910390fd5b565b5f6001905090565b5f80829050806127026126ec565b11612780575f5481101561277f575f60045f8381526020019081526020015f205490505f7c010000000000000000000000000000000000000000000000000000000082160361277d575b5f81036127735760045f836001900393508381526020019081526020015f2054905061274c565b80925050506127b2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612839868684612f6e565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6002600854036128b6576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600881905550565b6001600881905550565b5f805f90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561293757503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612a6a576d76a84fef008cdabe6409d2fe638b73ffffffffffffffffffffffffffffffffffffffff16639c395bc233856040518363ffffffff1660e01b8152600401612985929190614935565b602060405180830381865afa1580156129a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c49190614970565b156129ce57600190505b80158015612a5f57506c447e69651d841bd8d104bed49373ffffffffffffffffffffffffffffffffffffffff16639c395bc233856040518363ffffffff1660e01b8152600401612a1f929190614935565b602060405180830381865afa158015612a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a5e9190614970565b5b15612a6957600190505b5b80915050919050565b5f82612a7f8584612f76565b1490509392505050565b5f600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601054612ad59190614538565b821115612b2c57600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601054612b279190614538565b612b2e565b815b90505f811115612b8c5780600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612b8491906143f4565b925050819055505b505050565b612baa828260405180602001604052805f815250612fc4565b5050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c79613456565b612c9360045f8481526020019081526020015f205461305b565b9050919050565b5f8054905090565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cc761265e565b8786866040518563ffffffff1660e01b8152600401612ce994939291906149ed565b6020604051808303815f875af1925050508015612d2457506040513d601f19601f82011682018060405250810190612d219190614a4b565b60015b612d9a573d805f8114612d52576040519150601f19603f3d011682016040523d82523d5f602084013e612d57565b606091505b505f815103612d92576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612df5613456565b612e06612e01836126f4565b61305b565b9050919050565b6060600d8054612e1c90614082565b80601f0160208091040260200160405190810160405280929190818152602001828054612e4890614082565b8015612e935780601f10612e6a57610100808354040283529160200191612e93565b820191905f5260205f20905b815481529060010190602001808311612e7657829003601f168201915b5050505050905090565b60605f6001612eab8461310f565b0190505f8167ffffffffffffffff811115612ec957612ec8613743565b5b6040519080825280601f01601f191660200182016040528015612efb5781602001600182028036833780820191505090505b5090505f82602001820190505b600115612f5c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612f5157612f50614a76565b5b0494505f8503612f08575b819350505050919050565b5f33905090565b5f9392505050565b5f808290505f5b8451811015612fb957612faa82868381518110612f9d57612f9c614728565b5b6020026020010151613260565b91508080600101915050612f7d565b508091505092915050565b612fce838361328a565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613056575f805490505f83820390505b61300a5f868380600101945086612ca2565b613040576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ff857815f5414613053575f80fd5b50505b505050565b613063613456565b81815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff16815250505f7c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061316b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161316157613160614a76565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106131a8576d04ee2d6d415b85acef8100000000838161319e5761319d614a76565b5b0492506020810190505b662386f26fc1000083106131d757662386f26fc1000083816131cd576131cc614a76565b5b0492506010810190505b6305f5e1008310613200576305f5e10083816131f6576131f5614a76565b5b0492506008810190505b612710831061322557612710838161321b5761321a614a76565b5b0492506004810190505b60648310613248576064838161323e5761323d614a76565b5b0492506002810190505b600a8310613257576001810190505b80915050919050565b5f818310613277576132728284613433565b613282565b6132818383613433565b5b905092915050565b5f805490505f82036132c8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132d45f84838561281d565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613346836133375f865f612823565b61334085613447565b1761284a565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146133e05780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506133a7565b505f820361341a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f81905550505061342e5f848385612874565b505050565b5f825f528160205260405f20905092915050565b5f6001821460e11b9050919050565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f62ffffff1681525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134e6816134b2565b81146134f0575f80fd5b50565b5f81359050613501816134dd565b92915050565b5f6020828403121561351c5761351b6134aa565b5b5f613529848285016134f3565b91505092915050565b5f8115159050919050565b61354681613532565b82525050565b5f60208201905061355f5f83018461353d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6135a782613565565b6135b1818561356f565b93506135c181856020860161357f565b6135ca8161358d565b840191505092915050565b5f6020820190508181035f8301526135ed818461359d565b905092915050565b5f819050919050565b613607816135f5565b8114613611575f80fd5b50565b5f81359050613622816135fe565b92915050565b5f6020828403121561363d5761363c6134aa565b5b5f61364a84828501613614565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61367c82613653565b9050919050565b61368c81613672565b82525050565b5f6020820190506136a55f830184613683565b92915050565b6136b481613672565b81146136be575f80fd5b50565b5f813590506136cf816136ab565b92915050565b5f80604083850312156136eb576136ea6134aa565b5b5f6136f8858286016136c1565b925050602061370985828601613614565b9150509250929050565b61371c816135f5565b82525050565b5f6020820190506137355f830184613713565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6137798261358d565b810181811067ffffffffffffffff8211171561379857613797613743565b5b80604052505050565b5f6137aa6134a1565b90506137b68282613770565b919050565b5f67ffffffffffffffff8211156137d5576137d4613743565b5b6137de8261358d565b9050602081019050919050565b828183375f83830152505050565b5f61380b613806846137bb565b6137a1565b9050828152602081018484840111156138275761382661373f565b5b6138328482856137eb565b509392505050565b5f82601f83011261384e5761384d61373b565b5b813561385e8482602086016137f9565b91505092915050565b5f6020828403121561387c5761387b6134aa565b5b5f82013567ffffffffffffffff811115613899576138986134ae565b5b6138a58482850161383a565b91505092915050565b6138b781613532565b81146138c1575f80fd5b50565b5f813590506138d2816138ae565b92915050565b5f602082840312156138ed576138ec6134aa565b5b5f6138fa848285016138c4565b91505092915050565b5f805f6060848603121561391a576139196134aa565b5b5f613927868287016136c1565b9350506020613938868287016136c1565b925050604061394986828701613614565b9150509250925092565b5f60208284031215613968576139676134aa565b5b5f613975848285016136c1565b91505092915050565b5f819050919050565b6139908161397e565b82525050565b5f6020820190506139a95f830184613987565b92915050565b5f80fd5b5f80fd5b5f8083601f8401126139cc576139cb61373b565b5b8235905067ffffffffffffffff8111156139e9576139e86139af565b5b602083019150836020820283011115613a0557613a046139b3565b5b9250929050565b5f805f8060608587031215613a2457613a236134aa565b5b5f613a31878288016136c1565b9450506020613a4287828801613614565b935050604085013567ffffffffffffffff811115613a6357613a626134ae565b5b613a6f878288016139b7565b925092505092959194509250565b5f8083601f840112613a9257613a9161373b565b5b8235905067ffffffffffffffff811115613aaf57613aae6139af565b5b602083019150836020820283011115613acb57613aca6139b3565b5b9250929050565b5f8060208385031215613ae857613ae76134aa565b5b5f83013567ffffffffffffffff811115613b0557613b046134ae565b5b613b1185828601613a7d565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613b4f81613672565b82525050565b5f67ffffffffffffffff82169050919050565b613b7181613b55565b82525050565b613b8081613532565b82525050565b5f62ffffff82169050919050565b613b9d81613b86565b82525050565b608082015f820151613bb75f850182613b46565b506020820151613bca6020850182613b68565b506040820151613bdd6040850182613b77565b506060820151613bf06060850182613b94565b50505050565b5f613c018383613ba3565b60808301905092915050565b5f602082019050919050565b5f613c2382613b1d565b613c2d8185613b27565b9350613c3883613b37565b805f5b83811015613c68578151613c4f8882613bf6565b9750613c5a83613c0d565b925050600181019050613c3b565b5085935050505092915050565b5f6020820190508181035f830152613c8d8184613c19565b905092915050565b613c9e8161397e565b8114613ca8575f80fd5b50565b5f81359050613cb981613c95565b92915050565b5f60208284031215613cd457613cd36134aa565b5b5f613ce184828501613cab565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613d1c816135f5565b82525050565b5f613d2d8383613d13565b60208301905092915050565b5f602082019050919050565b5f613d4f82613cea565b613d598185613cf4565b9350613d6483613d04565b805f5b83811015613d94578151613d7b8882613d22565b9750613d8683613d39565b925050600181019050613d67565b5085935050505092915050565b5f6020820190508181035f830152613db98184613d45565b905092915050565b5f805f60608486031215613dd857613dd76134aa565b5b5f613de5868287016136c1565b9350506020613df686828701613614565b9250506040613e0786828701613614565b9150509250925092565b5f8060408385031215613e2757613e266134aa565b5b5f613e34858286016136c1565b9250506020613e45858286016138c4565b9150509250929050565b5f67ffffffffffffffff821115613e6957613e68613743565b5b613e728261358d565b9050602081019050919050565b5f613e91613e8c84613e4f565b6137a1565b905082815260208101848484011115613ead57613eac61373f565b5b613eb88482856137eb565b509392505050565b5f82601f830112613ed457613ed361373b565b5b8135613ee4848260208601613e7f565b91505092915050565b5f805f8060808587031215613f0557613f046134aa565b5b5f613f12878288016136c1565b9450506020613f23878288016136c1565b9350506040613f3487828801613614565b925050606085013567ffffffffffffffff811115613f5557613f546134ae565b5b613f6187828801613ec0565b91505092959194509250565b608082015f820151613f815f850182613b46565b506020820151613f946020850182613b68565b506040820151613fa76040850182613b77565b506060820151613fba6060850182613b94565b50505050565b5f608082019050613fd35f830184613f6d565b92915050565b5f8060408385031215613fef57613fee6134aa565b5b5f613ffc858286016136c1565b925050602061400d858286016136c1565b9150509250929050565b5f806040838503121561402d5761402c6134aa565b5b5f61403a85828601613614565b925050602061404b858286016136c1565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061409957607f821691505b6020821081036140ac576140ab614055565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261410e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140d3565b61411886836140d3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61415361414e614149846135f5565b614130565b6135f5565b9050919050565b5f819050919050565b61416c83614139565b6141806141788261415a565b8484546140df565b825550505050565b5f90565b614194614188565b61419f818484614163565b505050565b5b818110156141c2576141b75f8261418c565b6001810190506141a5565b5050565b601f821115614207576141d8816140b2565b6141e1846140c4565b810160208510156141f0578190505b6142046141fc856140c4565b8301826141a4565b50505b505050565b5f82821c905092915050565b5f6142275f198460080261420c565b1980831691505092915050565b5f61423f8383614218565b9150826002028217905092915050565b61425882613565565b67ffffffffffffffff81111561427157614270613743565b5b61427b8254614082565b6142868282856141c6565b5f60209050601f8311600181146142b7575f84156142a5578287015190505b6142af8582614234565b865550614316565b601f1984166142c5866140b2565b5f5b828110156142ec578489015182556001820191506020850194506020810190506142c7565b868310156143095784890151614305601f891682614218565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b50565b5f6143365f8361431e565b915061434182614328565b5f82019050919050565b5f6143558261432b565b9150819050919050565b7f4e6f20436f6e7472616374204d696e74696e67210000000000000000000000005f82015250565b5f61439360148361356f565b915061439e8261435f565b602082019050919050565b5f6020820190508181035f8301526143c081614387565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6143fe826135f5565b9150614409836135f5565b9250828201905080821115614421576144206143c7565b5b92915050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f61445b60148361356f565b915061446682614427565b602082019050919050565b5f6020820190508181035f8301526144888161444f565b9050919050565b7f4d696e746564206d617820616d6f756e7420666f7220616464726573732100005f82015250565b5f6144c3601e8361356f565b91506144ce8261448f565b602082019050919050565b5f6020820190508181035f8301526144f0816144b7565b9050919050565b5f614501826135f5565b915061450c836135f5565b925082820261451a816135f5565b91508282048414831517614531576145306143c7565b5b5092915050565b5f614542826135f5565b915061454d836135f5565b9250828203905081811115614565576145646143c7565b5b92915050565b7f496e73756666696369656e742066756e647321000000000000000000000000005f82015250565b5f61459f60138361356f565b91506145aa8261456b565b602082019050919050565b5f6020820190508181035f8301526145cc81614593565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c655f8201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b5f61462d60228361356f565b9150614638826145d3565b604082019050919050565b5f6020820190508181035f83015261465a81614621565b9050919050565b5f8160601b9050919050565b5f61467782614661565b9050919050565b5f6146888261466d565b9050919050565b6146a061469b82613672565b61467e565b82525050565b5f6146b1828461468f565b60148201915081905092915050565b7f496e76616c69642070726f6f66210000000000000000000000000000000000005f82015250565b5f6146f4600e8361356f565b91506146ff826146c0565b602082019050919050565b5f6020820190508181035f830152614721816146e8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f54686520636f6e747261637420697320706175736564210000000000000000005f82015250565b5f61478960178361356f565b915061479482614755565b602082019050919050565b5f6020820190508181035f8301526147b68161477d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f614817602f8361356f565b9150614822826147bd565b604082019050919050565b5f6020820190508181035f8301526148448161480b565b9050919050565b5f81905092915050565b5f61485f82613565565b614869818561484b565b935061487981856020860161357f565b80840191505092915050565b5f815461489181614082565b61489b818661484b565b9450600182165f81146148b557600181146148ca576148fc565b60ff19831686528115158202860193506148fc565b6148d3856140b2565b5f5b838110156148f4578154818901526001820191506020810190506148d5565b838801955050505b50505092915050565b5f6149108286614855565b915061491c8285614855565b91506149288284614885565b9150819050949350505050565b5f6040820190506149485f830185613683565b6149556020830184613683565b9392505050565b5f8151905061496a816138ae565b92915050565b5f60208284031215614985576149846134aa565b5b5f6149928482850161495c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6149bf8261499b565b6149c981856149a5565b93506149d981856020860161357f565b6149e28161358d565b840191505092915050565b5f608082019050614a005f830187613683565b614a0d6020830186613683565b614a1a6040830185613713565b8181036060830152614a2c81846149b5565b905095945050505050565b5f81519050614a45816134dd565b92915050565b5f60208284031215614a6057614a5f6134aa565b5b5f614a6d84828501614a37565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffdfea26469706673582212208e6d71b2d8ef4611080c70c5dd9a43055e71de2b93d0f1925c527bc56f3882de64736f6c6343000819003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000002540be4000000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000a4d6963726f4d69676f7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d4943524f4d49474f5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f697066732e696f2f697066732f626166796265696873736a6435757433677978776d79696768696a6e356972796e7335767277767067627977337a326277646f7636673269776d692f68696464656e2e6a736f6e00000000


Deployed Bytecode

0x6080604052600436106102ad575f3560e01c806362b99ad411610174578063a0712d68116100db578063c87b56dd11610094578063e985e9c51161006e578063e985e9c514610a47578063efbd73f414610a83578063f2fde38b14610aab578063ff94ac1814610ad3576102ad565b8063c87b56dd146109b9578063d5abeb01146109f5578063e0a8085314610a1f576102ad565b8063a0712d68146108cb578063a22cb465146108e7578063a45ba8e71461090f578063b767a09814610939578063b88d4fde14610961578063c23dc68f1461097d576102ad565b80637cb647591161012d5780637cb64759146107af5780637ec4a659146107d75780638462151c146107ff5780638da5cb5b1461083b57806395d89b411461086557806399a2557a1461088f576102ad565b806362b99ad4146106a55780636352211e146106cf5780636caede3d1461070b5780636f8b44b01461073557806370a082311461075d578063715018a614610799576102ad565b806342842e0e116102185780635697f53e116101d15780635697f53e146105875780635bbb2177146105af5780635c41d75e146105eb5780635c975abb146106155780635d3155f31461063f5780635f17e26514610669576102ad565b806342842e0e146104ab57806344a0d68a146104c75780634b11faaf146104ef5780634fdd43cb1461050b57806351830227146105335780635503a0e81461055d576102ad565b806316c38b3c1161026a57806316c38b3c146103c157806318160ddd146103e957806323b872dd1461041357806328a601121461042f5780632eb4a7ab1461046b5780633ccfd60b14610495576102ad565b806301ffc9a7146102b157806306fdde03146102ed578063081812fc14610317578063095ea7b31461035357806313faede61461036f57806316ba10e014610399575b5f80fd5b3480156102bc575f80fd5b506102d760048036038101906102d29190613507565b610afb565b6040516102e4919061354c565b60405180910390f35b3480156102f8575f80fd5b50610301610b8c565b60405161030e91906135d5565b60405180910390f35b348015610322575f80fd5b5061033d60048036038101906103389190613628565b610c1c565b60405161034a9190613692565b60405180910390f35b61036d600480360381019061036891906136d5565b610c96565b005b34801561037a575f80fd5b50610383610dd5565b6040516103909190613722565b60405180910390f35b3480156103a4575f80fd5b506103bf60048036038101906103ba9190613867565b610ddb565b005b3480156103cc575f80fd5b506103e760048036038101906103e291906138d8565b610df6565b005b3480156103f4575f80fd5b506103fd610e1a565b60405161040a9190613722565b60405180910390f35b61042d60048036038101906104289190613903565b610e2f565b005b34801561043a575f80fd5b5061045560048036038101906104509190613953565b61113d565b6040516104629190613722565b60405180910390f35b348015610476575f80fd5b5061047f611152565b60405161048c9190613996565b60405180910390f35b3480156104a0575f80fd5b506104a9611158565b005b6104c560048036038101906104c09190613903565b6111eb565b005b3480156104d2575f80fd5b506104ed60048036038101906104e89190613628565b61120a565b005b61050960048036038101906105049190613a0c565b61121c565b005b348015610516575f80fd5b50610531600480360381019061052c9190613867565b611683565b005b34801561053e575f80fd5b5061054761169e565b604051610554919061354c565b60405180910390f35b348015610568575f80fd5b506105716116b1565b60405161057e91906135d5565b60405180910390f35b348015610592575f80fd5b506105ad60048036038101906105a89190613628565b61173d565b005b3480156105ba575f80fd5b506105d560048036038101906105d09190613ad2565b61174f565b6040516105e29190613c75565b60405180910390f35b3480156105f6575f80fd5b506105ff61180f565b60405161060c9190613722565b60405180910390f35b348015610620575f80fd5b50610629611815565b604051610636919061354c565b60405180910390f35b34801561064a575f80fd5b50610653611827565b6040516106609190613722565b60405180910390f35b348015610674575f80fd5b5061068f600480360381019061068a9190613953565b61182d565b60405161069c9190613722565b60405180910390f35b3480156106b0575f80fd5b506106b9611842565b6040516106c691906135d5565b60405180910390f35b3480156106da575f80fd5b506106f560048036038101906106f09190613628565b6118ce565b6040516107029190613692565b60405180910390f35b348015610716575f80fd5b5061071f6118df565b60405161072c919061354c565b60405180910390f35b348015610740575f80fd5b5061075b60048036038101906107569190613628565b6118f2565b005b348015610768575f80fd5b50610783600480360381019061077e9190613953565b611904565b6040516107909190613722565b60405180910390f35b3480156107a4575f80fd5b506107ad6119b9565b005b3480156107ba575f80fd5b506107d560048036038101906107d09190613cbf565b6119cc565b005b3480156107e2575f80fd5b506107fd60048036038101906107f89190613867565b6119de565b005b34801561080a575f80fd5b5061082560048036038101906108209190613953565b6119f9565b6040516108329190613da1565b60405180910390f35b348015610846575f80fd5b5061084f611b35565b60405161085c9190613692565b60405180910390f35b348015610870575f80fd5b50610879611b5d565b60405161088691906135d5565b60405180910390f35b34801561089a575f80fd5b506108b560048036038101906108b09190613dc1565b611bed565b6040516108c29190613da1565b60405180910390f35b6108e560048036038101906108e09190613628565b611dec565b005b3480156108f2575f80fd5b5061090d60048036038101906109089190613e11565b612061565b005b34801561091a575f80fd5b50610923612167565b60405161093091906135d5565b60405180910390f35b348015610944575f80fd5b5061095f600480360381019061095a91906138d8565b6121f3565b005b61097b60048036038101906109769190613eed565b612218565b005b348015610988575f80fd5b506109a3600480360381019061099e9190613628565b61228a565b6040516109b09190613fc0565b60405180910390f35b3480156109c4575f80fd5b506109df60048036038101906109da9190613628565b6122f4565b6040516109ec91906135d5565b60405180910390f35b348015610a00575f80fd5b50610a09612446565b604051610a169190613722565b60405180910390f35b348015610a2a575f80fd5b50610a456004803603810190610a4091906138d8565b61244c565b005b348015610a52575f80fd5b50610a6d6004803603810190610a689190613fd9565b612471565b604051610a7a919061354c565b60405180910390f35b348015610a8e575f80fd5b50610aa96004803603810190610aa49190614017565b6124ff565b005b348015610ab6575f80fd5b50610ad16004803603810190610acc9190613953565b61256e565b005b348015610ade575f80fd5b50610af96004803603810190610af49190613628565b6125f2565b005b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b5557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b855750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b9b90614082565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc790614082565b8015610c125780601f10610be957610100808354040283529160200191610c12565b820191905f5260205f20905b815481529060010190602001808311610bf557829003601f168201915b5050505050905090565b5f610c2682612604565b610c5c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610ca0826118ce565b90508073ffffffffffffffffffffffffffffffffffffffff16610cc161265e565b73ffffffffffffffffffffffffffffffffffffffff1614610d2457610ced81610ce861265e565b612471565b610d23576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60135481565b610de3612665565b80600e9081610df2919061424f565b5050565b610dfe612665565b8060145f6101000a81548160ff02191690831515021790555050565b5f610e236126ec565b6001545f540303905090565b5f610e39826126f4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80610eab846127b7565b91509150610ec18187610ebc61265e565b6127da565b610f0d57610ed686610ed161265e565b612471565b610f0c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f72576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f7f868686600161281d565b8015610f89575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600101919050819055506110518561102d888887612823565b7c02000000000000000000000000000000000000000000000000000000001761284a565b60045f8681526020019081526020015f20819055505f7c02000000000000000000000000000000000000000000000000000000008416036110cd575f6001850190505f60045f8381526020019081526020015f2054036110cb575f5481146110ca578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111358686866001612874565b505050505050565b600c602052805f5260405f205f915090505481565b600a5481565b611160612665565b61116861287a565b5f611171611b35565b73ffffffffffffffffffffffffffffffffffffffff16476040516111949061434b565b5f6040518083038185875af1925050503d805f81146111ce576040519150601f19603f3d011682016040523d82523d5f602084013e6111d3565b606091505b50509050806111e0575f80fd5b506111e96128c0565b565b61120583838360405180602001604052805f815250612218565b505050565b611212612665565b8060138190555050565b83833373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461128c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611283906143a9565b60405180910390fd5b60125481611298610e1a565b6112a291906143f4565b11156112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da90614471565b60405180910390fd5b5f6112ed836128ca565b6112f757336112f9565b825b90505f82118015611354575060115482600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461135191906143f4565b11155b611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a906144d9565b60405180910390fd5b86865f816013546113a491906144f7565b90505f6113b0846128ca565b6113ba57336113bc565b835b90505f80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460105461140b9190614538565b11611416575f611462565b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546010546114619190614538565b5b90505f80821115611480578482111561147b578461147d565b815b90505b6013548161148e91906144f7565b846114999190614538565b9350833410156114de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d5906145b5565b60405180910390fd5b6114e661287a565b601460019054906101000a900460ff16611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90614643565b60405180910390fd5b5f61153f8e6128ca565b611549573361154b565b8d5b90505f8160405160200161155f91906146a6565b6040516020818303038152906040528051906020012090506115c48d8d808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050600a5483612a73565b611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa9061470a565b60405180910390fd5b61160d828f612a89565b8d600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461165991906143f4565b9250508190555061166a338f612b91565b50506116746128c0565b50505050505050505050505050565b61168b612665565b80600f908161169a919061424f565b5050565b601460029054906101000a900460ff1681565b600e80546116be90614082565b80601f01602080910402602001604051908101604052809291908181526020018280546116ea90614082565b80156117355780601f1061170c57610100808354040283529160200191611735565b820191905f5260205f20905b81548152906001019060200180831161171857829003601f168201915b505050505081565b611745612665565b8060118190555050565b60605f8383905090505f8167ffffffffffffffff81111561177357611772613743565b5b6040519080825280602002602001820160405280156117ac57816020015b611799613456565b8152602001906001900390816117915790505b5090505f5b828114611803576117da8686838181106117ce576117cd614728565b5b9050602002013561228a565b8282815181106117ed576117ec614728565b5b60200260200101819052508060010190506117b1565b50809250505092915050565b60115481565b60145f9054906101000a900460ff1681565b60105481565b600b602052805f5260405f205f915090505481565b600d805461184f90614082565b80601f016020809104026020016040519081016040528092919081815260200182805461187b90614082565b80156118c65780601f1061189d576101008083540402835291602001916118c6565b820191905f5260205f20905b8154815290600101906020018083116118a957829003601f168201915b505050505081565b5f6118d8826126f4565b9050919050565b601460019054906101000a900460ff1681565b6118fa612665565b8060128190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361196a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6119c1612665565b6119ca5f612bae565b565b6119d4612665565b80600a8190555050565b6119e6612665565b80600d90816119f5919061424f565b5050565b60605f805f611a0785611904565b90505f8167ffffffffffffffff811115611a2457611a23613743565b5b604051908082528060200260200182016040528015611a525781602001602082028036833780820191505090505b509050611a5d613456565b5f611a666126ec565b90505b838614611b2757611a7981612c71565b91508160400151611b1c575f73ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614611ac157815f015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b1b5780838780600101985081518110611b0e57611b0d614728565b5b6020026020010181815250505b5b806001019050611a69565b508195505050505050919050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611b6c90614082565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9890614082565b8015611be35780601f10611bba57610100808354040283529160200191611be3565b820191905f5260205f20905b815481529060010190602001808311611bc657829003601f168201915b5050505050905090565b6060818310611c28576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611c32612c9a565b9050611c3c6126ec565b851015611c4e57611c4b6126ec565b94505b80841115611c5a578093505b5f611c6487611904565b905084861015611c86575f868603905081811015611c80578091505b50611c8a565b5f90505b5f8167ffffffffffffffff811115611ca557611ca4613743565b5b604051908082528060200260200182016040528015611cd35781602001602082028036833780820191505090505b5090505f8203611ce95780945050505050611de5565b5f611cf38861228a565b90505f8160400151611d0657815f015190505b5f8990505b888114158015611d1b5750848714155b15611dd757611d2981612c71565b92508260400151611dcc575f73ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614611d7157825f015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dcb5780848880600101995081518110611dbe57611dbd614728565b5b6020026020010181815250505b5b806001019050611d0b565b508583528296505050505050505b9392505050565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e52906143a9565b60405180910390fd5b5f81118015611eb4575060115481600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611eb191906143f4565b11155b611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea906144d9565b60405180910390fd5b60125481611eff610e1a565b611f0991906143f4565b1115611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4190614471565b60405180910390fd5b815f81601354611f5a91906144f7565b905080341015611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f96906145b5565b60405180910390fd5b611fa761287a565b60145f9054906101000a900460ff1615611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed9061479f565b60405180910390fd5b83600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461204291906143f4565b925050819055506120533385612b91565b61205b6128c0565b50505050565b8060075f61206d61265e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661211661265e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161215b919061354c565b60405180910390a35050565b600f805461217490614082565b80601f01602080910402602001604051908101604052809291908181526020018280546121a090614082565b80156121eb5780601f106121c2576101008083540402835291602001916121eb565b820191905f5260205f20905b8154815290600101906020018083116121ce57829003601f168201915b505050505081565b6121fb612665565b80601460016101000a81548160ff02191690831515021790555050565b612223848484610e2f565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146122845761224d84848484612ca2565b612283576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612292613456565b61229a613456565b6122a26126ec565b8310806122b657506122b2612c9a565b8310155b156122c457809150506122ef565b6122cd83612c71565b90508060400151156122e257809150506122ef565b6122eb83612ded565b9150505b919050565b60606122ff82612604565b61233e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123359061482d565b60405180910390fd5b5f1515601460029054906101000a900460ff161515036123e857600f805461236590614082565b80601f016020809104026020016040519081016040528092919081815260200182805461239190614082565b80156123dc5780601f106123b3576101008083540402835291602001916123dc565b820191905f5260205f20905b8154815290600101906020018083116123bf57829003601f168201915b50505050509050612441565b5f6123f1612e0d565b90505f81511161240f5760405180602001604052805f81525061243d565b8061241984612e9d565b600e60405160200161242d93929190614905565b6040516020818303038152906040525b9150505b919050565b60125481565b612454612665565b80601460026101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b816012548161250c610e1a565b61251691906143f4565b1115612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e90614471565b60405180910390fd5b61255f612665565b6125698284612b91565b505050565b612576612665565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125e6575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016125dd9190613692565b60405180910390fd5b6125ef81612bae565b50565b6125fa612665565b8060108190555050565b5f8161260e6126ec565b1115801561261c57505f5482105b801561265757505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b61266d612f67565b73ffffffffffffffffffffffffffffffffffffffff1661268b611b35565b73ffffffffffffffffffffffffffffffffffffffff16146126ea576126ae612f67565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016126e19190613692565b60405180910390fd5b565b5f6001905090565b5f80829050806127026126ec565b11612780575f5481101561277f575f60045f8381526020019081526020015f205490505f7c010000000000000000000000000000000000000000000000000000000082160361277d575b5f81036127735760045f836001900393508381526020019081526020015f2054905061274c565b80925050506127b2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612839868684612f6e565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6002600854036128b6576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600881905550565b6001600881905550565b5f805f90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561293757503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612a6a576d76a84fef008cdabe6409d2fe638b73ffffffffffffffffffffffffffffffffffffffff16639c395bc233856040518363ffffffff1660e01b8152600401612985929190614935565b602060405180830381865afa1580156129a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c49190614970565b156129ce57600190505b80158015612a5f57506c447e69651d841bd8d104bed49373ffffffffffffffffffffffffffffffffffffffff16639c395bc233856040518363ffffffff1660e01b8152600401612a1f929190614935565b602060405180830381865afa158015612a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a5e9190614970565b5b15612a6957600190505b5b80915050919050565b5f82612a7f8584612f76565b1490509392505050565b5f600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601054612ad59190614538565b821115612b2c57600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601054612b279190614538565b612b2e565b815b90505f811115612b8c5780600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612b8491906143f4565b925050819055505b505050565b612baa828260405180602001604052805f815250612fc4565b5050565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c79613456565b612c9360045f8481526020019081526020015f205461305b565b9050919050565b5f8054905090565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cc761265e565b8786866040518563ffffffff1660e01b8152600401612ce994939291906149ed565b6020604051808303815f875af1925050508015612d2457506040513d601f19601f82011682018060405250810190612d219190614a4b565b60015b612d9a573d805f8114612d52576040519150601f19603f3d011682016040523d82523d5f602084013e612d57565b606091505b505f815103612d92576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612df5613456565b612e06612e01836126f4565b61305b565b9050919050565b6060600d8054612e1c90614082565b80601f0160208091040260200160405190810160405280929190818152602001828054612e4890614082565b8015612e935780601f10612e6a57610100808354040283529160200191612e93565b820191905f5260205f20905b815481529060010190602001808311612e7657829003601f168201915b5050505050905090565b60605f6001612eab8461310f565b0190505f8167ffffffffffffffff811115612ec957612ec8613743565b5b6040519080825280601f01601f191660200182016040528015612efb5781602001600182028036833780820191505090505b5090505f82602001820190505b600115612f5c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612f5157612f50614a76565b5b0494505f8503612f08575b819350505050919050565b5f33905090565b5f9392505050565b5f808290505f5b8451811015612fb957612faa82868381518110612f9d57612f9c614728565b5b6020026020010151613260565b91508080600101915050612f7d565b508091505092915050565b612fce838361328a565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613056575f805490505f83820390505b61300a5f868380600101945086612ca2565b613040576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ff857815f5414613053575f80fd5b50505b505050565b613063613456565b81815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff16815250505f7c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061316b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161316157613160614a76565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106131a8576d04ee2d6d415b85acef8100000000838161319e5761319d614a76565b5b0492506020810190505b662386f26fc1000083106131d757662386f26fc1000083816131cd576131cc614a76565b5b0492506010810190505b6305f5e1008310613200576305f5e10083816131f6576131f5614a76565b5b0492506008810190505b612710831061322557612710838161321b5761321a614a76565b5b0492506004810190505b60648310613248576064838161323e5761323d614a76565b5b0492506002810190505b600a8310613257576001810190505b80915050919050565b5f818310613277576132728284613433565b613282565b6132818383613433565b5b905092915050565b5f805490505f82036132c8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132d45f84838561281d565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613346836133375f865f612823565b61334085613447565b1761284a565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146133e05780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506133a7565b505f820361341a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f81905550505061342e5f848385612874565b505050565b5f825f528160205260405f20905092915050565b5f6001821460e11b9050919050565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f62ffffff1681525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134e6816134b2565b81146134f0575f80fd5b50565b5f81359050613501816134dd565b92915050565b5f6020828403121561351c5761351b6134aa565b5b5f613529848285016134f3565b91505092915050565b5f8115159050919050565b61354681613532565b82525050565b5f60208201905061355f5f83018461353d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6135a782613565565b6135b1818561356f565b93506135c181856020860161357f565b6135ca8161358d565b840191505092915050565b5f6020820190508181035f8301526135ed818461359d565b905092915050565b5f819050919050565b613607816135f5565b8114613611575f80fd5b50565b5f81359050613622816135fe565b92915050565b5f6020828403121561363d5761363c6134aa565b5b5f61364a84828501613614565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61367c82613653565b9050919050565b61368c81613672565b82525050565b5f6020820190506136a55f830184613683565b92915050565b6136b481613672565b81146136be575f80fd5b50565b5f813590506136cf816136ab565b92915050565b5f80604083850312156136eb576136ea6134aa565b5b5f6136f8858286016136c1565b925050602061370985828601613614565b9150509250929050565b61371c816135f5565b82525050565b5f6020820190506137355f830184613713565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6137798261358d565b810181811067ffffffffffffffff8211171561379857613797613743565b5b80604052505050565b5f6137aa6134a1565b90506137b68282613770565b919050565b5f67ffffffffffffffff8211156137d5576137d4613743565b5b6137de8261358d565b9050602081019050919050565b828183375f83830152505050565b5f61380b613806846137bb565b6137a1565b9050828152602081018484840111156138275761382661373f565b5b6138328482856137eb565b509392505050565b5f82601f83011261384e5761384d61373b565b5b813561385e8482602086016137f9565b91505092915050565b5f6020828403121561387c5761387b6134aa565b5b5f82013567ffffffffffffffff811115613899576138986134ae565b5b6138a58482850161383a565b91505092915050565b6138b781613532565b81146138c1575f80fd5b50565b5f813590506138d2816138ae565b92915050565b5f602082840312156138ed576138ec6134aa565b5b5f6138fa848285016138c4565b91505092915050565b5f805f6060848603121561391a576139196134aa565b5b5f613927868287016136c1565b9350506020613938868287016136c1565b925050604061394986828701613614565b9150509250925092565b5f60208284031215613968576139676134aa565b5b5f613975848285016136c1565b91505092915050565b5f819050919050565b6139908161397e565b82525050565b5f6020820190506139a95f830184613987565b92915050565b5f80fd5b5f80fd5b5f8083601f8401126139cc576139cb61373b565b5b8235905067ffffffffffffffff8111156139e9576139e86139af565b5b602083019150836020820283011115613a0557613a046139b3565b5b9250929050565b5f805f8060608587031215613a2457613a236134aa565b5b5f613a31878288016136c1565b9450506020613a4287828801613614565b935050604085013567ffffffffffffffff811115613a6357613a626134ae565b5b613a6f878288016139b7565b925092505092959194509250565b5f8083601f840112613a9257613a9161373b565b5b8235905067ffffffffffffffff811115613aaf57613aae6139af565b5b602083019150836020820283011115613acb57613aca6139b3565b5b9250929050565b5f8060208385031215613ae857613ae76134aa565b5b5f83013567ffffffffffffffff811115613b0557613b046134ae565b5b613b1185828601613a7d565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613b4f81613672565b82525050565b5f67ffffffffffffffff82169050919050565b613b7181613b55565b82525050565b613b8081613532565b82525050565b5f62ffffff82169050919050565b613b9d81613b86565b82525050565b608082015f820151613bb75f850182613b46565b506020820151613bca6020850182613b68565b506040820151613bdd6040850182613b77565b506060820151613bf06060850182613b94565b50505050565b5f613c018383613ba3565b60808301905092915050565b5f602082019050919050565b5f613c2382613b1d565b613c2d8185613b27565b9350613c3883613b37565b805f5b83811015613c68578151613c4f8882613bf6565b9750613c5a83613c0d565b925050600181019050613c3b565b5085935050505092915050565b5f6020820190508181035f830152613c8d8184613c19565b905092915050565b613c9e8161397e565b8114613ca8575f80fd5b50565b5f81359050613cb981613c95565b92915050565b5f60208284031215613cd457613cd36134aa565b5b5f613ce184828501613cab565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613d1c816135f5565b82525050565b5f613d2d8383613d13565b60208301905092915050565b5f602082019050919050565b5f613d4f82613cea565b613d598185613cf4565b9350613d6483613d04565b805f5b83811015613d94578151613d7b8882613d22565b9750613d8683613d39565b925050600181019050613d67565b5085935050505092915050565b5f6020820190508181035f830152613db98184613d45565b905092915050565b5f805f60608486031215613dd857613dd76134aa565b5b5f613de5868287016136c1565b9350506020613df686828701613614565b9250506040613e0786828701613614565b9150509250925092565b5f8060408385031215613e2757613e266134aa565b5b5f613e34858286016136c1565b9250506020613e45858286016138c4565b9150509250929050565b5f67ffffffffffffffff821115613e6957613e68613743565b5b613e728261358d565b9050602081019050919050565b5f613e91613e8c84613e4f565b6137a1565b905082815260208101848484011115613ead57613eac61373f565b5b613eb88482856137eb565b509392505050565b5f82601f830112613ed457613ed361373b565b5b8135613ee4848260208601613e7f565b91505092915050565b5f805f8060808587031215613f0557613f046134aa565b5b5f613f12878288016136c1565b9450506020613f23878288016136c1565b9350506040613f3487828801613614565b925050606085013567ffffffffffffffff811115613f5557613f546134ae565b5b613f6187828801613ec0565b91505092959194509250565b608082015f820151613f815f850182613b46565b506020820151613f946020850182613b68565b506040820151613fa76040850182613b77565b506060820151613fba6060850182613b94565b50505050565b5f608082019050613fd35f830184613f6d565b92915050565b5f8060408385031215613fef57613fee6134aa565b5b5f613ffc858286016136c1565b925050602061400d858286016136c1565b9150509250929050565b5f806040838503121561402d5761402c6134aa565b5b5f61403a85828601613614565b925050602061404b858286016136c1565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061409957607f821691505b6020821081036140ac576140ab614055565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261410e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140d3565b61411886836140d3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61415361414e614149846135f5565b614130565b6135f5565b9050919050565b5f819050919050565b61416c83614139565b6141806141788261415a565b8484546140df565b825550505050565b5f90565b614194614188565b61419f818484614163565b505050565b5b818110156141c2576141b75f8261418c565b6001810190506141a5565b5050565b601f821115614207576141d8816140b2565b6141e1846140c4565b810160208510156141f0578190505b6142046141fc856140c4565b8301826141a4565b50505b505050565b5f82821c905092915050565b5f6142275f198460080261420c565b1980831691505092915050565b5f61423f8383614218565b9150826002028217905092915050565b61425882613565565b67ffffffffffffffff81111561427157614270613743565b5b61427b8254614082565b6142868282856141c6565b5f60209050601f8311600181146142b7575f84156142a5578287015190505b6142af8582614234565b865550614316565b601f1984166142c5866140b2565b5f5b828110156142ec578489015182556001820191506020850194506020810190506142c7565b868310156143095784890151614305601f891682614218565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b50565b5f6143365f8361431e565b915061434182614328565b5f82019050919050565b5f6143558261432b565b9150819050919050565b7f4e6f20436f6e7472616374204d696e74696e67210000000000000000000000005f82015250565b5f61439360148361356f565b915061439e8261435f565b602082019050919050565b5f6020820190508181035f8301526143c081614387565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6143fe826135f5565b9150614409836135f5565b9250828201905080821115614421576144206143c7565b5b92915050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f61445b60148361356f565b915061446682614427565b602082019050919050565b5f6020820190508181035f8301526144888161444f565b9050919050565b7f4d696e746564206d617820616d6f756e7420666f7220616464726573732100005f82015250565b5f6144c3601e8361356f565b91506144ce8261448f565b602082019050919050565b5f6020820190508181035f8301526144f0816144b7565b9050919050565b5f614501826135f5565b915061450c836135f5565b925082820261451a816135f5565b91508282048414831517614531576145306143c7565b5b5092915050565b5f614542826135f5565b915061454d836135f5565b9250828203905081811115614565576145646143c7565b5b92915050565b7f496e73756666696369656e742066756e647321000000000000000000000000005f82015250565b5f61459f60138361356f565b91506145aa8261456b565b602082019050919050565b5f6020820190508181035f8301526145cc81614593565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c655f8201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b5f61462d60228361356f565b9150614638826145d3565b604082019050919050565b5f6020820190508181035f83015261465a81614621565b9050919050565b5f8160601b9050919050565b5f61467782614661565b9050919050565b5f6146888261466d565b9050919050565b6146a061469b82613672565b61467e565b82525050565b5f6146b1828461468f565b60148201915081905092915050565b7f496e76616c69642070726f6f66210000000000000000000000000000000000005f82015250565b5f6146f4600e8361356f565b91506146ff826146c0565b602082019050919050565b5f6020820190508181035f830152614721816146e8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f54686520636f6e747261637420697320706175736564210000000000000000005f82015250565b5f61478960178361356f565b915061479482614755565b602082019050919050565b5f6020820190508181035f8301526147b68161477d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f614817602f8361356f565b9150614822826147bd565b604082019050919050565b5f6020820190508181035f8301526148448161480b565b9050919050565b5f81905092915050565b5f61485f82613565565b614869818561484b565b935061487981856020860161357f565b80840191505092915050565b5f815461489181614082565b61489b818661484b565b9450600182165f81146148b557600181146148ca576148fc565b60ff19831686528115158202860193506148fc565b6148d3856140b2565b5f5b838110156148f4578154818901526001820191506020810190506148d5565b838801955050505b50505092915050565b5f6149108286614855565b915061491c8285614855565b91506149288284614885565b9150819050949350505050565b5f6040820190506149485f830185613683565b6149556020830184613683565b9392505050565b5f8151905061496a816138ae565b92915050565b5f60208284031215614985576149846134aa565b5b5f6149928482850161495c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6149bf8261499b565b6149c981856149a5565b93506149d981856020860161357f565b6149e28161358d565b840191505092915050565b5f608082019050614a005f830187613683565b614a0d6020830186613683565b614a1a6040830185613713565b8181036060830152614a2c81846149b5565b905095945050505050565b5f81519050614a45816134dd565b92915050565b5f60208284031215614a6057614a5f6134aa565b5b5f614a6d84828501614a37565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffdfea26469706673582212208e6d71b2d8ef4611080c70c5dd9a43055e71de2b93d0f1925c527bc56f3882de64736f6c63430008190033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000002540be4000000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000a4d6963726f4d69676f7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d4943524f4d49474f5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f697066732e696f2f697066732f626166796265696873736a6435757433677978776d79696768696a6e356972796e7335767277767067627977337a326277646f7636673269776d692f68696464656e2e6a736f6e00000000

-----Decoded View---------------
Arg [0] : _tokenName (string): MicroMigos
Arg [1] : _tokenSymbol (string): MICROMIGOS
Arg [2] : _cost (uint256): 10000000000
Arg [3] : _maxSupply (uint256): 20000
Arg [4] : _maxFreeAmountPerAddress (uint256): 1
Arg [5] : _maxMintAmountPerAddress (uint256): 5
Arg [6] : _hiddenMetadataUri (string): https://ipfs.io/ipfs/bafybeihssjd5ut3gyxwmyighijn5iryns5vrwvpgbyw3z2bwdov6g2iwmi/hidden.json

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 00000000000000000000000000000000000000000000000000000002540be400
Arg [3] : 0000000000000000000000000000000000000000000000000000000000004e20
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [8] : 4d6963726f4d69676f7300000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [10] : 4d4943524f4d49474f5300000000000000000000000000000000000000000000
Arg [11] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [12] : 68747470733a2f2f697066732e696f2f697066732f626166796265696873736a
Arg [13] : 6435757433677978776d79696768696a6e356972796e73357672777670676279
Arg [14] : 77337a326277646f7636673269776d692f68696464656e2e6a736f6e00000000


Deployed ByteCode Sourcemap

99925:7828:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56505:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57407:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63898:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63331:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100631:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107027:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;107141:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53158:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67537:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100334:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100242:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107463:160;;;;;;;;;;;;;:::i;:::-;;70458:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106679:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104336:712;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106767:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100736:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100432:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105522:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93728:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100555:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100657:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100510:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100274:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100397:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58800:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100689:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106476:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54342:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36675:103;;;;;;;;;;;;;:::i;:::-;;107232:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106913:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97604:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36000:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57583:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94644:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105056:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64456:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100472:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107344:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71249:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93141:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105968:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100600:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106584:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64847:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105686:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36933:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105358:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56505:639;56590:4;56929:10;56914:25;;:11;:25;;;;:102;;;;57006:10;56991:25;;:11;:25;;;;56914:102;:179;;;;57083:10;57068:25;;:11;:25;;;;56914:179;56894:199;;56505:639;;;:::o;57407:100::-;57461:13;57494:5;57487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57407:100;:::o;63898:218::-;63974:7;63999:16;64007:7;63999;:16::i;:::-;63994:64;;64024:34;;;;;;;;;;;;;;63994:64;64078:15;:24;64094:7;64078:24;;;;;;;;;;;:30;;;;;;;;;;;;64071:37;;63898:218;;;:::o;63331:408::-;63420:13;63436:16;63444:7;63436;:16::i;:::-;63420:32;;63492:5;63469:28;;:19;:17;:19::i;:::-;:28;;;63465:175;;63517:44;63534:5;63541:19;:17;:19::i;:::-;63517:16;:44::i;:::-;63512:128;;63589:35;;;;;;;;;;;;;;63512:128;63465:175;63685:2;63652:15;:24;63668:7;63652:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;63723:7;63719:2;63703:28;;63712:5;63703:28;;;;;;;;;;;;63409:330;63331:408;;:::o;100631:19::-;;;;:::o;107027:106::-;35886:13;:11;:13::i;:::-;107115:10:::1;107103:9;:22;;;;;;:::i;:::-;;107027:106:::0;:::o;107141:83::-;35886:13;:11;:13::i;:::-;107210:6:::1;107201;;:15;;;;;;;;;;;;;;;;;;107141:83:::0;:::o;53158:323::-;53219:7;53447:15;:13;:15::i;:::-;53432:12;;53416:13;;:28;:46;53409:53;;53158:323;:::o;67537:2825::-;67679:27;67709;67728:7;67709:18;:27::i;:::-;67679:57;;67794:4;67753:45;;67769:19;67753:45;;;67749:86;;67807:28;;;;;;;;;;;;;;67749:86;67849:27;67878:23;67905:35;67932:7;67905:26;:35::i;:::-;67848:92;;;;68040:68;68065:15;68082:4;68088:19;:17;:19::i;:::-;68040:24;:68::i;:::-;68035:180;;68128:43;68145:4;68151:19;:17;:19::i;:::-;68128:16;:43::i;:::-;68123:92;;68180:35;;;;;;;;;;;;;;68123:92;68035:180;68246:1;68232:16;;:2;:16;;;68228:52;;68257:23;;;;;;;;;;;;;;68228:52;68293:43;68315:4;68321:2;68325:7;68334:1;68293:21;:43::i;:::-;68429:15;68426:160;;;68569:1;68548:19;68541:30;68426:160;68966:18;:24;68985:4;68966:24;;;;;;;;;;;;;;;;68964:26;;;;;;;;;;;;69035:18;:22;69054:2;69035:22;;;;;;;;;;;;;;;;69033:24;;;;;;;;;;;69357:146;69394:2;69443:45;69458:4;69464:2;69468:19;69443:14;:45::i;:::-;49557:8;69415:73;69357:18;:146::i;:::-;69328:17;:26;69346:7;69328:26;;;;;;;;;;;:175;;;;69674:1;49557:8;69623:19;:47;:52;69619:627;;69696:19;69728:1;69718:7;:11;69696:33;;69885:1;69851:17;:30;69869:11;69851:30;;;;;;;;;;;;:35;69847:384;;69989:13;;69974:11;:28;69970:242;;70169:19;70136:17;:30;70154:11;70136:30;;;;;;;;;;;:52;;;;69970:242;69847:384;69677:569;69619:627;70293:7;70289:2;70274:27;;70283:4;70274:27;;;;;;;;;;;;70312:42;70333:4;70339:2;70343:7;70352:1;70312:20;:42::i;:::-;67668:2694;;;67537:2825;;;:::o;100334:56::-;;;;;;;;;;;;;;;;;:::o;100242:25::-;;;;:::o;107463:160::-;35886:13;:11;:13::i;:::-;2442:21:::1;:19;:21::i;:::-;107525:7:::2;107546;:5;:7::i;:::-;107538:21;;107567;107538:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107524:69;;;107612:2;107604:11;;;::::0;::::2;;107513:110;2486:20:::1;:18;:20::i;:::-;107463:160::o:0;70458:193::-;70604:39;70621:4;70627:2;70631:7;70604:39;;;;;;;;;;;;:16;:39::i;:::-;70458:193;;;:::o;106679:80::-;35886:13;:11;:13::i;:::-;106746:5:::1;106739:4;:12;;;;106679:80:::0;:::o;104336:712::-;104470:15;104487:11;102189:10;102176:23;;:9;:23;;;102168:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;102274:9;;102259:11;102243:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;102235:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;102321:14;102338:27;102349:15;102338:10;:27::i;:::-;:58;;102386:10;102338:58;;;102368:15;102338:58;102321:75;;102429:1;102415:11;:15;:89;;;;;102481:23;;102466:11;102434:21;:29;102456:6;102434:29;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:70;;102415:89;102407:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;104522:15:::1;104539:11;102657:17;102684:11;102677:4;;:18;;;;:::i;:::-;102657:38;;102706:14;102723:27;102734:15;102723:10;:27::i;:::-;:58;;102771:10;102723:58;;;102753:15;102723:58;102706:75;;102792:37;102887:1:::0;102858:18:::1;:26;102877:6;102858:26;;;;;;;;;;;;;;;;102832:23;;:52;;;;:::i;:::-;:56;:115;;102946:1;102832:115;;;102917:18;:26;102936:6;102917:26;;;;;;;;;;;;;;;;102891:23;;:52;;;;:::i;:::-;102832:115;102792:155;;102958:28;103039:1:::0;103007:29:::1;:33;103003:179;;;103113:11;103080:29;:44;;:90;;103159:11;103080:90;;;103127:29;103080:90;103057:113;;103003:179;103242:4;;103219:20;:27;;;;:::i;:::-;103206:9;:41;;;;:::i;:::-;103194:53;;103282:9;103269;:22;;103261:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;2442:21:::2;:19;:21::i;:::-;104584:20:::3;;;;;;;;;;;104576:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;104654:14;104671:27;104682:15;104671:10;:27::i;:::-;:58;;104719:10;104671:58;;;104701:15;104671:58;104654:75;;104742:12;104784:6;104767:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;104757:35;;;;;;104742:50;;104811;104830:12;;104811:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104844:10;;104856:4;104811:18;:50::i;:::-;104803:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;104893:45;104918:6;104926:11;104893:24;:45::i;:::-;104982:11;104949:21;:29;104971:6;104949:29;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;105006:34;105016:10;105028:11;105006:9;:34::i;:::-;104565:483;;2486:20:::2;:18;:20::i;:::-;102646:689:::1;;;;102552:1;;102157:404:::0;104336:712;;;;;;:::o;106767:138::-;35886:13;:11;:13::i;:::-;106879:18:::1;106859:17;:38;;;;;;:::i;:::-;;106767:138:::0;:::o;100736:28::-;;;;;;;;;;;;;:::o;100432:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;105522:156::-;35886:13;:11;:13::i;:::-;105646:24:::1;105620:23;:50;;;;105522:156:::0;:::o;93728:528::-;93872:23;93938:22;93963:8;;:15;;93938:40;;93993:34;94051:14;94030:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;93993:73;;94086:9;94081:125;94102:14;94097:1;:19;94081:125;;94158:32;94178:8;;94187:1;94178:11;;;;;;;:::i;:::-;;;;;;;;94158:19;:32::i;:::-;94142:10;94153:1;94142:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;94118:3;;;;;94081:125;;;;94227:10;94220:17;;;;93728:528;;;;:::o;100555:38::-;;;;:::o;100657:25::-;;;;;;;;;;;;;:::o;100510:38::-;;;;:::o;100274:53::-;;;;;;;;;;;;;;;;;:::o;100397:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58800:152::-;58872:7;58915:27;58934:7;58915:18;:27::i;:::-;58892:52;;58800:152;;;:::o;100689:40::-;;;;;;;;;;;;;:::o;106476:100::-;35886:13;:11;:13::i;:::-;106558:10:::1;106546:9;:22;;;;106476:100:::0;:::o;54342:233::-;54414:7;54455:1;54438:19;;:5;:19;;;54434:60;;54466:28;;;;;;;;;;;;;;54434:60;48501:13;54512:18;:25;54531:5;54512:25;;;;;;;;;;;;;;;;:55;54505:62;;54342:233;;;:::o;36675:103::-;35886:13;:11;:13::i;:::-;36740:30:::1;36767:1;36740:18;:30::i;:::-;36675:103::o:0;107232:104::-;35886:13;:11;:13::i;:::-;107317:11:::1;107304:10;:24;;;;107232:104:::0;:::o;106913:106::-;35886:13;:11;:13::i;:::-;107001:10:::1;106989:9;:22;;;;;;:::i;:::-;;106913:106:::0;:::o;97604:900::-;97682:16;97736:19;97770:25;97810:22;97835:16;97845:5;97835:9;:16::i;:::-;97810:41;;97866:25;97908:14;97894:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97866:57;;97938:31;;:::i;:::-;97989:9;98001:15;:13;:15::i;:::-;97989:27;;97984:472;98033:14;98018:11;:29;97984:472;;98085:15;98098:1;98085:12;:15::i;:::-;98073:27;;98123:9;:16;;;98164:8;98119:73;98240:1;98214:28;;:9;:14;;;:28;;;98210:111;;98287:9;:14;;;98267:34;;98210:111;98364:5;98343:26;;:17;:26;;;98339:102;;98420:1;98394:8;98403:13;;;;;;98394:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;98339:102;97984:472;98049:3;;;;;97984:472;;;;98477:8;98470:15;;;;;;;97604:900;;;:::o;36000:87::-;36046:7;36073:6;;;;;;;;;;;36066:13;;36000:87;:::o;57583:104::-;57639:13;57672:7;57665:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57583:104;:::o;94644:2513::-;94787:16;94854:4;94845:5;:13;94841:45;;94867:19;;;;;;;;;;;;;;94841:45;94901:19;94935:17;94955:14;:12;:14::i;:::-;94935:34;;95055:15;:13;:15::i;:::-;95047:5;:23;95043:87;;;95099:15;:13;:15::i;:::-;95091:23;;95043:87;95206:9;95199:4;:16;95195:73;;;95243:9;95236:16;;95195:73;95282:25;95310:16;95320:5;95310:9;:16::i;:::-;95282:44;;95504:4;95496:5;:12;95492:278;;;95529:19;95558:5;95551:4;:12;95529:34;;95600:17;95586:11;:31;95582:111;;;95662:11;95642:31;;95582:111;95510:198;95492:278;;;95753:1;95733:21;;95492:278;95784:25;95826:17;95812:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95784:60;;95884:1;95863:17;:22;95859:78;;95913:8;95906:15;;;;;;;;95859:78;96081:31;96115:26;96135:5;96115:19;:26::i;:::-;96081:60;;96156:25;96401:9;:16;;;96396:92;;96458:9;:14;;;96438:34;;96396:92;96507:9;96519:5;96507:17;;96502:478;96531:4;96526:1;:9;;:45;;;;;96554:17;96539:11;:32;;96526:45;96502:478;;;96609:15;96622:1;96609:12;:15::i;:::-;96597:27;;96647:9;:16;;;96688:8;96643:73;96764:1;96738:28;;:9;:14;;;:28;;;96734:111;;96811:9;:14;;;96791:34;;96734:111;96888:5;96867:26;;:17;:26;;;96863:102;;96944:1;96918:8;96927:13;;;;;;96918:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;96863:102;96502:478;96573:3;;;;;96502:478;;;;97082:11;97072:8;97065:29;97130:8;97123:15;;;;;;;;94644:2513;;;;;;:::o;105056:294::-;105121:11;103420:10;103407:23;;:9;:23;;;103399:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;103488:1;103474:11;:15;:93;;;;;103544:23;;103529:11;103493:21;:33;103515:10;103493:33;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;:74;;103474:93;103466:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;103652:9;;103637:11;103621:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;103613:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;105154:11:::1;103775:17;103802:11;103795:4;;:18;;;;:::i;:::-;103775:38;;103845:9;103832;:22;;103824:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;2442:21:::2;:19;:21::i;:::-;105200:6:::3;;;;;;;;;;;105199:7;105191:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;105284:11;105247:21;:33;105269:10;105247:33;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;105308:34;105318:10;105330:11;105308:9;:34::i;:::-;2486:20:::2;:18;:20::i;:::-;103764:134:::1;103697:1;105056:294:::0;;:::o;64456:234::-;64603:8;64551:18;:39;64570:19;:17;:19::i;:::-;64551:39;;;;;;;;;;;;;;;:49;64591:8;64551:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;64663:8;64627:55;;64642:19;:17;:19::i;:::-;64627:55;;;64673:8;64627:55;;;;;;:::i;:::-;;;;;;;;64456:234;;:::o;100472:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;107344:111::-;35886:13;:11;:13::i;:::-;107441:6:::1;107418:20;;:29;;;;;;;;;;;;;;;;;;107344:111:::0;:::o;71249:407::-;71424:31;71437:4;71443:2;71447:7;71424:12;:31::i;:::-;71488:1;71470:2;:14;;;:19;71466:183;;71509:56;71540:4;71546:2;71550:7;71559:5;71509:30;:56::i;:::-;71504:145;;71593:40;;;;;;;;;;;;;;71504:145;71466:183;71249:407;;;;:::o;93141:428::-;93225:21;;:::i;:::-;93259:31;;:::i;:::-;93315:15;:13;:15::i;:::-;93305:7;:25;:54;;;;93345:14;:12;:14::i;:::-;93334:7;:25;;93305:54;93301:103;;;93383:9;93376:16;;;;;93301:103;93426:21;93439:7;93426:12;:21::i;:::-;93414:33;;93462:9;:16;;;93458:65;;;93502:9;93495:16;;;;;93458:65;93540:21;93553:7;93540:12;:21::i;:::-;93533:28;;;93141:428;;;;:::o;105968:500::-;106061:13;106095:17;106103:8;106095:7;:17::i;:::-;106087:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;106193:5;106181:17;;:8;;;;;;;;;;;:17;;;106177:74;;106222:17;106215:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106177:74;106263:28;106294:10;:8;:10::i;:::-;106263:41;;106353:1;106328:14;106322:28;:32;:138;;;;;;;;;;;;;;;;;106394:14;106410:19;:8;:17;:19::i;:::-;106431:9;106377:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;106322:138;106315:145;;;105968:500;;;;:::o;100600:24::-;;;;:::o;106584:87::-;35886:13;:11;:13::i;:::-;106657:6:::1;106646:8;;:17;;;;;;;;;;;;;;;;;;106584:87:::0;:::o;64847:164::-;64944:4;64968:18;:25;64987:5;64968:25;;;;;;;;;;;;;;;:35;64994:8;64968:35;;;;;;;;;;;;;;;;;;;;;;;;;64961:42;;64847:164;;;;:::o;105686:165::-;105776:11;101430:9;;101415:11;101399:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;101391:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35886:13:::1;:11;:13::i;:::-;105810:33:::2;105820:9;105831:11;105810:9;:33::i;:::-;105686:165:::0;;;:::o;36933:220::-;35886:13;:11;:13::i;:::-;37038:1:::1;37018:22;;:8;:22;;::::0;37014:93:::1;;37092:1;37064:31;;;;;;;;;;;:::i;:::-;;;;;;;;37014:93;37117:28;37136:8;37117:18;:28::i;:::-;36933:220:::0;:::o;105358:156::-;35886:13;:11;:13::i;:::-;105482:24:::1;105456:23;:50;;;;105358:156:::0;:::o;65269:282::-;65334:4;65390:7;65371:15;:13;:15::i;:::-;:26;;:66;;;;;65424:13;;65414:7;:23;65371:66;:153;;;;;65523:1;49277:8;65475:17;:26;65493:7;65475:26;;;;;;;;;;;;:44;:49;65371:153;65351:173;;65269:282;;;:::o;87577:105::-;87637:7;87664:10;87657:17;;87577:105;:::o;36165:166::-;36236:12;:10;:12::i;:::-;36225:23;;:7;:5;:7::i;:::-;:23;;;36221:103;;36299:12;:10;:12::i;:::-;36272:40;;;;;;;;;;;:::i;:::-;;;;;;;;36221:103;36165:166::o;105859:101::-;105924:7;105951:1;105944:8;;105859:101;:::o;59955:1275::-;60022:7;60042:12;60057:7;60042:22;;60125:4;60106:15;:13;:15::i;:::-;:23;60102:1061;;60159:13;;60152:4;:20;60148:1015;;;60197:14;60214:17;:23;60232:4;60214:23;;;;;;;;;;;;60197:40;;60331:1;49277:8;60303:6;:24;:29;60299:845;;60968:113;60985:1;60975:6;:11;60968:113;;61028:17;:25;61046:6;;;;;;;61028:25;;;;;;;;;;;;61019:34;;60968:113;;;61114:6;61107:13;;;;;;60299:845;60174:989;60148:1015;60102:1061;61191:31;;;;;;;;;;;;;;59955:1275;;;;:::o;66432:485::-;66534:27;66563:23;66604:38;66645:15;:24;66661:7;66645:24;;;;;;;;;;;66604:65;;66822:18;66799:41;;66879:19;66873:26;66854:45;;66784:126;66432:485;;;:::o;65660:659::-;65809:11;65974:16;65967:5;65963:28;65954:37;;66134:16;66123:9;66119:32;66106:45;;66284:15;66273:9;66270:30;66262:5;66251:9;66248:20;66245:56;66235:66;;65660:659;;;;;:::o;72318:159::-;;;;;:::o;86886:311::-;87021:7;87041:16;49681:3;87067:19;:41;;87041:68;;49681:3;87135:31;87146:4;87152:2;87156:9;87135:10;:31::i;:::-;87127:40;;:62;;87120:69;;;86886:311;;;;;:::o;61778:450::-;61858:14;62026:16;62019:5;62015:28;62006:37;;62203:5;62189:11;62164:23;62160:41;62157:52;62150:5;62147:63;62137:73;;61778:450;;;;:::o;73142:158::-;;;;;:::o;2522:315::-;1820:1;2651:7;;:18;2647:88;;2693:30;;;;;;;;;;;;;;2647:88;1820:1;2812:7;:17;;;;2522:315::o;2845:212::-;1777:1;3028:7;:21;;;;2845:212::o;101492:585::-;101559:4;101576:16;101595:5;101576:24;;101642:1;101615:29;;:15;:29;;;;:62;;;;;101667:10;101648:29;;:15;:29;;;;101615:62;101611:428;;;100093:42;101698:64;;;101763:10;101775:15;101698:93;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;101694:152;;;101826:4;101812:18;;101694:152;101865:11;101864:12;:109;;;;;100193:42;101880:64;;;101945:10;101957:15;101880:93;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;101864:109;101860:168;;;102008:4;101994:18;;101860:168;101611:428;102058:11;102051:18;;;101492:585;;;:::o;24723:156::-;24814:4;24867;24838:25;24851:5;24858:4;24838:12;:25::i;:::-;:33;24831:40;;24723:156;;;;;:::o;103906:422::-;104008:17;104069:18;:37;104088:17;104069:37;;;;;;;;;;;;;;;;104043:23;;:63;;;;:::i;:::-;104028:11;:78;;:184;;104175:18;:37;104194:17;104175:37;;;;;;;;;;;;;;;;104149:23;;:63;;;;:::i;:::-;104028:184;;;104122:11;104028:184;104008:204;;104241:1;104229:9;:13;104225:96;;;104300:9;104259:18;:37;104278:17;104259:37;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;104225:96;103996:332;103906:422;;:::o;81409:112::-;81486:27;81496:2;81500:8;81486:27;;;;;;;;;;;;:9;:27::i;:::-;81409:112;;:::o;37313:191::-;37387:16;37406:6;;;;;;;;;;;37387:25;;37432:8;37423:6;;:17;;;;;;;;;;;;;;;;;;37487:8;37456:40;;37477:8;37456:40;;;;;;;;;;;;37376:128;37313:191;:::o;59403:161::-;59471:21;;:::i;:::-;59512:44;59531:17;:24;59549:5;59531:24;;;;;;;;;;;;59512:18;:44::i;:::-;59505:51;;59403:161;;;:::o;52845:103::-;52900:7;52927:13;;52920:20;;52845:103;:::o;73740:716::-;73903:4;73949:2;73924:45;;;73970:19;:17;:19::i;:::-;73991:4;73997:7;74006:5;73924:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;73920:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74224:1;74207:6;:13;:18;74203:235;;74253:40;;;;;;;;;;;;;;74203:235;74396:6;74390:13;74381:6;74377:2;74373:15;74366:38;73920:529;74093:54;;;74083:64;;;:6;:64;;;;74076:71;;;73740:716;;;;;;:::o;59141:166::-;59211:21;;:::i;:::-;59252:47;59271:27;59290:7;59271:18;:27::i;:::-;59252:18;:47::i;:::-;59245:54;;59141:166;;;:::o;107631:119::-;107700:13;107733:9;107726:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107631:119;:::o;20852:718::-;20908:13;20959:14;20996:1;20976:17;20987:5;20976:10;:17::i;:::-;:21;20959:38;;21012:20;21046:6;21035:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21012:41;;21068:11;21197:6;21193:2;21189:15;21181:6;21177:28;21170:35;;21234:290;21241:4;21234:290;;;21266:5;;;;;;;;21408:10;21403:2;21396:5;21392:14;21387:32;21382:3;21374:46;21466:2;21457:11;;;;;;:::i;:::-;;;;;21500:1;21491:5;:10;21234:290;21487:21;21234:290;21545:6;21538:13;;;;;20852:718;;;:::o;34116:98::-;34169:7;34196:10;34189:17;;34116:98;:::o;86587:147::-;86724:6;86587:147;;;;;:::o;25442:296::-;25525:7;25545:20;25568:4;25545:27;;25588:9;25583:118;25607:5;:12;25603:1;:16;25583:118;;;25656:33;25666:12;25680:5;25686:1;25680:8;;;;;;;;:::i;:::-;;;;;;;;25656:9;:33::i;:::-;25641:48;;25621:3;;;;;;;25583:118;;;;25718:12;25711:19;;;25442:296;;;;:::o;80636:689::-;80767:19;80773:2;80777:8;80767:5;:19::i;:::-;80846:1;80828:2;:14;;;:19;80824:483;;80868:11;80882:13;;80868:27;;80914:13;80936:8;80930:3;:14;80914:30;;80963:233;80994:62;81033:1;81037:2;81041:7;;;;;;81050:5;80994:30;:62::i;:::-;80989:167;;81092:40;;;;;;;;;;;;;;80989:167;81191:3;81183:5;:11;80963:233;;81278:3;81261:13;;:20;81257:34;;81283:8;;;81257:34;80849:458;;80824:483;80636:689;;;:::o;61329:366::-;61395:31;;:::i;:::-;61472:6;61439:9;:14;;:41;;;;;;;;;;;49160:3;61525:6;:33;;61491:9;:24;;:68;;;;;;;;;;;61617:1;49277:8;61589:6;:24;:29;;61570:9;:16;;:48;;;;;;;;;;;49681:3;61658:6;:28;;61629:9;:19;;:58;;;;;;;;;;;61329:366;;;:::o;17256:948::-;17309:7;17329:14;17346:1;17329:18;;17396:8;17387:5;:17;17383:106;;17434:8;17425:17;;;;;;:::i;:::-;;;;;17471:2;17461:12;;;;17383:106;17516:8;17507:5;:17;17503:106;;17554:8;17545:17;;;;;;:::i;:::-;;;;;17591:2;17581:12;;;;17503:106;17636:8;17627:5;:17;17623:106;;17674:8;17665:17;;;;;;:::i;:::-;;;;;17711:2;17701:12;;;;17623:106;17756:7;17747:5;:16;17743:103;;17793:7;17784:16;;;;;;:::i;:::-;;;;;17829:1;17819:11;;;;17743:103;17873:7;17864:5;:16;17860:103;;17910:7;17901:16;;;;;;:::i;:::-;;;;;17946:1;17936:11;;;;17860:103;17990:7;17981:5;:16;17977:103;;18027:7;18018:16;;;;;;:::i;:::-;;;;;18063:1;18053:11;;;;17977:103;18107:7;18098:5;:16;18094:68;;18145:1;18135:11;;;;18094:68;18190:6;18183:13;;;17256:948;;;:::o;32872:149::-;32935:7;32966:1;32962;:5;:51;;32993:20;33008:1;33011;32993:14;:20::i;:::-;32962:51;;;32970:20;32985:1;32988;32970:14;:20::i;:::-;32962:51;32955:58;;32872:149;;;;:::o;74918:2966::-;74991:20;75014:13;;74991:36;;75054:1;75042:8;:13;75038:44;;75064:18;;;;;;;;;;;;;;75038:44;75095:61;75125:1;75129:2;75133:12;75147:8;75095:21;:61::i;:::-;75639:1;48639:2;75609:1;:26;;75608:32;75596:8;:45;75570:18;:22;75589:2;75570:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;75918:139;75955:2;76009:33;76032:1;76036:2;76040:1;76009:14;:33::i;:::-;75976:30;75997:8;75976:20;:30::i;:::-;:66;75918:18;:139::i;:::-;75884:17;:31;75902:12;75884:31;;;;;;;;;;;:173;;;;76074:16;76105:11;76134:8;76119:12;:23;76105:37;;76655:16;76651:2;76647:25;76635:37;;77027:12;76987:8;76946:1;76884:25;76825:1;76764;76737:335;77398:1;77384:12;77380:20;77338:346;77439:3;77430:7;77427:16;77338:346;;77657:7;77647:8;77644:1;77617:25;77614:1;77611;77606:59;77492:1;77483:7;77479:15;77468:26;;77338:346;;;77342:77;77729:1;77717:8;:13;77713:45;;77739:19;;;;;;;;;;;;;;77713:45;77791:3;77775:13;:19;;;;75344:2462;;77816:60;77845:1;77849:2;77853:12;77867:8;77816:20;:60::i;:::-;74980:2904;74918:2966;;:::o;33146:268::-;33214:13;33321:1;33315:4;33308:15;33350:1;33344:4;33337:15;33391:4;33385;33375:21;33366:30;;33146:268;;;;:::o;62330:324::-;62400:14;62633:1;62623:8;62620:15;62594:24;62590:46;62580:56;;62330:324;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:122::-;2909:24;2927:5;2909:24;:::i;:::-;2902:5;2899:35;2889:63;;2948:1;2945;2938:12;2889:63;2836:122;:::o;2964:139::-;3010:5;3048:6;3035:20;3026:29;;3064:33;3091:5;3064:33;:::i;:::-;2964:139;;;;:::o;3109:329::-;3168:6;3217:2;3205:9;3196:7;3192:23;3188:32;3185:119;;;3223:79;;:::i;:::-;3185:119;3343:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;:::i;:::-;3358:63;;3314:117;3109:329;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:118::-;4870:24;4888:5;4870:24;:::i;:::-;4865:3;4858:37;4783:118;;:::o;4907:222::-;5000:4;5038:2;5027:9;5023:18;5015:26;;5051:71;5119:1;5108:9;5104:17;5095:6;5051:71;:::i;:::-;4907:222;;;;:::o;5135:117::-;5244:1;5241;5234:12;5258:117;5367:1;5364;5357:12;5381:180;5429:77;5426:1;5419:88;5526:4;5523:1;5516:15;5550:4;5547:1;5540:15;5567:281;5650:27;5672:4;5650:27;:::i;:::-;5642:6;5638:40;5780:6;5768:10;5765:22;5744:18;5732:10;5729:34;5726:62;5723:88;;;5791:18;;:::i;:::-;5723:88;5831:10;5827:2;5820:22;5610:238;5567:281;;:::o;5854:129::-;5888:6;5915:20;;:::i;:::-;5905:30;;5944:33;5972:4;5964:6;5944:33;:::i;:::-;5854:129;;;:::o;5989:308::-;6051:4;6141:18;6133:6;6130:30;6127:56;;;6163:18;;:::i;:::-;6127:56;6201:29;6223:6;6201:29;:::i;:::-;6193:37;;6285:4;6279;6275:15;6267:23;;5989:308;;;:::o;6303:148::-;6401:6;6396:3;6391;6378:30;6442:1;6433:6;6428:3;6424:16;6417:27;6303:148;;;:::o;6457:425::-;6535:5;6560:66;6576:49;6618:6;6576:49;:::i;:::-;6560:66;:::i;:::-;6551:75;;6649:6;6642:5;6635:21;6687:4;6680:5;6676:16;6725:3;6716:6;6711:3;6707:16;6704:25;6701:112;;;6732:79;;:::i;:::-;6701:112;6822:54;6869:6;6864:3;6859;6822:54;:::i;:::-;6541:341;6457:425;;;;;:::o;6902:340::-;6958:5;7007:3;7000:4;6992:6;6988:17;6984:27;6974:122;;7015:79;;:::i;:::-;6974:122;7132:6;7119:20;7157:79;7232:3;7224:6;7217:4;7209:6;7205:17;7157:79;:::i;:::-;7148:88;;6964:278;6902:340;;;;:::o;7248:509::-;7317:6;7366:2;7354:9;7345:7;7341:23;7337:32;7334:119;;;7372:79;;:::i;:::-;7334:119;7520:1;7509:9;7505:17;7492:31;7550:18;7542:6;7539:30;7536:117;;;7572:79;;:::i;:::-;7536:117;7677:63;7732:7;7723:6;7712:9;7708:22;7677:63;:::i;:::-;7667:73;;7463:287;7248:509;;;;:::o;7763:116::-;7833:21;7848:5;7833:21;:::i;:::-;7826:5;7823:32;7813:60;;7869:1;7866;7859:12;7813:60;7763:116;:::o;7885:133::-;7928:5;7966:6;7953:20;7944:29;;7982:30;8006:5;7982:30;:::i;:::-;7885:133;;;;:::o;8024:323::-;8080:6;8129:2;8117:9;8108:7;8104:23;8100:32;8097:119;;;8135:79;;:::i;:::-;8097:119;8255:1;8280:50;8322:7;8313:6;8302:9;8298:22;8280:50;:::i;:::-;8270:60;;8226:114;8024:323;;;;:::o;8353:619::-;8430:6;8438;8446;8495:2;8483:9;8474:7;8470:23;8466:32;8463:119;;;8501:79;;:::i;:::-;8463:119;8621:1;8646:53;8691:7;8682:6;8671:9;8667:22;8646:53;:::i;:::-;8636:63;;8592:117;8748:2;8774:53;8819:7;8810:6;8799:9;8795:22;8774:53;:::i;:::-;8764:63;;8719:118;8876:2;8902:53;8947:7;8938:6;8927:9;8923:22;8902:53;:::i;:::-;8892:63;;8847:118;8353:619;;;;;:::o;8978:329::-;9037:6;9086:2;9074:9;9065:7;9061:23;9057:32;9054:119;;;9092:79;;:::i;:::-;9054:119;9212:1;9237:53;9282:7;9273:6;9262:9;9258:22;9237:53;:::i;:::-;9227:63;;9183:117;8978:329;;;;:::o;9313:77::-;9350:7;9379:5;9368:16;;9313:77;;;:::o;9396:118::-;9483:24;9501:5;9483:24;:::i;:::-;9478:3;9471:37;9396:118;;:::o;9520:222::-;9613:4;9651:2;9640:9;9636:18;9628:26;;9664:71;9732:1;9721:9;9717:17;9708:6;9664:71;:::i;:::-;9520:222;;;;:::o;9748:117::-;9857:1;9854;9847:12;9871:117;9980:1;9977;9970:12;10011:568;10084:8;10094:6;10144:3;10137:4;10129:6;10125:17;10121:27;10111:122;;10152:79;;:::i;:::-;10111:122;10265:6;10252:20;10242:30;;10295:18;10287:6;10284:30;10281:117;;;10317:79;;:::i;:::-;10281:117;10431:4;10423:6;10419:17;10407:29;;10485:3;10477:4;10469:6;10465:17;10455:8;10451:32;10448:41;10445:128;;;10492:79;;:::i;:::-;10445:128;10011:568;;;;;:::o;10585:849::-;10689:6;10697;10705;10713;10762:2;10750:9;10741:7;10737:23;10733:32;10730:119;;;10768:79;;:::i;:::-;10730:119;10888:1;10913:53;10958:7;10949:6;10938:9;10934:22;10913:53;:::i;:::-;10903:63;;10859:117;11015:2;11041:53;11086:7;11077:6;11066:9;11062:22;11041:53;:::i;:::-;11031:63;;10986:118;11171:2;11160:9;11156:18;11143:32;11202:18;11194:6;11191:30;11188:117;;;11224:79;;:::i;:::-;11188:117;11337:80;11409:7;11400:6;11389:9;11385:22;11337:80;:::i;:::-;11319:98;;;;11114:313;10585:849;;;;;;;:::o;11457:568::-;11530:8;11540:6;11590:3;11583:4;11575:6;11571:17;11567:27;11557:122;;11598:79;;:::i;:::-;11557:122;11711:6;11698:20;11688:30;;11741:18;11733:6;11730:30;11727:117;;;11763:79;;:::i;:::-;11727:117;11877:4;11869:6;11865:17;11853:29;;11931:3;11923:4;11915:6;11911:17;11901:8;11897:32;11894:41;11891:128;;;11938:79;;:::i;:::-;11891:128;11457:568;;;;;:::o;12031:559::-;12117:6;12125;12174:2;12162:9;12153:7;12149:23;12145:32;12142:119;;;12180:79;;:::i;:::-;12142:119;12328:1;12317:9;12313:17;12300:31;12358:18;12350:6;12347:30;12344:117;;;12380:79;;:::i;:::-;12344:117;12493:80;12565:7;12556:6;12545:9;12541:22;12493:80;:::i;:::-;12475:98;;;;12271:312;12031:559;;;;;:::o;12596:146::-;12695:6;12729:5;12723:12;12713:22;;12596:146;;;:::o;12748:216::-;12879:11;12913:6;12908:3;12901:19;12953:4;12948:3;12944:14;12929:29;;12748:216;;;;:::o;12970:164::-;13069:4;13092:3;13084:11;;13122:4;13117:3;13113:14;13105:22;;12970:164;;;:::o;13140:108::-;13217:24;13235:5;13217:24;:::i;:::-;13212:3;13205:37;13140:108;;:::o;13254:101::-;13290:7;13330:18;13323:5;13319:30;13308:41;;13254:101;;;:::o;13361:105::-;13436:23;13453:5;13436:23;:::i;:::-;13431:3;13424:36;13361:105;;:::o;13472:99::-;13543:21;13558:5;13543:21;:::i;:::-;13538:3;13531:34;13472:99;;:::o;13577:91::-;13613:7;13653:8;13646:5;13642:20;13631:31;;13577:91;;;:::o;13674:105::-;13749:23;13766:5;13749:23;:::i;:::-;13744:3;13737:36;13674:105;;:::o;13857:866::-;14008:4;14003:3;13999:14;14095:4;14088:5;14084:16;14078:23;14114:63;14171:4;14166:3;14162:14;14148:12;14114:63;:::i;:::-;14023:164;14279:4;14272:5;14268:16;14262:23;14298:61;14353:4;14348:3;14344:14;14330:12;14298:61;:::i;:::-;14197:172;14453:4;14446:5;14442:16;14436:23;14472:57;14523:4;14518:3;14514:14;14500:12;14472:57;:::i;:::-;14379:160;14626:4;14619:5;14615:16;14609:23;14645:61;14700:4;14695:3;14691:14;14677:12;14645:61;:::i;:::-;14549:167;13977:746;13857:866;;:::o;14729:307::-;14862:10;14883:110;14989:3;14981:6;14883:110;:::i;:::-;15025:4;15020:3;15016:14;15002:28;;14729:307;;;;:::o;15042:145::-;15144:4;15176;15171:3;15167:14;15159:22;;15042:145;;;:::o;15269:988::-;15452:3;15481:86;15561:5;15481:86;:::i;:::-;15583:118;15694:6;15689:3;15583:118;:::i;:::-;15576:125;;15725:88;15807:5;15725:88;:::i;:::-;15836:7;15867:1;15852:380;15877:6;15874:1;15871:13;15852:380;;;15953:6;15947:13;15980:127;16103:3;16088:13;15980:127;:::i;:::-;15973:134;;16130:92;16215:6;16130:92;:::i;:::-;16120:102;;15912:320;15899:1;15896;15892:9;15887:14;;15852:380;;;15856:14;16248:3;16241:10;;15457:800;;;15269:988;;;;:::o;16263:501::-;16470:4;16508:2;16497:9;16493:18;16485:26;;16557:9;16551:4;16547:20;16543:1;16532:9;16528:17;16521:47;16585:172;16752:4;16743:6;16585:172;:::i;:::-;16577:180;;16263:501;;;;:::o;16770:122::-;16843:24;16861:5;16843:24;:::i;:::-;16836:5;16833:35;16823:63;;16882:1;16879;16872:12;16823:63;16770:122;:::o;16898:139::-;16944:5;16982:6;16969:20;16960:29;;16998:33;17025:5;16998:33;:::i;:::-;16898:139;;;;:::o;17043:329::-;17102:6;17151:2;17139:9;17130:7;17126:23;17122:32;17119:119;;;17157:79;;:::i;:::-;17119:119;17277:1;17302:53;17347:7;17338:6;17327:9;17323:22;17302:53;:::i;:::-;17292:63;;17248:117;17043:329;;;;:::o;17378:114::-;17445:6;17479:5;17473:12;17463:22;;17378:114;;;:::o;17498:184::-;17597:11;17631:6;17626:3;17619:19;17671:4;17666:3;17662:14;17647:29;;17498:184;;;;:::o;17688:132::-;17755:4;17778:3;17770:11;;17808:4;17803:3;17799:14;17791:22;;17688:132;;;:::o;17826:108::-;17903:24;17921:5;17903:24;:::i;:::-;17898:3;17891:37;17826:108;;:::o;17940:179::-;18009:10;18030:46;18072:3;18064:6;18030:46;:::i;:::-;18108:4;18103:3;18099:14;18085:28;;17940:179;;;;:::o;18125:113::-;18195:4;18227;18222:3;18218:14;18210:22;;18125:113;;;:::o;18274:732::-;18393:3;18422:54;18470:5;18422:54;:::i;:::-;18492:86;18571:6;18566:3;18492:86;:::i;:::-;18485:93;;18602:56;18652:5;18602:56;:::i;:::-;18681:7;18712:1;18697:284;18722:6;18719:1;18716:13;18697:284;;;18798:6;18792:13;18825:63;18884:3;18869:13;18825:63;:::i;:::-;18818:70;;18911:60;18964:6;18911:60;:::i;:::-;18901:70;;18757:224;18744:1;18741;18737:9;18732:14;;18697:284;;;18701:14;18997:3;18990:10;;18398:608;;;18274:732;;;;:::o;19012:373::-;19155:4;19193:2;19182:9;19178:18;19170:26;;19242:9;19236:4;19232:20;19228:1;19217:9;19213:17;19206:47;19270:108;19373:4;19364:6;19270:108;:::i;:::-;19262:116;;19012:373;;;;:::o;19391:619::-;19468:6;19476;19484;19533:2;19521:9;19512:7;19508:23;19504:32;19501:119;;;19539:79;;:::i;:::-;19501:119;19659:1;19684:53;19729:7;19720:6;19709:9;19705:22;19684:53;:::i;:::-;19674:63;;19630:117;19786:2;19812:53;19857:7;19848:6;19837:9;19833:22;19812:53;:::i;:::-;19802:63;;19757:118;19914:2;19940:53;19985:7;19976:6;19965:9;19961:22;19940:53;:::i;:::-;19930:63;;19885:118;19391:619;;;;;:::o;20016:468::-;20081:6;20089;20138:2;20126:9;20117:7;20113:23;20109:32;20106:119;;;20144:79;;:::i;:::-;20106:119;20264:1;20289:53;20334:7;20325:6;20314:9;20310:22;20289:53;:::i;:::-;20279:63;;20235:117;20391:2;20417:50;20459:7;20450:6;20439:9;20435:22;20417:50;:::i;:::-;20407:60;;20362:115;20016:468;;;;;:::o;20490:307::-;20551:4;20641:18;20633:6;20630:30;20627:56;;;20663:18;;:::i;:::-;20627:56;20701:29;20723:6;20701:29;:::i;:::-;20693:37;;20785:4;20779;20775:15;20767:23;;20490:307;;;:::o;20803:423::-;20880:5;20905:65;20921:48;20962:6;20921:48;:::i;:::-;20905:65;:::i;:::-;20896:74;;20993:6;20986:5;20979:21;21031:4;21024:5;21020:16;21069:3;21060:6;21055:3;21051:16;21048:25;21045:112;;;21076:79;;:::i;:::-;21045:112;21166:54;21213:6;21208:3;21203;21166:54;:::i;:::-;20886:340;20803:423;;;;;:::o;21245:338::-;21300:5;21349:3;21342:4;21334:6;21330:17;21326:27;21316:122;;21357:79;;:::i;:::-;21316:122;21474:6;21461:20;21499:78;21573:3;21565:6;21558:4;21550:6;21546:17;21499:78;:::i;:::-;21490:87;;21306:277;21245:338;;;;:::o;21589:943::-;21684:6;21692;21700;21708;21757:3;21745:9;21736:7;21732:23;21728:33;21725:120;;;21764:79;;:::i;:::-;21725:120;21884:1;21909:53;21954:7;21945:6;21934:9;21930:22;21909:53;:::i;:::-;21899:63;;21855:117;22011:2;22037:53;22082:7;22073:6;22062:9;22058:22;22037:53;:::i;:::-;22027:63;;21982:118;22139:2;22165:53;22210:7;22201:6;22190:9;22186:22;22165:53;:::i;:::-;22155:63;;22110:118;22295:2;22284:9;22280:18;22267:32;22326:18;22318:6;22315:30;22312:117;;;22348:79;;:::i;:::-;22312:117;22453:62;22507:7;22498:6;22487:9;22483:22;22453:62;:::i;:::-;22443:72;;22238:287;21589:943;;;;;;;:::o;22610:876::-;22771:4;22766:3;22762:14;22858:4;22851:5;22847:16;22841:23;22877:63;22934:4;22929:3;22925:14;22911:12;22877:63;:::i;:::-;22786:164;23042:4;23035:5;23031:16;23025:23;23061:61;23116:4;23111:3;23107:14;23093:12;23061:61;:::i;:::-;22960:172;23216:4;23209:5;23205:16;23199:23;23235:57;23286:4;23281:3;23277:14;23263:12;23235:57;:::i;:::-;23142:160;23389:4;23382:5;23378:16;23372:23;23408:61;23463:4;23458:3;23454:14;23440:12;23408:61;:::i;:::-;23312:167;22740:746;22610:876;;:::o;23492:351::-;23649:4;23687:3;23676:9;23672:19;23664:27;;23701:135;23833:1;23822:9;23818:17;23809:6;23701:135;:::i;:::-;23492:351;;;;:::o;23849:474::-;23917:6;23925;23974:2;23962:9;23953:7;23949:23;23945:32;23942:119;;;23980:79;;:::i;:::-;23942:119;24100:1;24125:53;24170:7;24161:6;24150:9;24146:22;24125:53;:::i;:::-;24115:63;;24071:117;24227:2;24253:53;24298:7;24289:6;24278:9;24274:22;24253:53;:::i;:::-;24243:63;;24198:118;23849:474;;;;;:::o;24329:::-;24397:6;24405;24454:2;24442:9;24433:7;24429:23;24425:32;24422:119;;;24460:79;;:::i;:::-;24422:119;24580:1;24605:53;24650:7;24641:6;24630:9;24626:22;24605:53;:::i;:::-;24595:63;;24551:117;24707:2;24733:53;24778:7;24769:6;24758:9;24754:22;24733:53;:::i;:::-;24723:63;;24678:118;24329:474;;;;;:::o;24809:180::-;24857:77;24854:1;24847:88;24954:4;24951:1;24944:15;24978:4;24975:1;24968:15;24995:320;25039:6;25076:1;25070:4;25066:12;25056:22;;25123:1;25117:4;25113:12;25144:18;25134:81;;25200:4;25192:6;25188:17;25178:27;;25134:81;25262:2;25254:6;25251:14;25231:18;25228:38;25225:84;;25281:18;;:::i;:::-;25225:84;25046:269;24995:320;;;:::o;25321:141::-;25370:4;25393:3;25385:11;;25416:3;25413:1;25406:14;25450:4;25447:1;25437:18;25429:26;;25321:141;;;:::o;25468:93::-;25505:6;25552:2;25547;25540:5;25536:14;25532:23;25522:33;;25468:93;;;:::o;25567:107::-;25611:8;25661:5;25655:4;25651:16;25630:37;;25567:107;;;;:::o;25680:393::-;25749:6;25799:1;25787:10;25783:18;25822:97;25852:66;25841:9;25822:97;:::i;:::-;25940:39;25970:8;25959:9;25940:39;:::i;:::-;25928:51;;26012:4;26008:9;26001:5;25997:21;25988:30;;26061:4;26051:8;26047:19;26040:5;26037:30;26027:40;;25756:317;;25680:393;;;;;:::o;26079:60::-;26107:3;26128:5;26121:12;;26079:60;;;:::o;26145:142::-;26195:9;26228:53;26246:34;26255:24;26273:5;26255:24;:::i;:::-;26246:34;:::i;:::-;26228:53;:::i;:::-;26215:66;;26145:142;;;:::o;26293:75::-;26336:3;26357:5;26350:12;;26293:75;;;:::o;26374:269::-;26484:39;26515:7;26484:39;:::i;:::-;26545:91;26594:41;26618:16;26594:41;:::i;:::-;26586:6;26579:4;26573:11;26545:91;:::i;:::-;26539:4;26532:105;26450:193;26374:269;;;:::o;26649:73::-;26694:3;26649:73;:::o;26728:189::-;26805:32;;:::i;:::-;26846:65;26904:6;26896;26890:4;26846:65;:::i;:::-;26781:136;26728:189;;:::o;26923:186::-;26983:120;27000:3;26993:5;26990:14;26983:120;;;27054:39;27091:1;27084:5;27054:39;:::i;:::-;27027:1;27020:5;27016:13;27007:22;;26983:120;;;26923:186;;:::o;27115:543::-;27216:2;27211:3;27208:11;27205:446;;;27250:38;27282:5;27250:38;:::i;:::-;27334:29;27352:10;27334:29;:::i;:::-;27324:8;27320:44;27517:2;27505:10;27502:18;27499:49;;;27538:8;27523:23;;27499:49;27561:80;27617:22;27635:3;27617:22;:::i;:::-;27607:8;27603:37;27590:11;27561:80;:::i;:::-;27220:431;;27205:446;27115:543;;;:::o;27664:117::-;27718:8;27768:5;27762:4;27758:16;27737:37;;27664:117;;;;:::o;27787:169::-;27831:6;27864:51;27912:1;27908:6;27900:5;27897:1;27893:13;27864:51;:::i;:::-;27860:56;27945:4;27939;27935:15;27925:25;;27838:118;27787:169;;;;:::o;27961:295::-;28037:4;28183:29;28208:3;28202:4;28183:29;:::i;:::-;28175:37;;28245:3;28242:1;28238:11;28232:4;28229:21;28221:29;;27961:295;;;;:::o;28261:1395::-;28378:37;28411:3;28378:37;:::i;:::-;28480:18;28472:6;28469:30;28466:56;;;28502:18;;:::i;:::-;28466:56;28546:38;28578:4;28572:11;28546:38;:::i;:::-;28631:67;28691:6;28683;28677:4;28631:67;:::i;:::-;28725:1;28749:4;28736:17;;28781:2;28773:6;28770:14;28798:1;28793:618;;;;29455:1;29472:6;29469:77;;;29521:9;29516:3;29512:19;29506:26;29497:35;;29469:77;29572:67;29632:6;29625:5;29572:67;:::i;:::-;29566:4;29559:81;29428:222;28763:887;;28793:618;28845:4;28841:9;28833:6;28829:22;28879:37;28911:4;28879:37;:::i;:::-;28938:1;28952:208;28966:7;28963:1;28960:14;28952:208;;;29045:9;29040:3;29036:19;29030:26;29022:6;29015:42;29096:1;29088:6;29084:14;29074:24;;29143:2;29132:9;29128:18;29115:31;;28989:4;28986:1;28982:12;28977:17;;28952:208;;;29188:6;29179:7;29176:19;29173:179;;;29246:9;29241:3;29237:19;29231:26;29289:48;29331:4;29323:6;29319:17;29308:9;29289:48;:::i;:::-;29281:6;29274:64;29196:156;29173:179;29398:1;29394;29386:6;29382:14;29378:22;29372:4;29365:36;28800:611;;;28763:887;;28353:1303;;;28261:1395;;:::o;29662:147::-;29763:11;29800:3;29785:18;;29662:147;;;;:::o;29815:114::-;;:::o;29935:398::-;30094:3;30115:83;30196:1;30191:3;30115:83;:::i;:::-;30108:90;;30207:93;30296:3;30207:93;:::i;:::-;30325:1;30320:3;30316:11;30309:18;;29935:398;;;:::o;30339:379::-;30523:3;30545:147;30688:3;30545:147;:::i;:::-;30538:154;;30709:3;30702:10;;30339:379;;;:::o;30724:170::-;30864:22;30860:1;30852:6;30848:14;30841:46;30724:170;:::o;30900:366::-;31042:3;31063:67;31127:2;31122:3;31063:67;:::i;:::-;31056:74;;31139:93;31228:3;31139:93;:::i;:::-;31257:2;31252:3;31248:12;31241:19;;30900:366;;;:::o;31272:419::-;31438:4;31476:2;31465:9;31461:18;31453:26;;31525:9;31519:4;31515:20;31511:1;31500:9;31496:17;31489:47;31553:131;31679:4;31553:131;:::i;:::-;31545:139;;31272:419;;;:::o;31697:180::-;31745:77;31742:1;31735:88;31842:4;31839:1;31832:15;31866:4;31863:1;31856:15;31883:191;31923:3;31942:20;31960:1;31942:20;:::i;:::-;31937:25;;31976:20;31994:1;31976:20;:::i;:::-;31971:25;;32019:1;32016;32012:9;32005:16;;32040:3;32037:1;32034:10;32031:36;;;32047:18;;:::i;:::-;32031:36;31883:191;;;;:::o;32080:170::-;32220:22;32216:1;32208:6;32204:14;32197:46;32080:170;:::o;32256:366::-;32398:3;32419:67;32483:2;32478:3;32419:67;:::i;:::-;32412:74;;32495:93;32584:3;32495:93;:::i;:::-;32613:2;32608:3;32604:12;32597:19;;32256:366;;;:::o;32628:419::-;32794:4;32832:2;32821:9;32817:18;32809:26;;32881:9;32875:4;32871:20;32867:1;32856:9;32852:17;32845:47;32909:131;33035:4;32909:131;:::i;:::-;32901:139;;32628:419;;;:::o;33053:180::-;33193:32;33189:1;33181:6;33177:14;33170:56;33053:180;:::o;33239:366::-;33381:3;33402:67;33466:2;33461:3;33402:67;:::i;:::-;33395:74;;33478:93;33567:3;33478:93;:::i;:::-;33596:2;33591:3;33587:12;33580:19;;33239:366;;;:::o;33611:419::-;33777:4;33815:2;33804:9;33800:18;33792:26;;33864:9;33858:4;33854:20;33850:1;33839:9;33835:17;33828:47;33892:131;34018:4;33892:131;:::i;:::-;33884:139;;33611:419;;;:::o;34036:410::-;34076:7;34099:20;34117:1;34099:20;:::i;:::-;34094:25;;34133:20;34151:1;34133:20;:::i;:::-;34128:25;;34188:1;34185;34181:9;34210:30;34228:11;34210:30;:::i;:::-;34199:41;;34389:1;34380:7;34376:15;34373:1;34370:22;34350:1;34343:9;34323:83;34300:139;;34419:18;;:::i;:::-;34300:139;34084:362;34036:410;;;;:::o;34452:194::-;34492:4;34512:20;34530:1;34512:20;:::i;:::-;34507:25;;34546:20;34564:1;34546:20;:::i;:::-;34541:25;;34590:1;34587;34583:9;34575:17;;34614:1;34608:4;34605:11;34602:37;;;34619:18;;:::i;:::-;34602:37;34452:194;;;;:::o;34652:169::-;34792:21;34788:1;34780:6;34776:14;34769:45;34652:169;:::o;34827:366::-;34969:3;34990:67;35054:2;35049:3;34990:67;:::i;:::-;34983:74;;35066:93;35155:3;35066:93;:::i;:::-;35184:2;35179:3;35175:12;35168:19;;34827:366;;;:::o;35199:419::-;35365:4;35403:2;35392:9;35388:18;35380:26;;35452:9;35446:4;35442:20;35438:1;35427:9;35423:17;35416:47;35480:131;35606:4;35480:131;:::i;:::-;35472:139;;35199:419;;;:::o;35624:221::-;35764:34;35760:1;35752:6;35748:14;35741:58;35833:4;35828:2;35820:6;35816:15;35809:29;35624:221;:::o;35851:366::-;35993:3;36014:67;36078:2;36073:3;36014:67;:::i;:::-;36007:74;;36090:93;36179:3;36090:93;:::i;:::-;36208:2;36203:3;36199:12;36192:19;;35851:366;;;:::o;36223:419::-;36389:4;36427:2;36416:9;36412:18;36404:26;;36476:9;36470:4;36466:20;36462:1;36451:9;36447:17;36440:47;36504:131;36630:4;36504:131;:::i;:::-;36496:139;;36223:419;;;:::o;36648:94::-;36681:8;36729:5;36725:2;36721:14;36700:35;;36648:94;;;:::o;36748:::-;36787:7;36816:20;36830:5;36816:20;:::i;:::-;36805:31;;36748:94;;;:::o;36848:100::-;36887:7;36916:26;36936:5;36916:26;:::i;:::-;36905:37;;36848:100;;;:::o;36954:157::-;37059:45;37079:24;37097:5;37079:24;:::i;:::-;37059:45;:::i;:::-;37054:3;37047:58;36954:157;;:::o;37117:256::-;37229:3;37244:75;37315:3;37306:6;37244:75;:::i;:::-;37344:2;37339:3;37335:12;37328:19;;37364:3;37357:10;;37117:256;;;;:::o;37379:164::-;37519:16;37515:1;37507:6;37503:14;37496:40;37379:164;:::o;37549:366::-;37691:3;37712:67;37776:2;37771:3;37712:67;:::i;:::-;37705:74;;37788:93;37877:3;37788:93;:::i;:::-;37906:2;37901:3;37897:12;37890:19;;37549:366;;;:::o;37921:419::-;38087:4;38125:2;38114:9;38110:18;38102:26;;38174:9;38168:4;38164:20;38160:1;38149:9;38145:17;38138:47;38202:131;38328:4;38202:131;:::i;:::-;38194:139;;37921:419;;;:::o;38346:180::-;38394:77;38391:1;38384:88;38491:4;38488:1;38481:15;38515:4;38512:1;38505:15;38532:173;38672:25;38668:1;38660:6;38656:14;38649:49;38532:173;:::o;38711:366::-;38853:3;38874:67;38938:2;38933:3;38874:67;:::i;:::-;38867:74;;38950:93;39039:3;38950:93;:::i;:::-;39068:2;39063:3;39059:12;39052:19;;38711:366;;;:::o;39083:419::-;39249:4;39287:2;39276:9;39272:18;39264:26;;39336:9;39330:4;39326:20;39322:1;39311:9;39307:17;39300:47;39364:131;39490:4;39364:131;:::i;:::-;39356:139;;39083:419;;;:::o;39508:234::-;39648:34;39644:1;39636:6;39632:14;39625:58;39717:17;39712:2;39704:6;39700:15;39693:42;39508:234;:::o;39748:366::-;39890:3;39911:67;39975:2;39970:3;39911:67;:::i;:::-;39904:74;;39987:93;40076:3;39987:93;:::i;:::-;40105:2;40100:3;40096:12;40089:19;;39748:366;;;:::o;40120:419::-;40286:4;40324:2;40313:9;40309:18;40301:26;;40373:9;40367:4;40363:20;40359:1;40348:9;40344:17;40337:47;40401:131;40527:4;40401:131;:::i;:::-;40393:139;;40120:419;;;:::o;40545:148::-;40647:11;40684:3;40669:18;;40545:148;;;;:::o;40699:390::-;40805:3;40833:39;40866:5;40833:39;:::i;:::-;40888:89;40970:6;40965:3;40888:89;:::i;:::-;40881:96;;40986:65;41044:6;41039:3;41032:4;41025:5;41021:16;40986:65;:::i;:::-;41076:6;41071:3;41067:16;41060:23;;40809:280;40699:390;;;;:::o;41119:874::-;41222:3;41259:5;41253:12;41288:36;41314:9;41288:36;:::i;:::-;41340:89;41422:6;41417:3;41340:89;:::i;:::-;41333:96;;41460:1;41449:9;41445:17;41476:1;41471:166;;;;41651:1;41646:341;;;;41438:549;;41471:166;41555:4;41551:9;41540;41536:25;41531:3;41524:38;41617:6;41610:14;41603:22;41595:6;41591:35;41586:3;41582:45;41575:52;;41471:166;;41646:341;41713:38;41745:5;41713:38;:::i;:::-;41773:1;41787:154;41801:6;41798:1;41795:13;41787:154;;;41875:7;41869:14;41865:1;41860:3;41856:11;41849:35;41925:1;41916:7;41912:15;41901:26;;41823:4;41820:1;41816:12;41811:17;;41787:154;;;41970:6;41965:3;41961:16;41954:23;;41653:334;;41438:549;;41226:767;;41119:874;;;;:::o;41999:589::-;42224:3;42246:95;42337:3;42328:6;42246:95;:::i;:::-;42239:102;;42358:95;42449:3;42440:6;42358:95;:::i;:::-;42351:102;;42470:92;42558:3;42549:6;42470:92;:::i;:::-;42463:99;;42579:3;42572:10;;41999:589;;;;;;:::o;42594:332::-;42715:4;42753:2;42742:9;42738:18;42730:26;;42766:71;42834:1;42823:9;42819:17;42810:6;42766:71;:::i;:::-;42847:72;42915:2;42904:9;42900:18;42891:6;42847:72;:::i;:::-;42594:332;;;;;:::o;42932:137::-;42986:5;43017:6;43011:13;43002:22;;43033:30;43057:5;43033:30;:::i;:::-;42932:137;;;;:::o;43075:345::-;43142:6;43191:2;43179:9;43170:7;43166:23;43162:32;43159:119;;;43197:79;;:::i;:::-;43159:119;43317:1;43342:61;43395:7;43386:6;43375:9;43371:22;43342:61;:::i;:::-;43332:71;;43288:125;43075:345;;;;:::o;43426:98::-;43477:6;43511:5;43505:12;43495:22;;43426:98;;;:::o;43530:168::-;43613:11;43647:6;43642:3;43635:19;43687:4;43682:3;43678:14;43663:29;;43530:168;;;;:::o;43704:373::-;43790:3;43818:38;43850:5;43818:38;:::i;:::-;43872:70;43935:6;43930:3;43872:70;:::i;:::-;43865:77;;43951:65;44009:6;44004:3;43997:4;43990:5;43986:16;43951:65;:::i;:::-;44041:29;44063:6;44041:29;:::i;:::-;44036:3;44032:39;44025:46;;43794:283;43704:373;;;;:::o;44083:640::-;44278:4;44316:3;44305:9;44301:19;44293:27;;44330:71;44398:1;44387:9;44383:17;44374:6;44330:71;:::i;:::-;44411:72;44479:2;44468:9;44464:18;44455:6;44411:72;:::i;:::-;44493;44561:2;44550:9;44546:18;44537:6;44493:72;:::i;:::-;44612:9;44606:4;44602:20;44597:2;44586:9;44582:18;44575:48;44640:76;44711:4;44702:6;44640:76;:::i;:::-;44632:84;;44083:640;;;;;;;:::o;44729:141::-;44785:5;44816:6;44810:13;44801:22;;44832:32;44858:5;44832:32;:::i;:::-;44729:141;;;;:::o;44876:349::-;44945:6;44994:2;44982:9;44973:7;44969:23;44965:32;44962:119;;;45000:79;;:::i;:::-;44962:119;45120:1;45145:63;45200:7;45191:6;45180:9;45176:22;45145:63;:::i;:::-;45135:73;;45091:127;44876:349;;;;:::o;45231:180::-;45279:77;45276:1;45269:88;45376:4;45373:1;45366:15;45400:4;45397:1;45390:15

Swarm Source

ipfs://8e6d71b2d8ef4611080c70c5dd9a43055e71de2b93d0f1925c527bc56f3882de
MicroMigos (MICROMIGOS) Token Tracker | BaseSepolia (2024)
Top Articles
Latest Posts
Article information

Author: Geoffrey Lueilwitz

Last Updated:

Views: 5513

Rating: 5 / 5 (80 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Geoffrey Lueilwitz

Birthday: 1997-03-23

Address: 74183 Thomas Course, Port Micheal, OK 55446-1529

Phone: +13408645881558

Job: Global Representative

Hobby: Sailing, Vehicle restoration, Rowing, Ghost hunting, Scrapbooking, Rugby, Board sports

Introduction: My name is Geoffrey Lueilwitz, I am a zealous, encouraging, sparkling, enchanting, graceful, faithful, nice person who loves writing and wants to share my knowledge and understanding with you.