Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 236 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 19700857 | 135 days ago | IN | 0 ETH | 0.00026926 | ||||
Set Approval For... | 16956006 | 520 days ago | IN | 0 ETH | 0.00084996 | ||||
Set Approval For... | 16956004 | 520 days ago | IN | 0 ETH | 0.00094699 | ||||
Set Approval For... | 16956004 | 520 days ago | IN | 0 ETH | 0.00094699 | ||||
Set Approval For... | 16956004 | 520 days ago | IN | 0 ETH | 0.00094699 | ||||
Set Approval For... | 16956004 | 520 days ago | IN | 0 ETH | 0.00094699 | ||||
Set Approval For... | 16956004 | 520 days ago | IN | 0 ETH | 0.00094699 | ||||
Set Approval For... | 16956004 | 520 days ago | IN | 0 ETH | 0.00094699 | ||||
Set Approval For... | 16956004 | 520 days ago | IN | 0 ETH | 0.00094699 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956003 | 520 days ago | IN | 0 ETH | 0.00096163 | ||||
Set Approval For... | 16956002 | 520 days ago | IN | 0 ETH | 0.00095406 | ||||
Set Approval For... | 16956002 | 520 days ago | IN | 0 ETH | 0.00095406 | ||||
Set Approval For... | 16956002 | 520 days ago | IN | 0 ETH | 0.00095406 | ||||
Set Approval For... | 16956002 | 520 days ago | IN | 0 ETH | 0.00095406 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Bulls
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-01 */ // SPDX-License-Identifier: MIT /* Developed by @Sayem98 Github: https://github.com/Sayem98 LinkedIn: https://www.linkedin.com/in/sayem-abedin/ Fiverr: https://www.fiverr.com/sayem_abedin */ // 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/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(0xa1426107292737fE690e2A96C9Cab83755F5FF65); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.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/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.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/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.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: contracts/Woolsters.sol // First mint free and remaining is paid per wallet, low gas contract pragma solidity >=0.7.0 <0.9.0; contract Bulls is ERC721, Ownable { using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private supply; string public uriPrefix = "ipfs://bafybeibsty4l4bljmm7dad3dnxx2drqzdixkcsn5ulirykthzaizziz2nm/"; string public uriSuffix = ".json"; uint256 public cost = 0.0055 ether; uint256 public maxSupply = 555; uint public freeSupply = 177; uint public freeMinted = 0; uint256 public maxMintAmountPerTx = 7; uint public maxMintPreWallet = 7; mapping(address=>bool) public hasFreeMinted; address[] public airDropAddress; // hidden image URI string public hiddenImageURI = "ipfs://bafybeic3tmjyb7gfmykaa2gwiemxue2gjdvap5bhxiud4m4ceymdnualei/hidden.json"; bool public Revealed = false; // whitelist mint period. address public receiver = owner(); constructor() ERC721("1969 Bulls", "69BLS") { } /* Mint any amount of NFTs and one is free for each wallet. * @dev Mint NFTs * @param _mintAmount The number of NFTs to mint */ function mint(uint256 _mintAmount) public payable { require(_mintAmount <= maxMintAmountPerTx, "Invalid transaction"); require(walletOfOwner(msg.sender).length + _mintAmount <= maxMintPreWallet, "Invalid transaction"); // Check that the total supply of NFTs will not exceed the maximum supply after this minting uint256 currentSupply = totalSupply(); require(currentSupply + _mintAmount <= maxSupply, "Max supply reached"); if(hasFreeMinted[msg.sender]){ require(msg.value >= cost * _mintAmount, "invalid cost"); }else{ require(freeMinted+_mintAmount<=freeSupply, "All free NFT is minted"); require(msg.value >= cost *(_mintAmount-1), "invalid cost -2"); hasFreeMinted[msg.sender] = true; freeMinted += 1; } // Mint the NFTs for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(msg.sender, currentSupply + i); supply.increment(); } } function adminMint(uint256 _mintAmount) public onlyOwner { uint256 currentSupply = totalSupply(); require(currentSupply + _mintAmount <= maxSupply, "Max supply reached"); // Mint the NFTs for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(msg.sender, currentSupply + i); supply.increment(); } } function airdrop() public onlyOwner{ for(uint i=0;i<airDropAddress.length;i++){ if(airDropAddress[i] != address(0)){ uint currentSupply = totalSupply(); _safeMint(airDropAddress[i], currentSupply + i+1); supply.increment(); delete airDropAddress[i]; } } } /* Setter functions */ /* -> For setting any address as white listed or not. @params _address: address to be white listed, _value: true/false */ /* -> For setting multiple address as white listed or not. @params _addresses: array of address to be white listed, _value: true/false */ /* -> For setting any address as airdrop address. @params _address: address to be airdrop address @dev only owner can call this function. */ function setAirdropAddress(address _address) public onlyOwner{ airDropAddress.push(_address); } /* -> For removing address as airdrop address. @params _address : address to be removed from airdrop address @dev only owner can call this function. */ function removeAirdropAddress(address _address) public onlyOwner{ for(uint i=0;i<airDropAddress.length;i++){ if(airDropAddress[i] == _address){ delete airDropAddress[i]; } } } /* ->setting max mint amount per wallet. @params _value: max mint amount per wallet @dev only owner can call this function. */ function setMaxMintPerWallet(uint _value) public onlyOwner{ maxMintPreWallet = _value; } /* -> setting white listed minting cost. @params _cost: cost of minting for white listed address @dev only owner can call this function. */ /* -> setting cost of minting. @params _cost: cost of minting @dev only owner can call this function. */ function setCost(uint256 _cost) public onlyOwner { cost = _cost; } /* -> setting max mint amount per transaction. @params _maxMintAmountPerTx: max mint amount per transaction @dev only owner can call this function. */ function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } /* ->s setting URI prefix. @params _uriPrefix: URI prefix @dev only owner can call this function. */ function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } /* -> setting URI suffix. @params _uriSuffix: URI suffix @dev only owner can call this function. */ function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } /* -> setting state of contract. @params _state: true/false @dev only owner can call this function. */ function setReveal(bool _state) public onlyOwner{ Revealed = _state; } function withdraw() public onlyOwner { // This will transfer the remaining contract balance to the owner. // Do not remove this otherwise you will not be able to withdraw the funds. // ============================================================================= (bool os, ) = payable(receiver).call{value: address(this).balance}(""); require(os); // ============================================================================= } function setReceiver(address _add) public onlyOwner{ receiver = _add; } /* -> Getter functions */ function totalSupply() public view returns (uint256) { return supply.current(); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(!Revealed){ return hiddenImageURI; }else{ string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function setHiddenURI(string memory _uri) public onlyOwner{ hiddenImageURI = _uri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"Revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"airDropAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdrop","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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","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":[{"internalType":"address","name":"","type":"address"}],"name":"hasFreeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenImageURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPreWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAirdropAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setAirdropAddress","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"setReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180608001604052806043815260200162004cd260439139600890816200002e919062000566565b506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506009908162000075919062000566565b5066138a388a43c000600a5561022b600b5560b1600c556000600d556007600e556007600f556040518060800160405280604e815260200162004d15604e913960129081620000c5919062000566565b506000601360006101000a81548160ff021916908315150217905550620000f1620001fc60201b60201c565b601360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200013e57600080fd5b506040518060400160405280600a81526020017f313936392042756c6c73000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f3639424c530000000000000000000000000000000000000000000000000000008152508160009081620001bc919062000566565b508060019081620001ce919062000566565b505050620001f673a1426107292737fe690e2a96c9cab83755f5ff656200022660201b60201c565b6200064d565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036e57607f821691505b60208210810362000384576200038362000326565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003ee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003af565b620003fa8683620003af565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000447620004416200043b8462000412565b6200041c565b62000412565b9050919050565b6000819050919050565b620004638362000426565b6200047b62000472826200044e565b848454620003bc565b825550505050565b600090565b6200049262000483565b6200049f81848462000458565b505050565b5b81811015620004c757620004bb60008262000488565b600181019050620004a5565b5050565b601f8211156200051657620004e0816200038a565b620004eb846200039f565b81016020851015620004fb578190505b620005136200050a856200039f565b830182620004a4565b50505b505050565b600082821c905092915050565b60006200053b600019846008026200051b565b1980831691505092915050565b600062000556838362000528565b9150826002028217905092915050565b6200057182620002ec565b67ffffffffffffffff8111156200058d576200058c620002f7565b5b62000599825462000355565b620005a6828285620004cb565b600060209050601f831160018114620005de5760008415620005c9578287015190505b620005d5858262000548565b86555062000645565b601f198416620005ee866200038a565b60005b828110156200061857848901518255600182019150602085019450602081019050620005f1565b8683101562000638578489015162000634601f89168262000528565b8355505b6001600288020188555050505b505050505050565b614675806200065d6000396000f3fe6080604052600436106102725760003560e01c8063718da7ee1161014f578063b88d4fde116100c1578063d88a10861161007a578063d88a108614610917578063e2a7169c14610942578063e985e9c51461096d578063ef6187a4146109aa578063f2fde38b146109e7578063f7260d3e14610a1057610272565b8063b88d4fde14610809578063bbaac02f14610832578063c1f261231461085b578063c87b56dd14610884578063d10a1a2b146108c1578063d5abeb01146108ec57610272565b806396d4710d1161011357806396d4710d14610720578063a0712d6814610749578063a22cb46514610765578063ab0eda9e1461078e578063afdf6134146107b7578063b071401b146107e057610272565b8063718da7ee1461064d5780637ec4a659146106765780638da5cb5b1461069f57806394354fd0146106ca57806395d89b41146106f557610272565b80633884d635116101e85780635503a0e8116101ac5780635503a0e814610529578063599d86c21461055457806362b99ad4146105915780636352211e146105bc57806370a08231146105f9578063715018a61461063657610272565b80633884d6351461046c5780633ccfd60b1461048357806342842e0e1461049a578063438b6300146104c357806344a0d68a1461050057610272565b806316ba10e01161023a57806316ba10e01461037057806318160ddd1461039957806323b872dd146103c457806324a6ab0c146103ed5780632a3f300c14610418578063382fad8e1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806313faede614610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190612f2a565b610a3b565b6040516102ab9190612f72565b60405180910390f35b3480156102c057600080fd5b506102c9610b1d565b6040516102d6919061301d565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613075565b610baf565b60405161031391906130e3565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061312a565b610bf5565b005b34801561035157600080fd5b5061035a610d0c565b6040516103679190613179565b60405180910390f35b34801561037c57600080fd5b50610397600480360381019061039291906132c9565b610d12565b005b3480156103a557600080fd5b506103ae610d2d565b6040516103bb9190613179565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613312565b610d3e565b005b3480156103f957600080fd5b50610402610d9e565b60405161040f9190613179565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613391565b610da4565b005b34801561044d57600080fd5b50610456610dc9565b6040516104639190613179565b60405180910390f35b34801561047857600080fd5b50610481610dcf565b005b34801561048f57600080fd5b50610498610f27565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190613312565b610fca565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906133be565b610fea565b6040516104f791906134a9565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190613075565b6110f4565b005b34801561053557600080fd5b5061053e611106565b60405161054b919061301d565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190613075565b611194565b60405161058891906130e3565b60405180910390f35b34801561059d57600080fd5b506105a66111d3565b6040516105b3919061301d565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de9190613075565b611261565b6040516105f091906130e3565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b91906133be565b6112e7565b60405161062d9190613179565b60405180910390f35b34801561064257600080fd5b5061064b61139e565b005b34801561065957600080fd5b50610674600480360381019061066f91906133be565b6113b2565b005b34801561068257600080fd5b5061069d600480360381019061069891906132c9565b6113fe565b005b3480156106ab57600080fd5b506106b4611419565b6040516106c191906130e3565b60405180910390f35b3480156106d657600080fd5b506106df611443565b6040516106ec9190613179565b60405180910390f35b34801561070157600080fd5b5061070a611449565b604051610717919061301d565b60405180910390f35b34801561072c57600080fd5b50610747600480360381019061074291906133be565b6114db565b005b610763600480360381019061075e9190613075565b6115bd565b005b34801561077157600080fd5b5061078c600480360381019061078791906134cb565b6118c4565b005b34801561079a57600080fd5b506107b560048036038101906107b091906133be565b6118da565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613075565b611948565b005b3480156107ec57600080fd5b5061080760048036038101906108029190613075565b61195a565b005b34801561081557600080fd5b50610830600480360381019061082b91906135ac565b61196c565b005b34801561083e57600080fd5b50610859600480360381019061085491906132c9565b6119ce565b005b34801561086757600080fd5b50610882600480360381019061087d9190613075565b6119e9565b005b34801561089057600080fd5b506108ab60048036038101906108a69190613075565b611a92565b6040516108b8919061301d565b60405180910390f35b3480156108cd57600080fd5b506108d6611be3565b6040516108e39190613179565b60405180910390f35b3480156108f857600080fd5b50610901611be9565b60405161090e9190613179565b60405180910390f35b34801561092357600080fd5b5061092c611bef565b604051610939919061301d565b60405180910390f35b34801561094e57600080fd5b50610957611c7d565b6040516109649190612f72565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f919061362f565b611c90565b6040516109a19190612f72565b60405180910390f35b3480156109b657600080fd5b506109d160048036038101906109cc91906133be565b611d24565b6040516109de9190612f72565b60405180910390f35b3480156109f357600080fd5b50610a0e6004803603810190610a0991906133be565b611d44565b005b348015610a1c57600080fd5b50610a25611dc7565b604051610a3291906130e3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b165750610b1582611ded565b5b9050919050565b606060008054610b2c9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b589061369e565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b6000610bba82611e57565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0082611261565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790613741565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c8f611ea2565b73ffffffffffffffffffffffffffffffffffffffff161480610cbe5750610cbd81610cb8611ea2565b611c90565b5b610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906137d3565b60405180910390fd5b610d078383611eaa565b505050565b600a5481565b610d1a611f63565b8060099081610d29919061399f565b5050565b6000610d396007611fe1565b905090565b610d4f610d49611ea2565b82611fef565b610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613ae3565b60405180910390fd5b610d99838383612084565b505050565b600c5481565b610dac611f63565b80601360006101000a81548160ff02191690831515021790555050565b600f5481565b610dd7611f63565b60005b601180549050811015610f2457600073ffffffffffffffffffffffffffffffffffffffff1660118281548110610e1357610e12613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f11576000610e63610d2d565b9050610ec460118381548110610e7c57610e7b613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018484610eb59190613b61565b610ebf9190613b61565b61237d565b610ece600761239b565b60118281548110610ee257610ee1613b03565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055505b8080610f1c90613b95565b915050610dda565b50565b610f2f611f63565b6000601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610f7790613c0e565b60006040518083038185875af1925050503d8060008114610fb4576040519150601f19603f3d011682016040523d82523d6000602084013e610fb9565b606091505b5050905080610fc757600080fd5b50565b610fe58383836040518060200160405280600081525061196c565b505050565b60606000610ff7836112e7565b905060008167ffffffffffffffff8111156110155761101461319e565b5b6040519080825280602002602001820160405280156110435781602001602082028036833780820191505090505b50905060006001905060005b83811080156110605750600b548211155b156110e857600061107083611261565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d457828483815181106110b9576110b8613b03565b5b60200260200101818152505081806110d090613b95565b9250505b82806110df90613b95565b9350505061104f565b82945050505050919050565b6110fc611f63565b80600a8190555050565b600980546111139061369e565b80601f016020809104026020016040519081016040528092919081815260200182805461113f9061369e565b801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b505050505081565b601181815481106111a457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600880546111e09061369e565b80601f016020809104026020016040519081016040528092919081815260200182805461120c9061369e565b80156112595780601f1061122e57610100808354040283529160200191611259565b820191906000526020600020905b81548152906001019060200180831161123c57829003601f168201915b505050505081565b60008061126d836123b1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d590613c6f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e90613d01565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113a6611f63565b6113b060006123ee565b565b6113ba611f63565b80601360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611406611f63565b8060089081611415919061399f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546114589061369e565b80601f01602080910402602001604051908101604052809291908181526020018280546114849061369e565b80156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b5050505050905090565b6114e3611f63565b60005b6011805490508110156115b9578173ffffffffffffffffffffffffffffffffffffffff166011828154811061151e5761151d613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036115a6576011818154811061157857611577613b03565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b80806115b190613b95565b9150506114e6565b5050565b600e54811115611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990613d6d565b60405180910390fd5b600f548161160f33610fea565b5161161a9190613b61565b111561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290613d6d565b60405180910390fd5b6000611665610d2d565b9050600b5482826116769190613b61565b11156116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90613dd9565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561175e5781600a546117179190613df9565b341015611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090613e87565b60405180910390fd5b61187f565b600c5482600d5461176f9190613b61565b11156117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790613ef3565b60405180910390fd5b6001826117bd9190613f13565b600a546117ca9190613df9565b34101561180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390613f93565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60008282546118779190613b61565b925050819055505b6000600190505b8281116118bf576118a233828461189d9190613b61565b61237d565b6118ac600761239b565b80806118b790613b95565b915050611886565b505050565b6118d66118cf611ea2565b83836124b4565b5050565b6118e2611f63565b6011819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611950611f63565b80600f8190555050565b611962611f63565b80600e8190555050565b61197d611977611ea2565b83611fef565b6119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613ae3565b60405180910390fd5b6119c884848484612620565b50505050565b6119d6611f63565b80601290816119e5919061399f565b5050565b6119f1611f63565b60006119fb610d2d565b9050600b548282611a0c9190613b61565b1115611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490613dd9565b60405180910390fd5b6000600190505b828111611a8d57611a70338284611a6b9190613b61565b61237d565b611a7a600761239b565b8080611a8590613b95565b915050611a54565b505050565b6060611a9d8261267c565b611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad390614025565b60405180910390fd5b601360009054906101000a900460ff16611b825760128054611afd9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b299061369e565b8015611b765780601f10611b4b57610100808354040283529160200191611b76565b820191906000526020600020905b815481529060010190602001808311611b5957829003601f168201915b50505050509050611bde565b6000611b8c6126bd565b90506000815111611bac5760405180602001604052806000815250611bda565b80611bb68461274f565b6009604051602001611bca93929190614104565b6040516020818303038152906040525b9150505b919050565b600d5481565b600b5481565b60128054611bfc9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c289061369e565b8015611c755780601f10611c4a57610100808354040283529160200191611c75565b820191906000526020600020905b815481529060010190602001808311611c5857829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b611d4c611f63565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db2906141a7565b60405180910390fd5b611dc4816123ee565b50565b601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e608161267c565b611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690613c6f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f1d83611261565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f6b611ea2565b73ffffffffffffffffffffffffffffffffffffffff16611f89611419565b73ffffffffffffffffffffffffffffffffffffffff1614611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd690614213565b60405180910390fd5b565b600081600001549050919050565b600080611ffb83611261565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061203d575061203c8185611c90565b5b8061207b57508373ffffffffffffffffffffffffffffffffffffffff1661206384610baf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120a482611261565b73ffffffffffffffffffffffffffffffffffffffff16146120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f1906142a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216090614337565b60405180910390fd5b612176838383600161281d565b8273ffffffffffffffffffffffffffffffffffffffff1661219682611261565b73ffffffffffffffffffffffffffffffffffffffff16146121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e3906142a5565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123788383836001612943565b505050565b612397828260405180602001604052806000815250612949565b5050565b6001816000016000828254019250508190555050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906143a3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126139190612f72565b60405180910390a3505050565b61262b848484612084565b612637848484846129a4565b612676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266d90614435565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661269e836123b1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600880546126cc9061369e565b80601f01602080910402602001604051908101604052809291908181526020018280546126f89061369e565b80156127455780601f1061271a57610100808354040283529160200191612745565b820191906000526020600020905b81548152906001019060200180831161272857829003601f168201915b5050505050905090565b60606000600161275e84612b2b565b01905060008167ffffffffffffffff81111561277d5761277c61319e565b5b6040519080825280601f01601f1916602001820160405280156127af5781602001600182028036833780820191505090505b509050600082602001820190505b600115612812578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161280657612805614455565b5b049450600085036127bd575b819350505050919050565b600181111561293d57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146128b15780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a99190613f13565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461293c5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129349190613b61565b925050819055505b5b50505050565b50505050565b6129538383612c7e565b61296060008484846129a4565b61299f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299690614435565b60405180910390fd5b505050565b60006129c58473ffffffffffffffffffffffffffffffffffffffff16612e9b565b15612b1e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129ee611ea2565b8786866040518563ffffffff1660e01b8152600401612a1094939291906144d9565b6020604051808303816000875af1925050508015612a4c57506040513d601f19601f82011682018060405250810190612a49919061453a565b60015b612ace573d8060008114612a7c576040519150601f19603f3d011682016040523d82523d6000602084013e612a81565b606091505b506000815103612ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abd90614435565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b23565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b89577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b7f57612b7e614455565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612bc6576d04ee2d6d415b85acef81000000008381612bbc57612bbb614455565b5b0492506020810190505b662386f26fc100008310612bf557662386f26fc100008381612beb57612bea614455565b5b0492506010810190505b6305f5e1008310612c1e576305f5e1008381612c1457612c13614455565b5b0492506008810190505b6127108310612c43576127108381612c3957612c38614455565b5b0492506004810190505b60648310612c665760648381612c5c57612c5b614455565b5b0492506002810190505b600a8310612c75576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce4906145b3565b60405180910390fd5b612cf68161267c565b15612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d9061461f565b60405180910390fd5b612d4460008383600161281d565b612d4d8161267c565b15612d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d849061461f565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e97600083836001612943565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f0781612ed2565b8114612f1257600080fd5b50565b600081359050612f2481612efe565b92915050565b600060208284031215612f4057612f3f612ec8565b5b6000612f4e84828501612f15565b91505092915050565b60008115159050919050565b612f6c81612f57565b82525050565b6000602082019050612f876000830184612f63565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fc7578082015181840152602081019050612fac565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fef82612f8d565b612ff98185612f98565b9350613009818560208601612fa9565b61301281612fd3565b840191505092915050565b600060208201905081810360008301526130378184612fe4565b905092915050565b6000819050919050565b6130528161303f565b811461305d57600080fd5b50565b60008135905061306f81613049565b92915050565b60006020828403121561308b5761308a612ec8565b5b600061309984828501613060565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130cd826130a2565b9050919050565b6130dd816130c2565b82525050565b60006020820190506130f860008301846130d4565b92915050565b613107816130c2565b811461311257600080fd5b50565b600081359050613124816130fe565b92915050565b6000806040838503121561314157613140612ec8565b5b600061314f85828601613115565b925050602061316085828601613060565b9150509250929050565b6131738161303f565b82525050565b600060208201905061318e600083018461316a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131d682612fd3565b810181811067ffffffffffffffff821117156131f5576131f461319e565b5b80604052505050565b6000613208612ebe565b905061321482826131cd565b919050565b600067ffffffffffffffff8211156132345761323361319e565b5b61323d82612fd3565b9050602081019050919050565b82818337600083830152505050565b600061326c61326784613219565b6131fe565b90508281526020810184848401111561328857613287613199565b5b61329384828561324a565b509392505050565b600082601f8301126132b0576132af613194565b5b81356132c0848260208601613259565b91505092915050565b6000602082840312156132df576132de612ec8565b5b600082013567ffffffffffffffff8111156132fd576132fc612ecd565b5b6133098482850161329b565b91505092915050565b60008060006060848603121561332b5761332a612ec8565b5b600061333986828701613115565b935050602061334a86828701613115565b925050604061335b86828701613060565b9150509250925092565b61336e81612f57565b811461337957600080fd5b50565b60008135905061338b81613365565b92915050565b6000602082840312156133a7576133a6612ec8565b5b60006133b58482850161337c565b91505092915050565b6000602082840312156133d4576133d3612ec8565b5b60006133e284828501613115565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134208161303f565b82525050565b60006134328383613417565b60208301905092915050565b6000602082019050919050565b6000613456826133eb565b61346081856133f6565b935061346b83613407565b8060005b8381101561349c5781516134838882613426565b975061348e8361343e565b92505060018101905061346f565b5085935050505092915050565b600060208201905081810360008301526134c3818461344b565b905092915050565b600080604083850312156134e2576134e1612ec8565b5b60006134f085828601613115565b92505060206135018582860161337c565b9150509250929050565b600067ffffffffffffffff8211156135265761352561319e565b5b61352f82612fd3565b9050602081019050919050565b600061354f61354a8461350b565b6131fe565b90508281526020810184848401111561356b5761356a613199565b5b61357684828561324a565b509392505050565b600082601f83011261359357613592613194565b5b81356135a384826020860161353c565b91505092915050565b600080600080608085870312156135c6576135c5612ec8565b5b60006135d487828801613115565b94505060206135e587828801613115565b93505060406135f687828801613060565b925050606085013567ffffffffffffffff81111561361757613616612ecd565b5b6136238782880161357e565b91505092959194509250565b6000806040838503121561364657613645612ec8565b5b600061365485828601613115565b925050602061366585828601613115565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136b657607f821691505b6020821081036136c9576136c861366f565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061372b602183612f98565b9150613736826136cf565b604082019050919050565b6000602082019050818103600083015261375a8161371e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006137bd603d83612f98565b91506137c882613761565b604082019050919050565b600060208201905081810360008301526137ec816137b0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613818565b61385f8683613818565b95508019841693508086168417925050509392505050565b6000819050919050565b600061389c6138976138928461303f565b613877565b61303f565b9050919050565b6000819050919050565b6138b683613881565b6138ca6138c2826138a3565b848454613825565b825550505050565b600090565b6138df6138d2565b6138ea8184846138ad565b505050565b5b8181101561390e576139036000826138d7565b6001810190506138f0565b5050565b601f82111561395357613924816137f3565b61392d84613808565b8101602085101561393c578190505b61395061394885613808565b8301826138ef565b50505b505050565b600082821c905092915050565b600061397660001984600802613958565b1980831691505092915050565b600061398f8383613965565b9150826002028217905092915050565b6139a882612f8d565b67ffffffffffffffff8111156139c1576139c061319e565b5b6139cb825461369e565b6139d6828285613912565b600060209050601f831160018114613a0957600084156139f7578287015190505b613a018582613983565b865550613a69565b601f198416613a17866137f3565b60005b82811015613a3f57848901518255600182019150602085019450602081019050613a1a565b86831015613a5c5784890151613a58601f891682613965565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613acd602d83612f98565b9150613ad882613a71565b604082019050919050565b60006020820190508181036000830152613afc81613ac0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b6c8261303f565b9150613b778361303f565b9250828201905080821115613b8f57613b8e613b32565b5b92915050565b6000613ba08261303f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bd257613bd1613b32565b5b600182019050919050565b600081905092915050565b50565b6000613bf8600083613bdd565b9150613c0382613be8565b600082019050919050565b6000613c1982613beb565b9150819050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613c59601883612f98565b9150613c6482613c23565b602082019050919050565b60006020820190508181036000830152613c8881613c4c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613ceb602983612f98565b9150613cf682613c8f565b604082019050919050565b60006020820190508181036000830152613d1a81613cde565b9050919050565b7f496e76616c6964207472616e73616374696f6e00000000000000000000000000600082015250565b6000613d57601383612f98565b9150613d6282613d21565b602082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613dc3601283612f98565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b6000613e048261303f565b9150613e0f8361303f565b9250828202613e1d8161303f565b91508282048414831517613e3457613e33613b32565b5b5092915050565b7f696e76616c696420636f73740000000000000000000000000000000000000000600082015250565b6000613e71600c83612f98565b9150613e7c82613e3b565b602082019050919050565b60006020820190508181036000830152613ea081613e64565b9050919050565b7f416c6c2066726565204e4654206973206d696e74656400000000000000000000600082015250565b6000613edd601683612f98565b9150613ee882613ea7565b602082019050919050565b60006020820190508181036000830152613f0c81613ed0565b9050919050565b6000613f1e8261303f565b9150613f298361303f565b9250828203905081811115613f4157613f40613b32565b5b92915050565b7f696e76616c696420636f7374202d320000000000000000000000000000000000600082015250565b6000613f7d600f83612f98565b9150613f8882613f47565b602082019050919050565b60006020820190508181036000830152613fac81613f70565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061400f602f83612f98565b915061401a82613fb3565b604082019050919050565b6000602082019050818103600083015261403e81614002565b9050919050565b600081905092915050565b600061405b82612f8d565b6140658185614045565b9350614075818560208601612fa9565b80840191505092915050565b6000815461408e8161369e565b6140988186614045565b945060018216600081146140b357600181146140c8576140fb565b60ff19831686528115158202860193506140fb565b6140d1856137f3565b60005b838110156140f3578154818901526001820191506020810190506140d4565b838801955050505b50505092915050565b60006141108286614050565b915061411c8285614050565b91506141288284614081565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614191602683612f98565b915061419c82614135565b604082019050919050565b600060208201905081810360008301526141c081614184565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141fd602083612f98565b9150614208826141c7565b602082019050919050565b6000602082019050818103600083015261422c816141f0565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061428f602583612f98565b915061429a82614233565b604082019050919050565b600060208201905081810360008301526142be81614282565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614321602483612f98565b915061432c826142c5565b604082019050919050565b6000602082019050818103600083015261435081614314565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061438d601983612f98565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061441f603283612f98565b915061442a826143c3565b604082019050919050565b6000602082019050818103600083015261444e81614412565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006144ab82614484565b6144b5818561448f565b93506144c5818560208601612fa9565b6144ce81612fd3565b840191505092915050565b60006080820190506144ee60008301876130d4565b6144fb60208301866130d4565b614508604083018561316a565b818103606083015261451a81846144a0565b905095945050505050565b60008151905061453481612efe565b92915050565b6000602082840312156145505761454f612ec8565b5b600061455e84828501614525565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061459d602083612f98565b91506145a882614567565b602082019050919050565b600060208201905081810360008301526145cc81614590565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614609601c83612f98565b9150614614826145d3565b602082019050919050565b60006020820190508181036000830152614638816145fc565b905091905056fea2646970667358221220e336e456d930da825734a6b0fcce1818fcd9b781adb55cde0e14c2cba07183d664736f6c63430008120033697066733a2f2f6261667962656962737479346c34626c6a6d6d3764616433646e7878326472717a6469786b63736e35756c6972796b74687a61697a7a697a326e6d2f697066733a2f2f626166796265696333746d6a79623767666d796b616132677769656d78756532676a6476617035626878697564346d346365796d646e75616c65692f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102725760003560e01c8063718da7ee1161014f578063b88d4fde116100c1578063d88a10861161007a578063d88a108614610917578063e2a7169c14610942578063e985e9c51461096d578063ef6187a4146109aa578063f2fde38b146109e7578063f7260d3e14610a1057610272565b8063b88d4fde14610809578063bbaac02f14610832578063c1f261231461085b578063c87b56dd14610884578063d10a1a2b146108c1578063d5abeb01146108ec57610272565b806396d4710d1161011357806396d4710d14610720578063a0712d6814610749578063a22cb46514610765578063ab0eda9e1461078e578063afdf6134146107b7578063b071401b146107e057610272565b8063718da7ee1461064d5780637ec4a659146106765780638da5cb5b1461069f57806394354fd0146106ca57806395d89b41146106f557610272565b80633884d635116101e85780635503a0e8116101ac5780635503a0e814610529578063599d86c21461055457806362b99ad4146105915780636352211e146105bc57806370a08231146105f9578063715018a61461063657610272565b80633884d6351461046c5780633ccfd60b1461048357806342842e0e1461049a578063438b6300146104c357806344a0d68a1461050057610272565b806316ba10e01161023a57806316ba10e01461037057806318160ddd1461039957806323b872dd146103c457806324a6ab0c146103ed5780632a3f300c14610418578063382fad8e1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806313faede614610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190612f2a565b610a3b565b6040516102ab9190612f72565b60405180910390f35b3480156102c057600080fd5b506102c9610b1d565b6040516102d6919061301d565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613075565b610baf565b60405161031391906130e3565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061312a565b610bf5565b005b34801561035157600080fd5b5061035a610d0c565b6040516103679190613179565b60405180910390f35b34801561037c57600080fd5b50610397600480360381019061039291906132c9565b610d12565b005b3480156103a557600080fd5b506103ae610d2d565b6040516103bb9190613179565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613312565b610d3e565b005b3480156103f957600080fd5b50610402610d9e565b60405161040f9190613179565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613391565b610da4565b005b34801561044d57600080fd5b50610456610dc9565b6040516104639190613179565b60405180910390f35b34801561047857600080fd5b50610481610dcf565b005b34801561048f57600080fd5b50610498610f27565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190613312565b610fca565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906133be565b610fea565b6040516104f791906134a9565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190613075565b6110f4565b005b34801561053557600080fd5b5061053e611106565b60405161054b919061301d565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190613075565b611194565b60405161058891906130e3565b60405180910390f35b34801561059d57600080fd5b506105a66111d3565b6040516105b3919061301d565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de9190613075565b611261565b6040516105f091906130e3565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b91906133be565b6112e7565b60405161062d9190613179565b60405180910390f35b34801561064257600080fd5b5061064b61139e565b005b34801561065957600080fd5b50610674600480360381019061066f91906133be565b6113b2565b005b34801561068257600080fd5b5061069d600480360381019061069891906132c9565b6113fe565b005b3480156106ab57600080fd5b506106b4611419565b6040516106c191906130e3565b60405180910390f35b3480156106d657600080fd5b506106df611443565b6040516106ec9190613179565b60405180910390f35b34801561070157600080fd5b5061070a611449565b604051610717919061301d565b60405180910390f35b34801561072c57600080fd5b50610747600480360381019061074291906133be565b6114db565b005b610763600480360381019061075e9190613075565b6115bd565b005b34801561077157600080fd5b5061078c600480360381019061078791906134cb565b6118c4565b005b34801561079a57600080fd5b506107b560048036038101906107b091906133be565b6118da565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613075565b611948565b005b3480156107ec57600080fd5b5061080760048036038101906108029190613075565b61195a565b005b34801561081557600080fd5b50610830600480360381019061082b91906135ac565b61196c565b005b34801561083e57600080fd5b50610859600480360381019061085491906132c9565b6119ce565b005b34801561086757600080fd5b50610882600480360381019061087d9190613075565b6119e9565b005b34801561089057600080fd5b506108ab60048036038101906108a69190613075565b611a92565b6040516108b8919061301d565b60405180910390f35b3480156108cd57600080fd5b506108d6611be3565b6040516108e39190613179565b60405180910390f35b3480156108f857600080fd5b50610901611be9565b60405161090e9190613179565b60405180910390f35b34801561092357600080fd5b5061092c611bef565b604051610939919061301d565b60405180910390f35b34801561094e57600080fd5b50610957611c7d565b6040516109649190612f72565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f919061362f565b611c90565b6040516109a19190612f72565b60405180910390f35b3480156109b657600080fd5b506109d160048036038101906109cc91906133be565b611d24565b6040516109de9190612f72565b60405180910390f35b3480156109f357600080fd5b50610a0e6004803603810190610a0991906133be565b611d44565b005b348015610a1c57600080fd5b50610a25611dc7565b604051610a3291906130e3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b165750610b1582611ded565b5b9050919050565b606060008054610b2c9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b589061369e565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b6000610bba82611e57565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0082611261565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790613741565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c8f611ea2565b73ffffffffffffffffffffffffffffffffffffffff161480610cbe5750610cbd81610cb8611ea2565b611c90565b5b610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906137d3565b60405180910390fd5b610d078383611eaa565b505050565b600a5481565b610d1a611f63565b8060099081610d29919061399f565b5050565b6000610d396007611fe1565b905090565b610d4f610d49611ea2565b82611fef565b610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613ae3565b60405180910390fd5b610d99838383612084565b505050565b600c5481565b610dac611f63565b80601360006101000a81548160ff02191690831515021790555050565b600f5481565b610dd7611f63565b60005b601180549050811015610f2457600073ffffffffffffffffffffffffffffffffffffffff1660118281548110610e1357610e12613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f11576000610e63610d2d565b9050610ec460118381548110610e7c57610e7b613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018484610eb59190613b61565b610ebf9190613b61565b61237d565b610ece600761239b565b60118281548110610ee257610ee1613b03565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055505b8080610f1c90613b95565b915050610dda565b50565b610f2f611f63565b6000601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610f7790613c0e565b60006040518083038185875af1925050503d8060008114610fb4576040519150601f19603f3d011682016040523d82523d6000602084013e610fb9565b606091505b5050905080610fc757600080fd5b50565b610fe58383836040518060200160405280600081525061196c565b505050565b60606000610ff7836112e7565b905060008167ffffffffffffffff8111156110155761101461319e565b5b6040519080825280602002602001820160405280156110435781602001602082028036833780820191505090505b50905060006001905060005b83811080156110605750600b548211155b156110e857600061107083611261565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d457828483815181106110b9576110b8613b03565b5b60200260200101818152505081806110d090613b95565b9250505b82806110df90613b95565b9350505061104f565b82945050505050919050565b6110fc611f63565b80600a8190555050565b600980546111139061369e565b80601f016020809104026020016040519081016040528092919081815260200182805461113f9061369e565b801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b505050505081565b601181815481106111a457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600880546111e09061369e565b80601f016020809104026020016040519081016040528092919081815260200182805461120c9061369e565b80156112595780601f1061122e57610100808354040283529160200191611259565b820191906000526020600020905b81548152906001019060200180831161123c57829003601f168201915b505050505081565b60008061126d836123b1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d590613c6f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e90613d01565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113a6611f63565b6113b060006123ee565b565b6113ba611f63565b80601360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611406611f63565b8060089081611415919061399f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546114589061369e565b80601f01602080910402602001604051908101604052809291908181526020018280546114849061369e565b80156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b5050505050905090565b6114e3611f63565b60005b6011805490508110156115b9578173ffffffffffffffffffffffffffffffffffffffff166011828154811061151e5761151d613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036115a6576011818154811061157857611577613b03565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b80806115b190613b95565b9150506114e6565b5050565b600e54811115611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990613d6d565b60405180910390fd5b600f548161160f33610fea565b5161161a9190613b61565b111561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290613d6d565b60405180910390fd5b6000611665610d2d565b9050600b5482826116769190613b61565b11156116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90613dd9565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561175e5781600a546117179190613df9565b341015611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090613e87565b60405180910390fd5b61187f565b600c5482600d5461176f9190613b61565b11156117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790613ef3565b60405180910390fd5b6001826117bd9190613f13565b600a546117ca9190613df9565b34101561180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390613f93565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60008282546118779190613b61565b925050819055505b6000600190505b8281116118bf576118a233828461189d9190613b61565b61237d565b6118ac600761239b565b80806118b790613b95565b915050611886565b505050565b6118d66118cf611ea2565b83836124b4565b5050565b6118e2611f63565b6011819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611950611f63565b80600f8190555050565b611962611f63565b80600e8190555050565b61197d611977611ea2565b83611fef565b6119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613ae3565b60405180910390fd5b6119c884848484612620565b50505050565b6119d6611f63565b80601290816119e5919061399f565b5050565b6119f1611f63565b60006119fb610d2d565b9050600b548282611a0c9190613b61565b1115611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490613dd9565b60405180910390fd5b6000600190505b828111611a8d57611a70338284611a6b9190613b61565b61237d565b611a7a600761239b565b8080611a8590613b95565b915050611a54565b505050565b6060611a9d8261267c565b611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad390614025565b60405180910390fd5b601360009054906101000a900460ff16611b825760128054611afd9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b299061369e565b8015611b765780601f10611b4b57610100808354040283529160200191611b76565b820191906000526020600020905b815481529060010190602001808311611b5957829003601f168201915b50505050509050611bde565b6000611b8c6126bd565b90506000815111611bac5760405180602001604052806000815250611bda565b80611bb68461274f565b6009604051602001611bca93929190614104565b6040516020818303038152906040525b9150505b919050565b600d5481565b600b5481565b60128054611bfc9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c289061369e565b8015611c755780601f10611c4a57610100808354040283529160200191611c75565b820191906000526020600020905b815481529060010190602001808311611c5857829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b611d4c611f63565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db2906141a7565b60405180910390fd5b611dc4816123ee565b50565b601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e608161267c565b611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690613c6f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f1d83611261565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f6b611ea2565b73ffffffffffffffffffffffffffffffffffffffff16611f89611419565b73ffffffffffffffffffffffffffffffffffffffff1614611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd690614213565b60405180910390fd5b565b600081600001549050919050565b600080611ffb83611261565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061203d575061203c8185611c90565b5b8061207b57508373ffffffffffffffffffffffffffffffffffffffff1661206384610baf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120a482611261565b73ffffffffffffffffffffffffffffffffffffffff16146120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f1906142a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216090614337565b60405180910390fd5b612176838383600161281d565b8273ffffffffffffffffffffffffffffffffffffffff1661219682611261565b73ffffffffffffffffffffffffffffffffffffffff16146121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e3906142a5565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123788383836001612943565b505050565b612397828260405180602001604052806000815250612949565b5050565b6001816000016000828254019250508190555050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906143a3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126139190612f72565b60405180910390a3505050565b61262b848484612084565b612637848484846129a4565b612676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266d90614435565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661269e836123b1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600880546126cc9061369e565b80601f01602080910402602001604051908101604052809291908181526020018280546126f89061369e565b80156127455780601f1061271a57610100808354040283529160200191612745565b820191906000526020600020905b81548152906001019060200180831161272857829003601f168201915b5050505050905090565b60606000600161275e84612b2b565b01905060008167ffffffffffffffff81111561277d5761277c61319e565b5b6040519080825280601f01601f1916602001820160405280156127af5781602001600182028036833780820191505090505b509050600082602001820190505b600115612812578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161280657612805614455565b5b049450600085036127bd575b819350505050919050565b600181111561293d57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146128b15780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a99190613f13565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461293c5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129349190613b61565b925050819055505b5b50505050565b50505050565b6129538383612c7e565b61296060008484846129a4565b61299f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299690614435565b60405180910390fd5b505050565b60006129c58473ffffffffffffffffffffffffffffffffffffffff16612e9b565b15612b1e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129ee611ea2565b8786866040518563ffffffff1660e01b8152600401612a1094939291906144d9565b6020604051808303816000875af1925050508015612a4c57506040513d601f19601f82011682018060405250810190612a49919061453a565b60015b612ace573d8060008114612a7c576040519150601f19603f3d011682016040523d82523d6000602084013e612a81565b606091505b506000815103612ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abd90614435565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b23565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b89577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b7f57612b7e614455565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612bc6576d04ee2d6d415b85acef81000000008381612bbc57612bbb614455565b5b0492506020810190505b662386f26fc100008310612bf557662386f26fc100008381612beb57612bea614455565b5b0492506010810190505b6305f5e1008310612c1e576305f5e1008381612c1457612c13614455565b5b0492506008810190505b6127108310612c43576127108381612c3957612c38614455565b5b0492506004810190505b60648310612c665760648381612c5c57612c5b614455565b5b0492506002810190505b600a8310612c75576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce4906145b3565b60405180910390fd5b612cf68161267c565b15612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d9061461f565b60405180910390fd5b612d4460008383600161281d565b612d4d8161267c565b15612d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d849061461f565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e97600083836001612943565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f0781612ed2565b8114612f1257600080fd5b50565b600081359050612f2481612efe565b92915050565b600060208284031215612f4057612f3f612ec8565b5b6000612f4e84828501612f15565b91505092915050565b60008115159050919050565b612f6c81612f57565b82525050565b6000602082019050612f876000830184612f63565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fc7578082015181840152602081019050612fac565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fef82612f8d565b612ff98185612f98565b9350613009818560208601612fa9565b61301281612fd3565b840191505092915050565b600060208201905081810360008301526130378184612fe4565b905092915050565b6000819050919050565b6130528161303f565b811461305d57600080fd5b50565b60008135905061306f81613049565b92915050565b60006020828403121561308b5761308a612ec8565b5b600061309984828501613060565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130cd826130a2565b9050919050565b6130dd816130c2565b82525050565b60006020820190506130f860008301846130d4565b92915050565b613107816130c2565b811461311257600080fd5b50565b600081359050613124816130fe565b92915050565b6000806040838503121561314157613140612ec8565b5b600061314f85828601613115565b925050602061316085828601613060565b9150509250929050565b6131738161303f565b82525050565b600060208201905061318e600083018461316a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131d682612fd3565b810181811067ffffffffffffffff821117156131f5576131f461319e565b5b80604052505050565b6000613208612ebe565b905061321482826131cd565b919050565b600067ffffffffffffffff8211156132345761323361319e565b5b61323d82612fd3565b9050602081019050919050565b82818337600083830152505050565b600061326c61326784613219565b6131fe565b90508281526020810184848401111561328857613287613199565b5b61329384828561324a565b509392505050565b600082601f8301126132b0576132af613194565b5b81356132c0848260208601613259565b91505092915050565b6000602082840312156132df576132de612ec8565b5b600082013567ffffffffffffffff8111156132fd576132fc612ecd565b5b6133098482850161329b565b91505092915050565b60008060006060848603121561332b5761332a612ec8565b5b600061333986828701613115565b935050602061334a86828701613115565b925050604061335b86828701613060565b9150509250925092565b61336e81612f57565b811461337957600080fd5b50565b60008135905061338b81613365565b92915050565b6000602082840312156133a7576133a6612ec8565b5b60006133b58482850161337c565b91505092915050565b6000602082840312156133d4576133d3612ec8565b5b60006133e284828501613115565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134208161303f565b82525050565b60006134328383613417565b60208301905092915050565b6000602082019050919050565b6000613456826133eb565b61346081856133f6565b935061346b83613407565b8060005b8381101561349c5781516134838882613426565b975061348e8361343e565b92505060018101905061346f565b5085935050505092915050565b600060208201905081810360008301526134c3818461344b565b905092915050565b600080604083850312156134e2576134e1612ec8565b5b60006134f085828601613115565b92505060206135018582860161337c565b9150509250929050565b600067ffffffffffffffff8211156135265761352561319e565b5b61352f82612fd3565b9050602081019050919050565b600061354f61354a8461350b565b6131fe565b90508281526020810184848401111561356b5761356a613199565b5b61357684828561324a565b509392505050565b600082601f83011261359357613592613194565b5b81356135a384826020860161353c565b91505092915050565b600080600080608085870312156135c6576135c5612ec8565b5b60006135d487828801613115565b94505060206135e587828801613115565b93505060406135f687828801613060565b925050606085013567ffffffffffffffff81111561361757613616612ecd565b5b6136238782880161357e565b91505092959194509250565b6000806040838503121561364657613645612ec8565b5b600061365485828601613115565b925050602061366585828601613115565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136b657607f821691505b6020821081036136c9576136c861366f565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061372b602183612f98565b9150613736826136cf565b604082019050919050565b6000602082019050818103600083015261375a8161371e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006137bd603d83612f98565b91506137c882613761565b604082019050919050565b600060208201905081810360008301526137ec816137b0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613818565b61385f8683613818565b95508019841693508086168417925050509392505050565b6000819050919050565b600061389c6138976138928461303f565b613877565b61303f565b9050919050565b6000819050919050565b6138b683613881565b6138ca6138c2826138a3565b848454613825565b825550505050565b600090565b6138df6138d2565b6138ea8184846138ad565b505050565b5b8181101561390e576139036000826138d7565b6001810190506138f0565b5050565b601f82111561395357613924816137f3565b61392d84613808565b8101602085101561393c578190505b61395061394885613808565b8301826138ef565b50505b505050565b600082821c905092915050565b600061397660001984600802613958565b1980831691505092915050565b600061398f8383613965565b9150826002028217905092915050565b6139a882612f8d565b67ffffffffffffffff8111156139c1576139c061319e565b5b6139cb825461369e565b6139d6828285613912565b600060209050601f831160018114613a0957600084156139f7578287015190505b613a018582613983565b865550613a69565b601f198416613a17866137f3565b60005b82811015613a3f57848901518255600182019150602085019450602081019050613a1a565b86831015613a5c5784890151613a58601f891682613965565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613acd602d83612f98565b9150613ad882613a71565b604082019050919050565b60006020820190508181036000830152613afc81613ac0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b6c8261303f565b9150613b778361303f565b9250828201905080821115613b8f57613b8e613b32565b5b92915050565b6000613ba08261303f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bd257613bd1613b32565b5b600182019050919050565b600081905092915050565b50565b6000613bf8600083613bdd565b9150613c0382613be8565b600082019050919050565b6000613c1982613beb565b9150819050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613c59601883612f98565b9150613c6482613c23565b602082019050919050565b60006020820190508181036000830152613c8881613c4c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613ceb602983612f98565b9150613cf682613c8f565b604082019050919050565b60006020820190508181036000830152613d1a81613cde565b9050919050565b7f496e76616c6964207472616e73616374696f6e00000000000000000000000000600082015250565b6000613d57601383612f98565b9150613d6282613d21565b602082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613dc3601283612f98565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b6000613e048261303f565b9150613e0f8361303f565b9250828202613e1d8161303f565b91508282048414831517613e3457613e33613b32565b5b5092915050565b7f696e76616c696420636f73740000000000000000000000000000000000000000600082015250565b6000613e71600c83612f98565b9150613e7c82613e3b565b602082019050919050565b60006020820190508181036000830152613ea081613e64565b9050919050565b7f416c6c2066726565204e4654206973206d696e74656400000000000000000000600082015250565b6000613edd601683612f98565b9150613ee882613ea7565b602082019050919050565b60006020820190508181036000830152613f0c81613ed0565b9050919050565b6000613f1e8261303f565b9150613f298361303f565b9250828203905081811115613f4157613f40613b32565b5b92915050565b7f696e76616c696420636f7374202d320000000000000000000000000000000000600082015250565b6000613f7d600f83612f98565b9150613f8882613f47565b602082019050919050565b60006020820190508181036000830152613fac81613f70565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061400f602f83612f98565b915061401a82613fb3565b604082019050919050565b6000602082019050818103600083015261403e81614002565b9050919050565b600081905092915050565b600061405b82612f8d565b6140658185614045565b9350614075818560208601612fa9565b80840191505092915050565b6000815461408e8161369e565b6140988186614045565b945060018216600081146140b357600181146140c8576140fb565b60ff19831686528115158202860193506140fb565b6140d1856137f3565b60005b838110156140f3578154818901526001820191506020810190506140d4565b838801955050505b50505092915050565b60006141108286614050565b915061411c8285614050565b91506141288284614081565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614191602683612f98565b915061419c82614135565b604082019050919050565b600060208201905081810360008301526141c081614184565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141fd602083612f98565b9150614208826141c7565b602082019050919050565b6000602082019050818103600083015261422c816141f0565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061428f602583612f98565b915061429a82614233565b604082019050919050565b600060208201905081810360008301526142be81614282565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614321602483612f98565b915061432c826142c5565b604082019050919050565b6000602082019050818103600083015261435081614314565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061438d601983612f98565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061441f603283612f98565b915061442a826143c3565b604082019050919050565b6000602082019050818103600083015261444e81614412565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006144ab82614484565b6144b5818561448f565b93506144c5818560208601612fa9565b6144ce81612fd3565b840191505092915050565b60006080820190506144ee60008301876130d4565b6144fb60208301866130d4565b614508604083018561316a565b818103606083015261451a81846144a0565b905095945050505050565b60008151905061453481612efe565b92915050565b6000602082840312156145505761454f612ec8565b5b600061455e84828501614525565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061459d602083612f98565b91506145a882614567565b602082019050919050565b600060208201905081810360008301526145cc81614590565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614609601c83612f98565b9150614614826145d3565b602082019050919050565b60006020820190508181036000830152614638816145fc565b905091905056fea2646970667358221220e336e456d930da825734a6b0fcce1818fcd9b781adb55cde0e14c2cba07183d664736f6c63430008120033
Deployed Bytecode Sourcemap
56250:7552:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40254:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41182:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42694:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42212:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56543:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61408:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62340:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43394:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56620:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61643:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56728:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58638:358;;;;;;;;;;;;;:::i;:::-;;61729:469;;;;;;;;;;;;;:::i;:::-;;43800:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62437:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60648:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56499:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56821:31;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56399:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40892:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40623:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19685:103;;;;;;;;;;;;;:::i;:::-;;62204:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61178:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19044:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56686:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41351:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59846:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57310:966;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42937:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59555:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60234:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60913:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44056:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63705:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58284:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63078:509;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56653:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56585:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56882:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56998:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43163:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56769:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19943:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57062:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40254:305;40356:4;40408:25;40393:40;;;:11;:40;;;;:105;;;;40465:33;40450:48;;;:11;:48;;;;40393:105;:158;;;;40515:36;40539:11;40515:23;:36::i;:::-;40393:158;40373:178;;40254:305;;;:::o;41182:100::-;41236:13;41269:5;41262:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41182:100;:::o;42694:171::-;42770:7;42790:23;42805:7;42790:14;:23::i;:::-;42833:15;:24;42849:7;42833:24;;;;;;;;;;;;;;;;;;;;;42826:31;;42694:171;;;:::o;42212:416::-;42293:13;42309:23;42324:7;42309:14;:23::i;:::-;42293:39;;42357:5;42351:11;;:2;:11;;;42343:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42451:5;42435:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42460:37;42477:5;42484:12;:10;:12::i;:::-;42460:16;:37::i;:::-;42435:62;42413:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;42599:21;42608:2;42612:7;42599:8;:21::i;:::-;42282:346;42212:416;;:::o;56543:35::-;;;;:::o;61408:100::-;18930:13;:11;:13::i;:::-;61492:10:::1;61480:9;:22;;;;;;:::i;:::-;;61408:100:::0;:::o;62340:89::-;62384:7;62407:16;:6;:14;:16::i;:::-;62400:23;;62340:89;:::o;43394:335::-;43589:41;43608:12;:10;:12::i;:::-;43622:7;43589:18;:41::i;:::-;43581:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43693:28;43703:4;43709:2;43713:7;43693:9;:28::i;:::-;43394:335;;;:::o;56620:28::-;;;;:::o;61643:80::-;18930:13;:11;:13::i;:::-;61711:6:::1;61700:8;;:17;;;;;;;;;;;;;;;;;;61643:80:::0;:::o;56728:32::-;;;;:::o;58638:358::-;18930:13;:11;:13::i;:::-;58686:6:::1;58682:309;58697:14;:21;;;;58695:1;:23;58682:309;;;58768:1;58739:31;;:14;58754:1;58739:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:31;;;58736:234;;58786:18;58807:13;:11;:13::i;:::-;58786:34;;58835:49;58845:14;58860:1;58845:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58882:1;58880;58864:13;:17;;;;:::i;:::-;:19;;;;:::i;:::-;58835:9;:49::i;:::-;58899:18;:6;:16;:18::i;:::-;58939:14;58954:1;58939:17;;;;;;;;:::i;:::-;;;;;;;;;;58932:24;;;;;;;;;;;58771:199;58736:234;58719:3;;;;;:::i;:::-;;;;58682:309;;;;58638:358::o:0;61729:469::-;18930:13;:11;:13::i;:::-;62019:7:::1;62040:8;;;;;;;;;;;62032:22;;62062:21;62032:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62018:70;;;62103:2;62095:11;;;::::0;::::1;;61766:432;61729:469::o:0;43800:185::-;43938:39;43955:4;43961:2;43965:7;43938:39;;;;;;;;;;;;:16;:39::i;:::-;43800:185;;;:::o;62437:635::-;62512:16;62540:23;62566:17;62576:6;62566:9;:17::i;:::-;62540:43;;62590:30;62637:15;62623:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62590:63;;62660:22;62685:1;62660:26;;62693:23;62729:309;62754:15;62736;:33;:64;;;;;62791:9;;62773:14;:27;;62736:64;62729:309;;;62811:25;62839:23;62847:14;62839:7;:23::i;:::-;62811:51;;62898:6;62877:27;;:17;:27;;;62873:131;;62950:14;62917:13;62931:15;62917:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;62977:17;;;;;:::i;:::-;;;;62873:131;63014:16;;;;;:::i;:::-;;;;62802:236;62729:309;;;63053:13;63046:20;;;;;;62437:635;;;:::o;60648:80::-;18930:13;:11;:13::i;:::-;60711:5:::1;60704:4;:12;;;;60648:80:::0;:::o;56499:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56821:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56399:95::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40892:223::-;40964:7;40984:13;41000:17;41009:7;41000:8;:17::i;:::-;40984:33;;41053:1;41036:19;;:5;:19;;;41028:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41102:5;41095:12;;;40892:223;;;:::o;40623:207::-;40695:7;40740:1;40723:19;;:5;:19;;;40715:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40806:9;:16;40816:5;40806:16;;;;;;;;;;;;;;;;40799:23;;40623:207;;;:::o;19685:103::-;18930:13;:11;:13::i;:::-;19750:30:::1;19777:1;19750:18;:30::i;:::-;19685:103::o:0;62204:81::-;18930:13;:11;:13::i;:::-;62275:4:::1;62264:8;;:15;;;;;;;;;;;;;;;;;;62204:81:::0;:::o;61178:100::-;18930:13;:11;:13::i;:::-;61262:10:::1;61250:9;:22;;;;;;:::i;:::-;;61178:100:::0;:::o;19044:87::-;19090:7;19117:6;;;;;;;;;;;19110:13;;19044:87;:::o;56686:37::-;;;;:::o;41351:104::-;41407:13;41440:7;41433:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41351:104;:::o;59846:229::-;18930:13;:11;:13::i;:::-;59923:6:::1;59919:151;59934:14;:21;;;;59932:1;:23;59919:151;;;59997:8;59976:29;;:14;59991:1;59976:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;::::0;59973:88:::1;;60030:14;60045:1;60030:17;;;;;;;;:::i;:::-;;;;;;;;;;60023:24;;;;;;;;;;;59973:88;59956:3;;;;;:::i;:::-;;;;59919:151;;;;59846:229:::0;:::o;57310:966::-;57396:18;;57381:11;:33;;57373:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57503:16;;57488:11;57453:25;57467:10;57453:13;:25::i;:::-;:32;:46;;;;:::i;:::-;:66;;57445:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;57648:21;57672:13;:11;:13::i;:::-;57648:37;;57731:9;;57716:11;57700:13;:27;;;;:::i;:::-;:40;;57692:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;57775:13;:25;57789:10;57775:25;;;;;;;;;;;;;;;;;;;;;;;;;57772:342;;;57840:11;57833:4;;:18;;;;:::i;:::-;57820:9;:31;;57812:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57772:342;;;57925:10;;57912:11;57901:10;;:22;;;;:::i;:::-;:34;;57893:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;58013:1;58001:11;:13;;;;:::i;:::-;57994:4;;:21;;;;:::i;:::-;57981:9;:34;;57973:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;58074:4;58046:13;:25;58060:10;58046:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;58103:1;58089:10;;:15;;;;;;;:::i;:::-;;;;;;;;57772:342;58149:9;58161:1;58149:13;;58144:127;58169:11;58164:1;:16;58144:127;;58196:40;58206:10;58234:1;58218:13;:17;;;;:::i;:::-;58196:9;:40::i;:::-;58245:18;:6;:16;:18::i;:::-;58182:3;;;;;:::i;:::-;;;;58144:127;;;;57360:916;57310:966;:::o;42937:155::-;43032:52;43051:12;:10;:12::i;:::-;43065:8;43075;43032:18;:52::i;:::-;42937:155;;:::o;59555:105::-;18930:13;:11;:13::i;:::-;59625:14:::1;59645:8;59625:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59555:105:::0;:::o;60234:98::-;18930:13;:11;:13::i;:::-;60320:6:::1;60301:16;:25;;;;60234:98:::0;:::o;60913:130::-;18930:13;:11;:13::i;:::-;61018:19:::1;60997:18;:40;;;;60913:130:::0;:::o;44056:322::-;44230:41;44249:12;:10;:12::i;:::-;44263:7;44230:18;:41::i;:::-;44222:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44332:38;44346:4;44352:2;44356:7;44365:4;44332:13;:38::i;:::-;44056:322;;;;:::o;63705:94::-;18930:13;:11;:13::i;:::-;63789:4:::1;63772:14;:21;;;;;;:::i;:::-;;63705:94:::0;:::o;58284:346::-;18930:13;:11;:13::i;:::-;58350:21:::1;58374:13;:11;:13::i;:::-;58350:37;;58433:9;;58418:11;58402:13;:27;;;;:::i;:::-;:40;;58394:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;58501:9;58513:1;58501:13;;58496:127;58521:11;58516:1;:16;58496:127;;58548:40;58558:10;58586:1;58570:13;:17;;;;:::i;:::-;58548:9;:40::i;:::-;58597:18;:6;:16;:18::i;:::-;58534:3;;;;;:::i;:::-;;;;58496:127;;;;58341:289;58284:346:::0;:::o;63078:509::-;63177:13;63218:17;63226:8;63218:7;:17::i;:::-;63202:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;63319:8;;;;;;;;;;;63315:261;;63346:14;63339:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63315:261;63381:28;63412:10;:8;:10::i;:::-;63381:41;;63469:1;63444:14;63438:28;:32;:130;;;;;;;;;;;;;;;;;63506:14;63522:19;:8;:17;:19::i;:::-;63543:9;63489:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63438:130;63431:137;;;63078:509;;;;:::o;56653:26::-;;;;:::o;56585:30::-;;;;:::o;56882:111::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56998:28::-;;;;;;;;;;;;;:::o;43163:164::-;43260:4;43284:18;:25;43303:5;43284:25;;;;;;;;;;;;;;;:35;43310:8;43284:35;;;;;;;;;;;;;;;;;;;;;;;;;43277:42;;43163:164;;;;:::o;56769:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;19943:201::-;18930:13;:11;:13::i;:::-;20052:1:::1;20032:22;;:8;:22;;::::0;20024:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;20108:28;20127:8;20108:18;:28::i;:::-;19943:201:::0;:::o;57062:33::-;;;;;;;;;;;;;:::o;32766:157::-;32851:4;32890:25;32875:40;;;:11;:40;;;;32868:47;;32766:157;;;:::o;52513:135::-;52595:16;52603:7;52595;:16::i;:::-;52587:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52513:135;:::o;17565:98::-;17618:7;17645:10;17638:17;;17565:98;:::o;51792:174::-;51894:2;51867:15;:24;51883:7;51867:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51950:7;51946:2;51912:46;;51921:23;51936:7;51921:14;:23::i;:::-;51912:46;;;;;;;;;;;;51792:174;;:::o;19209:132::-;19284:12;:10;:12::i;:::-;19273:23;;:7;:5;:7::i;:::-;:23;;;19265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19209:132::o;1094:114::-;1159:7;1186;:14;;;1179:21;;1094:114;;;:::o;46411:264::-;46504:4;46521:13;46537:23;46552:7;46537:14;:23::i;:::-;46521:39;;46590:5;46579:16;;:7;:16;;;:52;;;;46599:32;46616:5;46623:7;46599:16;:32::i;:::-;46579:52;:87;;;;46659:7;46635:31;;:20;46647:7;46635:11;:20::i;:::-;:31;;;46579:87;46571:96;;;46411:264;;;;:::o;50410:1263::-;50569:4;50542:31;;:23;50557:7;50542:14;:23::i;:::-;:31;;;50534:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50648:1;50634:16;;:2;:16;;;50626:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50704:42;50725:4;50731:2;50735:7;50744:1;50704:20;:42::i;:::-;50876:4;50849:31;;:23;50864:7;50849:14;:23::i;:::-;:31;;;50841:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50994:15;:24;51010:7;50994:24;;;;;;;;;;;;50987:31;;;;;;;;;;;51489:1;51470:9;:15;51480:4;51470:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;51522:1;51505:9;:13;51515:2;51505:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51564:2;51545:7;:16;51553:7;51545:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51603:7;51599:2;51584:27;;51593:4;51584:27;;;;;;;;;;;;51624:41;51644:4;51650:2;51654:7;51663:1;51624:19;:41::i;:::-;50410:1263;;;:::o;47017:110::-;47093:26;47103:2;47107:7;47093:26;;;;;;;;;;;;:9;:26::i;:::-;47017:110;;:::o;1216:127::-;1323:1;1305:7;:14;;;:19;;;;;;;;;;;1216:127;:::o;45686:117::-;45752:7;45779;:16;45787:7;45779:16;;;;;;;;;;;;;;;;;;;;;45772:23;;45686:117;;;:::o;20304:191::-;20378:16;20397:6;;;;;;;;;;;20378:25;;20423:8;20414:6;;:17;;;;;;;;;;;;;;;;;;20478:8;20447:40;;20468:8;20447:40;;;;;;;;;;;;20367:128;20304:191;:::o;52109:315::-;52264:8;52255:17;;:5;:17;;;52247:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52351:8;52313:18;:25;52332:5;52313:25;;;;;;;;;;;;;;;:35;52339:8;52313:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52397:8;52375:41;;52390:5;52375:41;;;52407:8;52375:41;;;;;;:::i;:::-;;;;;;;;52109:315;;;:::o;45259:313::-;45415:28;45425:4;45431:2;45435:7;45415:9;:28::i;:::-;45462:47;45485:4;45491:2;45495:7;45504:4;45462:22;:47::i;:::-;45454:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45259:313;;;;:::o;46116:128::-;46181:4;46234:1;46205:31;;:17;46214:7;46205:8;:17::i;:::-;:31;;;;46198:38;;46116:128;;;:::o;63595:104::-;63655:13;63684:9;63677:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63595:104;:::o;14992:716::-;15048:13;15099:14;15136:1;15116:17;15127:5;15116:10;:17::i;:::-;:21;15099:38;;15152:20;15186:6;15175:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15152:41;;15208:11;15337:6;15333:2;15329:15;15321:6;15317:28;15310:35;;15374:288;15381:4;15374:288;;;15406:5;;;;;;;;15548:8;15543:2;15536:5;15532:14;15527:30;15522:3;15514:44;15604:2;15595:11;;;;;;:::i;:::-;;;;;15638:1;15629:5;:10;15374:288;15625:21;15374:288;15683:6;15676:13;;;;;14992:716;;;:::o;54797:410::-;54987:1;54975:9;:13;54971:229;;;55025:1;55009:18;;:4;:18;;;55005:87;;55067:9;55048;:15;55058:4;55048:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;55005:87;55124:1;55110:16;;:2;:16;;;55106:83;;55164:9;55147;:13;55157:2;55147:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;55106:83;54971:229;54797:410;;;;:::o;55929:158::-;;;;;:::o;47354:319::-;47483:18;47489:2;47493:7;47483:5;:18::i;:::-;47534:53;47565:1;47569:2;47573:7;47582:4;47534:22;:53::i;:::-;47512:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;47354:319;;;:::o;53212:853::-;53366:4;53387:15;:2;:13;;;:15::i;:::-;53383:675;;;53439:2;53423:36;;;53460:12;:10;:12::i;:::-;53474:4;53480:7;53489:4;53423:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53419:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53681:1;53664:6;:13;:18;53660:328;;53707:60;;;;;;;;;;:::i;:::-;;;;;;;;53660:328;53938:6;53932:13;53923:6;53919:2;53915:15;53908:38;53419:584;53555:41;;;53545:51;;;:6;:51;;;;53538:58;;;;;53383:675;54042:4;54035:11;;53212:853;;;;;;;:::o;11858:922::-;11911:7;11931:14;11948:1;11931:18;;11998:6;11989:5;:15;11985:102;;12034:6;12025:15;;;;;;:::i;:::-;;;;;12069:2;12059:12;;;;11985:102;12114:6;12105:5;:15;12101:102;;12150:6;12141:15;;;;;;:::i;:::-;;;;;12185:2;12175:12;;;;12101:102;12230:6;12221:5;:15;12217:102;;12266:6;12257:15;;;;;;:::i;:::-;;;;;12301:2;12291:12;;;;12217:102;12346:5;12337;:14;12333:99;;12381:5;12372:14;;;;;;:::i;:::-;;;;;12415:1;12405:11;;;;12333:99;12459:5;12450;:14;12446:99;;12494:5;12485:14;;;;;;:::i;:::-;;;;;12528:1;12518:11;;;;12446:99;12572:5;12563;:14;12559:99;;12607:5;12598:14;;;;;;:::i;:::-;;;;;12641:1;12631:11;;;;12559:99;12685:5;12676;:14;12672:66;;12721:1;12711:11;;;;12672:66;12766:6;12759:13;;;11858:922;;;:::o;48009:942::-;48103:1;48089:16;;:2;:16;;;48081:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48162:16;48170:7;48162;:16::i;:::-;48161:17;48153:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48224:48;48253:1;48257:2;48261:7;48270:1;48224:20;:48::i;:::-;48371:16;48379:7;48371;:16::i;:::-;48370:17;48362:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48786:1;48769:9;:13;48779:2;48769:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48830:2;48811:7;:16;48819:7;48811:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48875:7;48871:2;48850:33;;48867:1;48850:33;;;;;;;;;;;;48896:47;48924:1;48928:2;48932:7;48941:1;48896:19;:47::i;:::-;48009:942;;:::o;21735:326::-;21795:4;22052:1;22030:7;:19;;;:23;22023:30;;21735:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:180;5536:77;5533:1;5526:88;5633:4;5630:1;5623:15;5657:4;5654:1;5647:15;5674:281;5757:27;5779:4;5757:27;:::i;:::-;5749:6;5745:40;5887:6;5875:10;5872:22;5851:18;5839:10;5836:34;5833:62;5830:88;;;5898:18;;:::i;:::-;5830:88;5938:10;5934:2;5927:22;5717:238;5674:281;;:::o;5961:129::-;5995:6;6022:20;;:::i;:::-;6012:30;;6051:33;6079:4;6071:6;6051:33;:::i;:::-;5961:129;;;:::o;6096:308::-;6158:4;6248:18;6240:6;6237:30;6234:56;;;6270:18;;:::i;:::-;6234:56;6308:29;6330:6;6308:29;:::i;:::-;6300:37;;6392:4;6386;6382:15;6374:23;;6096:308;;;:::o;6410:146::-;6507:6;6502:3;6497;6484:30;6548:1;6539:6;6534:3;6530:16;6523:27;6410:146;;;:::o;6562:425::-;6640:5;6665:66;6681:49;6723:6;6681:49;:::i;:::-;6665:66;:::i;:::-;6656:75;;6754:6;6747:5;6740:21;6792:4;6785:5;6781:16;6830:3;6821:6;6816:3;6812:16;6809:25;6806:112;;;6837:79;;:::i;:::-;6806:112;6927:54;6974:6;6969:3;6964;6927:54;:::i;:::-;6646:341;6562:425;;;;;:::o;7007:340::-;7063:5;7112:3;7105:4;7097:6;7093:17;7089:27;7079:122;;7120:79;;:::i;:::-;7079:122;7237:6;7224:20;7262:79;7337:3;7329:6;7322:4;7314:6;7310:17;7262:79;:::i;:::-;7253:88;;7069:278;7007:340;;;;:::o;7353:509::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7625:1;7614:9;7610:17;7597:31;7655:18;7647:6;7644:30;7641:117;;;7677:79;;:::i;:::-;7641:117;7782:63;7837:7;7828:6;7817:9;7813:22;7782:63;:::i;:::-;7772:73;;7568:287;7353:509;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:116::-;8563:21;8578:5;8563:21;:::i;:::-;8556:5;8553:32;8543:60;;8599:1;8596;8589:12;8543:60;8493:116;:::o;8615:133::-;8658:5;8696:6;8683:20;8674:29;;8712:30;8736:5;8712:30;:::i;:::-;8615:133;;;;:::o;8754:323::-;8810:6;8859:2;8847:9;8838:7;8834:23;8830:32;8827:119;;;8865:79;;:::i;:::-;8827:119;8985:1;9010:50;9052:7;9043:6;9032:9;9028:22;9010:50;:::i;:::-;9000:60;;8956:114;8754:323;;;;:::o;9083:329::-;9142:6;9191:2;9179:9;9170:7;9166:23;9162:32;9159:119;;;9197:79;;:::i;:::-;9159:119;9317:1;9342:53;9387:7;9378:6;9367:9;9363:22;9342:53;:::i;:::-;9332:63;;9288:117;9083:329;;;;:::o;9418:114::-;9485:6;9519:5;9513:12;9503:22;;9418:114;;;:::o;9538:184::-;9637:11;9671:6;9666:3;9659:19;9711:4;9706:3;9702:14;9687:29;;9538:184;;;;:::o;9728:132::-;9795:4;9818:3;9810:11;;9848:4;9843:3;9839:14;9831:22;;9728:132;;;:::o;9866:108::-;9943:24;9961:5;9943:24;:::i;:::-;9938:3;9931:37;9866:108;;:::o;9980:179::-;10049:10;10070:46;10112:3;10104:6;10070:46;:::i;:::-;10148:4;10143:3;10139:14;10125:28;;9980:179;;;;:::o;10165:113::-;10235:4;10267;10262:3;10258:14;10250:22;;10165:113;;;:::o;10314:732::-;10433:3;10462:54;10510:5;10462:54;:::i;:::-;10532:86;10611:6;10606:3;10532:86;:::i;:::-;10525:93;;10642:56;10692:5;10642:56;:::i;:::-;10721:7;10752:1;10737:284;10762:6;10759:1;10756:13;10737:284;;;10838:6;10832:13;10865:63;10924:3;10909:13;10865:63;:::i;:::-;10858:70;;10951:60;11004:6;10951:60;:::i;:::-;10941:70;;10797:224;10784:1;10781;10777:9;10772:14;;10737:284;;;10741:14;11037:3;11030:10;;10438:608;;;10314:732;;;;:::o;11052:373::-;11195:4;11233:2;11222:9;11218:18;11210:26;;11282:9;11276:4;11272:20;11268:1;11257:9;11253:17;11246:47;11310:108;11413:4;11404:6;11310:108;:::i;:::-;11302:116;;11052:373;;;;:::o;11431:468::-;11496:6;11504;11553:2;11541:9;11532:7;11528:23;11524:32;11521:119;;;11559:79;;:::i;:::-;11521:119;11679:1;11704:53;11749:7;11740:6;11729:9;11725:22;11704:53;:::i;:::-;11694:63;;11650:117;11806:2;11832:50;11874:7;11865:6;11854:9;11850:22;11832:50;:::i;:::-;11822:60;;11777:115;11431:468;;;;;:::o;11905:307::-;11966:4;12056:18;12048:6;12045:30;12042:56;;;12078:18;;:::i;:::-;12042:56;12116:29;12138:6;12116:29;:::i;:::-;12108:37;;12200:4;12194;12190:15;12182:23;;11905:307;;;:::o;12218:423::-;12295:5;12320:65;12336:48;12377:6;12336:48;:::i;:::-;12320:65;:::i;:::-;12311:74;;12408:6;12401:5;12394:21;12446:4;12439:5;12435:16;12484:3;12475:6;12470:3;12466:16;12463:25;12460:112;;;12491:79;;:::i;:::-;12460:112;12581:54;12628:6;12623:3;12618;12581:54;:::i;:::-;12301:340;12218:423;;;;;:::o;12660:338::-;12715:5;12764:3;12757:4;12749:6;12745:17;12741:27;12731:122;;12772:79;;:::i;:::-;12731:122;12889:6;12876:20;12914:78;12988:3;12980:6;12973:4;12965:6;12961:17;12914:78;:::i;:::-;12905:87;;12721:277;12660:338;;;;:::o;13004:943::-;13099:6;13107;13115;13123;13172:3;13160:9;13151:7;13147:23;13143:33;13140:120;;;13179:79;;:::i;:::-;13140:120;13299:1;13324:53;13369:7;13360:6;13349:9;13345:22;13324:53;:::i;:::-;13314:63;;13270:117;13426:2;13452:53;13497:7;13488:6;13477:9;13473:22;13452:53;:::i;:::-;13442:63;;13397:118;13554:2;13580:53;13625:7;13616:6;13605:9;13601:22;13580:53;:::i;:::-;13570:63;;13525:118;13710:2;13699:9;13695:18;13682:32;13741:18;13733:6;13730:30;13727:117;;;13763:79;;:::i;:::-;13727:117;13868:62;13922:7;13913:6;13902:9;13898:22;13868:62;:::i;:::-;13858:72;;13653:287;13004:943;;;;;;;:::o;13953:474::-;14021:6;14029;14078:2;14066:9;14057:7;14053:23;14049:32;14046:119;;;14084:79;;:::i;:::-;14046:119;14204:1;14229:53;14274:7;14265:6;14254:9;14250:22;14229:53;:::i;:::-;14219:63;;14175:117;14331:2;14357:53;14402:7;14393:6;14382:9;14378:22;14357:53;:::i;:::-;14347:63;;14302:118;13953:474;;;;;:::o;14433:180::-;14481:77;14478:1;14471:88;14578:4;14575:1;14568:15;14602:4;14599:1;14592:15;14619:320;14663:6;14700:1;14694:4;14690:12;14680:22;;14747:1;14741:4;14737:12;14768:18;14758:81;;14824:4;14816:6;14812:17;14802:27;;14758:81;14886:2;14878:6;14875:14;14855:18;14852:38;14849:84;;14905:18;;:::i;:::-;14849:84;14670:269;14619:320;;;:::o;14945:220::-;15085:34;15081:1;15073:6;15069:14;15062:58;15154:3;15149:2;15141:6;15137:15;15130:28;14945:220;:::o;15171:366::-;15313:3;15334:67;15398:2;15393:3;15334:67;:::i;:::-;15327:74;;15410:93;15499:3;15410:93;:::i;:::-;15528:2;15523:3;15519:12;15512:19;;15171:366;;;:::o;15543:419::-;15709:4;15747:2;15736:9;15732:18;15724:26;;15796:9;15790:4;15786:20;15782:1;15771:9;15767:17;15760:47;15824:131;15950:4;15824:131;:::i;:::-;15816:139;;15543:419;;;:::o;15968:248::-;16108:34;16104:1;16096:6;16092:14;16085:58;16177:31;16172:2;16164:6;16160:15;16153:56;15968:248;:::o;16222:366::-;16364:3;16385:67;16449:2;16444:3;16385:67;:::i;:::-;16378:74;;16461:93;16550:3;16461:93;:::i;:::-;16579:2;16574:3;16570:12;16563:19;;16222:366;;;:::o;16594:419::-;16760:4;16798:2;16787:9;16783:18;16775:26;;16847:9;16841:4;16837:20;16833:1;16822:9;16818:17;16811:47;16875:131;17001:4;16875:131;:::i;:::-;16867:139;;16594:419;;;:::o;17019:141::-;17068:4;17091:3;17083:11;;17114:3;17111:1;17104:14;17148:4;17145:1;17135:18;17127:26;;17019:141;;;:::o;17166:93::-;17203:6;17250:2;17245;17238:5;17234:14;17230:23;17220:33;;17166:93;;;:::o;17265:107::-;17309:8;17359:5;17353:4;17349:16;17328:37;;17265:107;;;;:::o;17378:393::-;17447:6;17497:1;17485:10;17481:18;17520:97;17550:66;17539:9;17520:97;:::i;:::-;17638:39;17668:8;17657:9;17638:39;:::i;:::-;17626:51;;17710:4;17706:9;17699:5;17695:21;17686:30;;17759:4;17749:8;17745:19;17738:5;17735:30;17725:40;;17454:317;;17378:393;;;;;:::o;17777:60::-;17805:3;17826:5;17819:12;;17777:60;;;:::o;17843:142::-;17893:9;17926:53;17944:34;17953:24;17971:5;17953:24;:::i;:::-;17944:34;:::i;:::-;17926:53;:::i;:::-;17913:66;;17843:142;;;:::o;17991:75::-;18034:3;18055:5;18048:12;;17991:75;;;:::o;18072:269::-;18182:39;18213:7;18182:39;:::i;:::-;18243:91;18292:41;18316:16;18292:41;:::i;:::-;18284:6;18277:4;18271:11;18243:91;:::i;:::-;18237:4;18230:105;18148:193;18072:269;;;:::o;18347:73::-;18392:3;18347:73;:::o;18426:189::-;18503:32;;:::i;:::-;18544:65;18602:6;18594;18588:4;18544:65;:::i;:::-;18479:136;18426:189;;:::o;18621:186::-;18681:120;18698:3;18691:5;18688:14;18681:120;;;18752:39;18789:1;18782:5;18752:39;:::i;:::-;18725:1;18718:5;18714:13;18705:22;;18681:120;;;18621:186;;:::o;18813:543::-;18914:2;18909:3;18906:11;18903:446;;;18948:38;18980:5;18948:38;:::i;:::-;19032:29;19050:10;19032:29;:::i;:::-;19022:8;19018:44;19215:2;19203:10;19200:18;19197:49;;;19236:8;19221:23;;19197:49;19259:80;19315:22;19333:3;19315:22;:::i;:::-;19305:8;19301:37;19288:11;19259:80;:::i;:::-;18918:431;;18903:446;18813:543;;;:::o;19362:117::-;19416:8;19466:5;19460:4;19456:16;19435:37;;19362:117;;;;:::o;19485:169::-;19529:6;19562:51;19610:1;19606:6;19598:5;19595:1;19591:13;19562:51;:::i;:::-;19558:56;19643:4;19637;19633:15;19623:25;;19536:118;19485:169;;;;:::o;19659:295::-;19735:4;19881:29;19906:3;19900:4;19881:29;:::i;:::-;19873:37;;19943:3;19940:1;19936:11;19930:4;19927:21;19919:29;;19659:295;;;;:::o;19959:1395::-;20076:37;20109:3;20076:37;:::i;:::-;20178:18;20170:6;20167:30;20164:56;;;20200:18;;:::i;:::-;20164:56;20244:38;20276:4;20270:11;20244:38;:::i;:::-;20329:67;20389:6;20381;20375:4;20329:67;:::i;:::-;20423:1;20447:4;20434:17;;20479:2;20471:6;20468:14;20496:1;20491:618;;;;21153:1;21170:6;21167:77;;;21219:9;21214:3;21210:19;21204:26;21195:35;;21167:77;21270:67;21330:6;21323:5;21270:67;:::i;:::-;21264:4;21257:81;21126:222;20461:887;;20491:618;20543:4;20539:9;20531:6;20527:22;20577:37;20609:4;20577:37;:::i;:::-;20636:1;20650:208;20664:7;20661:1;20658:14;20650:208;;;20743:9;20738:3;20734:19;20728:26;20720:6;20713:42;20794:1;20786:6;20782:14;20772:24;;20841:2;20830:9;20826:18;20813:31;;20687:4;20684:1;20680:12;20675:17;;20650:208;;;20886:6;20877:7;20874:19;20871:179;;;20944:9;20939:3;20935:19;20929:26;20987:48;21029:4;21021:6;21017:17;21006:9;20987:48;:::i;:::-;20979:6;20972:64;20894:156;20871:179;21096:1;21092;21084:6;21080:14;21076:22;21070:4;21063:36;20498:611;;;20461:887;;20051:1303;;;19959:1395;;:::o;21360:232::-;21500:34;21496:1;21488:6;21484:14;21477:58;21569:15;21564:2;21556:6;21552:15;21545:40;21360:232;:::o;21598:366::-;21740:3;21761:67;21825:2;21820:3;21761:67;:::i;:::-;21754:74;;21837:93;21926:3;21837:93;:::i;:::-;21955:2;21950:3;21946:12;21939:19;;21598:366;;;:::o;21970:419::-;22136:4;22174:2;22163:9;22159:18;22151:26;;22223:9;22217:4;22213:20;22209:1;22198:9;22194:17;22187:47;22251:131;22377:4;22251:131;:::i;:::-;22243:139;;21970:419;;;:::o;22395:180::-;22443:77;22440:1;22433:88;22540:4;22537:1;22530:15;22564:4;22561:1;22554:15;22581:180;22629:77;22626:1;22619:88;22726:4;22723:1;22716:15;22750:4;22747:1;22740:15;22767:191;22807:3;22826:20;22844:1;22826:20;:::i;:::-;22821:25;;22860:20;22878:1;22860:20;:::i;:::-;22855:25;;22903:1;22900;22896:9;22889:16;;22924:3;22921:1;22918:10;22915:36;;;22931:18;;:::i;:::-;22915:36;22767:191;;;;:::o;22964:233::-;23003:3;23026:24;23044:5;23026:24;:::i;:::-;23017:33;;23072:66;23065:5;23062:77;23059:103;;23142:18;;:::i;:::-;23059:103;23189:1;23182:5;23178:13;23171:20;;22964:233;;;:::o;23203:147::-;23304:11;23341:3;23326:18;;23203:147;;;;:::o;23356:114::-;;:::o;23476:398::-;23635:3;23656:83;23737:1;23732:3;23656:83;:::i;:::-;23649:90;;23748:93;23837:3;23748:93;:::i;:::-;23866:1;23861:3;23857:11;23850:18;;23476:398;;;:::o;23880:379::-;24064:3;24086:147;24229:3;24086:147;:::i;:::-;24079:154;;24250:3;24243:10;;23880:379;;;:::o;24265:174::-;24405:26;24401:1;24393:6;24389:14;24382:50;24265:174;:::o;24445:366::-;24587:3;24608:67;24672:2;24667:3;24608:67;:::i;:::-;24601:74;;24684:93;24773:3;24684:93;:::i;:::-;24802:2;24797:3;24793:12;24786:19;;24445:366;;;:::o;24817:419::-;24983:4;25021:2;25010:9;25006:18;24998:26;;25070:9;25064:4;25060:20;25056:1;25045:9;25041:17;25034:47;25098:131;25224:4;25098:131;:::i;:::-;25090:139;;24817:419;;;:::o;25242:228::-;25382:34;25378:1;25370:6;25366:14;25359:58;25451:11;25446:2;25438:6;25434:15;25427:36;25242:228;:::o;25476:366::-;25618:3;25639:67;25703:2;25698:3;25639:67;:::i;:::-;25632:74;;25715:93;25804:3;25715:93;:::i;:::-;25833:2;25828:3;25824:12;25817:19;;25476:366;;;:::o;25848:419::-;26014:4;26052:2;26041:9;26037:18;26029:26;;26101:9;26095:4;26091:20;26087:1;26076:9;26072:17;26065:47;26129:131;26255:4;26129:131;:::i;:::-;26121:139;;25848:419;;;:::o;26273:169::-;26413:21;26409:1;26401:6;26397:14;26390:45;26273:169;:::o;26448:366::-;26590:3;26611:67;26675:2;26670:3;26611:67;:::i;:::-;26604:74;;26687:93;26776:3;26687:93;:::i;:::-;26805:2;26800:3;26796:12;26789:19;;26448:366;;;:::o;26820:419::-;26986:4;27024:2;27013:9;27009:18;27001:26;;27073:9;27067:4;27063:20;27059:1;27048:9;27044:17;27037:47;27101:131;27227:4;27101:131;:::i;:::-;27093:139;;26820:419;;;:::o;27245:168::-;27385:20;27381:1;27373:6;27369:14;27362:44;27245:168;:::o;27419:366::-;27561:3;27582:67;27646:2;27641:3;27582:67;:::i;:::-;27575:74;;27658:93;27747:3;27658:93;:::i;:::-;27776:2;27771:3;27767:12;27760:19;;27419:366;;;:::o;27791:419::-;27957:4;27995:2;27984:9;27980:18;27972:26;;28044:9;28038:4;28034:20;28030:1;28019:9;28015:17;28008:47;28072:131;28198:4;28072:131;:::i;:::-;28064:139;;27791:419;;;:::o;28216:410::-;28256:7;28279:20;28297:1;28279:20;:::i;:::-;28274:25;;28313:20;28331:1;28313:20;:::i;:::-;28308:25;;28368:1;28365;28361:9;28390:30;28408:11;28390:30;:::i;:::-;28379:41;;28569:1;28560:7;28556:15;28553:1;28550:22;28530:1;28523:9;28503:83;28480:139;;28599:18;;:::i;:::-;28480:139;28264:362;28216:410;;;;:::o;28632:162::-;28772:14;28768:1;28760:6;28756:14;28749:38;28632:162;:::o;28800:366::-;28942:3;28963:67;29027:2;29022:3;28963:67;:::i;:::-;28956:74;;29039:93;29128:3;29039:93;:::i;:::-;29157:2;29152:3;29148:12;29141:19;;28800:366;;;:::o;29172:419::-;29338:4;29376:2;29365:9;29361:18;29353:26;;29425:9;29419:4;29415:20;29411:1;29400:9;29396:17;29389:47;29453:131;29579:4;29453:131;:::i;:::-;29445:139;;29172:419;;;:::o;29597:172::-;29737:24;29733:1;29725:6;29721:14;29714:48;29597:172;:::o;29775:366::-;29917:3;29938:67;30002:2;29997:3;29938:67;:::i;:::-;29931:74;;30014:93;30103:3;30014:93;:::i;:::-;30132:2;30127:3;30123:12;30116:19;;29775:366;;;:::o;30147:419::-;30313:4;30351:2;30340:9;30336:18;30328:26;;30400:9;30394:4;30390:20;30386:1;30375:9;30371:17;30364:47;30428:131;30554:4;30428:131;:::i;:::-;30420:139;;30147:419;;;:::o;30572:194::-;30612:4;30632:20;30650:1;30632:20;:::i;:::-;30627:25;;30666:20;30684:1;30666:20;:::i;:::-;30661:25;;30710:1;30707;30703:9;30695:17;;30734:1;30728:4;30725:11;30722:37;;;30739:18;;:::i;:::-;30722:37;30572:194;;;;:::o;30772:165::-;30912:17;30908:1;30900:6;30896:14;30889:41;30772:165;:::o;30943:366::-;31085:3;31106:67;31170:2;31165:3;31106:67;:::i;:::-;31099:74;;31182:93;31271:3;31182:93;:::i;:::-;31300:2;31295:3;31291:12;31284:19;;30943:366;;;:::o;31315:419::-;31481:4;31519:2;31508:9;31504:18;31496:26;;31568:9;31562:4;31558:20;31554:1;31543:9;31539:17;31532:47;31596:131;31722:4;31596:131;:::i;:::-;31588:139;;31315:419;;;:::o;31740:234::-;31880:34;31876:1;31868:6;31864:14;31857:58;31949:17;31944:2;31936:6;31932:15;31925:42;31740:234;:::o;31980:366::-;32122:3;32143:67;32207:2;32202:3;32143:67;:::i;:::-;32136:74;;32219:93;32308:3;32219:93;:::i;:::-;32337:2;32332:3;32328:12;32321:19;;31980:366;;;:::o;32352:419::-;32518:4;32556:2;32545:9;32541:18;32533:26;;32605:9;32599:4;32595:20;32591:1;32580:9;32576:17;32569:47;32633:131;32759:4;32633:131;:::i;:::-;32625:139;;32352:419;;;:::o;32777:148::-;32879:11;32916:3;32901:18;;32777:148;;;;:::o;32931:390::-;33037:3;33065:39;33098:5;33065:39;:::i;:::-;33120:89;33202:6;33197:3;33120:89;:::i;:::-;33113:96;;33218:65;33276:6;33271:3;33264:4;33257:5;33253:16;33218:65;:::i;:::-;33308:6;33303:3;33299:16;33292:23;;33041:280;32931:390;;;;:::o;33351:874::-;33454:3;33491:5;33485:12;33520:36;33546:9;33520:36;:::i;:::-;33572:89;33654:6;33649:3;33572:89;:::i;:::-;33565:96;;33692:1;33681:9;33677:17;33708:1;33703:166;;;;33883:1;33878:341;;;;33670:549;;33703:166;33787:4;33783:9;33772;33768:25;33763:3;33756:38;33849:6;33842:14;33835:22;33827:6;33823:35;33818:3;33814:45;33807:52;;33703:166;;33878:341;33945:38;33977:5;33945:38;:::i;:::-;34005:1;34019:154;34033:6;34030:1;34027:13;34019:154;;;34107:7;34101:14;34097:1;34092:3;34088:11;34081:35;34157:1;34148:7;34144:15;34133:26;;34055:4;34052:1;34048:12;34043:17;;34019:154;;;34202:6;34197:3;34193:16;34186:23;;33885:334;;33670:549;;33458:767;;33351:874;;;;:::o;34231:589::-;34456:3;34478:95;34569:3;34560:6;34478:95;:::i;:::-;34471:102;;34590:95;34681:3;34672:6;34590:95;:::i;:::-;34583:102;;34702:92;34790:3;34781:6;34702:92;:::i;:::-;34695:99;;34811:3;34804:10;;34231:589;;;;;;:::o;34826:225::-;34966:34;34962:1;34954:6;34950:14;34943:58;35035:8;35030:2;35022:6;35018:15;35011:33;34826:225;:::o;35057:366::-;35199:3;35220:67;35284:2;35279:3;35220:67;:::i;:::-;35213:74;;35296:93;35385:3;35296:93;:::i;:::-;35414:2;35409:3;35405:12;35398:19;;35057:366;;;:::o;35429:419::-;35595:4;35633:2;35622:9;35618:18;35610:26;;35682:9;35676:4;35672:20;35668:1;35657:9;35653:17;35646:47;35710:131;35836:4;35710:131;:::i;:::-;35702:139;;35429:419;;;:::o;35854:182::-;35994:34;35990:1;35982:6;35978:14;35971:58;35854:182;:::o;36042:366::-;36184:3;36205:67;36269:2;36264:3;36205:67;:::i;:::-;36198:74;;36281:93;36370:3;36281:93;:::i;:::-;36399:2;36394:3;36390:12;36383:19;;36042:366;;;:::o;36414:419::-;36580:4;36618:2;36607:9;36603:18;36595:26;;36667:9;36661:4;36657:20;36653:1;36642:9;36638:17;36631:47;36695:131;36821:4;36695:131;:::i;:::-;36687:139;;36414:419;;;:::o;36839:224::-;36979:34;36975:1;36967:6;36963:14;36956:58;37048:7;37043:2;37035:6;37031:15;37024:32;36839:224;:::o;37069:366::-;37211:3;37232:67;37296:2;37291:3;37232:67;:::i;:::-;37225:74;;37308:93;37397:3;37308:93;:::i;:::-;37426:2;37421:3;37417:12;37410:19;;37069:366;;;:::o;37441:419::-;37607:4;37645:2;37634:9;37630:18;37622:26;;37694:9;37688:4;37684:20;37680:1;37669:9;37665:17;37658:47;37722:131;37848:4;37722:131;:::i;:::-;37714:139;;37441:419;;;:::o;37866:223::-;38006:34;38002:1;37994:6;37990:14;37983:58;38075:6;38070:2;38062:6;38058:15;38051:31;37866:223;:::o;38095:366::-;38237:3;38258:67;38322:2;38317:3;38258:67;:::i;:::-;38251:74;;38334:93;38423:3;38334:93;:::i;:::-;38452:2;38447:3;38443:12;38436:19;;38095:366;;;:::o;38467:419::-;38633:4;38671:2;38660:9;38656:18;38648:26;;38720:9;38714:4;38710:20;38706:1;38695:9;38691:17;38684:47;38748:131;38874:4;38748:131;:::i;:::-;38740:139;;38467:419;;;:::o;38892:175::-;39032:27;39028:1;39020:6;39016:14;39009:51;38892:175;:::o;39073:366::-;39215:3;39236:67;39300:2;39295:3;39236:67;:::i;:::-;39229:74;;39312:93;39401:3;39312:93;:::i;:::-;39430:2;39425:3;39421:12;39414:19;;39073:366;;;:::o;39445:419::-;39611:4;39649:2;39638:9;39634:18;39626:26;;39698:9;39692:4;39688:20;39684:1;39673:9;39669:17;39662:47;39726:131;39852:4;39726:131;:::i;:::-;39718:139;;39445:419;;;:::o;39870:237::-;40010:34;40006:1;39998:6;39994:14;39987:58;40079:20;40074:2;40066:6;40062:15;40055:45;39870:237;:::o;40113:366::-;40255:3;40276:67;40340:2;40335:3;40276:67;:::i;:::-;40269:74;;40352:93;40441:3;40352:93;:::i;:::-;40470:2;40465:3;40461:12;40454:19;;40113:366;;;:::o;40485:419::-;40651:4;40689:2;40678:9;40674:18;40666:26;;40738:9;40732:4;40728:20;40724:1;40713:9;40709:17;40702:47;40766:131;40892:4;40766:131;:::i;:::-;40758:139;;40485:419;;;:::o;40910:180::-;40958:77;40955:1;40948:88;41055:4;41052:1;41045:15;41079:4;41076:1;41069:15;41096:98;41147:6;41181:5;41175:12;41165:22;;41096:98;;;:::o;41200:168::-;41283:11;41317:6;41312:3;41305:19;41357:4;41352:3;41348:14;41333:29;;41200:168;;;;:::o;41374:373::-;41460:3;41488:38;41520:5;41488:38;:::i;:::-;41542:70;41605:6;41600:3;41542:70;:::i;:::-;41535:77;;41621:65;41679:6;41674:3;41667:4;41660:5;41656:16;41621:65;:::i;:::-;41711:29;41733:6;41711:29;:::i;:::-;41706:3;41702:39;41695:46;;41464:283;41374:373;;;;:::o;41753:640::-;41948:4;41986:3;41975:9;41971:19;41963:27;;42000:71;42068:1;42057:9;42053:17;42044:6;42000:71;:::i;:::-;42081:72;42149:2;42138:9;42134:18;42125:6;42081:72;:::i;:::-;42163;42231:2;42220:9;42216:18;42207:6;42163:72;:::i;:::-;42282:9;42276:4;42272:20;42267:2;42256:9;42252:18;42245:48;42310:76;42381:4;42372:6;42310:76;:::i;:::-;42302:84;;41753:640;;;;;;;:::o;42399:141::-;42455:5;42486:6;42480:13;42471:22;;42502:32;42528:5;42502:32;:::i;:::-;42399:141;;;;:::o;42546:349::-;42615:6;42664:2;42652:9;42643:7;42639:23;42635:32;42632:119;;;42670:79;;:::i;:::-;42632:119;42790:1;42815:63;42870:7;42861:6;42850:9;42846:22;42815:63;:::i;:::-;42805:73;;42761:127;42546:349;;;;:::o;42901:182::-;43041:34;43037:1;43029:6;43025:14;43018:58;42901:182;:::o;43089:366::-;43231:3;43252:67;43316:2;43311:3;43252:67;:::i;:::-;43245:74;;43328:93;43417:3;43328:93;:::i;:::-;43446:2;43441:3;43437:12;43430:19;;43089:366;;;:::o;43461:419::-;43627:4;43665:2;43654:9;43650:18;43642:26;;43714:9;43708:4;43704:20;43700:1;43689:9;43685:17;43678:47;43742:131;43868:4;43742:131;:::i;:::-;43734:139;;43461:419;;;:::o;43886:178::-;44026:30;44022:1;44014:6;44010:14;44003:54;43886:178;:::o;44070:366::-;44212:3;44233:67;44297:2;44292:3;44233:67;:::i;:::-;44226:74;;44309:93;44398:3;44309:93;:::i;:::-;44427:2;44422:3;44418:12;44411:19;;44070:366;;;:::o;44442:419::-;44608:4;44646:2;44635:9;44631:18;44623:26;;44695:9;44689:4;44685:20;44681:1;44670:9;44666:17;44659:47;44723:131;44849:4;44723:131;:::i;:::-;44715:139;;44442:419;;;:::o
Swarm Source
ipfs://e336e456d930da825734a6b0fcce1818fcd9b781adb55cde0e14c2cba07183d6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.