Overview
POL Balance
0 POL
POL Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 36 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 51233769 | 356 days ago | IN | 0 POL | 0.00198797 | ||||
Set Approval For... | 44947609 | 515 days ago | IN | 0 POL | 0.00531759 | ||||
Set Approval For... | 40308544 | 635 days ago | IN | 0 POL | 0.00682343 | ||||
Mint | 37367273 | 711 days ago | IN | 20 POL | 0.00999241 | ||||
Set Approval For... | 37032899 | 719 days ago | IN | 0 POL | 0.0146059 | ||||
Safe Transfer Fr... | 36905779 | 722 days ago | IN | 0 POL | 0.01653034 | ||||
Set Approval For... | 36905505 | 722 days ago | IN | 0 POL | 0.01329737 | ||||
Mint | 36905142 | 722 days ago | IN | 20 POL | 0.04750977 | ||||
Mint | 36869643 | 723 days ago | IN | 20 POL | 0.01514901 | ||||
Mint | 36862173 | 723 days ago | IN | 20 POL | 0.01581233 | ||||
Mint | 36550903 | 731 days ago | IN | 20 POL | 0.00660161 | ||||
Mint | 36547513 | 731 days ago | IN | 20 POL | 0.00600634 | ||||
Mint | 36513066 | 732 days ago | IN | 20 POL | 0.00696776 | ||||
Set Approval For... | 36274379 | 738 days ago | IN | 0 POL | 0.0014491 | ||||
Mint | 36221298 | 739 days ago | IN | 20 POL | 0.00731713 | ||||
Mint | 36192356 | 740 days ago | IN | 20 POL | 0.0068513 | ||||
Set Approval For... | 36133849 | 741 days ago | IN | 0 POL | 0.00145561 | ||||
Mint | 36021911 | 744 days ago | IN | 20 POL | 0.00659113 | ||||
Mint | 35902858 | 747 days ago | IN | 20 POL | 0.00660431 | ||||
Set Approval For... | 35898347 | 747 days ago | IN | 0 POL | 0.00140289 | ||||
Mint | 35837352 | 748 days ago | IN | 20 POL | 0.00659845 | ||||
Mint | 35821253 | 749 days ago | IN | 20 POL | 0.00659113 | ||||
Mint | 35820386 | 749 days ago | IN | 20 POL | 0.00580367 | ||||
Mint | 35814205 | 749 days ago | IN | 20 POL | 0.00557454 | ||||
Mint | 35811514 | 749 days ago | IN | 20 POL | 0.00659114 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
37367273 | 711 days ago | 18 POL | ||||
37367273 | 711 days ago | 2 POL | ||||
36905142 | 722 days ago | 18 POL | ||||
36905142 | 722 days ago | 2 POL | ||||
36869643 | 723 days ago | 18 POL | ||||
36869643 | 723 days ago | 2 POL | ||||
36862173 | 723 days ago | 18 POL | ||||
36862173 | 723 days ago | 2 POL | ||||
36550903 | 731 days ago | 18 POL | ||||
36550903 | 731 days ago | 2 POL | ||||
36547513 | 731 days ago | 18 POL | ||||
36547513 | 731 days ago | 2 POL | ||||
36513066 | 732 days ago | 18 POL | ||||
36513066 | 732 days ago | 2 POL | ||||
36221298 | 739 days ago | 18 POL | ||||
36221298 | 739 days ago | 2 POL | ||||
36192356 | 740 days ago | 18 POL | ||||
36192356 | 740 days ago | 2 POL | ||||
36021911 | 744 days ago | 18 POL | ||||
36021911 | 744 days ago | 2 POL | ||||
35902858 | 747 days ago | 18 POL | ||||
35902858 | 747 days ago | 2 POL | ||||
35837352 | 748 days ago | 18 POL | ||||
35837352 | 748 days ago | 2 POL | ||||
35821253 | 749 days ago | 18 POL |
Loading...
Loading
Contract Name:
RicharlisonConvocado
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-11-19 */ // File: @openzeppelin/[email protected]/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee 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. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ abstract contract ERC721A is Context, ERC165, IERC721 { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary 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 { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId, string memory baseExtension) public view virtual returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); if (_exists(tokenId)) return string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension)); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension)) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ 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 (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, 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. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @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. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) public { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is 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 { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) public returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @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 {} } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: RicharlisonConvocado.sol pragma solidity 0.8.4; pragma abicoder v2; contract RicharlisonConvocado is ERC721A, Ownable { using Address for address; using Strings for uint256; bytes32 public root; bytes32[] public merkleProof; mapping(address => bool) public whitelistClaimed; string private baseURI; //Deve ser a URL do json do pinata: string private baseExtension = ".json"; string private notRevealedUri = ""; uint256 private maxSupply = 104; uint256 private maxMintAmount = 5; uint256 private FreeMintPerAddressLimit = 1; bool private paused = false; bool private onlyWhitelisted = false; address[] public whitelistedAddresses; mapping(address => uint256) private addressMintedBalance; mapping(uint256 => uint) private _availableTokens; uint256 private _numAvailableTokens; string private _contractUri; address _contractOwner; mapping (address => bool) private _affiliates; bool private _allowAffiliateProgram = true; uint private _affiliateProgramPercentage = 15; bool private _allowRecommendation = true; uint256 private _recommendationPercentage = 10; uint256 private _royalties = 10; uint256 private nftWhitelistDiscount = 14; address private wMobiup = 0x2919771f951fd264445d4D4c682EE5D8326B93ec; mapping(address => uint256) private _addressLastMintedTokenId; bool private _isFreeMint = false; uint256 private _nftEtherValue = 20000000000000000000; event _transferSend(address _from, address _to, uint _amount); constructor( string memory _initBaseURI, bytes32 _root, string memory _contractURI ) ERC721A("Richarlison Convocado", "RCHCONVOCADO") { setBaseURI(_initBaseURI); root = _root; _contractUri = _contractURI; _contractOwner = msg.sender; } function isValid(bytes32[] memory proof, bytes32 leaf) public view returns (bool) { return MerkleProof.verify(proof, root, leaf); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setFreeMintPerAddressLimit(uint256 _limit) public onlyOwner { FreeMintPerAddressLimit = _limit; } function setOnlyWhitelisted(bool _state) public onlyOwner { onlyWhitelisted = _state; } function isOnlyWhitelist() public view returns (bool) { return onlyWhitelisted; } function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner { maxMintAmount = _maxMintAmount; } function pause(bool _state) public onlyOwner { paused = _state; } function setAllowAffiliateProgram(bool _state) public onlyOwner { _allowAffiliateProgram = _state; } function setAffiliateProgramPercentage(uint256 percentage) public onlyOwner { _affiliateProgramPercentage = percentage; } function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function setMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function setNftEtherValue(uint256 nftEtherValue) public onlyOwner { _nftEtherValue = nftEtherValue; } function setAffiliate(address manager, bool state) public onlyOwner { _affiliates[manager] = state; } function setIsFreeMint(bool state) public onlyOwner { _isFreeMint = state; } function getQtdAvailableTokens() public view returns (uint256) { if(_numAvailableTokens > 0) { return _numAvailableTokens; } return maxSupply; } function getMaxSupply() public view returns (uint) { return maxSupply; } function getNftEtherValue(address wallet, bytes32[] memory proof) public view returns (uint) { if( isValid( proof, keccak256( abi.encodePacked(wallet) ) ) ) { if (whitelistClaimed[wallet]) { return _nftEtherValue; } //uint256 amount = _nftEtherValue * nftWhitelistDiscount / 100; //uint256 amountPercent = _nftEtherValue - amount; return _nftEtherValue; } else { return _nftEtherValue; } } function getAddressLastMintedTokenId(address wallet) public view returns (uint256) { return _addressLastMintedTokenId[wallet]; } function getMaxMintAmount() public view returns (uint256) { return maxMintAmount; } function getBalance() public view returns (uint) { return msg.sender.balance; } function getBaseURI() public view returns (string memory) { return baseURI; } function getNFTURI(uint256 tokenId) public view returns(string memory){ return string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension)); } function isAffliliated(address wallet) public view returns (bool) { return _affiliates[wallet]; } function contractIsFreeMint() public view returns (bool) { return _isFreeMint; } function isPaused() public view returns (bool) { return paused; } function isWhitelisted(address _user, bytes32[] memory proof) public view returns (bool) { if( isValid( proof, keccak256( abi.encodePacked(_user) ) ) ) { if (whitelistClaimed[_user]) { return false; } return true; } else { return false; } } function mint( uint256 _mintAmount, address payable _recommendedBy, uint256 _indicationType, //1=directlink, 2=affiliate, 3=recomendation address payable endUser, bytes32[] memory proof ) public payable { require(!paused, "O contrato pausado"); uint256 supply = totalSupply(); require(_mintAmount > 0, "Precisa mintar pelo menos 1 NFT"); require(_mintAmount + balanceOf(endUser) <= maxMintAmount, "Quantidade limite de mint por carteira excedida"); require(supply + _mintAmount <= maxSupply, "Quantidade limite de NFT excedida"); if(onlyWhitelisted) { require(!whitelistClaimed[endUser], "Address ja reivindicado"); require(isValid(proof, keccak256(abi.encodePacked(endUser))), "Nao faz parte da Whitelist"); } if(_indicationType == 2) { require(_allowAffiliateProgram, "No momento o programa de afiliados se encontra desativado"); } if(!_isFreeMint ) { if(!isValid(proof, keccak256(abi.encodePacked(endUser)))) { split(_mintAmount, _recommendedBy, _indicationType, proof); } else { uint tokensIds = walletOfOwner(endUser); if(tokensIds > 0){ split(_mintAmount, _recommendedBy, _indicationType, proof); } } } uint256 updatedNumAvailableTokens = maxSupply - totalSupply(); for (uint256 i = 1; i <= _mintAmount; i++) { addressMintedBalance[endUser]++; _safeMint(endUser, 1); uint256 newIdToken = supply + 1; tokenURI(newIdToken); --updatedNumAvailableTokens; _addressLastMintedTokenId[endUser] = i; } if (onlyWhitelisted) { whitelistClaimed[endUser] = true; } _numAvailableTokens = updatedNumAvailableTokens; } function contractURI() external view returns (string memory) { return _contractUri; } function setContractURI(string memory contractURI_) external onlyOwner { _contractUri = contractURI_; } function tokenURI(uint256 tokenId) public view virtual returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } function walletOfOwner(address _owner) public view returns (uint) { return addressMintedBalance[_owner]; } function split(uint256 _mintAmount, address payable _recommendedBy, uint256 _indicationType, bytes32[] memory proof) public payable { uint256 _nftEtherValueTemp = _nftEtherValue; if( isValid( proof, keccak256( abi.encodePacked(msg.sender) ) ) ) { if (whitelistClaimed[msg.sender]) { _nftEtherValueTemp = _nftEtherValue; } //uint256 amount = _nftEtherValue * nftWhitelistDiscount / 100; //uint256 amountPercent = _nftEtherValue - amount; _nftEtherValueTemp = _nftEtherValue; } else { _nftEtherValueTemp = _nftEtherValue; } require(msg.value >= (_nftEtherValueTemp * _mintAmount), "Valor da mintagem diferente do valor definido no contrato"); uint ownerAmount = msg.value; if(_indicationType > 1) { uint256 _splitPercentage = _recommendationPercentage; if(_indicationType == 2 && _allowAffiliateProgram) { if( _affiliates[_recommendedBy] ) { _splitPercentage = _affiliateProgramPercentage; } } uint256 amount = msg.value * _splitPercentage / 100; ownerAmount = msg.value - amount; emit _transferSend(msg.sender, _recommendedBy, amount); _recommendedBy.transfer(amount); } uint256 _splitPercentageM = _royalties; uint256 amountM = msg.value * _splitPercentageM / 100; payable(wMobiup).transfer(amountM); ownerAmount = msg.value - amountM; payable(_contractOwner).transfer(ownerAmount); } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } emit Transfer(from, to, tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_transferSend","type":"event"},{"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":"_checkContractOnERC721Received","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractIsFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getAddressLastMintedTokenId","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":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNFTURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"getNftEtherValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQtdAvailableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isAffliliated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isOnlyWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleProof","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address payable","name":"_recommendedBy","type":"address"},{"internalType":"uint256","name":"_indicationType","type":"uint256"},{"internalType":"address payable","name":"endUser","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setAffiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setAffiliateProgramPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setAllowAffiliateProgram","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeMintPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setIsFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftEtherValue","type":"uint256"}],"name":"setNftEtherValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address payable","name":"_recommendedBy","type":"address"},{"internalType":"uint256","name":"_indicationType","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"split","outputs":[],"stateMutability":"payable","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"},{"internalType":"string","name":"baseExtension","type":"string"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d908051906020019062000051929190620004c8565b5060405180602001604052806000815250600e908051906020019062000079929190620004c8565b506068600f55600560105560016011556000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055506001601a60006101000a81548160ff021916908315150217905550600f601b556001601c60006101000a81548160ff021916908315150217905550600a601d55600a601e55600e601f55732919771f951fd264445d4d4c682ee5d8326b93ec602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000602260006101000a81548160ff0219169083151502179055506801158e460913d000006023553480156200019357600080fd5b506040516200599c3803806200599c8339818101604052810190620001b9919062000601565b6040518060400160405280601581526020017f5269636861726c69736f6e20436f6e766f6361646f00000000000000000000008152506040518060400160405280600c81526020017f524348434f4e564f4341444f000000000000000000000000000000000000000081525081600290805190602001906200023d929190620004c8565b50806003908051906020019062000256929190620004c8565b50620002676200030a60201b60201c565b60008190555050506200028f620002836200031360201b60201c565b6200031b60201b60201c565b620002a083620003e160201b60201c565b816009819055508060179080519060200190620002bf929190620004c8565b5033601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620008a0565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003f16200040d60201b60201c565b80600c908051906020019062000409929190620004c8565b5050565b6200041d6200031360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004436200049e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200049c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049390620006b0565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004d69062000782565b90600052602060002090601f016020900481019282620004fa576000855562000546565b82601f106200051557805160ff191683800117855562000546565b8280016001018555821562000546579182015b828111156200054557825182559160200191906001019062000528565b5b50905062000555919062000559565b5090565b5b80821115620005745760008160009055506001016200055a565b5090565b60006200058f6200058984620006fb565b620006d2565b905082815260208101848484011115620005a857600080fd5b620005b58482856200074c565b509392505050565b600081519050620005ce8162000886565b92915050565b600082601f830112620005e657600080fd5b8151620005f884826020860162000578565b91505092915050565b6000806000606084860312156200061757600080fd5b600084015167ffffffffffffffff8111156200063257600080fd5b6200064086828701620005d4565b93505060206200065386828701620005bd565b925050604084015167ffffffffffffffff8111156200067157600080fd5b6200067f86828701620005d4565b9150509250925092565b60006200069860208362000731565b9150620006a5826200085d565b602082019050919050565b60006020820190508181036000830152620006cb8162000689565b9050919050565b6000620006de620006f1565b9050620006ec8282620007b8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200071957620007186200081d565b5b62000724826200084c565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b838110156200076c5780820151818401526020810190506200074f565b838111156200077c576000848401525b50505050565b600060028204905060018216806200079b57607f821691505b60208210811415620007b257620007b1620007ee565b5b50919050565b620007c3826200084c565b810181811067ffffffffffffffff82111715620007e557620007e46200081d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620008918162000742565b81146200089d57600080fd5b50565b6150ec80620008b06000396000f3fe60806040526004361061034f5760003560e01c806370a08231116101c6578063b4ed16b3116100f7578063db4bec4411610095578063ebf0c7171161006f578063ebf0c71714610ca2578063ef5d87d714610ccd578063f2fde38b14610cf6578063fa9a309d14610d1f5761034f565b8063db4bec4414610bfd578063e8a3d48514610c3a578063e985e9c514610c655761034f565b8063ba4e5c49116100d1578063ba4e5c4914610b1b578063c87b56dd14610b58578063d6e7b8e414610b95578063d88343e214610bc05761034f565b8063b4ed16b314610a8a578063b88d4fde14610ab5578063b8a20ed014610ade5761034f565b80639293237d1161016457806395d89b411161013e57806395d89b41146109ce5780639b0e665d146109f9578063a22cb46514610a36578063b187bd2614610a5f5761034f565b80639293237d14610960578063938e3d7b1461097c57806394cf4b6a146109a55761034f565b806377dbd17f116101a057806377dbd17f146108b35780638863ebbb146108f05780638c584664146109195780638da5cb5b146109355761034f565b806370a0823114610834578063714c539814610871578063715018a61461089c5761034f565b80633ccfd60b116102a057806355f804b31161023e5780636c21fb00116102185780636c21fb001461077a5780636e17f797146107b75780636f50c93c146107e05780636f8b44b01461080b5761034f565b806355f804b3146106d75780635a23dd99146107005780636352211e1461073d5761034f565b8063438b63001161027a578063438b63001461061b578063474c68ec146106585780634c0f38c2146106815780634fc9f84a146106ac5761034f565b80633ccfd60b146105ab57806341dcf454146105b557806342842e0e146105f25761034f565b8063088a4ed01161030d57806318160ddd116102e757806318160ddd1461050557806323b872dd1461053057806330e0789e146105595780633c952764146105825761034f565b8063088a4ed014610488578063095ea7b3146104b157806312065fe0146104da5761034f565b8062621fda1461035457806301ffc9a71461039157806302329a29146103ce57806306fdde03146103f7578063081812fc14610422578063081818161461045f575b600080fd5b34801561036057600080fd5b5061037b60048036038101906103769190614054565b610d5c565b60405161038891906146cc565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613fc1565b610d93565b6040516103c59190614696565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613f98565b610e75565b005b34801561040357600080fd5b5061040c610e9a565b60405161041991906146cc565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190614054565b610f2c565b60405161045691906145f8565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190614054565b610fa8565b005b34801561049457600080fd5b506104af60048036038101906104aa9190614054565b610fba565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613f08565b610fcc565b005b3480156104e657600080fd5b506104ef6110d7565b6040516104fc919061484e565b60405180910390f35b34801561051157600080fd5b5061051a6110f6565b604051610527919061484e565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613dae565b61110d565b005b34801561056557600080fd5b50610580600480360381019061057b9190613dae565b61111d565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613f98565b6115d3565b005b6105b36115f8565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190614187565b611680565b6040516105e991906146cc565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613dae565b611765565b005b34801561062757600080fd5b50610642600480360381019061063d9190613d49565b611785565b60405161064f919061484e565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a9190614054565b6117ce565b005b34801561068d57600080fd5b506106966117e0565b6040516106a3919061484e565b60405180910390f35b3480156106b857600080fd5b506106c16117ea565b6040516106ce9190614696565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190614013565b611801565b005b34801561070c57600080fd5b5061072760048036038101906107229190613e78565b611823565b6040516107349190614696565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190614054565b6118c9565b60405161077191906145f8565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c9190613d49565b6118df565b6040516107ae919061484e565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190614054565b611928565b005b3480156107ec57600080fd5b506107f561193a565b6040516108029190614696565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190614054565b611951565b005b34801561084057600080fd5b5061085b60048036038101906108569190613d49565b611963565b604051610868919061484e565b60405180910390f35b34801561087d57600080fd5b50610886611a33565b60405161089391906146cc565b60405180910390f35b3480156108a857600080fd5b506108b1611ac5565b005b3480156108bf57600080fd5b506108da60048036038101906108d59190613e78565b611ad9565b6040516108e7919061484e565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190613ecc565b611b82565b005b610933600480360381019061092e919061410c565b611be5565b005b34801561094157600080fd5b5061094a611f22565b60405161095791906145f8565b60405180910390f35b61097a6004803603810190610975919061407d565b611f4c565b005b34801561098857600080fd5b506109a3600480360381019061099e9190614013565b612402565b005b3480156109b157600080fd5b506109cc60048036038101906109c79190613f98565b612424565b005b3480156109da57600080fd5b506109e3612449565b6040516109f091906146cc565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190613d49565b6124db565b604051610a2d9190614696565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190613ecc565b612531565b005b348015610a6b57600080fd5b50610a746126a9565b604051610a819190614696565b60405180910390f35b348015610a9657600080fd5b50610a9f6126c0565b604051610aac919061484e565b60405180910390f35b348015610ac157600080fd5b50610adc6004803603810190610ad79190613dfd565b6126df565b005b348015610aea57600080fd5b50610b056004803603810190610b009190613f44565b6127b6565b604051610b129190614696565b60405180910390f35b348015610b2757600080fd5b50610b426004803603810190610b3d9190614054565b6127cd565b604051610b4f91906145f8565b60405180910390f35b348015610b6457600080fd5b50610b7f6004803603810190610b7a9190614054565b61280c565b604051610b8c91906146cc565b60405180910390f35b348015610ba157600080fd5b50610baa6128b6565b604051610bb7919061484e565b60405180910390f35b348015610bcc57600080fd5b50610be76004803603810190610be29190613dfd565b6128c0565b604051610bf49190614696565b60405180910390f35b348015610c0957600080fd5b50610c246004803603810190610c1f9190613d49565b612a20565b604051610c319190614696565b60405180910390f35b348015610c4657600080fd5b50610c4f612a40565b604051610c5c91906146cc565b60405180910390f35b348015610c7157600080fd5b50610c8c6004803603810190610c879190613d72565b612ad2565b604051610c999190614696565b60405180910390f35b348015610cae57600080fd5b50610cb7612b66565b604051610cc491906146b1565b60405180910390f35b348015610cd957600080fd5b50610cf46004803603810190610cef9190613f98565b612b6c565b005b348015610d0257600080fd5b50610d1d6004803603810190610d189190613d49565b612b91565b005b348015610d2b57600080fd5b50610d466004803603810190610d419190614054565b612c15565b604051610d5391906146b1565b60405180910390f35b6060600c610d6983612c39565b600d604051602001610d7d939291906145b2565b6040516020818303038152906040529050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e5e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e6e5750610e6d82612d5d565b5b9050919050565b610e7d612dc7565b80601260006101000a81548160ff02191690831515021790555050565b606060028054610ea990614bc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed590614bc6565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b5050505050905090565b6000610f3782612e45565b610f6d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fb0612dc7565b8060118190555050565b610fc2612dc7565b8060108190555050565b6000610fd7826118c9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661105e612e93565b73ffffffffffffffffffffffffffffffffffffffff1614158015611090575061108e81611089612e93565b612ad2565b155b156110c7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d2838383612e9b565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff1631905090565b6000611100612f4d565b6001546000540303905090565b61111883838361111d565b505050565b600061112882612f56565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611193576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166111b4612e93565b73ffffffffffffffffffffffffffffffffffffffff1614806111e357506111e2856111dd612e93565b612ad2565b5b8061122857506111f1612e93565b73ffffffffffffffffffffffffffffffffffffffff1661121084610f2c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611261576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156112c8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112d585858560016131e5565b6112e160008487612e9b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561156157600054821461156057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115cc85858560016131eb565b5050505050565b6115db612dc7565b80601260016101000a81548160ff02191690831515021790555050565b611600612dc7565b600061160a611f22565b73ffffffffffffffffffffffffffffffffffffffff164760405161162d906145e3565b60006040518083038185875af1925050503d806000811461166a576040519150601f19603f3d011682016040523d82523d6000602084013e61166f565b606091505b505090508061167d57600080fd5b50565b606061168b83612e45565b6116c1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116cb6131f1565b90506116d684612e45565b1561170f57806116e585612c39565b846040516020016116f893929190614550565b60405160208183030381529060405291505061175f565b60008151141561172e576040518060200160405280600081525061175b565b8061173885612c39565b8460405160200161174b93929190614550565b6040516020818303038152906040525b9150505b92915050565b611780838383604051806020016040528060008152506126df565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117d6612dc7565b80601b8190555050565b6000600f54905090565b6000602260009054906101000a900460ff16905090565b611809612dc7565b80600c908051906020019061181f929190613a6a565b5050565b6000611855828460405160200161183a919061451a565b604051602081830303815290604052805190602001206127b6565b156118be57600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118b557600090506118c3565b600190506118c3565b600090505b92915050565b60006118d482612f56565b600001519050919050565b6000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611930612dc7565b8060238190555050565b6000601260019054906101000a900460ff16905090565b611959612dc7565b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060600c8054611a4290614bc6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6e90614bc6565b8015611abb5780601f10611a9057610100808354040283529160200191611abb565b820191906000526020600020905b815481529060010190602001808311611a9e57829003601f168201915b5050505050905090565b611acd612dc7565b611ad76000613283565b565b6000611b0b8284604051602001611af0919061451a565b604051602081830303815290604052805190602001206127b6565b15611b7657600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b6c576023549050611b7c565b6023549050611b7c565b60235490505b92915050565b611b8a612dc7565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006023549050611c1c8233604051602001611c01919061451a565b604051602081830303815290604052805190602001206127b6565b15611c8357600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c795760235490505b6023549050611c89565b60235490505b8481611c959190614a06565b341015611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce9061476e565b60405180910390fd5b60003490506001841115611e15576000601d549050600285148015611d085750601a60009054906101000a900460ff165b15611d6657601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d6557601b5490505b5b600060648234611d769190614a06565b611d8091906149d5565b90508034611d8e9190614a60565b92507ff70a742b6ec5de639ce8e8d0df10a44a88c323ac660a09f1fc0c190e830aea74338883604051611dc393929190614613565b60405180910390a18673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e11573d6000803e3d6000fd5b5050505b6000601e549050600060648234611e2c9190614a06565b611e3691906149d5565b9050602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611ea0573d6000803e3d6000fd5b508034611ead9190614a60565b9250601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611f17573d6000803e3d6000fd5b505050505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900460ff1615611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f939061474e565b60405180910390fd5b6000611fa66110f6565b905060008611611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe2906147ce565b60405180910390fd5b601054611ff784611963565b87612002919061497f565b1115612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a9061472e565b60405180910390fd5b600f548682612052919061497f565b1115612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a9061480e565b60405180910390fd5b601260019054906101000a900460ff16156121a557600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c9061470e565b60405180910390fd5b612165828460405160200161214a9190614535565b604051602081830303815290604052805190602001206127b6565b6121a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219b9061482e565b60405180910390fd5b5b60028414156121fe57601a60009054906101000a900460ff166121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f4906147ee565b60405180910390fd5b5b602260009054906101000a900460ff1661227d5761224282846040516020016122279190614535565b604051602081830303815290604052805190602001206127b6565b6122575761225286868685611be5565b61227c565b600061226284611785565b9050600081111561227a5761227987878786611be5565b5b505b5b60006122876110f6565b600f546122949190614a60565b90506000600190505b87811161238357601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906122f490614c29565b9190505550612304856001613349565b6000600184612313919061497f565b905061231e8161280c565b508261232990614b9c565b925081602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050808061237b90614c29565b91505061229d565b50601260019054906101000a900460ff16156123f2576001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8060168190555050505050505050565b61240a612dc7565b8060179080519060200190612420929190613a6a565b5050565b61242c612dc7565b80601a60006101000a81548160ff02191690831515021790555050565b60606003805461245890614bc6565b80601f016020809104026020016040519081016040528092919081815260200182805461248490614bc6565b80156124d15780601f106124a6576101008083540402835291602001916124d1565b820191906000526020600020905b8154815290600101906020018083116124b457829003601f168201915b5050505050905090565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612539612e93565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561259e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006125ab612e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612658612e93565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161269d9190614696565b60405180910390a35050565b6000601260009054906101000a900460ff16905090565b60008060165411156126d65760165490506126dc565b600f5490505b90565b6126ea84848461111d565b6127098373ffffffffffffffffffffffffffffffffffffffff16613367565b801561271e575061271c848484846128c0565b155b15612755576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60006127c5836009548461338a565b905092915050565b601381815481106127dd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061281782612e45565b612856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d906147ae565b60405180910390fd5b60006128606131f1565b9050600081511161288057604051806020016040528060008152506128ae565b8061288a84612c39565b600d60405160200161289e93929190614581565b6040516020818303038152906040525b915050919050565b6000601054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128e6612e93565b8786866040518563ffffffff1660e01b8152600401612908949392919061464a565b602060405180830381600087803b15801561292257600080fd5b505af192505050801561295357506040513d601f19601f820116820180604052508101906129509190613fea565b60015b6129cd573d8060008114612983576040519150601f19603f3d011682016040523d82523d6000602084013e612988565b606091505b506000815114156129c5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b606060178054612a4f90614bc6565b80601f0160208091040260200160405190810160405280929190818152602001828054612a7b90614bc6565b8015612ac85780601f10612a9d57610100808354040283529160200191612ac8565b820191906000526020600020905b815481529060010190602001808311612aab57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b612b74612dc7565b80602260006101000a81548160ff02191690831515021790555050565b612b99612dc7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c00906146ee565b60405180910390fd5b612c1281613283565b50565b600a8181548110612c2557600080fd5b906000526020600020016000915090505481565b606060006001612c48846133a1565b01905060008167ffffffffffffffff811115612c8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612cbf5781602001600182028036833780820191505090505b509050600082602001820190505b600115612d52578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612d3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0494506000851415612d4d57612d52565b612ccd565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dcf612e93565b73ffffffffffffffffffffffffffffffffffffffff16612ded611f22565b73ffffffffffffffffffffffffffffffffffffffff1614612e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3a9061478e565b60405180910390fd5b565b600081612e50612f4d565b11158015612e5f575060005482105b8015612e8c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b612f5e613af0565b600082905080612f6c612f4d565b11158015612f7b575060005481105b156131ae576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516131ac57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130905780925050506131e0565b5b6001156131ab57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131a65780925050506131e0565b613091565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b50505050565b50505050565b6060600c805461320090614bc6565b80601f016020809104026020016040519081016040528092919081815260200182805461322c90614bc6565b80156132795780601f1061324e57610100808354040283529160200191613279565b820191906000526020600020905b81548152906001019060200180831161325c57829003601f168201915b5050505050905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6133638282604051806020016040528060008152506135d8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008261339785846135ea565b1490509392505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613425577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161341b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613488576d04ee2d6d415b85acef8100000000838161347e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506020810190505b662386f26fc1000083106134dd57662386f26fc1000083816134d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506010810190505b6305f5e100831061352c576305f5e1008381613522577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506008810190505b612710831061357757612710838161356d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506004810190505b606483106135c057606483816135b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506002810190505b600a83106135cf576001810190505b80915050919050565b6135e58383836001613685565b505050565b60008082905060005b845181101561367a576000858281518110613637577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613659576136528382613a53565b9250613666565b6136638184613a53565b92505b50808061367290614c29565b9150506135f3565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136f2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561372d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61373a60008683876131e5565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561390457506139038773ffffffffffffffffffffffffffffffffffffffff16613367565b5b156139ca575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461397960008884806001019550886128c0565b6139af576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561390a5782600054146139c557600080fd5b613a36565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156139cb575b816000819055505050613a4c60008683876131eb565b5050505050565b600082600052816020526040600020905092915050565b828054613a7690614bc6565b90600052602060002090601f016020900481019282613a985760008555613adf565b82601f10613ab157805160ff1916838001178555613adf565b82800160010185558215613adf579182015b82811115613ade578251825591602001919060010190613ac3565b5b509050613aec9190613b33565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613b4c576000816000905550600101613b34565b5090565b6000613b63613b5e8461488e565b614869565b90508083825260208201905082856020860282011115613b8257600080fd5b60005b85811015613bb25781613b988882613ca1565b845260208401935060208301925050600181019050613b85565b5050509392505050565b6000613bcf613bca846148ba565b614869565b905082815260208101848484011115613be757600080fd5b613bf2848285614b5a565b509392505050565b6000613c0d613c08846148eb565b614869565b905082815260208101848484011115613c2557600080fd5b613c30848285614b5a565b509392505050565b600081359050613c478161502c565b92915050565b600081359050613c5c81615043565b92915050565b600082601f830112613c7357600080fd5b8135613c83848260208601613b50565b91505092915050565b600081359050613c9b8161505a565b92915050565b600081359050613cb081615071565b92915050565b600081359050613cc581615088565b92915050565b600081519050613cda81615088565b92915050565b600082601f830112613cf157600080fd5b8135613d01848260208601613bbc565b91505092915050565b600082601f830112613d1b57600080fd5b8135613d2b848260208601613bfa565b91505092915050565b600081359050613d438161509f565b92915050565b600060208284031215613d5b57600080fd5b6000613d6984828501613c38565b91505092915050565b60008060408385031215613d8557600080fd5b6000613d9385828601613c38565b9250506020613da485828601613c38565b9150509250929050565b600080600060608486031215613dc357600080fd5b6000613dd186828701613c38565b9350506020613de286828701613c38565b9250506040613df386828701613d34565b9150509250925092565b60008060008060808587031215613e1357600080fd5b6000613e2187828801613c38565b9450506020613e3287828801613c38565b9350506040613e4387828801613d34565b925050606085013567ffffffffffffffff811115613e6057600080fd5b613e6c87828801613ce0565b91505092959194509250565b60008060408385031215613e8b57600080fd5b6000613e9985828601613c38565b925050602083013567ffffffffffffffff811115613eb657600080fd5b613ec285828601613c62565b9150509250929050565b60008060408385031215613edf57600080fd5b6000613eed85828601613c38565b9250506020613efe85828601613c8c565b9150509250929050565b60008060408385031215613f1b57600080fd5b6000613f2985828601613c38565b9250506020613f3a85828601613d34565b9150509250929050565b60008060408385031215613f5757600080fd5b600083013567ffffffffffffffff811115613f7157600080fd5b613f7d85828601613c62565b9250506020613f8e85828601613ca1565b9150509250929050565b600060208284031215613faa57600080fd5b6000613fb884828501613c8c565b91505092915050565b600060208284031215613fd357600080fd5b6000613fe184828501613cb6565b91505092915050565b600060208284031215613ffc57600080fd5b600061400a84828501613ccb565b91505092915050565b60006020828403121561402557600080fd5b600082013567ffffffffffffffff81111561403f57600080fd5b61404b84828501613d0a565b91505092915050565b60006020828403121561406657600080fd5b600061407484828501613d34565b91505092915050565b600080600080600060a0868803121561409557600080fd5b60006140a388828901613d34565b95505060206140b488828901613c4d565b94505060406140c588828901613d34565b93505060606140d688828901613c4d565b925050608086013567ffffffffffffffff8111156140f357600080fd5b6140ff88828901613c62565b9150509295509295909350565b6000806000806080858703121561412257600080fd5b600061413087828801613d34565b945050602061414187828801613c4d565b935050604061415287828801613d34565b925050606085013567ffffffffffffffff81111561416f57600080fd5b61417b87828801613c62565b91505092959194509250565b6000806040838503121561419a57600080fd5b60006141a885828601613d34565b925050602083013567ffffffffffffffff8111156141c557600080fd5b6141d185828601613d0a565b9150509250929050565b6141e481614b24565b82525050565b6141fb6141f682614aa6565b614c84565b82525050565b61420a81614a94565b82525050565b61422161421c82614a94565b614c72565b82525050565b61423081614ab8565b82525050565b61423f81614ac4565b82525050565b600061425082614931565b61425a8185614947565b935061426a818560208601614b69565b61427381614d64565b840191505092915050565b60006142898261493c565b6142938185614963565b93506142a3818560208601614b69565b6142ac81614d64565b840191505092915050565b60006142c28261493c565b6142cc8185614974565b93506142dc818560208601614b69565b80840191505092915050565b600081546142f581614bc6565b6142ff8186614974565b9450600182166000811461431a576001811461432b5761435e565b60ff1983168652818601935061435e565b6143348561491c565b60005b8381101561435657815481890152600182019150602081019050614337565b838801955050505b50505092915050565b6000614374602683614963565b915061437f82614d82565b604082019050919050565b6000614397601783614963565b91506143a282614dd1565b602082019050919050565b60006143ba602f83614963565b91506143c582614dfa565b604082019050919050565b60006143dd601283614963565b91506143e882614e49565b602082019050919050565b6000614400603983614963565b915061440b82614e72565b604082019050919050565b6000614423602083614963565b915061442e82614ec1565b602082019050919050565b6000614446602f83614963565b915061445182614eea565b604082019050919050565b6000614469601f83614963565b915061447482614f39565b602082019050919050565b600061448c600083614958565b915061449782614f62565b600082019050919050565b60006144af603983614963565b91506144ba82614f65565b604082019050919050565b60006144d2602183614963565b91506144dd82614fb4565b604082019050919050565b60006144f5601a83614963565b915061450082615003565b602082019050919050565b61451481614b1a565b82525050565b60006145268284614210565b60148201915081905092915050565b600061454182846141ea565b60148201915081905092915050565b600061455c82866142b7565b915061456882856142b7565b915061457482846142b7565b9150819050949350505050565b600061458d82866142b7565b915061459982856142b7565b91506145a582846142e8565b9150819050949350505050565b60006145be82866142e8565b91506145ca82856142b7565b91506145d682846142e8565b9150819050949350505050565b60006145ee8261447f565b9150819050919050565b600060208201905061460d6000830184614201565b92915050565b60006060820190506146286000830186614201565b61463560208301856141db565b614642604083018461450b565b949350505050565b600060808201905061465f6000830187614201565b61466c6020830186614201565b614679604083018561450b565b818103606083015261468b8184614245565b905095945050505050565b60006020820190506146ab6000830184614227565b92915050565b60006020820190506146c66000830184614236565b92915050565b600060208201905081810360008301526146e6818461427e565b905092915050565b6000602082019050818103600083015261470781614367565b9050919050565b600060208201905081810360008301526147278161438a565b9050919050565b60006020820190508181036000830152614747816143ad565b9050919050565b60006020820190508181036000830152614767816143d0565b9050919050565b60006020820190508181036000830152614787816143f3565b9050919050565b600060208201905081810360008301526147a781614416565b9050919050565b600060208201905081810360008301526147c781614439565b9050919050565b600060208201905081810360008301526147e78161445c565b9050919050565b60006020820190508181036000830152614807816144a2565b9050919050565b60006020820190508181036000830152614827816144c5565b9050919050565b60006020820190508181036000830152614847816144e8565b9050919050565b6000602082019050614863600083018461450b565b92915050565b6000614873614884565b905061487f8282614bf8565b919050565b6000604051905090565b600067ffffffffffffffff8211156148a9576148a8614d35565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148d5576148d4614d35565b5b6148de82614d64565b9050602081019050919050565b600067ffffffffffffffff82111561490657614905614d35565b5b61490f82614d64565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061498a82614b1a565b915061499583614b1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149ca576149c9614ca8565b5b828201905092915050565b60006149e082614b1a565b91506149eb83614b1a565b9250826149fb576149fa614cd7565b5b828204905092915050565b6000614a1182614b1a565b9150614a1c83614b1a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a5557614a54614ca8565b5b828202905092915050565b6000614a6b82614b1a565b9150614a7683614b1a565b925082821015614a8957614a88614ca8565b5b828203905092915050565b6000614a9f82614afa565b9050919050565b6000614ab182614afa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614b2f82614b36565b9050919050565b6000614b4182614b48565b9050919050565b6000614b5382614afa565b9050919050565b82818337600083830152505050565b60005b83811015614b87578082015181840152602081019050614b6c565b83811115614b96576000848401525b50505050565b6000614ba782614b1a565b91506000821415614bbb57614bba614ca8565b5b600182039050919050565b60006002820490506001821680614bde57607f821691505b60208210811415614bf257614bf1614d06565b5b50919050565b614c0182614d64565b810181811067ffffffffffffffff82111715614c2057614c1f614d35565b5b80604052505050565b6000614c3482614b1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c6757614c66614ca8565b5b600182019050919050565b6000614c7d82614c96565b9050919050565b6000614c8f82614c96565b9050919050565b6000614ca182614d75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206a612072656976696e64696361646f000000000000000000600082015250565b7f5175616e746964616465206c696d697465206465206d696e7420706f7220636160008201527f7274656972612065786365646964610000000000000000000000000000000000602082015250565b7f4f20636f6e747261746f207061757361646f0000000000000000000000000000600082015250565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f00000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e465400600082015250565b50565b7f4e6f206d6f6d656e746f206f2070726f6772616d61206465206166696c69616460008201527f6f7320736520656e636f6e747261206465736174697661646f00000000000000602082015250565b7f5175616e746964616465206c696d697465206465204e4654206578636564696460008201527f6100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e616f2066617a2070617274652064612057686974656c697374000000000000600082015250565b61503581614a94565b811461504057600080fd5b50565b61504c81614aa6565b811461505757600080fd5b50565b61506381614ab8565b811461506e57600080fd5b50565b61507a81614ac4565b811461508557600080fd5b50565b61509181614ace565b811461509c57600080fd5b50565b6150a881614b1a565b81146150b357600080fd5b5056fea2646970667358221220fbc8a6bd5b1aa83d01514a198734ff2f963e7274e27667918cc65307550ee2ec64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000608fef5c34dfb341823e14d8284c0cbad14956e40601f76ba0921f448ac232d4f500000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d6561664463747538543173774742573664796d4c59574d6d56755a727575424d5379584c52674b4c557465442f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d5555506d4644487256757476454b4657755a33716f6774476141324c4e696b36755a374d734e7a556d4736680000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061034f5760003560e01c806370a08231116101c6578063b4ed16b3116100f7578063db4bec4411610095578063ebf0c7171161006f578063ebf0c71714610ca2578063ef5d87d714610ccd578063f2fde38b14610cf6578063fa9a309d14610d1f5761034f565b8063db4bec4414610bfd578063e8a3d48514610c3a578063e985e9c514610c655761034f565b8063ba4e5c49116100d1578063ba4e5c4914610b1b578063c87b56dd14610b58578063d6e7b8e414610b95578063d88343e214610bc05761034f565b8063b4ed16b314610a8a578063b88d4fde14610ab5578063b8a20ed014610ade5761034f565b80639293237d1161016457806395d89b411161013e57806395d89b41146109ce5780639b0e665d146109f9578063a22cb46514610a36578063b187bd2614610a5f5761034f565b80639293237d14610960578063938e3d7b1461097c57806394cf4b6a146109a55761034f565b806377dbd17f116101a057806377dbd17f146108b35780638863ebbb146108f05780638c584664146109195780638da5cb5b146109355761034f565b806370a0823114610834578063714c539814610871578063715018a61461089c5761034f565b80633ccfd60b116102a057806355f804b31161023e5780636c21fb00116102185780636c21fb001461077a5780636e17f797146107b75780636f50c93c146107e05780636f8b44b01461080b5761034f565b806355f804b3146106d75780635a23dd99146107005780636352211e1461073d5761034f565b8063438b63001161027a578063438b63001461061b578063474c68ec146106585780634c0f38c2146106815780634fc9f84a146106ac5761034f565b80633ccfd60b146105ab57806341dcf454146105b557806342842e0e146105f25761034f565b8063088a4ed01161030d57806318160ddd116102e757806318160ddd1461050557806323b872dd1461053057806330e0789e146105595780633c952764146105825761034f565b8063088a4ed014610488578063095ea7b3146104b157806312065fe0146104da5761034f565b8062621fda1461035457806301ffc9a71461039157806302329a29146103ce57806306fdde03146103f7578063081812fc14610422578063081818161461045f575b600080fd5b34801561036057600080fd5b5061037b60048036038101906103769190614054565b610d5c565b60405161038891906146cc565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613fc1565b610d93565b6040516103c59190614696565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613f98565b610e75565b005b34801561040357600080fd5b5061040c610e9a565b60405161041991906146cc565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190614054565b610f2c565b60405161045691906145f8565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190614054565b610fa8565b005b34801561049457600080fd5b506104af60048036038101906104aa9190614054565b610fba565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613f08565b610fcc565b005b3480156104e657600080fd5b506104ef6110d7565b6040516104fc919061484e565b60405180910390f35b34801561051157600080fd5b5061051a6110f6565b604051610527919061484e565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613dae565b61110d565b005b34801561056557600080fd5b50610580600480360381019061057b9190613dae565b61111d565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613f98565b6115d3565b005b6105b36115f8565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190614187565b611680565b6040516105e991906146cc565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613dae565b611765565b005b34801561062757600080fd5b50610642600480360381019061063d9190613d49565b611785565b60405161064f919061484e565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a9190614054565b6117ce565b005b34801561068d57600080fd5b506106966117e0565b6040516106a3919061484e565b60405180910390f35b3480156106b857600080fd5b506106c16117ea565b6040516106ce9190614696565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190614013565b611801565b005b34801561070c57600080fd5b5061072760048036038101906107229190613e78565b611823565b6040516107349190614696565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190614054565b6118c9565b60405161077191906145f8565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c9190613d49565b6118df565b6040516107ae919061484e565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190614054565b611928565b005b3480156107ec57600080fd5b506107f561193a565b6040516108029190614696565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190614054565b611951565b005b34801561084057600080fd5b5061085b60048036038101906108569190613d49565b611963565b604051610868919061484e565b60405180910390f35b34801561087d57600080fd5b50610886611a33565b60405161089391906146cc565b60405180910390f35b3480156108a857600080fd5b506108b1611ac5565b005b3480156108bf57600080fd5b506108da60048036038101906108d59190613e78565b611ad9565b6040516108e7919061484e565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190613ecc565b611b82565b005b610933600480360381019061092e919061410c565b611be5565b005b34801561094157600080fd5b5061094a611f22565b60405161095791906145f8565b60405180910390f35b61097a6004803603810190610975919061407d565b611f4c565b005b34801561098857600080fd5b506109a3600480360381019061099e9190614013565b612402565b005b3480156109b157600080fd5b506109cc60048036038101906109c79190613f98565b612424565b005b3480156109da57600080fd5b506109e3612449565b6040516109f091906146cc565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190613d49565b6124db565b604051610a2d9190614696565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190613ecc565b612531565b005b348015610a6b57600080fd5b50610a746126a9565b604051610a819190614696565b60405180910390f35b348015610a9657600080fd5b50610a9f6126c0565b604051610aac919061484e565b60405180910390f35b348015610ac157600080fd5b50610adc6004803603810190610ad79190613dfd565b6126df565b005b348015610aea57600080fd5b50610b056004803603810190610b009190613f44565b6127b6565b604051610b129190614696565b60405180910390f35b348015610b2757600080fd5b50610b426004803603810190610b3d9190614054565b6127cd565b604051610b4f91906145f8565b60405180910390f35b348015610b6457600080fd5b50610b7f6004803603810190610b7a9190614054565b61280c565b604051610b8c91906146cc565b60405180910390f35b348015610ba157600080fd5b50610baa6128b6565b604051610bb7919061484e565b60405180910390f35b348015610bcc57600080fd5b50610be76004803603810190610be29190613dfd565b6128c0565b604051610bf49190614696565b60405180910390f35b348015610c0957600080fd5b50610c246004803603810190610c1f9190613d49565b612a20565b604051610c319190614696565b60405180910390f35b348015610c4657600080fd5b50610c4f612a40565b604051610c5c91906146cc565b60405180910390f35b348015610c7157600080fd5b50610c8c6004803603810190610c879190613d72565b612ad2565b604051610c999190614696565b60405180910390f35b348015610cae57600080fd5b50610cb7612b66565b604051610cc491906146b1565b60405180910390f35b348015610cd957600080fd5b50610cf46004803603810190610cef9190613f98565b612b6c565b005b348015610d0257600080fd5b50610d1d6004803603810190610d189190613d49565b612b91565b005b348015610d2b57600080fd5b50610d466004803603810190610d419190614054565b612c15565b604051610d5391906146b1565b60405180910390f35b6060600c610d6983612c39565b600d604051602001610d7d939291906145b2565b6040516020818303038152906040529050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e5e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e6e5750610e6d82612d5d565b5b9050919050565b610e7d612dc7565b80601260006101000a81548160ff02191690831515021790555050565b606060028054610ea990614bc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed590614bc6565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b5050505050905090565b6000610f3782612e45565b610f6d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fb0612dc7565b8060118190555050565b610fc2612dc7565b8060108190555050565b6000610fd7826118c9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661105e612e93565b73ffffffffffffffffffffffffffffffffffffffff1614158015611090575061108e81611089612e93565b612ad2565b155b156110c7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d2838383612e9b565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff1631905090565b6000611100612f4d565b6001546000540303905090565b61111883838361111d565b505050565b600061112882612f56565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611193576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166111b4612e93565b73ffffffffffffffffffffffffffffffffffffffff1614806111e357506111e2856111dd612e93565b612ad2565b5b8061122857506111f1612e93565b73ffffffffffffffffffffffffffffffffffffffff1661121084610f2c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611261576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156112c8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112d585858560016131e5565b6112e160008487612e9b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561156157600054821461156057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115cc85858560016131eb565b5050505050565b6115db612dc7565b80601260016101000a81548160ff02191690831515021790555050565b611600612dc7565b600061160a611f22565b73ffffffffffffffffffffffffffffffffffffffff164760405161162d906145e3565b60006040518083038185875af1925050503d806000811461166a576040519150601f19603f3d011682016040523d82523d6000602084013e61166f565b606091505b505090508061167d57600080fd5b50565b606061168b83612e45565b6116c1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116cb6131f1565b90506116d684612e45565b1561170f57806116e585612c39565b846040516020016116f893929190614550565b60405160208183030381529060405291505061175f565b60008151141561172e576040518060200160405280600081525061175b565b8061173885612c39565b8460405160200161174b93929190614550565b6040516020818303038152906040525b9150505b92915050565b611780838383604051806020016040528060008152506126df565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117d6612dc7565b80601b8190555050565b6000600f54905090565b6000602260009054906101000a900460ff16905090565b611809612dc7565b80600c908051906020019061181f929190613a6a565b5050565b6000611855828460405160200161183a919061451a565b604051602081830303815290604052805190602001206127b6565b156118be57600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118b557600090506118c3565b600190506118c3565b600090505b92915050565b60006118d482612f56565b600001519050919050565b6000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611930612dc7565b8060238190555050565b6000601260019054906101000a900460ff16905090565b611959612dc7565b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060600c8054611a4290614bc6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6e90614bc6565b8015611abb5780601f10611a9057610100808354040283529160200191611abb565b820191906000526020600020905b815481529060010190602001808311611a9e57829003601f168201915b5050505050905090565b611acd612dc7565b611ad76000613283565b565b6000611b0b8284604051602001611af0919061451a565b604051602081830303815290604052805190602001206127b6565b15611b7657600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b6c576023549050611b7c565b6023549050611b7c565b60235490505b92915050565b611b8a612dc7565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006023549050611c1c8233604051602001611c01919061451a565b604051602081830303815290604052805190602001206127b6565b15611c8357600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c795760235490505b6023549050611c89565b60235490505b8481611c959190614a06565b341015611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce9061476e565b60405180910390fd5b60003490506001841115611e15576000601d549050600285148015611d085750601a60009054906101000a900460ff165b15611d6657601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d6557601b5490505b5b600060648234611d769190614a06565b611d8091906149d5565b90508034611d8e9190614a60565b92507ff70a742b6ec5de639ce8e8d0df10a44a88c323ac660a09f1fc0c190e830aea74338883604051611dc393929190614613565b60405180910390a18673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e11573d6000803e3d6000fd5b5050505b6000601e549050600060648234611e2c9190614a06565b611e3691906149d5565b9050602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611ea0573d6000803e3d6000fd5b508034611ead9190614a60565b9250601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611f17573d6000803e3d6000fd5b505050505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900460ff1615611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f939061474e565b60405180910390fd5b6000611fa66110f6565b905060008611611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe2906147ce565b60405180910390fd5b601054611ff784611963565b87612002919061497f565b1115612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a9061472e565b60405180910390fd5b600f548682612052919061497f565b1115612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a9061480e565b60405180910390fd5b601260019054906101000a900460ff16156121a557600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c9061470e565b60405180910390fd5b612165828460405160200161214a9190614535565b604051602081830303815290604052805190602001206127b6565b6121a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219b9061482e565b60405180910390fd5b5b60028414156121fe57601a60009054906101000a900460ff166121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f4906147ee565b60405180910390fd5b5b602260009054906101000a900460ff1661227d5761224282846040516020016122279190614535565b604051602081830303815290604052805190602001206127b6565b6122575761225286868685611be5565b61227c565b600061226284611785565b9050600081111561227a5761227987878786611be5565b5b505b5b60006122876110f6565b600f546122949190614a60565b90506000600190505b87811161238357601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906122f490614c29565b9190505550612304856001613349565b6000600184612313919061497f565b905061231e8161280c565b508261232990614b9c565b925081602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050808061237b90614c29565b91505061229d565b50601260019054906101000a900460ff16156123f2576001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8060168190555050505050505050565b61240a612dc7565b8060179080519060200190612420929190613a6a565b5050565b61242c612dc7565b80601a60006101000a81548160ff02191690831515021790555050565b60606003805461245890614bc6565b80601f016020809104026020016040519081016040528092919081815260200182805461248490614bc6565b80156124d15780601f106124a6576101008083540402835291602001916124d1565b820191906000526020600020905b8154815290600101906020018083116124b457829003601f168201915b5050505050905090565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612539612e93565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561259e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006125ab612e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612658612e93565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161269d9190614696565b60405180910390a35050565b6000601260009054906101000a900460ff16905090565b60008060165411156126d65760165490506126dc565b600f5490505b90565b6126ea84848461111d565b6127098373ffffffffffffffffffffffffffffffffffffffff16613367565b801561271e575061271c848484846128c0565b155b15612755576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60006127c5836009548461338a565b905092915050565b601381815481106127dd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061281782612e45565b612856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d906147ae565b60405180910390fd5b60006128606131f1565b9050600081511161288057604051806020016040528060008152506128ae565b8061288a84612c39565b600d60405160200161289e93929190614581565b6040516020818303038152906040525b915050919050565b6000601054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128e6612e93565b8786866040518563ffffffff1660e01b8152600401612908949392919061464a565b602060405180830381600087803b15801561292257600080fd5b505af192505050801561295357506040513d601f19601f820116820180604052508101906129509190613fea565b60015b6129cd573d8060008114612983576040519150601f19603f3d011682016040523d82523d6000602084013e612988565b606091505b506000815114156129c5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b606060178054612a4f90614bc6565b80601f0160208091040260200160405190810160405280929190818152602001828054612a7b90614bc6565b8015612ac85780601f10612a9d57610100808354040283529160200191612ac8565b820191906000526020600020905b815481529060010190602001808311612aab57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b612b74612dc7565b80602260006101000a81548160ff02191690831515021790555050565b612b99612dc7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c00906146ee565b60405180910390fd5b612c1281613283565b50565b600a8181548110612c2557600080fd5b906000526020600020016000915090505481565b606060006001612c48846133a1565b01905060008167ffffffffffffffff811115612c8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612cbf5781602001600182028036833780820191505090505b509050600082602001820190505b600115612d52578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612d3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0494506000851415612d4d57612d52565b612ccd565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dcf612e93565b73ffffffffffffffffffffffffffffffffffffffff16612ded611f22565b73ffffffffffffffffffffffffffffffffffffffff1614612e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3a9061478e565b60405180910390fd5b565b600081612e50612f4d565b11158015612e5f575060005482105b8015612e8c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b612f5e613af0565b600082905080612f6c612f4d565b11158015612f7b575060005481105b156131ae576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516131ac57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130905780925050506131e0565b5b6001156131ab57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131a65780925050506131e0565b613091565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b50505050565b50505050565b6060600c805461320090614bc6565b80601f016020809104026020016040519081016040528092919081815260200182805461322c90614bc6565b80156132795780601f1061324e57610100808354040283529160200191613279565b820191906000526020600020905b81548152906001019060200180831161325c57829003601f168201915b5050505050905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6133638282604051806020016040528060008152506135d8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008261339785846135ea565b1490509392505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613425577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161341b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613488576d04ee2d6d415b85acef8100000000838161347e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506020810190505b662386f26fc1000083106134dd57662386f26fc1000083816134d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506010810190505b6305f5e100831061352c576305f5e1008381613522577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506008810190505b612710831061357757612710838161356d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506004810190505b606483106135c057606483816135b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506002810190505b600a83106135cf576001810190505b80915050919050565b6135e58383836001613685565b505050565b60008082905060005b845181101561367a576000858281518110613637577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613659576136528382613a53565b9250613666565b6136638184613a53565b92505b50808061367290614c29565b9150506135f3565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136f2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561372d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61373a60008683876131e5565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561390457506139038773ffffffffffffffffffffffffffffffffffffffff16613367565b5b156139ca575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461397960008884806001019550886128c0565b6139af576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561390a5782600054146139c557600080fd5b613a36565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156139cb575b816000819055505050613a4c60008683876131eb565b5050505050565b600082600052816020526040600020905092915050565b828054613a7690614bc6565b90600052602060002090601f016020900481019282613a985760008555613adf565b82601f10613ab157805160ff1916838001178555613adf565b82800160010185558215613adf579182015b82811115613ade578251825591602001919060010190613ac3565b5b509050613aec9190613b33565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613b4c576000816000905550600101613b34565b5090565b6000613b63613b5e8461488e565b614869565b90508083825260208201905082856020860282011115613b8257600080fd5b60005b85811015613bb25781613b988882613ca1565b845260208401935060208301925050600181019050613b85565b5050509392505050565b6000613bcf613bca846148ba565b614869565b905082815260208101848484011115613be757600080fd5b613bf2848285614b5a565b509392505050565b6000613c0d613c08846148eb565b614869565b905082815260208101848484011115613c2557600080fd5b613c30848285614b5a565b509392505050565b600081359050613c478161502c565b92915050565b600081359050613c5c81615043565b92915050565b600082601f830112613c7357600080fd5b8135613c83848260208601613b50565b91505092915050565b600081359050613c9b8161505a565b92915050565b600081359050613cb081615071565b92915050565b600081359050613cc581615088565b92915050565b600081519050613cda81615088565b92915050565b600082601f830112613cf157600080fd5b8135613d01848260208601613bbc565b91505092915050565b600082601f830112613d1b57600080fd5b8135613d2b848260208601613bfa565b91505092915050565b600081359050613d438161509f565b92915050565b600060208284031215613d5b57600080fd5b6000613d6984828501613c38565b91505092915050565b60008060408385031215613d8557600080fd5b6000613d9385828601613c38565b9250506020613da485828601613c38565b9150509250929050565b600080600060608486031215613dc357600080fd5b6000613dd186828701613c38565b9350506020613de286828701613c38565b9250506040613df386828701613d34565b9150509250925092565b60008060008060808587031215613e1357600080fd5b6000613e2187828801613c38565b9450506020613e3287828801613c38565b9350506040613e4387828801613d34565b925050606085013567ffffffffffffffff811115613e6057600080fd5b613e6c87828801613ce0565b91505092959194509250565b60008060408385031215613e8b57600080fd5b6000613e9985828601613c38565b925050602083013567ffffffffffffffff811115613eb657600080fd5b613ec285828601613c62565b9150509250929050565b60008060408385031215613edf57600080fd5b6000613eed85828601613c38565b9250506020613efe85828601613c8c565b9150509250929050565b60008060408385031215613f1b57600080fd5b6000613f2985828601613c38565b9250506020613f3a85828601613d34565b9150509250929050565b60008060408385031215613f5757600080fd5b600083013567ffffffffffffffff811115613f7157600080fd5b613f7d85828601613c62565b9250506020613f8e85828601613ca1565b9150509250929050565b600060208284031215613faa57600080fd5b6000613fb884828501613c8c565b91505092915050565b600060208284031215613fd357600080fd5b6000613fe184828501613cb6565b91505092915050565b600060208284031215613ffc57600080fd5b600061400a84828501613ccb565b91505092915050565b60006020828403121561402557600080fd5b600082013567ffffffffffffffff81111561403f57600080fd5b61404b84828501613d0a565b91505092915050565b60006020828403121561406657600080fd5b600061407484828501613d34565b91505092915050565b600080600080600060a0868803121561409557600080fd5b60006140a388828901613d34565b95505060206140b488828901613c4d565b94505060406140c588828901613d34565b93505060606140d688828901613c4d565b925050608086013567ffffffffffffffff8111156140f357600080fd5b6140ff88828901613c62565b9150509295509295909350565b6000806000806080858703121561412257600080fd5b600061413087828801613d34565b945050602061414187828801613c4d565b935050604061415287828801613d34565b925050606085013567ffffffffffffffff81111561416f57600080fd5b61417b87828801613c62565b91505092959194509250565b6000806040838503121561419a57600080fd5b60006141a885828601613d34565b925050602083013567ffffffffffffffff8111156141c557600080fd5b6141d185828601613d0a565b9150509250929050565b6141e481614b24565b82525050565b6141fb6141f682614aa6565b614c84565b82525050565b61420a81614a94565b82525050565b61422161421c82614a94565b614c72565b82525050565b61423081614ab8565b82525050565b61423f81614ac4565b82525050565b600061425082614931565b61425a8185614947565b935061426a818560208601614b69565b61427381614d64565b840191505092915050565b60006142898261493c565b6142938185614963565b93506142a3818560208601614b69565b6142ac81614d64565b840191505092915050565b60006142c28261493c565b6142cc8185614974565b93506142dc818560208601614b69565b80840191505092915050565b600081546142f581614bc6565b6142ff8186614974565b9450600182166000811461431a576001811461432b5761435e565b60ff1983168652818601935061435e565b6143348561491c565b60005b8381101561435657815481890152600182019150602081019050614337565b838801955050505b50505092915050565b6000614374602683614963565b915061437f82614d82565b604082019050919050565b6000614397601783614963565b91506143a282614dd1565b602082019050919050565b60006143ba602f83614963565b91506143c582614dfa565b604082019050919050565b60006143dd601283614963565b91506143e882614e49565b602082019050919050565b6000614400603983614963565b915061440b82614e72565b604082019050919050565b6000614423602083614963565b915061442e82614ec1565b602082019050919050565b6000614446602f83614963565b915061445182614eea565b604082019050919050565b6000614469601f83614963565b915061447482614f39565b602082019050919050565b600061448c600083614958565b915061449782614f62565b600082019050919050565b60006144af603983614963565b91506144ba82614f65565b604082019050919050565b60006144d2602183614963565b91506144dd82614fb4565b604082019050919050565b60006144f5601a83614963565b915061450082615003565b602082019050919050565b61451481614b1a565b82525050565b60006145268284614210565b60148201915081905092915050565b600061454182846141ea565b60148201915081905092915050565b600061455c82866142b7565b915061456882856142b7565b915061457482846142b7565b9150819050949350505050565b600061458d82866142b7565b915061459982856142b7565b91506145a582846142e8565b9150819050949350505050565b60006145be82866142e8565b91506145ca82856142b7565b91506145d682846142e8565b9150819050949350505050565b60006145ee8261447f565b9150819050919050565b600060208201905061460d6000830184614201565b92915050565b60006060820190506146286000830186614201565b61463560208301856141db565b614642604083018461450b565b949350505050565b600060808201905061465f6000830187614201565b61466c6020830186614201565b614679604083018561450b565b818103606083015261468b8184614245565b905095945050505050565b60006020820190506146ab6000830184614227565b92915050565b60006020820190506146c66000830184614236565b92915050565b600060208201905081810360008301526146e6818461427e565b905092915050565b6000602082019050818103600083015261470781614367565b9050919050565b600060208201905081810360008301526147278161438a565b9050919050565b60006020820190508181036000830152614747816143ad565b9050919050565b60006020820190508181036000830152614767816143d0565b9050919050565b60006020820190508181036000830152614787816143f3565b9050919050565b600060208201905081810360008301526147a781614416565b9050919050565b600060208201905081810360008301526147c781614439565b9050919050565b600060208201905081810360008301526147e78161445c565b9050919050565b60006020820190508181036000830152614807816144a2565b9050919050565b60006020820190508181036000830152614827816144c5565b9050919050565b60006020820190508181036000830152614847816144e8565b9050919050565b6000602082019050614863600083018461450b565b92915050565b6000614873614884565b905061487f8282614bf8565b919050565b6000604051905090565b600067ffffffffffffffff8211156148a9576148a8614d35565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148d5576148d4614d35565b5b6148de82614d64565b9050602081019050919050565b600067ffffffffffffffff82111561490657614905614d35565b5b61490f82614d64565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061498a82614b1a565b915061499583614b1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149ca576149c9614ca8565b5b828201905092915050565b60006149e082614b1a565b91506149eb83614b1a565b9250826149fb576149fa614cd7565b5b828204905092915050565b6000614a1182614b1a565b9150614a1c83614b1a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a5557614a54614ca8565b5b828202905092915050565b6000614a6b82614b1a565b9150614a7683614b1a565b925082821015614a8957614a88614ca8565b5b828203905092915050565b6000614a9f82614afa565b9050919050565b6000614ab182614afa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614b2f82614b36565b9050919050565b6000614b4182614b48565b9050919050565b6000614b5382614afa565b9050919050565b82818337600083830152505050565b60005b83811015614b87578082015181840152602081019050614b6c565b83811115614b96576000848401525b50505050565b6000614ba782614b1a565b91506000821415614bbb57614bba614ca8565b5b600182039050919050565b60006002820490506001821680614bde57607f821691505b60208210811415614bf257614bf1614d06565b5b50919050565b614c0182614d64565b810181811067ffffffffffffffff82111715614c2057614c1f614d35565b5b80604052505050565b6000614c3482614b1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c6757614c66614ca8565b5b600182019050919050565b6000614c7d82614c96565b9050919050565b6000614c8f82614c96565b9050919050565b6000614ca182614d75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206a612072656976696e64696361646f000000000000000000600082015250565b7f5175616e746964616465206c696d697465206465206d696e7420706f7220636160008201527f7274656972612065786365646964610000000000000000000000000000000000602082015250565b7f4f20636f6e747261746f207061757361646f0000000000000000000000000000600082015250565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f00000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e465400600082015250565b50565b7f4e6f206d6f6d656e746f206f2070726f6772616d61206465206166696c69616460008201527f6f7320736520656e636f6e747261206465736174697661646f00000000000000602082015250565b7f5175616e746964616465206c696d697465206465204e4654206578636564696460008201527f6100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e616f2066617a2070617274652064612057686974656c697374000000000000600082015250565b61503581614a94565b811461504057600080fd5b50565b61504c81614aa6565b811461505757600080fd5b50565b61506381614ab8565b811461506e57600080fd5b50565b61507a81614ac4565b811461508557600080fd5b50565b61509181614ace565b811461509c57600080fd5b50565b6150a881614b1a565b81146150b357600080fd5b5056fea2646970667358221220fbc8a6bd5b1aa83d01514a198734ff2f963e7274e27667918cc65307550ee2ec64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000608fef5c34dfb341823e14d8284c0cbad14956e40601f76ba0921f448ac232d4f500000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d6561664463747538543173774742573664796d4c59574d6d56755a727575424d5379584c52674b4c557465442f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d5555506d4644487256757476454b4657755a33716f6774476141324c4e696b36755a374d734e7a556d4736680000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://ipfs.io/ipfs/QmeafDctu8T1swGBW6dymLYWMmVuZruuBMSyXLRgKLUteD/
Arg [1] : _root (bytes32): 0x8fef5c34dfb341823e14d8284c0cbad14956e40601f76ba0921f448ac232d4f5
Arg [2] : _contractURI (string): https://ipfs.io/ipfs/QmUUPmFDHrVutvEKFWuZ3qogtGaA2LNik6uZ7MsNzUmG6h
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 8fef5c34dfb341823e14d8284c0cbad14956e40601f76ba0921f448ac232d4f5
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [4] : 68747470733a2f2f697066732e696f2f697066732f516d656166446374753854
Arg [5] : 3173774742573664796d4c59574d6d56755a727575424d5379584c52674b4c55
Arg [6] : 7465442f00000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [8] : 68747470733a2f2f697066732e696f2f697066732f516d5555506d4644487256
Arg [9] : 757476454b4657755a33716f6774476141324c4e696b36755a374d734e7a556d
Arg [10] : 4736680000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
82578:11257:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87496:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46323:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85259:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49436:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51076:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84795:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85135:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50639:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87296:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45572:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92927:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55229:2129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84923:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85611:155;;;:::i;:::-;;49762:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93166:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91023:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85468:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86423:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87794:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84683:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87983:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49244:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87041:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85882:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85032:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85774:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46692:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87397:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22889:103;;;;;;;;;;;;;:::i;:::-;;86517:516;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86005:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91183:1679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22241:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88332:1986;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90433:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85346:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49596:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87675:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51352:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87896:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86226:189;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93420:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84414:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83177:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90558:457;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87191:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60973:666;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82764:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90326:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51710:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82701:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86128:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23147:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82727:28;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87496:171;87552:13;87608:7;87617:25;87634:7;87617:16;:25::i;:::-;87644:13;87591:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87577:82;;87496:171;;;:::o;46323:305::-;46425:4;46477:25;46462:40;;;:11;:40;;;;:105;;;;46534:33;46519:48;;;:11;:48;;;;46462:105;:158;;;;46584:36;46608:11;46584:23;:36::i;:::-;46462:158;46442:178;;46323:305;;;:::o;85259:79::-;22127:13;:11;:13::i;:::-;85324:6:::1;85315;;:15;;;;;;;;;;;;;;;;;;85259:79:::0;:::o;49436:91::-;49481:13;49514:5;49507:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49436:91;:::o;51076:204::-;51144:7;51169:16;51177:7;51169;:16::i;:::-;51164:64;;51194:34;;;;;;;;;;;;;;51164:64;51248:15;:24;51264:7;51248:24;;;;;;;;;;;;;;;;;;;;;51241:31;;51076:204;;;:::o;84795:120::-;22127:13;:11;:13::i;:::-;84901:6:::1;84875:23;:32;;;;84795:120:::0;:::o;85135:116::-;22127:13;:11;:13::i;:::-;85229:14:::1;85213:13;:30;;;;85135:116:::0;:::o;50639:371::-;50712:13;50728:24;50744:7;50728:15;:24::i;:::-;50712:40;;50773:5;50767:11;;:2;:11;;;50763:48;;;50787:24;;;;;;;;;;;;;;50763:48;50844:5;50828:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;50854:37;50871:5;50878:12;:10;:12::i;:::-;50854:16;:37::i;:::-;50853:38;50828:63;50824:138;;;50915:35;;;;;;;;;;;;;;50824:138;50974:28;50983:2;50987:7;50996:5;50974:8;:28::i;:::-;50639:371;;;:::o;87296:93::-;87339:4;87363:10;:18;;;87356:25;;87296:93;:::o;45572:303::-;45616:7;45841:15;:13;:15::i;:::-;45826:12;;45810:13;;:28;:46;45803:53;;45572:303;:::o;92927:170::-;93061:28;93071:4;93077:2;93081:7;93061:9;:28::i;:::-;92927:170;;;:::o;55229:2129::-;55343:35;55381:21;55394:7;55381:12;:21::i;:::-;55343:59;;55441:4;55419:26;;:13;:18;;;:26;;;55415:67;;55454:28;;;;;;;;;;;;;;55415:67;55495:22;55537:4;55521:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;55558:36;55575:4;55581:12;:10;:12::i;:::-;55558:16;:36::i;:::-;55521:73;:126;;;;55635:12;:10;:12::i;:::-;55611:36;;:20;55623:7;55611:11;:20::i;:::-;:36;;;55521:126;55495:153;;55666:17;55661:66;;55692:35;;;;;;;;;;;;;;55661:66;55756:1;55742:16;;:2;:16;;;55738:52;;;55767:23;;;;;;;;;;;;;;55738:52;55803:43;55825:4;55831:2;55835:7;55844:1;55803:21;:43::i;:::-;55911:35;55928:1;55932:7;55941:4;55911:8;:35::i;:::-;56272:1;56242:12;:18;56255:4;56242:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56316:1;56288:12;:16;56301:2;56288:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56334:31;56368:11;:20;56380:7;56368:20;;;;;;;;;;;56334:54;;56419:2;56403:8;:13;;;:18;;;;;;;;;;;;;;;;;;56469:15;56436:8;:23;;;:49;;;;;;;;;;;;;;;;;;56737:19;56769:1;56759:7;:11;56737:33;;56785:31;56819:11;:24;56831:11;56819:24;;;;;;;;;;;56785:58;;56887:1;56862:27;;:8;:13;;;;;;;;;;;;:27;;;56858:384;;;57072:13;;57057:11;:28;57053:174;;57126:4;57110:8;:13;;;:20;;;;;;;;;;;;;;;;;;57179:13;:28;;;57153:8;:23;;;:54;;;;;;;;;;;;;;;;;;57053:174;56858:384;55229:2129;;;57289:7;57285:2;57270:27;;57279:4;57270:27;;;;;;;;;;;;57308:42;57329:4;57335:2;57339:7;57348:1;57308:20;:42::i;:::-;55229:2129;;;;;:::o;84923:101::-;22127:13;:11;:13::i;:::-;85010:6:::1;84992:15;;:24;;;;;;;;;;;;;;;;;;84923:101:::0;:::o;85611:155::-;22127:13;:11;:13::i;:::-;85668:7:::1;85689;:5;:7::i;:::-;85681:21;;85710;85681:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85667:69;;;85755:2;85747:11;;;::::0;::::1;;22151:1;85611:155::o:0;49762:473::-;49855:13;49886:16;49894:7;49886;:16::i;:::-;49881:59;;49911:29;;;;;;;;;;;;;;49881:59;49951:21;49975:10;:8;:10::i;:::-;49951:34;;50000:16;50008:7;50000;:16::i;:::-;49996:104;;;50049:7;50058:25;50075:7;50058:16;:25::i;:::-;50085:13;50032:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50018:82;;;;;49996:104;50143:1;50124:7;50118:21;:26;;:109;;;;;;;;;;;;;;;;;50171:7;50180:25;50197:7;50180:16;:25::i;:::-;50207:13;50154:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50118:109;50111:116;;;49762:473;;;;;:::o;93166:185::-;93304:39;93321:4;93327:2;93331:7;93304:39;;;;;;;;;;;;:16;:39::i;:::-;93166:185;;;:::o;91023:152::-;91110:4;91139:20;:28;91160:6;91139:28;;;;;;;;;;;;;;;;91132:35;;91023:152;;;:::o;85468:135::-;22127:13;:11;:13::i;:::-;85585:10:::1;85555:27;:40;;;;85468:135:::0;:::o;86423:86::-;86468:4;86492:9;;86485:16;;86423:86;:::o;87794:94::-;87845:4;87869:11;;;;;;;;;;;87862:18;;87794:94;:::o;84683:104::-;22127:13;:11;:13::i;:::-;84768:11:::1;84758:7;:21;;;;;;;;;;;;:::i;:::-;;84683:104:::0;:::o;87983:341::-;88066:4;88087:54;88096:5;88131;88114:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;88103:36;;;;;;88087:7;:54::i;:::-;88083:234;;;88163:16;:23;88180:5;88163:23;;;;;;;;;;;;;;;;;;;;;;;;;88159:76;;;88214:5;88207:12;;;;88159:76;88256:4;88249:11;;;;88083:234;88300:5;88293:12;;87983:341;;;;;:::o;49244:125::-;49308:7;49335:21;49348:7;49335:12;:21::i;:::-;:26;;;49328:33;;49244:125;;;:::o;87041:142::-;87115:7;87142:25;:33;87168:6;87142:33;;;;;;;;;;;;;;;;87135:40;;87041:142;;;:::o;85882:115::-;22127:13;:11;:13::i;:::-;85976::::1;85959:14;:30;;;;85882:115:::0;:::o;85032:95::-;85080:4;85104:15;;;;;;;;;;;85097:22;;85032:95;:::o;85774:100::-;22127:13;:11;:13::i;:::-;85856:10:::1;85844:9;:22;;;;85774:100:::0;:::o;46692:206::-;46756:7;46797:1;46780:19;;:5;:19;;;46776:60;;;46808:28;;;;;;;;;;;;;;46776:60;46862:12;:19;46875:5;46862:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;46854:36;;46847:43;;46692:206;;;:::o;87397:91::-;87440:13;87473:7;87466:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87397:91;:::o;22889:103::-;22127:13;:11;:13::i;:::-;22954:30:::1;22981:1;22954:18;:30::i;:::-;22889:103::o:0;86517:516::-;86604:4;86625:55;86634:5;86669:6;86652:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;86641:37;;;;;;86625:7;:55::i;:::-;86621:405;;;86702:16;:24;86719:6;86702:24;;;;;;;;;;;;;;;;;;;;;;;;;86698:86;;;86754:14;;86747:21;;;;86698:86;86946:14;;86939:21;;;;86621:405;87000:14;;86993:21;;86517:516;;;;;:::o;86005:115::-;22127:13;:11;:13::i;:::-;86107:5:::1;86084:11;:20;86096:7;86084:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;86005:115:::0;;:::o;91183:1679::-;91326:26;91355:14;;91326:43;;91384:59;91393:5;91428:10;91411:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;91400:41;;;;;;91384:7;:59::i;:::-;91380:455;;;91465:16;:28;91482:10;91465:28;;;;;;;;;;;;;;;;;;;;;;;;;91461:104;;;91535:14;;91514:35;;91461:104;91741:14;;91720:35;;91380:455;;;91809:14;;91788:35;;91380:455;91890:11;91869:18;:32;;;;:::i;:::-;91855:9;:47;;91847:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;91977:16;91996:9;91977:28;;92039:1;92021:15;:19;92018:557;;;92057:24;92084:25;;92057:52;;92146:1;92127:15;:20;:46;;;;;92151:22;;;;;;;;;;;92127:46;92124:208;;;92198:11;:27;92210:14;92198:27;;;;;;;;;;;;;;;;;;;;;;;;;92194:123;;;92270:27;;92251:46;;92194:123;92124:208;92348:14;92396:3;92377:16;92365:9;:28;;;;:::i;:::-;:34;;;;:::i;:::-;92348:51;;92440:6;92428:9;:18;;;;:::i;:::-;92414:32;;92468:49;92482:10;92494:14;92510:6;92468:49;;;;;;;;:::i;:::-;;;;;;;;92532:14;:23;;:31;92556:6;92532:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92018:557;;;92587:25;92615:10;;92587:38;;92636:15;92686:3;92666:17;92654:9;:29;;;;:::i;:::-;:35;;;;:::i;:::-;92636:53;;92718:7;;;;;;;;;;;92710:25;;:34;92736:7;92710:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92791:7;92779:9;:19;;;;:::i;:::-;92765:33;;92817:14;;;;;;;;;;;92809:32;;:45;92842:11;92809:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91183:1679;;;;;;;;:::o;22241:87::-;22287:7;22314:6;;;;;;;;;;;22307:13;;22241:87;:::o;88332:1986::-;88605:6;;;;;;;;;;;88604:7;88596:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;88645:14;88662:13;:11;:13::i;:::-;88645:30;;88708:1;88694:11;:15;88686:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;88800:13;;88778:18;88788:7;88778:9;:18::i;:::-;88764:11;:32;;;;:::i;:::-;:49;;88756:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;88908:9;;88893:11;88884:6;:20;;;;:::i;:::-;:33;;88876:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;88971:15;;;;;;;;;;;88968:215;;;89012:16;:25;89029:7;89012:25;;;;;;;;;;;;;;;;;;;;;;;;;89011:26;89003:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;89088:52;89096:5;89130:7;89113:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;89103:36;;;;;;89088:7;:52::i;:::-;89080:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;88968:215;89217:1;89198:15;:20;89195:144;;;89243:22;;;;;;;;;;;89235:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;89195:144;89355:11;;;;;;;;;;;89351:411;;89388:52;89396:5;89430:7;89413:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;89403:36;;;;;;89388:7;:52::i;:::-;89384:367;;89461:58;89467:11;89480:14;89496:15;89513:5;89461;:58::i;:::-;89384:367;;;89560:14;89577:22;89591:7;89577:13;:22::i;:::-;89560:39;;89633:1;89621:9;:13;89618:118;;;89658:58;89664:11;89677:14;89693:15;89710:5;89658;:58::i;:::-;89618:118;89384:367;;89351:411;89774:33;89822:13;:11;:13::i;:::-;89810:9;;:25;;;;:::i;:::-;89774:61;;89853:9;89865:1;89853:13;;89848:313;89873:11;89868:1;:16;89848:313;;89906:20;:29;89927:7;89906:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;89952:21;89962:7;89971:1;89952:9;:21::i;:::-;89988:18;90018:1;90009:6;:10;;;;:::i;:::-;89988:31;;90034:20;90043:10;90034:8;:20::i;:::-;;90069:27;;;;:::i;:::-;;;90148:1;90111:25;:34;90137:7;90111:34;;;;;;;;;;;;;;;:38;;;;89848:313;89886:3;;;;;:::i;:::-;;;;89848:313;;;;90177:15;;;;;;;;;;;90173:80;;;90237:4;90209:16;:25;90226:7;90209:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;90173:80;90285:25;90263:19;:47;;;;88332:1986;;;;;;;:::o;90433:117::-;22127:13;:11;:13::i;:::-;90530:12:::1;90515;:27;;;;;;;;;;;;:::i;:::-;;90433:117:::0;:::o;85346:114::-;22127:13;:11;:13::i;:::-;85446:6:::1;85421:22;;:31;;;;;;;;;;;;;;;;;;85346:114:::0;:::o;49596:95::-;49643:13;49676:7;49669:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49596:95;:::o;87675:111::-;87735:4;87759:11;:19;87771:6;87759:19;;;;;;;;;;;;;;;;;;;;;;;;;87752:26;;87675:111;;;:::o;51352:287::-;51463:12;:10;:12::i;:::-;51451:24;;:8;:24;;;51447:54;;;51484:17;;;;;;;;;;;;;;51447:54;51559:8;51514:18;:32;51533:12;:10;:12::i;:::-;51514:32;;;;;;;;;;;;;;;:42;51547:8;51514:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51612:8;51583:48;;51598:12;:10;:12::i;:::-;51583:48;;;51622:8;51583:48;;;;;;:::i;:::-;;;;;;;;51352:287;;:::o;87896:79::-;87937:4;87961:6;;;;;;;;;;;87954:13;;87896:79;:::o;86226:189::-;86280:7;86325:1;86303:19;;:23;86300:81;;;86350:19;;86343:26;;;;86300:81;86398:9;;86391:16;;86226:189;;:::o;93420:412::-;93587:28;93597:4;93603:2;93607:7;93587:9;:28::i;:::-;93630:15;:2;:13;;;:15::i;:::-;:76;;;;;93650:56;93681:4;93687:2;93691:7;93700:5;93650:30;:56::i;:::-;93649:57;93630:76;93626:156;;;93730:40;;;;;;;;;;;;;;93626:156;93816:7;93812:2;93797:27;;93806:4;93797:27;;;;;;;;;;;;93420:412;;;;:::o;84414:145::-;84490:4;84514:37;84533:5;84540:4;;84546;84514:18;:37::i;:::-;84507:44;;84414:145;;;;:::o;83177:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;90558:457::-;90658:13;90707:16;90715:7;90707;:16::i;:::-;90689:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;90807:28;90838:10;:8;:10::i;:::-;90807:41;;90897:1;90872:14;90866:28;:32;:141;;;;;;;;;;;;;;;;;90938:14;90954:18;:7;:16;:18::i;:::-;90974:13;90921:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90866:141;90859:148;;;90558:457;;;:::o;87191:97::-;87240:7;87267:13;;87260:20;;87191:97;:::o;60973:666::-;61135:4;61172:2;61156:36;;;61193:12;:10;:12::i;:::-;61207:4;61213:7;61222:5;61156:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;61152:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61407:1;61390:6;:13;:18;61386:235;;;61436:40;;;;;;;;;;;;;;61386:235;61579:6;61573:13;61564:6;61560:2;61556:15;61549:38;61152:480;61285:45;;;61275:55;;;:6;:55;;;;61268:62;;;60973:666;;;;;;:::o;82764:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;90326:99::-;90372:13;90405:12;90398:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90326:99;:::o;51710:164::-;51807:4;51831:18;:25;51850:5;51831:25;;;;;;;;;;;;;;;:35;51857:8;51831:35;;;;;;;;;;;;;;;;;;;;;;;;;51824:42;;51710:164;;;;:::o;82701:19::-;;;;:::o;86128:90::-;22127:13;:11;:13::i;:::-;86205:5:::1;86191:11;;:19;;;;;;;;;;;;;;;;;;86128:90:::0;:::o;23147:201::-;22127:13;:11;:13::i;:::-;23256:1:::1;23236:22;;:8;:22;;;;23228:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23312:28;23331:8;23312:18;:28::i;:::-;23147:201:::0;:::o;82727:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17165:716::-;17221:13;17272:14;17309:1;17289:17;17300:5;17289:10;:17::i;:::-;:21;17272:38;;17325:20;17359:6;17348:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17325:41;;17381:11;17510:6;17506:2;17502:15;17494:6;17490:28;17483:35;;17547:288;17554:4;17547:288;;;17579:5;;;;;;;;17721:8;17716:2;17709:5;17705:14;17700:30;17695:3;17687:44;17777:2;17768:11;;;;;;;;;;;;;;;;;17811:1;17802:5;:10;17798:21;;;17814:5;;17798:21;17547:288;;;17856:6;17849:13;;;;;17165:716;;;:::o;34916:157::-;35001:4;35040:25;35025:40;;;:11;:40;;;;35018:47;;34916:157;;;:::o;22406:132::-;22481:12;:10;:12::i;:::-;22470:23;;:7;:5;:7::i;:::-;:23;;;22462:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22406:132::o;52129:174::-;52186:4;52229:7;52210:15;:13;:15::i;:::-;:26;;:53;;;;;52250:13;;52240:7;:23;52210:53;:85;;;;;52268:11;:20;52280:7;52268:20;;;;;;;;;;;:27;;;;;;;;;;;;52267:28;52210:85;52203:92;;52129:174;;;:::o;20792:98::-;20845:7;20872:10;20865:17;;20792:98;:::o;60285:196::-;60427:2;60400:15;:24;60416:7;60400:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60465:7;60461:2;60445:28;;60454:5;60445:28;;;;;;;;;;;;60285:196;;;:::o;45346:92::-;45402:7;45429:1;45422:8;;45346:92;:::o;48073:1109::-;48135:21;;:::i;:::-;48169:12;48184:7;48169:22;;48252:4;48233:15;:13;:15::i;:::-;:23;;:47;;;;;48267:13;;48260:4;:20;48233:47;48229:886;;;48301:31;48335:11;:17;48347:4;48335:17;;;;;;;;;;;48301:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48376:9;:16;;;48371:729;;48447:1;48421:28;;:9;:14;;;:28;;;48417:101;;48485:9;48478:16;;;;;;48417:101;48820:261;48827:4;48820:261;;;48860:6;;;;;;;;48905:11;:17;48917:4;48905:17;;;;;;;;;;;48893:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48979:1;48953:28;;:9;:14;;;:28;;;48949:109;;49021:9;49014:16;;;;;;48949:109;48820:261;;;48371:729;48229:886;;49143:31;;;;;;;;;;;;;;48073:1109;;;;:::o;62287:159::-;;;;;:::o;63105:158::-;;;;;:::o;84567:108::-;84627:13;84660:7;84653:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84567:108;:::o;23508:191::-;23582:16;23601:6;;;;;;;;;;;23582:25;;23627:8;23618:6;;:17;;;;;;;;;;;;;;;;;;23682:8;23651:40;;23672:8;23651:40;;;;;;;;;;;;23508:191;;:::o;52311:104::-;52380:27;52390:2;52394:8;52380:27;;;;;;;;;;;;:9;:27::i;:::-;52311:104;;:::o;24939:326::-;24999:4;25256:1;25234:7;:19;;;:23;25227:30;;24939:326;;;:::o;929:190::-;1054:4;1107;1078:25;1091:5;1098:4;1078:12;:25::i;:::-;:33;1071:40;;929:190;;;;;:::o;14031:922::-;14084:7;14104:14;14121:1;14104:18;;14171:6;14162:5;:15;14158:102;;14207:6;14198:15;;;;;;;;;;;;;;;;;14242:2;14232:12;;;;14158:102;14287:6;14278:5;:15;14274:102;;14323:6;14314:15;;;;;;;;;;;;;;;;;14358:2;14348:12;;;;14274:102;14403:6;14394:5;:15;14390:102;;14439:6;14430:15;;;;;;;;;;;;;;;;;14474:2;14464:12;;;;14390:102;14519:5;14510;:14;14506:99;;14554:5;14545:14;;;;;;;;;;;;;;;;;14588:1;14578:11;;;;14506:99;14632:5;14623;:14;14619:99;;14667:5;14658:14;;;;;;;;;;;;;;;;;14701:1;14691:11;;;;14619:99;14745:5;14736;:14;14732:99;;14780:5;14771:14;;;;;;;;;;;;;;;;;14814:1;14804:11;;;;14732:99;14858:5;14849;:14;14845:66;;14894:1;14884:11;;;;14845:66;14939:6;14932:13;;;14031:922;;;:::o;52778:163::-;52901:32;52907:2;52911:8;52921:5;52928:4;52901:5;:32::i;:::-;52778:163;;;:::o;1481:675::-;1564:7;1584:20;1607:4;1584:27;;1627:9;1622:497;1646:5;:12;1642:1;:16;1622:497;;;1680:20;1703:5;1709:1;1703:8;;;;;;;;;;;;;;;;;;;;;;1680:31;;1746:12;1730;:28;1726:382;;1873:42;1888:12;1902;1873:14;:42::i;:::-;1858:57;;1726:382;;;2050:42;2065:12;2079;2050:14;:42::i;:::-;2035:57;;1726:382;1622:497;1660:3;;;;;:::i;:::-;;;;1622:497;;;;2136:12;2129:19;;;1481:675;;;;:::o;53200:1775::-;53339:20;53362:13;;53339:36;;53404:1;53390:16;;:2;:16;;;53386:48;;;53415:19;;;;;;;;;;;;;;53386:48;53461:1;53449:8;:13;53445:44;;;53471:18;;;;;;;;;;;;;;53445:44;53502:61;53532:1;53536:2;53540:12;53554:8;53502:21;:61::i;:::-;53875:8;53840:12;:16;53853:2;53840:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53939:8;53899:12;:16;53912:2;53899:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53998:2;53965:11;:25;53977:12;53965:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;54065:15;54015:11;:25;54027:12;54015:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;54098:20;54121:12;54098:35;;54148:11;54177:8;54162:12;:23;54148:37;;54206:4;:23;;;;;54214:15;:2;:13;;;:15::i;:::-;54206:23;54202:641;;;54250:314;54306:12;54302:2;54281:38;;54298:1;54281:38;;;;;;;;;;;;54347:69;54386:1;54390:2;54394:14;;;;;;54410:5;54347:30;:69::i;:::-;54342:174;;54452:40;;;;;;;;;;;;;;54342:174;54559:3;54543:12;:19;;54250:314;;54645:12;54628:13;;:29;54624:43;;54659:8;;;54624:43;54202:641;;;54708:120;54764:14;;;;;;54760:2;54739:40;;54756:1;54739:40;;;;;;;;;;;;54823:3;54807:12;:19;;54708:120;;54202:641;54873:12;54857:13;:28;;;;53200:1775;;54907:60;54936:1;54940:2;54944:12;54958:8;54907:20;:60::i;:::-;53200:1775;;;;;:::o;2164:224::-;2232:13;2295:1;2289:4;2282:15;2324:1;2318:4;2311:15;2365:4;2359;2349:21;2340:30;;2267:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1530:155::-;1584:5;1622:6;1609:20;1600:29;;1638:41;1673:5;1638:41;:::i;:::-;1590:95;;;;:::o;1708:303::-;1779:5;1828:3;1821:4;1813:6;1809:17;1805:27;1795:2;;1846:1;1843;1836:12;1795:2;1886:6;1873:20;1911:94;2001:3;1993:6;1986:4;1978:6;1974:17;1911:94;:::i;:::-;1902:103;;1785:226;;;;;:::o;2017:133::-;2060:5;2098:6;2085:20;2076:29;;2114:30;2138:5;2114:30;:::i;:::-;2066:84;;;;:::o;2156:139::-;2202:5;2240:6;2227:20;2218:29;;2256:33;2283:5;2256:33;:::i;:::-;2208:87;;;;:::o;2301:137::-;2346:5;2384:6;2371:20;2362:29;;2400:32;2426:5;2400:32;:::i;:::-;2352:86;;;;:::o;2444:141::-;2500:5;2531:6;2525:13;2516:22;;2547:32;2573:5;2547:32;:::i;:::-;2506:79;;;;:::o;2604:271::-;2659:5;2708:3;2701:4;2693:6;2689:17;2685:27;2675:2;;2726:1;2723;2716:12;2675:2;2766:6;2753:20;2791:78;2865:3;2857:6;2850:4;2842:6;2838:17;2791:78;:::i;:::-;2782:87;;2665:210;;;;;:::o;2895:273::-;2951:5;3000:3;2993:4;2985:6;2981:17;2977:27;2967:2;;3018:1;3015;3008:12;2967:2;3058:6;3045:20;3083:79;3158:3;3150:6;3143:4;3135:6;3131:17;3083:79;:::i;:::-;3074:88;;2957:211;;;;;:::o;3174:139::-;3220:5;3258:6;3245:20;3236:29;;3274:33;3301:5;3274:33;:::i;:::-;3226:87;;;;:::o;3319:262::-;3378:6;3427:2;3415:9;3406:7;3402:23;3398:32;3395:2;;;3443:1;3440;3433:12;3395:2;3486:1;3511:53;3556:7;3547:6;3536:9;3532:22;3511:53;:::i;:::-;3501:63;;3457:117;3385:196;;;;:::o;3587:407::-;3655:6;3663;3712:2;3700:9;3691:7;3687:23;3683:32;3680:2;;;3728:1;3725;3718:12;3680:2;3771:1;3796:53;3841:7;3832:6;3821:9;3817:22;3796:53;:::i;:::-;3786:63;;3742:117;3898:2;3924:53;3969:7;3960:6;3949:9;3945:22;3924:53;:::i;:::-;3914:63;;3869:118;3670:324;;;;;:::o;4000:552::-;4077:6;4085;4093;4142:2;4130:9;4121:7;4117:23;4113:32;4110:2;;;4158:1;4155;4148:12;4110:2;4201:1;4226:53;4271:7;4262:6;4251:9;4247:22;4226:53;:::i;:::-;4216:63;;4172:117;4328:2;4354:53;4399:7;4390:6;4379:9;4375:22;4354:53;:::i;:::-;4344:63;;4299:118;4456:2;4482:53;4527:7;4518:6;4507:9;4503:22;4482:53;:::i;:::-;4472:63;;4427:118;4100:452;;;;;:::o;4558:809::-;4653:6;4661;4669;4677;4726:3;4714:9;4705:7;4701:23;4697:33;4694:2;;;4743:1;4740;4733:12;4694:2;4786:1;4811:53;4856:7;4847:6;4836:9;4832:22;4811:53;:::i;:::-;4801:63;;4757:117;4913:2;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4884:118;5041:2;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5012:118;5197:2;5186:9;5182:18;5169:32;5228:18;5220:6;5217:30;5214:2;;;5260:1;5257;5250:12;5214:2;5288:62;5342:7;5333:6;5322:9;5318:22;5288:62;:::i;:::-;5278:72;;5140:220;4684:683;;;;;;;:::o;5373:550::-;5466:6;5474;5523:2;5511:9;5502:7;5498:23;5494:32;5491:2;;;5539:1;5536;5529:12;5491:2;5582:1;5607:53;5652:7;5643:6;5632:9;5628:22;5607:53;:::i;:::-;5597:63;;5553:117;5737:2;5726:9;5722:18;5709:32;5768:18;5760:6;5757:30;5754:2;;;5800:1;5797;5790:12;5754:2;5828:78;5898:7;5889:6;5878:9;5874:22;5828:78;:::i;:::-;5818:88;;5680:236;5481:442;;;;;:::o;5929:401::-;5994:6;6002;6051:2;6039:9;6030:7;6026:23;6022:32;6019:2;;;6067:1;6064;6057:12;6019:2;6110:1;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6081:117;6237:2;6263:50;6305:7;6296:6;6285:9;6281:22;6263:50;:::i;:::-;6253:60;;6208:115;6009:321;;;;;:::o;6336:407::-;6404:6;6412;6461:2;6449:9;6440:7;6436:23;6432:32;6429:2;;;6477:1;6474;6467:12;6429:2;6520:1;6545:53;6590:7;6581:6;6570:9;6566:22;6545:53;:::i;:::-;6535:63;;6491:117;6647:2;6673:53;6718:7;6709:6;6698:9;6694:22;6673:53;:::i;:::-;6663:63;;6618:118;6419:324;;;;;:::o;6749:550::-;6842:6;6850;6899:2;6887:9;6878:7;6874:23;6870:32;6867:2;;;6915:1;6912;6905:12;6867:2;6986:1;6975:9;6971:17;6958:31;7016:18;7008:6;7005:30;7002:2;;;7048:1;7045;7038:12;7002:2;7076:78;7146:7;7137:6;7126:9;7122:22;7076:78;:::i;:::-;7066:88;;6929:235;7203:2;7229:53;7274:7;7265:6;7254:9;7250:22;7229:53;:::i;:::-;7219:63;;7174:118;6857:442;;;;;:::o;7305:256::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:2;;;7426:1;7423;7416:12;7378:2;7469:1;7494:50;7536:7;7527:6;7516:9;7512:22;7494:50;:::i;:::-;7484:60;;7440:114;7368:193;;;;:::o;7567:260::-;7625:6;7674:2;7662:9;7653:7;7649:23;7645:32;7642:2;;;7690:1;7687;7680:12;7642:2;7733:1;7758:52;7802:7;7793:6;7782:9;7778:22;7758:52;:::i;:::-;7748:62;;7704:116;7632:195;;;;:::o;7833:282::-;7902:6;7951:2;7939:9;7930:7;7926:23;7922:32;7919:2;;;7967:1;7964;7957:12;7919:2;8010:1;8035:63;8090:7;8081:6;8070:9;8066:22;8035:63;:::i;:::-;8025:73;;7981:127;7909:206;;;;:::o;8121:375::-;8190:6;8239:2;8227:9;8218:7;8214:23;8210:32;8207:2;;;8255:1;8252;8245:12;8207:2;8326:1;8315:9;8311:17;8298:31;8356:18;8348:6;8345:30;8342:2;;;8388:1;8385;8378:12;8342:2;8416:63;8471:7;8462:6;8451:9;8447:22;8416:63;:::i;:::-;8406:73;;8269:220;8197:299;;;;:::o;8502:262::-;8561:6;8610:2;8598:9;8589:7;8585:23;8581:32;8578:2;;;8626:1;8623;8616:12;8578:2;8669:1;8694:53;8739:7;8730:6;8719:9;8715:22;8694:53;:::i;:::-;8684:63;;8640:117;8568:196;;;;:::o;8770:1019::-;8906:6;8914;8922;8930;8938;8987:3;8975:9;8966:7;8962:23;8958:33;8955:2;;;9004:1;9001;8994:12;8955:2;9047:1;9072:53;9117:7;9108:6;9097:9;9093:22;9072:53;:::i;:::-;9062:63;;9018:117;9174:2;9200:61;9253:7;9244:6;9233:9;9229:22;9200:61;:::i;:::-;9190:71;;9145:126;9310:2;9336:53;9381:7;9372:6;9361:9;9357:22;9336:53;:::i;:::-;9326:63;;9281:118;9438:2;9464:61;9517:7;9508:6;9497:9;9493:22;9464:61;:::i;:::-;9454:71;;9409:126;9602:3;9591:9;9587:19;9574:33;9634:18;9626:6;9623:30;9620:2;;;9666:1;9663;9656:12;9620:2;9694:78;9764:7;9755:6;9744:9;9740:22;9694:78;:::i;:::-;9684:88;;9545:237;8945:844;;;;;;;;:::o;9795:857::-;9914:6;9922;9930;9938;9987:3;9975:9;9966:7;9962:23;9958:33;9955:2;;;10004:1;10001;9994:12;9955:2;10047:1;10072:53;10117:7;10108:6;10097:9;10093:22;10072:53;:::i;:::-;10062:63;;10018:117;10174:2;10200:61;10253:7;10244:6;10233:9;10229:22;10200:61;:::i;:::-;10190:71;;10145:126;10310:2;10336:53;10381:7;10372:6;10361:9;10357:22;10336:53;:::i;:::-;10326:63;;10281:118;10466:2;10455:9;10451:18;10438:32;10497:18;10489:6;10486:30;10483:2;;;10529:1;10526;10519:12;10483:2;10557:78;10627:7;10618:6;10607:9;10603:22;10557:78;:::i;:::-;10547:88;;10409:236;9945:707;;;;;;;:::o;10658:520::-;10736:6;10744;10793:2;10781:9;10772:7;10768:23;10764:32;10761:2;;;10809:1;10806;10799:12;10761:2;10852:1;10877:53;10922:7;10913:6;10902:9;10898:22;10877:53;:::i;:::-;10867:63;;10823:117;11007:2;10996:9;10992:18;10979:32;11038:18;11030:6;11027:30;11024:2;;;11070:1;11067;11060:12;11024:2;11098:63;11153:7;11144:6;11133:9;11129:22;11098:63;:::i;:::-;11088:73;;10950:221;10751:427;;;;;:::o;11184:147::-;11279:45;11318:5;11279:45;:::i;:::-;11274:3;11267:58;11257:74;;:::o;11337:189::-;11458:61;11486:32;11512:5;11486:32;:::i;:::-;11458:61;:::i;:::-;11453:3;11446:74;11436:90;;:::o;11532:118::-;11619:24;11637:5;11619:24;:::i;:::-;11614:3;11607:37;11597:53;;:::o;11656:157::-;11761:45;11781:24;11799:5;11781:24;:::i;:::-;11761:45;:::i;:::-;11756:3;11749:58;11739:74;;:::o;11819:109::-;11900:21;11915:5;11900:21;:::i;:::-;11895:3;11888:34;11878:50;;:::o;11934:118::-;12021:24;12039:5;12021:24;:::i;:::-;12016:3;12009:37;11999:53;;:::o;12058:360::-;12144:3;12172:38;12204:5;12172:38;:::i;:::-;12226:70;12289:6;12284:3;12226:70;:::i;:::-;12219:77;;12305:52;12350:6;12345:3;12338:4;12331:5;12327:16;12305:52;:::i;:::-;12382:29;12404:6;12382:29;:::i;:::-;12377:3;12373:39;12366:46;;12148:270;;;;;:::o;12424:364::-;12512:3;12540:39;12573:5;12540:39;:::i;:::-;12595:71;12659:6;12654:3;12595:71;:::i;:::-;12588:78;;12675:52;12720:6;12715:3;12708:4;12701:5;12697:16;12675:52;:::i;:::-;12752:29;12774:6;12752:29;:::i;:::-;12747:3;12743:39;12736:46;;12516:272;;;;;:::o;12794:377::-;12900:3;12928:39;12961:5;12928:39;:::i;:::-;12983:89;13065:6;13060:3;12983:89;:::i;:::-;12976:96;;13081:52;13126:6;13121:3;13114:4;13107:5;13103:16;13081:52;:::i;:::-;13158:6;13153:3;13149:16;13142:23;;12904:267;;;;;:::o;13201:845::-;13304:3;13341:5;13335:12;13370:36;13396:9;13370:36;:::i;:::-;13422:89;13504:6;13499:3;13422:89;:::i;:::-;13415:96;;13542:1;13531:9;13527:17;13558:1;13553:137;;;;13704:1;13699:341;;;;13520:520;;13553:137;13637:4;13633:9;13622;13618:25;13613:3;13606:38;13673:6;13668:3;13664:16;13657:23;;13553:137;;13699:341;13766:38;13798:5;13766:38;:::i;:::-;13826:1;13840:154;13854:6;13851:1;13848:13;13840:154;;;13928:7;13922:14;13918:1;13913:3;13909:11;13902:35;13978:1;13969:7;13965:15;13954:26;;13876:4;13873:1;13869:12;13864:17;;13840:154;;;14023:6;14018:3;14014:16;14007:23;;13706:334;;13520:520;;13308:738;;;;;;:::o;14052:366::-;14194:3;14215:67;14279:2;14274:3;14215:67;:::i;:::-;14208:74;;14291:93;14380:3;14291:93;:::i;:::-;14409:2;14404:3;14400:12;14393:19;;14198:220;;;:::o;14424:366::-;14566:3;14587:67;14651:2;14646:3;14587:67;:::i;:::-;14580:74;;14663:93;14752:3;14663:93;:::i;:::-;14781:2;14776:3;14772:12;14765:19;;14570:220;;;:::o;14796:366::-;14938:3;14959:67;15023:2;15018:3;14959:67;:::i;:::-;14952:74;;15035:93;15124:3;15035:93;:::i;:::-;15153:2;15148:3;15144:12;15137:19;;14942:220;;;:::o;15168:366::-;15310:3;15331:67;15395:2;15390:3;15331:67;:::i;:::-;15324:74;;15407:93;15496:3;15407:93;:::i;:::-;15525:2;15520:3;15516:12;15509:19;;15314:220;;;:::o;15540:366::-;15682:3;15703:67;15767:2;15762:3;15703:67;:::i;:::-;15696:74;;15779:93;15868:3;15779:93;:::i;:::-;15897:2;15892:3;15888:12;15881:19;;15686:220;;;:::o;15912:366::-;16054:3;16075:67;16139:2;16134:3;16075:67;:::i;:::-;16068:74;;16151:93;16240:3;16151:93;:::i;:::-;16269:2;16264:3;16260:12;16253:19;;16058:220;;;:::o;16284:366::-;16426:3;16447:67;16511:2;16506:3;16447:67;:::i;:::-;16440:74;;16523:93;16612:3;16523:93;:::i;:::-;16641:2;16636:3;16632:12;16625:19;;16430:220;;;:::o;16656:366::-;16798:3;16819:67;16883:2;16878:3;16819:67;:::i;:::-;16812:74;;16895:93;16984:3;16895:93;:::i;:::-;17013:2;17008:3;17004:12;16997:19;;16802:220;;;:::o;17028:398::-;17187:3;17208:83;17289:1;17284:3;17208:83;:::i;:::-;17201:90;;17300:93;17389:3;17300:93;:::i;:::-;17418:1;17413:3;17409:11;17402:18;;17191:235;;;:::o;17432:366::-;17574:3;17595:67;17659:2;17654:3;17595:67;:::i;:::-;17588:74;;17671:93;17760:3;17671:93;:::i;:::-;17789:2;17784:3;17780:12;17773:19;;17578:220;;;:::o;17804:366::-;17946:3;17967:67;18031:2;18026:3;17967:67;:::i;:::-;17960:74;;18043:93;18132:3;18043:93;:::i;:::-;18161:2;18156:3;18152:12;18145:19;;17950:220;;;:::o;18176:366::-;18318:3;18339:67;18403:2;18398:3;18339:67;:::i;:::-;18332:74;;18415:93;18504:3;18415:93;:::i;:::-;18533:2;18528:3;18524:12;18517:19;;18322:220;;;:::o;18548:118::-;18635:24;18653:5;18635:24;:::i;:::-;18630:3;18623:37;18613:53;;:::o;18672:256::-;18784:3;18799:75;18870:3;18861:6;18799:75;:::i;:::-;18899:2;18894:3;18890:12;18883:19;;18919:3;18912:10;;18788:140;;;;:::o;18934:288::-;19062:3;19077:91;19164:3;19155:6;19077:91;:::i;:::-;19193:2;19188:3;19184:12;19177:19;;19213:3;19206:10;;19066:156;;;;:::o;19228:595::-;19456:3;19478:95;19569:3;19560:6;19478:95;:::i;:::-;19471:102;;19590:95;19681:3;19672:6;19590:95;:::i;:::-;19583:102;;19702:95;19793:3;19784:6;19702:95;:::i;:::-;19695:102;;19814:3;19807:10;;19460:363;;;;;;:::o;19829:589::-;20054:3;20076:95;20167:3;20158:6;20076:95;:::i;:::-;20069:102;;20188:95;20279:3;20270:6;20188:95;:::i;:::-;20181:102;;20300:92;20388:3;20379:6;20300:92;:::i;:::-;20293:99;;20409:3;20402:10;;20058:360;;;;;;:::o;20424:583::-;20646:3;20668:92;20756:3;20747:6;20668:92;:::i;:::-;20661:99;;20777:95;20868:3;20859:6;20777:95;:::i;:::-;20770:102;;20889:92;20977:3;20968:6;20889:92;:::i;:::-;20882:99;;20998:3;20991:10;;20650:357;;;;;;:::o;21013:379::-;21197:3;21219:147;21362:3;21219:147;:::i;:::-;21212:154;;21383:3;21376:10;;21201:191;;;:::o;21398:222::-;21491:4;21529:2;21518:9;21514:18;21506:26;;21542:71;21610:1;21599:9;21595:17;21586:6;21542:71;:::i;:::-;21496:124;;;;:::o;21626:458::-;21783:4;21821:2;21810:9;21806:18;21798:26;;21834:71;21902:1;21891:9;21887:17;21878:6;21834:71;:::i;:::-;21915:80;21991:2;21980:9;21976:18;21967:6;21915:80;:::i;:::-;22005:72;22073:2;22062:9;22058:18;22049:6;22005:72;:::i;:::-;21788:296;;;;;;:::o;22090:640::-;22285:4;22323:3;22312:9;22308:19;22300:27;;22337:71;22405:1;22394:9;22390:17;22381:6;22337:71;:::i;:::-;22418:72;22486:2;22475:9;22471:18;22462:6;22418:72;:::i;:::-;22500;22568:2;22557:9;22553:18;22544:6;22500:72;:::i;:::-;22619:9;22613:4;22609:20;22604:2;22593:9;22589:18;22582:48;22647:76;22718:4;22709:6;22647:76;:::i;:::-;22639:84;;22290:440;;;;;;;:::o;22736:210::-;22823:4;22861:2;22850:9;22846:18;22838:26;;22874:65;22936:1;22925:9;22921:17;22912:6;22874:65;:::i;:::-;22828:118;;;;:::o;22952:222::-;23045:4;23083:2;23072:9;23068:18;23060:26;;23096:71;23164:1;23153:9;23149:17;23140:6;23096:71;:::i;:::-;23050:124;;;;:::o;23180:313::-;23293:4;23331:2;23320:9;23316:18;23308:26;;23380:9;23374:4;23370:20;23366:1;23355:9;23351:17;23344:47;23408:78;23481:4;23472:6;23408:78;:::i;:::-;23400:86;;23298:195;;;;:::o;23499:419::-;23665:4;23703:2;23692:9;23688:18;23680:26;;23752:9;23746:4;23742:20;23738:1;23727:9;23723:17;23716:47;23780:131;23906:4;23780:131;:::i;:::-;23772:139;;23670:248;;;:::o;23924:419::-;24090:4;24128:2;24117:9;24113:18;24105:26;;24177:9;24171:4;24167:20;24163:1;24152:9;24148:17;24141:47;24205:131;24331:4;24205:131;:::i;:::-;24197:139;;24095:248;;;:::o;24349:419::-;24515:4;24553:2;24542:9;24538:18;24530:26;;24602:9;24596:4;24592:20;24588:1;24577:9;24573:17;24566:47;24630:131;24756:4;24630:131;:::i;:::-;24622:139;;24520:248;;;:::o;24774:419::-;24940:4;24978:2;24967:9;24963:18;24955:26;;25027:9;25021:4;25017:20;25013:1;25002:9;24998:17;24991:47;25055:131;25181:4;25055:131;:::i;:::-;25047:139;;24945:248;;;:::o;25199:419::-;25365:4;25403:2;25392:9;25388:18;25380:26;;25452:9;25446:4;25442:20;25438:1;25427:9;25423:17;25416:47;25480:131;25606:4;25480:131;:::i;:::-;25472:139;;25370:248;;;:::o;25624:419::-;25790:4;25828:2;25817:9;25813:18;25805:26;;25877:9;25871:4;25867:20;25863:1;25852:9;25848:17;25841:47;25905:131;26031:4;25905:131;:::i;:::-;25897:139;;25795:248;;;:::o;26049:419::-;26215:4;26253:2;26242:9;26238:18;26230:26;;26302:9;26296:4;26292:20;26288:1;26277:9;26273:17;26266:47;26330:131;26456:4;26330:131;:::i;:::-;26322:139;;26220:248;;;:::o;26474:419::-;26640:4;26678:2;26667:9;26663:18;26655:26;;26727:9;26721:4;26717:20;26713:1;26702:9;26698:17;26691:47;26755:131;26881:4;26755:131;:::i;:::-;26747:139;;26645:248;;;:::o;26899:419::-;27065:4;27103:2;27092:9;27088:18;27080:26;;27152:9;27146:4;27142:20;27138:1;27127:9;27123:17;27116:47;27180:131;27306:4;27180:131;:::i;:::-;27172:139;;27070:248;;;:::o;27324:419::-;27490:4;27528:2;27517:9;27513:18;27505:26;;27577:9;27571:4;27567:20;27563:1;27552:9;27548:17;27541:47;27605:131;27731:4;27605:131;:::i;:::-;27597:139;;27495:248;;;:::o;27749:419::-;27915:4;27953:2;27942:9;27938:18;27930:26;;28002:9;27996:4;27992:20;27988:1;27977:9;27973:17;27966:47;28030:131;28156:4;28030:131;:::i;:::-;28022:139;;27920:248;;;:::o;28174:222::-;28267:4;28305:2;28294:9;28290:18;28282:26;;28318:71;28386:1;28375:9;28371:17;28362:6;28318:71;:::i;:::-;28272:124;;;;:::o;28402:129::-;28436:6;28463:20;;:::i;:::-;28453:30;;28492:33;28520:4;28512:6;28492:33;:::i;:::-;28443:88;;;:::o;28537:75::-;28570:6;28603:2;28597:9;28587:19;;28577:35;:::o;28618:311::-;28695:4;28785:18;28777:6;28774:30;28771:2;;;28807:18;;:::i;:::-;28771:2;28857:4;28849:6;28845:17;28837:25;;28917:4;28911;28907:15;28899:23;;28700:229;;;:::o;28935:307::-;28996:4;29086:18;29078:6;29075:30;29072:2;;;29108:18;;:::i;:::-;29072:2;29146:29;29168:6;29146:29;:::i;:::-;29138:37;;29230:4;29224;29220:15;29212:23;;29001:241;;;:::o;29248:308::-;29310:4;29400:18;29392:6;29389:30;29386:2;;;29422:18;;:::i;:::-;29386:2;29460:29;29482:6;29460:29;:::i;:::-;29452:37;;29544:4;29538;29534:15;29526:23;;29315:241;;;:::o;29562:141::-;29611:4;29634:3;29626:11;;29657:3;29654:1;29647:14;29691:4;29688:1;29678:18;29670:26;;29616:87;;;:::o;29709:98::-;29760:6;29794:5;29788:12;29778:22;;29767:40;;;:::o;29813:99::-;29865:6;29899:5;29893:12;29883:22;;29872:40;;;:::o;29918:168::-;30001:11;30035:6;30030:3;30023:19;30075:4;30070:3;30066:14;30051:29;;30013:73;;;;:::o;30092:147::-;30193:11;30230:3;30215:18;;30205:34;;;;:::o;30245:169::-;30329:11;30363:6;30358:3;30351:19;30403:4;30398:3;30394:14;30379:29;;30341:73;;;;:::o;30420:148::-;30522:11;30559:3;30544:18;;30534:34;;;;:::o;30574:305::-;30614:3;30633:20;30651:1;30633:20;:::i;:::-;30628:25;;30667:20;30685:1;30667:20;:::i;:::-;30662:25;;30821:1;30753:66;30749:74;30746:1;30743:81;30740:2;;;30827:18;;:::i;:::-;30740:2;30871:1;30868;30864:9;30857:16;;30618:261;;;;:::o;30885:185::-;30925:1;30942:20;30960:1;30942:20;:::i;:::-;30937:25;;30976:20;30994:1;30976:20;:::i;:::-;30971:25;;31015:1;31005:2;;31020:18;;:::i;:::-;31005:2;31062:1;31059;31055:9;31050:14;;30927:143;;;;:::o;31076:348::-;31116:7;31139:20;31157:1;31139:20;:::i;:::-;31134:25;;31173:20;31191:1;31173:20;:::i;:::-;31168:25;;31361:1;31293:66;31289:74;31286:1;31283:81;31278:1;31271:9;31264:17;31260:105;31257:2;;;31368:18;;:::i;:::-;31257:2;31416:1;31413;31409:9;31398:20;;31124:300;;;;:::o;31430:191::-;31470:4;31490:20;31508:1;31490:20;:::i;:::-;31485:25;;31524:20;31542:1;31524:20;:::i;:::-;31519:25;;31563:1;31560;31557:8;31554:2;;;31568:18;;:::i;:::-;31554:2;31613:1;31610;31606:9;31598:17;;31475:146;;;;:::o;31627:96::-;31664:7;31693:24;31711:5;31693:24;:::i;:::-;31682:35;;31672:51;;;:::o;31729:104::-;31774:7;31803:24;31821:5;31803:24;:::i;:::-;31792:35;;31782:51;;;:::o;31839:90::-;31873:7;31916:5;31909:13;31902:21;31891:32;;31881:48;;;:::o;31935:77::-;31972:7;32001:5;31990:16;;31980:32;;;:::o;32018:149::-;32054:7;32094:66;32087:5;32083:78;32072:89;;32062:105;;;:::o;32173:126::-;32210:7;32250:42;32243:5;32239:54;32228:65;;32218:81;;;:::o;32305:77::-;32342:7;32371:5;32360:16;;32350:32;;;:::o;32388:134::-;32446:9;32479:37;32510:5;32479:37;:::i;:::-;32466:50;;32456:66;;;:::o;32528:126::-;32578:9;32611:37;32642:5;32611:37;:::i;:::-;32598:50;;32588:66;;;:::o;32660:113::-;32710:9;32743:24;32761:5;32743:24;:::i;:::-;32730:37;;32720:53;;;:::o;32779:154::-;32863:6;32858:3;32853;32840:30;32925:1;32916:6;32911:3;32907:16;32900:27;32830:103;;;:::o;32939:307::-;33007:1;33017:113;33031:6;33028:1;33025:13;33017:113;;;33116:1;33111:3;33107:11;33101:18;33097:1;33092:3;33088:11;33081:39;33053:2;33050:1;33046:10;33041:15;;33017:113;;;33148:6;33145:1;33142:13;33139:2;;;33228:1;33219:6;33214:3;33210:16;33203:27;33139:2;32988:258;;;;:::o;33252:171::-;33291:3;33314:24;33332:5;33314:24;:::i;:::-;33305:33;;33360:4;33353:5;33350:15;33347:2;;;33368:18;;:::i;:::-;33347:2;33415:1;33408:5;33404:13;33397:20;;33295:128;;;:::o;33429:320::-;33473:6;33510:1;33504:4;33500:12;33490:22;;33557:1;33551:4;33547:12;33578:18;33568:2;;33634:4;33626:6;33622:17;33612:27;;33568:2;33696;33688:6;33685:14;33665:18;33662:38;33659:2;;;33715:18;;:::i;:::-;33659:2;33480:269;;;;:::o;33755:281::-;33838:27;33860:4;33838:27;:::i;:::-;33830:6;33826:40;33968:6;33956:10;33953:22;33932:18;33920:10;33917:34;33914:62;33911:2;;;33979:18;;:::i;:::-;33911:2;34019:10;34015:2;34008:22;33798:238;;;:::o;34042:233::-;34081:3;34104:24;34122:5;34104:24;:::i;:::-;34095:33;;34150:66;34143:5;34140:77;34137:2;;;34220:18;;:::i;:::-;34137:2;34267:1;34260:5;34256:13;34249:20;;34085:190;;;:::o;34281:100::-;34320:7;34349:26;34369:5;34349:26;:::i;:::-;34338:37;;34328:53;;;:::o;34387:108::-;34434:7;34463:26;34483:5;34463:26;:::i;:::-;34452:37;;34442:53;;;:::o;34501:94::-;34540:7;34569:20;34583:5;34569:20;:::i;:::-;34558:31;;34548:47;;;:::o;34601:180::-;34649:77;34646:1;34639:88;34746:4;34743:1;34736:15;34770:4;34767:1;34760:15;34787:180;34835:77;34832:1;34825:88;34932:4;34929:1;34922:15;34956:4;34953:1;34946:15;34973:180;35021:77;35018:1;35011:88;35118:4;35115:1;35108:15;35142:4;35139:1;35132:15;35159:180;35207:77;35204:1;35197:88;35304:4;35301:1;35294:15;35328:4;35325:1;35318:15;35345:102;35386:6;35437:2;35433:7;35428:2;35421:5;35417:14;35413:28;35403:38;;35393:54;;;:::o;35453:94::-;35486:8;35534:5;35530:2;35526:14;35505:35;;35495:52;;;:::o;35553:225::-;35693:34;35689:1;35681:6;35677:14;35670:58;35762:8;35757:2;35749:6;35745:15;35738:33;35659:119;:::o;35784:173::-;35924:25;35920:1;35912:6;35908:14;35901:49;35890:67;:::o;35963:234::-;36103:34;36099:1;36091:6;36087:14;36080:58;36172:17;36167:2;36159:6;36155:15;36148:42;36069:128;:::o;36203:168::-;36343:20;36339:1;36331:6;36327:14;36320:44;36309:62;:::o;36377:244::-;36517:34;36513:1;36505:6;36501:14;36494:58;36586:27;36581:2;36573:6;36569:15;36562:52;36483:138;:::o;36627:182::-;36767:34;36763:1;36755:6;36751:14;36744:58;36733:76;:::o;36815:234::-;36955:34;36951:1;36943:6;36939:14;36932:58;37024:17;37019:2;37011:6;37007:15;37000:42;36921:128;:::o;37055:181::-;37195:33;37191:1;37183:6;37179:14;37172:57;37161:75;:::o;37242:114::-;37348:8;:::o;37362:244::-;37502:34;37498:1;37490:6;37486:14;37479:58;37571:27;37566:2;37558:6;37554:15;37547:52;37468:138;:::o;37612:220::-;37752:34;37748:1;37740:6;37736:14;37729:58;37821:3;37816:2;37808:6;37804:15;37797:28;37718:114;:::o;37838:176::-;37978:28;37974:1;37966:6;37962:14;37955:52;37944:70;:::o;38020:122::-;38093:24;38111:5;38093:24;:::i;:::-;38086:5;38083:35;38073:2;;38132:1;38129;38122:12;38073:2;38063:79;:::o;38148:138::-;38229:32;38255:5;38229:32;:::i;:::-;38222:5;38219:43;38209:2;;38276:1;38273;38266:12;38209:2;38199:87;:::o;38292:116::-;38362:21;38377:5;38362:21;:::i;:::-;38355:5;38352:32;38342:2;;38398:1;38395;38388:12;38342:2;38332:76;:::o;38414:122::-;38487:24;38505:5;38487:24;:::i;:::-;38480:5;38477:35;38467:2;;38526:1;38523;38516:12;38467:2;38457:79;:::o;38542:120::-;38614:23;38631:5;38614:23;:::i;:::-;38607:5;38604:34;38594:2;;38652:1;38649;38642:12;38594:2;38584:78;:::o;38668:122::-;38741:24;38759:5;38741:24;:::i;:::-;38734:5;38731:35;38721:2;;38780:1;38777;38770:12;38721:2;38711:79;:::o
Swarm Source
ipfs://fbc8a6bd5b1aa83d01514a198734ff2f963e7274e27667918cc65307550ee2ec
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.