ERC-721
Overview
Max Total Supply
500 TAG
Holders
186
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BEBadgeV2
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-08 */ // File: @openzeppelin\contracts\utils\introspection\IERC165.sol // SPDX-License-Identifier: MIT // 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\token\ERC721\IERC721.sol // OpenZeppelin Contracts (last updated v4.9.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\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\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\utils\Address.sol // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin\contracts\utils\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\utils\math\Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // 鈫?`sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // 鈫?`2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin\contracts\utils\math\SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin\contracts\utils\Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin\contracts\utils\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\ERC721.sol // OpenZeppelin Contracts (last updated v4.9.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 {} /** * @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 {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin\contracts\token\ERC721\extensions\IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin\contracts\token\ERC721\extensions\ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin\contracts\token\ERC721\extensions\ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } // File: @openzeppelin\contracts\access\Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts\tokens\erc721\BEBadgeV2.sol pragma solidity 0.8.10; contract BEBadgeV2 is Ownable, ERC721Enumerable, ERC721Burnable { string private _baseTokenURI = ""; uint256 public immutable supplyLimit; uint256 private _tokenIndex; mapping(address => bool) public minters; // ============ Events ============ event MetaAddressUpdated(address indexed metaAddress); event MinterUpdated(address indexed minter, bool support); constructor( string memory _name, string memory _symbol, uint256 _supplyLimt ) ERC721(_name, _symbol) { require(_supplyLimt > 0, "Supply limit must be greater than 0"); supplyLimit = _supplyLimt; } /** * @dev Safely mints a new token and assigns it to the specified address. * Only the account with the minter permission can call this function. * tokenId begin with 1. * @param _to The address to which the newly minted token will be assigned. */ function safeMint(address _to) external onlyMinter returns (uint256){ require(_tokenIndex < supplyLimit, "Exceeds the total supply"); uint256 tokenId = ++_tokenIndex; _safeMint(_to, tokenId); return tokenId; } /** * @dev Set token URI */ function updateBaseURI( string calldata baseTokenURI ) external onlyOwner() { _baseTokenURI = baseTokenURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } /** * @dev See {IERC165-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev Updates the minters mapping to allow or disallow a specific address to mint tokens. * Only the contract owner can call this function. * @param _address The address to update the minting permission for. * @param _support A boolean indicating whether the address should be allowed to mint tokens or not. */ function updateMinters(address _address, bool _support) external onlyOwner { minters[_address] = _support; emit MinterUpdated(_address, _support); } modifier onlyMinter() { require(minters[_msgSender()], "Address does not have the minter permission"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_supplyLimt","type":"uint256"}],"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":"metaAddress","type":"address"}],"name":"MetaAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"}],"name":"MinterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"safeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_support","type":"bool"}],"name":"updateMinters","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405260405180602001604052806000815250600b90805190602001906200002b929190620001d8565b503480156200003957600080fd5b5060405162003f9f38038062003f9f83398181016040528101906200005f919062000460565b828262000081620000756200010c60201b60201c565b6200011460201b60201c565b816001908051906020019062000099929190620001d8565b508060029080519060200190620000b2929190620001d8565b50505060008111620000fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000f29062000581565b60405180910390fd5b806080818152505050505062000608565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001e690620005d2565b90600052602060002090601f0160209004810192826200020a576000855562000256565b82601f106200022557805160ff191683800117855562000256565b8280016001018555821562000256579182015b828111156200025557825182559160200191906001019062000238565b5b50905062000265919062000269565b5090565b5b80821115620002845760008160009055506001016200026a565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002f182620002a6565b810181811067ffffffffffffffff82111715620003135762000312620002b7565b5b80604052505050565b60006200032862000288565b9050620003368282620002e6565b919050565b600067ffffffffffffffff821115620003595762000358620002b7565b5b6200036482620002a6565b9050602081019050919050565b60005b838110156200039157808201518184015260208101905062000374565b83811115620003a1576000848401525b50505050565b6000620003be620003b8846200033b565b6200031c565b905082815260208101848484011115620003dd57620003dc620002a1565b5b620003ea84828562000371565b509392505050565b600082601f8301126200040a57620004096200029c565b5b81516200041c848260208601620003a7565b91505092915050565b6000819050919050565b6200043a8162000425565b81146200044657600080fd5b50565b6000815190506200045a816200042f565b92915050565b6000806000606084860312156200047c576200047b62000292565b5b600084015167ffffffffffffffff8111156200049d576200049c62000297565b5b620004ab86828701620003f2565b935050602084015167ffffffffffffffff811115620004cf57620004ce62000297565b5b620004dd86828701620003f2565b9250506040620004f08682870162000449565b9150509250925092565b600082825260208201905092915050565b7f537570706c79206c696d6974206d75737420626520677265617465722074686160008201527f6e20300000000000000000000000000000000000000000000000000000000000602082015250565b600062000569602383620004fa565b915062000576826200050b565b604082019050919050565b600060208201905081810360008301526200059c816200055a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005eb57607f821691505b60208210811415620006025762000601620005a3565b5b50919050565b6080516139746200062b6000396000818161070501526108c301526139746000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80636352211e116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd14610448578063e985e9c514610478578063f2fde38b146104a8578063f46eccc4146104c457610173565b8063a22cb465146103f4578063a9570f1314610410578063b88d4fde1461042c57610173565b80636352211e1461033257806370a0823114610362578063715018a6146103925780638da5cb5b1461039c578063931688cb146103ba57806395d89b41146103d657610173565b806323b872dd1161013057806323b872dd1461024e5780632f745c591461026a57806340d097c31461029a57806342842e0e146102ca57806342966c68146102e65780634f6ccce71461030257610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806319d1997a14610230575b600080fd5b610192600480360381019061018d91906126fd565b6104f4565b60405161019f9190612745565b60405180910390f35b6101b0610506565b6040516101bd91906127f9565b60405180910390f35b6101e060048036038101906101db9190612851565b610598565b6040516101ed91906128bf565b60405180910390f35b610210600480360381019061020b9190612906565b6105de565b005b61021a6106f6565b6040516102279190612955565b60405180910390f35b610238610703565b6040516102459190612955565b60405180910390f35b61026860048036038101906102639190612970565b610727565b005b610284600480360381019061027f9190612906565b610787565b6040516102919190612955565b60405180910390f35b6102b460048036038101906102af91906129c3565b61082c565b6040516102c19190612955565b60405180910390f35b6102e460048036038101906102df9190612970565b610951565b005b61030060048036038101906102fb9190612851565b610971565b005b61031c60048036038101906103179190612851565b6109cd565b6040516103299190612955565b60405180910390f35b61034c60048036038101906103479190612851565b610a3e565b60405161035991906128bf565b60405180910390f35b61037c600480360381019061037791906129c3565b610ac5565b6040516103899190612955565b60405180910390f35b61039a610b7d565b005b6103a4610b91565b6040516103b191906128bf565b60405180910390f35b6103d460048036038101906103cf9190612a55565b610bba565b005b6103de610bd8565b6040516103eb91906127f9565b60405180910390f35b61040e60048036038101906104099190612ace565b610c6a565b005b61042a60048036038101906104259190612ace565b610c80565b005b61044660048036038101906104419190612c3e565b610d31565b005b610462600480360381019061045d9190612851565b610d93565b60405161046f91906127f9565b60405180910390f35b610492600480360381019061048d9190612cc1565b610dfb565b60405161049f9190612745565b60405180910390f35b6104c260048036038101906104bd91906129c3565b610e8f565b005b6104de60048036038101906104d991906129c3565b610f13565b6040516104eb9190612745565b60405180910390f35b60006104ff82610f33565b9050919050565b60606001805461051590612d30565b80601f016020809104026020016040519081016040528092919081815260200182805461054190612d30565b801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b5050505050905090565b60006105a382610fad565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105e982610a3e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561065a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065190612dd4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610679610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614806106a857506106a7816106a2610ff8565b610dfb565b5b6106e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106de90612e66565b60405180910390fd5b6106f18383611000565b505050565b6000600980549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b610738610732610ff8565b826110b9565b610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e90612ef8565b60405180910390fd5b61078283838361114e565b505050565b600061079283610ac5565b82106107d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ca90612f8a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600d600061083a610ff8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166108c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b89061301c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000600c5410610925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091c90613088565b60405180910390fd5b6000600c60008154610936906130d7565b91905081905590506109488382611448565b80915050919050565b61096c83838360405180602001604052806000815250610d31565b505050565b61098261097c610ff8565b826110b9565b6109c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b890612ef8565b60405180910390fd5b6109ca81611466565b50565b60006109d76106f6565b8210610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90613192565b60405180910390fd5b60098281548110610a2c57610a2b6131b2565b5b90600052602060002001549050919050565b600080610a4a836115b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab39061322d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d906132bf565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b856115f1565b610b8f600061166f565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610bc26115f1565b8181600b9190610bd39291906125ee565b505050565b606060028054610be790612d30565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1390612d30565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b5050505050905090565b610c7c610c75610ff8565b8383611733565b5050565b610c886115f1565b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fb21afb9ce9be0a676f8f317ff0ca072fb89a4f8ce2d1b6fe80f8755c14f1cb1982604051610d259190612745565b60405180910390a25050565b610d42610d3c610ff8565b836110b9565b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890612ef8565b60405180910390fd5b610d8d848484846118a0565b50505050565b6060610d9e82610fad565b6000610da86118fc565b90506000815111610dc85760405180602001604052806000815250610df3565b80610dd28461198e565b604051602001610de392919061331b565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e976115f1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe906133b1565b60405180910390fd5b610f108161166f565b50565b600d6020528060005260406000206000915054906101000a900460ff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610fa65750610fa582611a66565b5b9050919050565b610fb681611b48565b610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec9061322d565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661107383610a3e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806110c583610a3e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061110757506111068185610dfb565b5b8061114557508373ffffffffffffffffffffffffffffffffffffffff1661112d84610598565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661116e82610a3e565b73ffffffffffffffffffffffffffffffffffffffff16146111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb90613443565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b906134d5565b60405180910390fd5b6112418383836001611b89565b8273ffffffffffffffffffffffffffffffffffffffff1661126182610a3e565b73ffffffffffffffffffffffffffffffffffffffff16146112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613443565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114438383836001611b9b565b505050565b611462828260405180602001604052806000815250611ba1565b5050565b600061147182610a3e565b9050611481816000846001611b89565b61148a82610a3e565b90506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115b0816000846001611b9b565b5050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6115f9610ff8565b73ffffffffffffffffffffffffffffffffffffffff16611617610b91565b73ffffffffffffffffffffffffffffffffffffffff161461166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490613541565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611799906135ad565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118939190612745565b60405180910390a3505050565b6118ab84848461114e565b6118b784848484611bfc565b6118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed9061363f565b60405180910390fd5b50505050565b6060600b805461190b90612d30565b80601f016020809104026020016040519081016040528092919081815260200182805461193790612d30565b80156119845780601f1061195957610100808354040283529160200191611984565b820191906000526020600020905b81548152906001019060200180831161196757829003601f168201915b5050505050905090565b60606000600161199d84611d84565b01905060008167ffffffffffffffff8111156119bc576119bb612b13565b5b6040519080825280601f01601f1916602001820160405280156119ee5781602001600182028036833780820191505090505b509050600082602001820190505b600115611a5b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611a4557611a4461365f565b5b0494506000851415611a5657611a5b565b6119fc565b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b3157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b415750611b4082611ed7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611b6a836115b4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611b9584848484611f41565b50505050565b50505050565b611bab83836120a1565b611bb86000848484611bfc565b611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee9061363f565b60405180910390fd5b505050565b6000611c1d8473ffffffffffffffffffffffffffffffffffffffff166122bf565b15611d77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c46610ff8565b8786866040518563ffffffff1660e01b8152600401611c6894939291906136e3565b6020604051808303816000875af1925050508015611ca457506040513d601f19601f82011682018060405250810190611ca19190613744565b60015b611d27573d8060008114611cd4576040519150601f19603f3d011682016040523d82523d6000602084013e611cd9565b606091505b50600081511415611d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d169061363f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d7c565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611de2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611dd857611dd761365f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e1f576d04ee2d6d415b85acef81000000008381611e1557611e1461365f565b5b0492506020810190505b662386f26fc100008310611e4e57662386f26fc100008381611e4457611e4361365f565b5b0492506010810190505b6305f5e1008310611e77576305f5e1008381611e6d57611e6c61365f565b5b0492506008810190505b6127108310611e9c576127108381611e9257611e9161365f565b5b0492506004810190505b60648310611ebf5760648381611eb557611eb461365f565b5b0492506002810190505b600a8310611ece576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f4d848484846122e2565b6001811115611f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f88906137e3565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611fd957611fd4816122e8565b612018565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612017576120168582612331565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561205b576120568161249e565b61209a565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461209957612098848261256f565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612111576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121089061384f565b60405180910390fd5b61211a81611b48565b1561215a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612151906138bb565b60405180910390fd5b612168600083836001611b89565b61217181611b48565b156121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a8906138bb565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122bb600083836001611b9b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161233e84610ac5565b61234891906138db565b905060006008600084815260200190815260200160002054905081811461242d576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506124b291906138db565b90506000600a60008481526020019081526020016000205490506000600983815481106124e2576124e16131b2565b5b906000526020600020015490508060098381548110612504576125036131b2565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806125535761255261390f565b5b6001900381819060005260206000200160009055905550505050565b600061257a83610ac5565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546125fa90612d30565b90600052602060002090601f01602090048101928261261c5760008555612663565b82601f1061263557803560ff1916838001178555612663565b82800160010185558215612663579182015b82811115612662578235825591602001919060010190612647565b5b5090506126709190612674565b5090565b5b8082111561268d576000816000905550600101612675565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6126da816126a5565b81146126e557600080fd5b50565b6000813590506126f7816126d1565b92915050565b6000602082840312156127135761271261269b565b5b6000612721848285016126e8565b91505092915050565b60008115159050919050565b61273f8161272a565b82525050565b600060208201905061275a6000830184612736565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561279a57808201518184015260208101905061277f565b838111156127a9576000848401525b50505050565b6000601f19601f8301169050919050565b60006127cb82612760565b6127d5818561276b565b93506127e581856020860161277c565b6127ee816127af565b840191505092915050565b6000602082019050818103600083015261281381846127c0565b905092915050565b6000819050919050565b61282e8161281b565b811461283957600080fd5b50565b60008135905061284b81612825565b92915050565b6000602082840312156128675761286661269b565b5b60006128758482850161283c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128a98261287e565b9050919050565b6128b98161289e565b82525050565b60006020820190506128d460008301846128b0565b92915050565b6128e38161289e565b81146128ee57600080fd5b50565b600081359050612900816128da565b92915050565b6000806040838503121561291d5761291c61269b565b5b600061292b858286016128f1565b925050602061293c8582860161283c565b9150509250929050565b61294f8161281b565b82525050565b600060208201905061296a6000830184612946565b92915050565b6000806000606084860312156129895761298861269b565b5b6000612997868287016128f1565b93505060206129a8868287016128f1565b92505060406129b98682870161283c565b9150509250925092565b6000602082840312156129d9576129d861269b565b5b60006129e7848285016128f1565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a1557612a146129f0565b5b8235905067ffffffffffffffff811115612a3257612a316129f5565b5b602083019150836001820283011115612a4e57612a4d6129fa565b5b9250929050565b60008060208385031215612a6c57612a6b61269b565b5b600083013567ffffffffffffffff811115612a8a57612a896126a0565b5b612a96858286016129ff565b92509250509250929050565b612aab8161272a565b8114612ab657600080fd5b50565b600081359050612ac881612aa2565b92915050565b60008060408385031215612ae557612ae461269b565b5b6000612af3858286016128f1565b9250506020612b0485828601612ab9565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b4b826127af565b810181811067ffffffffffffffff82111715612b6a57612b69612b13565b5b80604052505050565b6000612b7d612691565b9050612b898282612b42565b919050565b600067ffffffffffffffff821115612ba957612ba8612b13565b5b612bb2826127af565b9050602081019050919050565b82818337600083830152505050565b6000612be1612bdc84612b8e565b612b73565b905082815260208101848484011115612bfd57612bfc612b0e565b5b612c08848285612bbf565b509392505050565b600082601f830112612c2557612c246129f0565b5b8135612c35848260208601612bce565b91505092915050565b60008060008060808587031215612c5857612c5761269b565b5b6000612c66878288016128f1565b9450506020612c77878288016128f1565b9350506040612c888782880161283c565b925050606085013567ffffffffffffffff811115612ca957612ca86126a0565b5b612cb587828801612c10565b91505092959194509250565b60008060408385031215612cd857612cd761269b565b5b6000612ce6858286016128f1565b9250506020612cf7858286016128f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d4857607f821691505b60208210811415612d5c57612d5b612d01565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612dbe60218361276b565b9150612dc982612d62565b604082019050919050565b60006020820190508181036000830152612ded81612db1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612e50603d8361276b565b9150612e5b82612df4565b604082019050919050565b60006020820190508181036000830152612e7f81612e43565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612ee2602d8361276b565b9150612eed82612e86565b604082019050919050565b60006020820190508181036000830152612f1181612ed5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612f74602b8361276b565b9150612f7f82612f18565b604082019050919050565b60006020820190508181036000830152612fa381612f67565b9050919050565b7f4164647265737320646f6573206e6f74206861766520746865206d696e74657260008201527f207065726d697373696f6e000000000000000000000000000000000000000000602082015250565b6000613006602b8361276b565b915061301182612faa565b604082019050919050565b6000602082019050818103600083015261303581612ff9565b9050919050565b7f457863656564732074686520746f74616c20737570706c790000000000000000600082015250565b600061307260188361276b565b915061307d8261303c565b602082019050919050565b600060208201905081810360008301526130a181613065565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130e28261281b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613115576131146130a8565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061317c602c8361276b565b915061318782613120565b604082019050919050565b600060208201905081810360008301526131ab8161316f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061321760188361276b565b9150613222826131e1565b602082019050919050565b600060208201905081810360008301526132468161320a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006132a960298361276b565b91506132b48261324d565b604082019050919050565b600060208201905081810360008301526132d88161329c565b9050919050565b600081905092915050565b60006132f582612760565b6132ff81856132df565b935061330f81856020860161277c565b80840191505092915050565b600061332782856132ea565b915061333382846132ea565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061339b60268361276b565b91506133a68261333f565b604082019050919050565b600060208201905081810360008301526133ca8161338e565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061342d60258361276b565b9150613438826133d1565b604082019050919050565b6000602082019050818103600083015261345c81613420565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006134bf60248361276b565b91506134ca82613463565b604082019050919050565b600060208201905081810360008301526134ee816134b2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061352b60208361276b565b9150613536826134f5565b602082019050919050565b6000602082019050818103600083015261355a8161351e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061359760198361276b565b91506135a282613561565b602082019050919050565b600060208201905081810360008301526135c68161358a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061362960328361276b565b9150613634826135cd565b604082019050919050565b600060208201905081810360008301526136588161361c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006136b58261368e565b6136bf8185613699565b93506136cf81856020860161277c565b6136d8816127af565b840191505092915050565b60006080820190506136f860008301876128b0565b61370560208301866128b0565b6137126040830185612946565b818103606083015261372481846136aa565b905095945050505050565b60008151905061373e816126d1565b92915050565b60006020828403121561375a5761375961269b565b5b60006137688482850161372f565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006137cd60358361276b565b91506137d882613771565b604082019050919050565b600060208201905081810360008301526137fc816137c0565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061383960208361276b565b915061384482613803565b602082019050919050565b600060208201905081810360008301526138688161382c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006138a5601c8361276b565b91506138b08261386f565b602082019050919050565b600060208201905081810360008301526138d481613898565b9050919050565b60006138e68261281b565b91506138f18361281b565b925082821015613904576139036130a8565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212200f3aa7a95f21fdbfd8d7564726d2ac5532b9f251b14184334df087af141ba9c464736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000c464f554e4445525320544147000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035441470000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c80636352211e116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd14610448578063e985e9c514610478578063f2fde38b146104a8578063f46eccc4146104c457610173565b8063a22cb465146103f4578063a9570f1314610410578063b88d4fde1461042c57610173565b80636352211e1461033257806370a0823114610362578063715018a6146103925780638da5cb5b1461039c578063931688cb146103ba57806395d89b41146103d657610173565b806323b872dd1161013057806323b872dd1461024e5780632f745c591461026a57806340d097c31461029a57806342842e0e146102ca57806342966c68146102e65780634f6ccce71461030257610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806319d1997a14610230575b600080fd5b610192600480360381019061018d91906126fd565b6104f4565b60405161019f9190612745565b60405180910390f35b6101b0610506565b6040516101bd91906127f9565b60405180910390f35b6101e060048036038101906101db9190612851565b610598565b6040516101ed91906128bf565b60405180910390f35b610210600480360381019061020b9190612906565b6105de565b005b61021a6106f6565b6040516102279190612955565b60405180910390f35b610238610703565b6040516102459190612955565b60405180910390f35b61026860048036038101906102639190612970565b610727565b005b610284600480360381019061027f9190612906565b610787565b6040516102919190612955565b60405180910390f35b6102b460048036038101906102af91906129c3565b61082c565b6040516102c19190612955565b60405180910390f35b6102e460048036038101906102df9190612970565b610951565b005b61030060048036038101906102fb9190612851565b610971565b005b61031c60048036038101906103179190612851565b6109cd565b6040516103299190612955565b60405180910390f35b61034c60048036038101906103479190612851565b610a3e565b60405161035991906128bf565b60405180910390f35b61037c600480360381019061037791906129c3565b610ac5565b6040516103899190612955565b60405180910390f35b61039a610b7d565b005b6103a4610b91565b6040516103b191906128bf565b60405180910390f35b6103d460048036038101906103cf9190612a55565b610bba565b005b6103de610bd8565b6040516103eb91906127f9565b60405180910390f35b61040e60048036038101906104099190612ace565b610c6a565b005b61042a60048036038101906104259190612ace565b610c80565b005b61044660048036038101906104419190612c3e565b610d31565b005b610462600480360381019061045d9190612851565b610d93565b60405161046f91906127f9565b60405180910390f35b610492600480360381019061048d9190612cc1565b610dfb565b60405161049f9190612745565b60405180910390f35b6104c260048036038101906104bd91906129c3565b610e8f565b005b6104de60048036038101906104d991906129c3565b610f13565b6040516104eb9190612745565b60405180910390f35b60006104ff82610f33565b9050919050565b60606001805461051590612d30565b80601f016020809104026020016040519081016040528092919081815260200182805461054190612d30565b801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b5050505050905090565b60006105a382610fad565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105e982610a3e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561065a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065190612dd4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610679610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614806106a857506106a7816106a2610ff8565b610dfb565b5b6106e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106de90612e66565b60405180910390fd5b6106f18383611000565b505050565b6000600980549050905090565b7f00000000000000000000000000000000000000000000000000000000000001f481565b610738610732610ff8565b826110b9565b610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e90612ef8565b60405180910390fd5b61078283838361114e565b505050565b600061079283610ac5565b82106107d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ca90612f8a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600d600061083a610ff8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166108c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b89061301c565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000001f4600c5410610925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091c90613088565b60405180910390fd5b6000600c60008154610936906130d7565b91905081905590506109488382611448565b80915050919050565b61096c83838360405180602001604052806000815250610d31565b505050565b61098261097c610ff8565b826110b9565b6109c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b890612ef8565b60405180910390fd5b6109ca81611466565b50565b60006109d76106f6565b8210610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90613192565b60405180910390fd5b60098281548110610a2c57610a2b6131b2565b5b90600052602060002001549050919050565b600080610a4a836115b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab39061322d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d906132bf565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b856115f1565b610b8f600061166f565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610bc26115f1565b8181600b9190610bd39291906125ee565b505050565b606060028054610be790612d30565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1390612d30565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b5050505050905090565b610c7c610c75610ff8565b8383611733565b5050565b610c886115f1565b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fb21afb9ce9be0a676f8f317ff0ca072fb89a4f8ce2d1b6fe80f8755c14f1cb1982604051610d259190612745565b60405180910390a25050565b610d42610d3c610ff8565b836110b9565b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890612ef8565b60405180910390fd5b610d8d848484846118a0565b50505050565b6060610d9e82610fad565b6000610da86118fc565b90506000815111610dc85760405180602001604052806000815250610df3565b80610dd28461198e565b604051602001610de392919061331b565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e976115f1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe906133b1565b60405180910390fd5b610f108161166f565b50565b600d6020528060005260406000206000915054906101000a900460ff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610fa65750610fa582611a66565b5b9050919050565b610fb681611b48565b610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec9061322d565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661107383610a3e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806110c583610a3e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061110757506111068185610dfb565b5b8061114557508373ffffffffffffffffffffffffffffffffffffffff1661112d84610598565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661116e82610a3e565b73ffffffffffffffffffffffffffffffffffffffff16146111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb90613443565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b906134d5565b60405180910390fd5b6112418383836001611b89565b8273ffffffffffffffffffffffffffffffffffffffff1661126182610a3e565b73ffffffffffffffffffffffffffffffffffffffff16146112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613443565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114438383836001611b9b565b505050565b611462828260405180602001604052806000815250611ba1565b5050565b600061147182610a3e565b9050611481816000846001611b89565b61148a82610a3e565b90506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115b0816000846001611b9b565b5050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6115f9610ff8565b73ffffffffffffffffffffffffffffffffffffffff16611617610b91565b73ffffffffffffffffffffffffffffffffffffffff161461166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490613541565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611799906135ad565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118939190612745565b60405180910390a3505050565b6118ab84848461114e565b6118b784848484611bfc565b6118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed9061363f565b60405180910390fd5b50505050565b6060600b805461190b90612d30565b80601f016020809104026020016040519081016040528092919081815260200182805461193790612d30565b80156119845780601f1061195957610100808354040283529160200191611984565b820191906000526020600020905b81548152906001019060200180831161196757829003601f168201915b5050505050905090565b60606000600161199d84611d84565b01905060008167ffffffffffffffff8111156119bc576119bb612b13565b5b6040519080825280601f01601f1916602001820160405280156119ee5781602001600182028036833780820191505090505b509050600082602001820190505b600115611a5b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611a4557611a4461365f565b5b0494506000851415611a5657611a5b565b6119fc565b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b3157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b415750611b4082611ed7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611b6a836115b4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611b9584848484611f41565b50505050565b50505050565b611bab83836120a1565b611bb86000848484611bfc565b611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee9061363f565b60405180910390fd5b505050565b6000611c1d8473ffffffffffffffffffffffffffffffffffffffff166122bf565b15611d77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c46610ff8565b8786866040518563ffffffff1660e01b8152600401611c6894939291906136e3565b6020604051808303816000875af1925050508015611ca457506040513d601f19601f82011682018060405250810190611ca19190613744565b60015b611d27573d8060008114611cd4576040519150601f19603f3d011682016040523d82523d6000602084013e611cd9565b606091505b50600081511415611d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d169061363f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d7c565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611de2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611dd857611dd761365f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e1f576d04ee2d6d415b85acef81000000008381611e1557611e1461365f565b5b0492506020810190505b662386f26fc100008310611e4e57662386f26fc100008381611e4457611e4361365f565b5b0492506010810190505b6305f5e1008310611e77576305f5e1008381611e6d57611e6c61365f565b5b0492506008810190505b6127108310611e9c576127108381611e9257611e9161365f565b5b0492506004810190505b60648310611ebf5760648381611eb557611eb461365f565b5b0492506002810190505b600a8310611ece576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f4d848484846122e2565b6001811115611f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f88906137e3565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611fd957611fd4816122e8565b612018565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612017576120168582612331565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561205b576120568161249e565b61209a565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461209957612098848261256f565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612111576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121089061384f565b60405180910390fd5b61211a81611b48565b1561215a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612151906138bb565b60405180910390fd5b612168600083836001611b89565b61217181611b48565b156121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a8906138bb565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122bb600083836001611b9b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161233e84610ac5565b61234891906138db565b905060006008600084815260200190815260200160002054905081811461242d576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506124b291906138db565b90506000600a60008481526020019081526020016000205490506000600983815481106124e2576124e16131b2565b5b906000526020600020015490508060098381548110612504576125036131b2565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806125535761255261390f565b5b6001900381819060005260206000200160009055905550505050565b600061257a83610ac5565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546125fa90612d30565b90600052602060002090601f01602090048101928261261c5760008555612663565b82601f1061263557803560ff1916838001178555612663565b82800160010185558215612663579182015b82811115612662578235825591602001919060010190612647565b5b5090506126709190612674565b5090565b5b8082111561268d576000816000905550600101612675565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6126da816126a5565b81146126e557600080fd5b50565b6000813590506126f7816126d1565b92915050565b6000602082840312156127135761271261269b565b5b6000612721848285016126e8565b91505092915050565b60008115159050919050565b61273f8161272a565b82525050565b600060208201905061275a6000830184612736565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561279a57808201518184015260208101905061277f565b838111156127a9576000848401525b50505050565b6000601f19601f8301169050919050565b60006127cb82612760565b6127d5818561276b565b93506127e581856020860161277c565b6127ee816127af565b840191505092915050565b6000602082019050818103600083015261281381846127c0565b905092915050565b6000819050919050565b61282e8161281b565b811461283957600080fd5b50565b60008135905061284b81612825565b92915050565b6000602082840312156128675761286661269b565b5b60006128758482850161283c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128a98261287e565b9050919050565b6128b98161289e565b82525050565b60006020820190506128d460008301846128b0565b92915050565b6128e38161289e565b81146128ee57600080fd5b50565b600081359050612900816128da565b92915050565b6000806040838503121561291d5761291c61269b565b5b600061292b858286016128f1565b925050602061293c8582860161283c565b9150509250929050565b61294f8161281b565b82525050565b600060208201905061296a6000830184612946565b92915050565b6000806000606084860312156129895761298861269b565b5b6000612997868287016128f1565b93505060206129a8868287016128f1565b92505060406129b98682870161283c565b9150509250925092565b6000602082840312156129d9576129d861269b565b5b60006129e7848285016128f1565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a1557612a146129f0565b5b8235905067ffffffffffffffff811115612a3257612a316129f5565b5b602083019150836001820283011115612a4e57612a4d6129fa565b5b9250929050565b60008060208385031215612a6c57612a6b61269b565b5b600083013567ffffffffffffffff811115612a8a57612a896126a0565b5b612a96858286016129ff565b92509250509250929050565b612aab8161272a565b8114612ab657600080fd5b50565b600081359050612ac881612aa2565b92915050565b60008060408385031215612ae557612ae461269b565b5b6000612af3858286016128f1565b9250506020612b0485828601612ab9565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b4b826127af565b810181811067ffffffffffffffff82111715612b6a57612b69612b13565b5b80604052505050565b6000612b7d612691565b9050612b898282612b42565b919050565b600067ffffffffffffffff821115612ba957612ba8612b13565b5b612bb2826127af565b9050602081019050919050565b82818337600083830152505050565b6000612be1612bdc84612b8e565b612b73565b905082815260208101848484011115612bfd57612bfc612b0e565b5b612c08848285612bbf565b509392505050565b600082601f830112612c2557612c246129f0565b5b8135612c35848260208601612bce565b91505092915050565b60008060008060808587031215612c5857612c5761269b565b5b6000612c66878288016128f1565b9450506020612c77878288016128f1565b9350506040612c888782880161283c565b925050606085013567ffffffffffffffff811115612ca957612ca86126a0565b5b612cb587828801612c10565b91505092959194509250565b60008060408385031215612cd857612cd761269b565b5b6000612ce6858286016128f1565b9250506020612cf7858286016128f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d4857607f821691505b60208210811415612d5c57612d5b612d01565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612dbe60218361276b565b9150612dc982612d62565b604082019050919050565b60006020820190508181036000830152612ded81612db1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612e50603d8361276b565b9150612e5b82612df4565b604082019050919050565b60006020820190508181036000830152612e7f81612e43565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612ee2602d8361276b565b9150612eed82612e86565b604082019050919050565b60006020820190508181036000830152612f1181612ed5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612f74602b8361276b565b9150612f7f82612f18565b604082019050919050565b60006020820190508181036000830152612fa381612f67565b9050919050565b7f4164647265737320646f6573206e6f74206861766520746865206d696e74657260008201527f207065726d697373696f6e000000000000000000000000000000000000000000602082015250565b6000613006602b8361276b565b915061301182612faa565b604082019050919050565b6000602082019050818103600083015261303581612ff9565b9050919050565b7f457863656564732074686520746f74616c20737570706c790000000000000000600082015250565b600061307260188361276b565b915061307d8261303c565b602082019050919050565b600060208201905081810360008301526130a181613065565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130e28261281b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613115576131146130a8565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061317c602c8361276b565b915061318782613120565b604082019050919050565b600060208201905081810360008301526131ab8161316f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061321760188361276b565b9150613222826131e1565b602082019050919050565b600060208201905081810360008301526132468161320a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006132a960298361276b565b91506132b48261324d565b604082019050919050565b600060208201905081810360008301526132d88161329c565b9050919050565b600081905092915050565b60006132f582612760565b6132ff81856132df565b935061330f81856020860161277c565b80840191505092915050565b600061332782856132ea565b915061333382846132ea565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061339b60268361276b565b91506133a68261333f565b604082019050919050565b600060208201905081810360008301526133ca8161338e565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061342d60258361276b565b9150613438826133d1565b604082019050919050565b6000602082019050818103600083015261345c81613420565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006134bf60248361276b565b91506134ca82613463565b604082019050919050565b600060208201905081810360008301526134ee816134b2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061352b60208361276b565b9150613536826134f5565b602082019050919050565b6000602082019050818103600083015261355a8161351e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061359760198361276b565b91506135a282613561565b602082019050919050565b600060208201905081810360008301526135c68161358a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061362960328361276b565b9150613634826135cd565b604082019050919050565b600060208201905081810360008301526136588161361c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006136b58261368e565b6136bf8185613699565b93506136cf81856020860161277c565b6136d8816127af565b840191505092915050565b60006080820190506136f860008301876128b0565b61370560208301866128b0565b6137126040830185612946565b818103606083015261372481846136aa565b905095945050505050565b60008151905061373e816126d1565b92915050565b60006020828403121561375a5761375961269b565b5b60006137688482850161372f565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006137cd60358361276b565b91506137d882613771565b604082019050919050565b600060208201905081810360008301526137fc816137c0565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061383960208361276b565b915061384482613803565b602082019050919050565b600060208201905081810360008301526138688161382c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006138a5601c8361276b565b91506138b08261386f565b602082019050919050565b600060208201905081810360008301526138d481613898565b9050919050565b60006138e68261281b565b91506138f18361281b565b925082821015613904576139036130a8565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212200f3aa7a95f21fdbfd8d7564726d2ac5532b9f251b14184334df087af141ba9c464736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000c464f554e4445525320544147000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035441470000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): FOUNDERS TAG
Arg [1] : _symbol (string): TAG
Arg [2] : _supplyLimt (uint256): 500
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 464f554e44455253205441470000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 5441470000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
65524:2647:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67323:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39009:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40521:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40039:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56676:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65631:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41221:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56344:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66422:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41593:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62507:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56866:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38719:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38450:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64630:103;;;:::i;:::-;;63989:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66699:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39178:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40764:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67881:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41815:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39353:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40990:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64888:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65704:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67323:211;67469:4;67492:36;67516:11;67492:23;:36::i;:::-;67485:43;;67323:211;;;:::o;39009:100::-;39063:13;39096:5;39089:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39009:100;:::o;40521:171::-;40597:7;40617:23;40632:7;40617:14;:23::i;:::-;40660:15;:24;40676:7;40660:24;;;;;;;;;;;;;;;;;;;;;40653:31;;40521:171;;;:::o;40039:416::-;40120:13;40136:23;40151:7;40136:14;:23::i;:::-;40120:39;;40184:5;40178:11;;:2;:11;;;;40170:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40278:5;40262:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40287:37;40304:5;40311:12;:10;:12::i;:::-;40287:16;:37::i;:::-;40262:62;40240:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40426:21;40435:2;40439:7;40426:8;:21::i;:::-;40109:346;40039:416;;:::o;56676:113::-;56737:7;56764:10;:17;;;;56757:24;;56676:113;:::o;65631:36::-;;;:::o;41221:301::-;41382:41;41401:12;:10;:12::i;:::-;41415:7;41382:18;:41::i;:::-;41374:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41486:28;41496:4;41502:2;41506:7;41486:9;:28::i;:::-;41221:301;;;:::o;56344:256::-;56441:7;56477:23;56494:5;56477:16;:23::i;:::-;56469:5;:31;56461:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;56566:12;:19;56579:5;56566:19;;;;;;;;;;;;;;;:26;56586:5;56566:26;;;;;;;;;;;;56559:33;;56344:256;;;;:::o;66422:232::-;66482:7;68085;:21;68093:12;:10;:12::i;:::-;68085:21;;;;;;;;;;;;;;;;;;;;;;;;;68077:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66519:11:::1;66505;;:25;66497:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;66566:15;66586:11;;66584:13;;;;;:::i;:::-;;;;;;;66566:31;;66604:23;66614:3;66619:7;66604:9;:23::i;:::-;66641:7;66634:14;;;66422:232:::0;;;:::o;41593:151::-;41697:39;41714:4;41720:2;41724:7;41697:39;;;;;;;;;;;;:16;:39::i;:::-;41593:151;;;:::o;62507:242::-;62625:41;62644:12;:10;:12::i;:::-;62658:7;62625:18;:41::i;:::-;62617:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;62727:14;62733:7;62727:5;:14::i;:::-;62507:242;:::o;56866:233::-;56941:7;56977:30;:28;:30::i;:::-;56969:5;:38;56961:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57074:10;57085:5;57074:17;;;;;;;;:::i;:::-;;;;;;;;;;57067:24;;56866:233;;;:::o;38719:223::-;38791:7;38811:13;38827:17;38836:7;38827:8;:17::i;:::-;38811:33;;38880:1;38863:19;;:5;:19;;;;38855:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;38929:5;38922:12;;;38719:223;;;:::o;38450:207::-;38522:7;38567:1;38550:19;;:5;:19;;;;38542:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38633:9;:16;38643:5;38633:16;;;;;;;;;;;;;;;;38626:23;;38450:207;;;:::o;64630:103::-;63875:13;:11;:13::i;:::-;64695:30:::1;64722:1;64695:18;:30::i;:::-;64630:103::o:0;63989:87::-;64035:7;64062:6;;;;;;;;;;;64055:13;;63989:87;:::o;66699:125::-;63875:13;:11;:13::i;:::-;66806:12:::1;;66790:13;:28;;;;;;;:::i;:::-;;66699:125:::0;;:::o;39178:104::-;39234:13;39267:7;39260:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39178:104;:::o;40764:155::-;40859:52;40878:12;:10;:12::i;:::-;40892:8;40902;40859:18;:52::i;:::-;40764:155;;:::o;67881:161::-;63875:13;:11;:13::i;:::-;67983:8:::1;67963:7;:17;67971:8;67963:17;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68017:8;68003:33;;;68027:8;68003:33;;;;;;:::i;:::-;;;;;;;;67881:161:::0;;:::o;41815:279::-;41946:41;41965:12;:10;:12::i;:::-;41979:7;41946:18;:41::i;:::-;41938:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42048:38;42062:4;42068:2;42072:7;42081:4;42048:13;:38::i;:::-;41815:279;;;;:::o;39353:281::-;39426:13;39452:23;39467:7;39452:14;:23::i;:::-;39488:21;39512:10;:8;:10::i;:::-;39488:34;;39564:1;39546:7;39540:21;:25;:86;;;;;;;;;;;;;;;;;39592:7;39601:18;:7;:16;:18::i;:::-;39575:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39540:86;39533:93;;;39353:281;;;:::o;40990:164::-;41087:4;41111:18;:25;41130:5;41111:25;;;;;;;;;;;;;;;:35;41137:8;41111:35;;;;;;;;;;;;;;;;;;;;;;;;;41104:42;;40990:164;;;;:::o;64888:201::-;63875:13;:11;:13::i;:::-;64997:1:::1;64977:22;;:8;:22;;;;64969:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;65053:28;65072:8;65053:18;:28::i;:::-;64888:201:::0;:::o;65704:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;56036:224::-;56138:4;56177:35;56162:50;;;:11;:50;;;;:90;;;;56216:36;56240:11;56216:23;:36::i;:::-;56162:90;56155:97;;56036:224;;;:::o;50084:135::-;50166:16;50174:7;50166;:16::i;:::-;50158:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50084:135;:::o;18115:98::-;18168:7;18195:10;18188:17;;18115:98;:::o;49397:174::-;49499:2;49472:15;:24;49488:7;49472:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49555:7;49551:2;49517:46;;49526:23;49541:7;49526:14;:23::i;:::-;49517:46;;;;;;;;;;;;49397:174;;:::o;44084:264::-;44177:4;44194:13;44210:23;44225:7;44210:14;:23::i;:::-;44194:39;;44263:5;44252:16;;:7;:16;;;:52;;;;44272:32;44289:5;44296:7;44272:16;:32::i;:::-;44252:52;:87;;;;44332:7;44308:31;;:20;44320:7;44308:11;:20::i;:::-;:31;;;44252:87;44244:96;;;44084:264;;;;:::o;48049:1229::-;48174:4;48147:31;;:23;48162:7;48147:14;:23::i;:::-;:31;;;48139:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48253:1;48239:16;;:2;:16;;;;48231:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48309:42;48330:4;48336:2;48340:7;48349:1;48309:20;:42::i;:::-;48481:4;48454:31;;:23;48469:7;48454:14;:23::i;:::-;:31;;;48446:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48599:15;:24;48615:7;48599:24;;;;;;;;;;;;48592:31;;;;;;;;;;;49094:1;49075:9;:15;49085:4;49075:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;49127:1;49110:9;:13;49120:2;49110:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49169:2;49150:7;:16;49158:7;49150:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49208:7;49204:2;49189:27;;49198:4;49189:27;;;;;;;;;;;;49229:41;49249:4;49255:2;49259:7;49268:1;49229:19;:41::i;:::-;48049:1229;;;:::o;44690:110::-;44766:26;44776:2;44780:7;44766:26;;;;;;;;;;;;:9;:26::i;:::-;44690:110;;:::o;46929:783::-;46989:13;47005:23;47020:7;47005:14;:23::i;:::-;46989:39;;47041:51;47062:5;47077:1;47081:7;47090:1;47041:20;:51::i;:::-;47205:23;47220:7;47205:14;:23::i;:::-;47197:31;;47276:15;:24;47292:7;47276:24;;;;;;;;;;;;47269:31;;;;;;;;;;;47541:1;47521:9;:16;47531:5;47521:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;47571:7;:16;47579:7;47571:16;;;;;;;;;;;;47564:23;;;;;;;;;;;47633:7;47629:1;47605:36;;47614:5;47605:36;;;;;;;;;;;;47654:50;47674:5;47689:1;47693:7;47702:1;47654:19;:50::i;:::-;46978:734;46929:783;:::o;43359:117::-;43425:7;43452;:16;43460:7;43452:16;;;;;;;;;;;;;;;;;;;;;43445:23;;43359:117;;;:::o;64154:132::-;64229:12;:10;:12::i;:::-;64218:23;;:7;:5;:7::i;:::-;:23;;;64210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64154:132::o;65249:191::-;65323:16;65342:6;;;;;;;;;;;65323:25;;65368:8;65359:6;;:17;;;;;;;;;;;;;;;;;;65423:8;65392:40;;65413:8;65392:40;;;;;;;;;;;;65312:128;65249:191;:::o;49714:281::-;49835:8;49826:17;;:5;:17;;;;49818:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49922:8;49884:18;:25;49903:5;49884:25;;;;;;;;;;;;;;;:35;49910:8;49884:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49968:8;49946:41;;49961:5;49946:41;;;49978:8;49946:41;;;;;;:::i;:::-;;;;;;;;49714:281;;;:::o;42975:270::-;43088:28;43098:4;43104:2;43108:7;43088:9;:28::i;:::-;43135:47;43158:4;43164:2;43168:7;43177:4;43135:22;:47::i;:::-;43127:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;42975:270;;;;:::o;66830:108::-;66890:13;66919;66912:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66830:108;:::o;33247:716::-;33303:13;33354:14;33391:1;33371:17;33382:5;33371:10;:17::i;:::-;:21;33354:38;;33407:20;33441:6;33430:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33407:41;;33463:11;33592:6;33588:2;33584:15;33576:6;33572:28;33565:35;;33629:288;33636:4;33629:288;;;33661:5;;;;;;;;33803:8;33798:2;33791:5;33787:14;33782:30;33777:3;33769:44;33859:2;33850:11;;;;;;:::i;:::-;;;;;33893:1;33884:5;:10;33880:21;;;33896:5;;33880:21;33629:288;;;33938:6;33931:13;;;;;33247:716;;;:::o;38081:305::-;38183:4;38235:25;38220:40;;;:11;:40;;;;:105;;;;38292:33;38277:48;;;:11;:48;;;;38220:105;:158;;;;38342:36;38366:11;38342:23;:36::i;:::-;38220:158;38200:178;;38081:305;;;:::o;43789:128::-;43854:4;43907:1;43878:31;;:17;43887:7;43878:8;:17::i;:::-;:31;;;;43871:38;;43789:128;;;:::o;67009:248::-;67190:61;67217:4;67223:2;67227:12;67241:9;67190:26;:61::i;:::-;67009:248;;;;:::o;53206:115::-;;;;;:::o;45027:285::-;45122:18;45128:2;45132:7;45122:5;:18::i;:::-;45173:53;45204:1;45208:2;45212:7;45221:4;45173:22;:53::i;:::-;45151:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45027:285;;;:::o;50783:853::-;50937:4;50958:15;:2;:13;;;:15::i;:::-;50954:675;;;51010:2;50994:36;;;51031:12;:10;:12::i;:::-;51045:4;51051:7;51060:4;50994:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50990:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51252:1;51235:6;:13;:18;51231:328;;;51278:60;;;;;;;;;;:::i;:::-;;;;;;;;51231:328;51509:6;51503:13;51494:6;51490:2;51486:15;51479:38;50990:584;51126:41;;;51116:51;;;:6;:51;;;;51109:58;;;;;50954:675;51613:4;51606:11;;50783:853;;;;;;;:::o;28744:948::-;28797:7;28817:14;28834:1;28817:18;;28884:8;28875:5;:17;28871:106;;28922:8;28913:17;;;;;;:::i;:::-;;;;;28959:2;28949:12;;;;28871:106;29004:8;28995:5;:17;28991:106;;29042:8;29033:17;;;;;;:::i;:::-;;;;;29079:2;29069:12;;;;28991:106;29124:8;29115:5;:17;29111:106;;29162:8;29153:17;;;;;;:::i;:::-;;;;;29199:2;29189:12;;;;29111:106;29244:7;29235:5;:16;29231:103;;29281:7;29272:16;;;;;;:::i;:::-;;;;;29317:1;29307:11;;;;29231:103;29361:7;29352:5;:16;29348:103;;29398:7;29389:16;;;;;;:::i;:::-;;;;;29434:1;29424:11;;;;29348:103;29478:7;29469:5;:16;29465:103;;29515:7;29506:16;;;;;;:::i;:::-;;;;;29551:1;29541:11;;;;29465:103;29595:7;29586:5;:16;29582:68;;29633:1;29623:11;;;;29582:68;29678:6;29671:13;;;28744:948;;;:::o;36512:157::-;36597:4;36636:25;36621:40;;;:11;:40;;;;36614:47;;36512:157;;;:::o;57173:915::-;57350:61;57377:4;57383:2;57387:12;57401:9;57350:26;:61::i;:::-;57440:1;57428:9;:13;57424:222;;;57571:63;;;;;;;;;;:::i;:::-;;;;;;;;57424:222;57658:15;57676:12;57658:30;;57721:1;57705:18;;:4;:18;;;57701:187;;;57740:40;57772:7;57740:31;:40::i;:::-;57701:187;;;57810:2;57802:10;;:4;:10;;;57798:90;;57829:47;57862:4;57868:7;57829:32;:47::i;:::-;57798:90;57701:187;57916:1;57902:16;;:2;:16;;;57898:183;;;57935:45;57972:7;57935:36;:45::i;:::-;57898:183;;;58008:4;58002:10;;:2;:10;;;57998:83;;58029:40;58057:2;58061:7;58029:27;:40::i;:::-;57998:83;57898:183;57339:749;57173:915;;;;:::o;45648:942::-;45742:1;45728:16;;:2;:16;;;;45720:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45801:16;45809:7;45801;:16::i;:::-;45800:17;45792:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45863:48;45892:1;45896:2;45900:7;45909:1;45863:20;:48::i;:::-;46010:16;46018:7;46010;:16::i;:::-;46009:17;46001:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46425:1;46408:9;:13;46418:2;46408:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;46469:2;46450:7;:16;46458:7;46450:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46514:7;46510:2;46489:33;;46506:1;46489:33;;;;;;;;;;;;46535:47;46563:1;46567:2;46571:7;46580:1;46535:19;:47::i;:::-;45648:942;;:::o;9277:326::-;9337:4;9594:1;9572:7;:19;;;:23;9565:30;;9277:326;;;:::o;52368:116::-;;;;;:::o;58811:164::-;58915:10;:17;;;;58888:15;:24;58904:7;58888:24;;;;;;;;;;;:44;;;;58943:10;58959:7;58943:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58811:164;:::o;59602:988::-;59868:22;59918:1;59893:22;59910:4;59893:16;:22::i;:::-;:26;;;;:::i;:::-;59868:51;;59930:18;59951:17;:26;59969:7;59951:26;;;;;;;;;;;;59930:47;;60098:14;60084:10;:28;60080:328;;60129:19;60151:12;:18;60164:4;60151:18;;;;;;;;;;;;;;;:34;60170:14;60151:34;;;;;;;;;;;;60129:56;;60235:11;60202:12;:18;60215:4;60202:18;;;;;;;;;;;;;;;:30;60221:10;60202:30;;;;;;;;;;;:44;;;;60352:10;60319:17;:30;60337:11;60319:30;;;;;;;;;;;:43;;;;60114:294;60080:328;60504:17;:26;60522:7;60504:26;;;;;;;;;;;60497:33;;;60548:12;:18;60561:4;60548:18;;;;;;;;;;;;;;;:34;60567:14;60548:34;;;;;;;;;;;60541:41;;;59683:907;;59602:988;;:::o;60885:1079::-;61138:22;61183:1;61163:10;:17;;;;:21;;;;:::i;:::-;61138:46;;61195:18;61216:15;:24;61232:7;61216:24;;;;;;;;;;;;61195:45;;61567:19;61589:10;61600:14;61589:26;;;;;;;;:::i;:::-;;;;;;;;;;61567:48;;61653:11;61628:10;61639;61628:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;61764:10;61733:15;:28;61749:11;61733:28;;;;;;;;;;;:41;;;;61905:15;:24;61921:7;61905:24;;;;;;;;;;;61898:31;;;61940:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60956:1008;;;60885:1079;:::o;58389:221::-;58474:14;58491:20;58508:2;58491:16;:20::i;:::-;58474:37;;58549:7;58522:12;:16;58535:2;58522:16;;;;;;;;;;;;;;;:24;58539:6;58522:24;;;;;;;;;;;:34;;;;58596:6;58567:17;:26;58585:7;58567:26;;;;;;;;;;;:35;;;;58463:147;58389:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334: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:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:117;6605:1;6602;6595:12;6633:553;6691:8;6701:6;6751:3;6744:4;6736:6;6732:17;6728:27;6718:122;;6759:79;;:::i;:::-;6718:122;6872:6;6859:20;6849:30;;6902:18;6894:6;6891:30;6888:117;;;6924:79;;:::i;:::-;6888:117;7038:4;7030:6;7026:17;7014:29;;7092:3;7084:4;7076:6;7072:17;7062:8;7058:32;7055:41;7052:128;;;7099:79;;:::i;:::-;7052:128;6633:553;;;;;:::o;7192:529::-;7263:6;7271;7320:2;7308:9;7299:7;7295:23;7291:32;7288:119;;;7326:79;;:::i;:::-;7288:119;7474:1;7463:9;7459:17;7446:31;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:65;7696:7;7687:6;7676:9;7672:22;7639:65;:::i;:::-;7621:83;;;;7417:297;7192:529;;;;;:::o;7727:116::-;7797:21;7812:5;7797:21;:::i;:::-;7790:5;7787:32;7777:60;;7833:1;7830;7823:12;7777:60;7727:116;:::o;7849:133::-;7892:5;7930:6;7917:20;7908:29;;7946:30;7970:5;7946:30;:::i;:::-;7849:133;;;;:::o;7988:468::-;8053:6;8061;8110:2;8098:9;8089:7;8085:23;8081:32;8078:119;;;8116:79;;:::i;:::-;8078:119;8236:1;8261:53;8306:7;8297:6;8286:9;8282:22;8261:53;:::i;:::-;8251:63;;8207:117;8363:2;8389:50;8431:7;8422:6;8411:9;8407:22;8389:50;:::i;:::-;8379:60;;8334:115;7988:468;;;;;:::o;8462:117::-;8571:1;8568;8561:12;8585:180;8633:77;8630:1;8623:88;8730:4;8727:1;8720:15;8754:4;8751:1;8744:15;8771:281;8854:27;8876:4;8854:27;:::i;:::-;8846:6;8842:40;8984:6;8972:10;8969:22;8948:18;8936:10;8933:34;8930:62;8927:88;;;8995:18;;:::i;:::-;8927:88;9035:10;9031:2;9024:22;8814:238;8771:281;;:::o;9058:129::-;9092:6;9119:20;;:::i;:::-;9109:30;;9148:33;9176:4;9168:6;9148:33;:::i;:::-;9058:129;;;:::o;9193:307::-;9254:4;9344:18;9336:6;9333:30;9330:56;;;9366:18;;:::i;:::-;9330:56;9404:29;9426:6;9404:29;:::i;:::-;9396:37;;9488:4;9482;9478:15;9470:23;;9193:307;;;:::o;9506:154::-;9590:6;9585:3;9580;9567:30;9652:1;9643:6;9638:3;9634:16;9627:27;9506:154;;;:::o;9666:410::-;9743:5;9768:65;9784:48;9825:6;9784:48;:::i;:::-;9768:65;:::i;:::-;9759:74;;9856:6;9849:5;9842:21;9894:4;9887:5;9883:16;9932:3;9923:6;9918:3;9914:16;9911:25;9908:112;;;9939:79;;:::i;:::-;9908:112;10029:41;10063:6;10058:3;10053;10029:41;:::i;:::-;9749:327;9666:410;;;;;:::o;10095:338::-;10150:5;10199:3;10192:4;10184:6;10180:17;10176:27;10166:122;;10207:79;;:::i;:::-;10166:122;10324:6;10311:20;10349:78;10423:3;10415:6;10408:4;10400:6;10396:17;10349:78;:::i;:::-;10340:87;;10156:277;10095:338;;;;:::o;10439:943::-;10534:6;10542;10550;10558;10607:3;10595:9;10586:7;10582:23;10578:33;10575:120;;;10614:79;;:::i;:::-;10575:120;10734:1;10759:53;10804:7;10795:6;10784:9;10780:22;10759:53;:::i;:::-;10749:63;;10705:117;10861:2;10887:53;10932:7;10923:6;10912:9;10908:22;10887:53;:::i;:::-;10877:63;;10832:118;10989:2;11015:53;11060:7;11051:6;11040:9;11036:22;11015:53;:::i;:::-;11005:63;;10960:118;11145:2;11134:9;11130:18;11117:32;11176:18;11168:6;11165:30;11162:117;;;11198:79;;:::i;:::-;11162:117;11303:62;11357:7;11348:6;11337:9;11333:22;11303:62;:::i;:::-;11293:72;;11088:287;10439:943;;;;;;;:::o;11388:474::-;11456:6;11464;11513:2;11501:9;11492:7;11488:23;11484:32;11481:119;;;11519:79;;:::i;:::-;11481:119;11639:1;11664:53;11709:7;11700:6;11689:9;11685:22;11664:53;:::i;:::-;11654:63;;11610:117;11766:2;11792:53;11837:7;11828:6;11817:9;11813:22;11792:53;:::i;:::-;11782:63;;11737:118;11388:474;;;;;:::o;11868:180::-;11916:77;11913:1;11906:88;12013:4;12010:1;12003:15;12037:4;12034:1;12027:15;12054:320;12098:6;12135:1;12129:4;12125:12;12115:22;;12182:1;12176:4;12172:12;12203:18;12193:81;;12259:4;12251:6;12247:17;12237:27;;12193:81;12321:2;12313:6;12310:14;12290:18;12287:38;12284:84;;;12340:18;;:::i;:::-;12284:84;12105:269;12054:320;;;:::o;12380:220::-;12520:34;12516:1;12508:6;12504:14;12497:58;12589:3;12584:2;12576:6;12572:15;12565:28;12380:220;:::o;12606:366::-;12748:3;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12845:93;12934:3;12845:93;:::i;:::-;12963:2;12958:3;12954:12;12947:19;;12606:366;;;:::o;12978:419::-;13144:4;13182:2;13171:9;13167:18;13159:26;;13231:9;13225:4;13221:20;13217:1;13206:9;13202:17;13195:47;13259:131;13385:4;13259:131;:::i;:::-;13251:139;;12978:419;;;:::o;13403:248::-;13543:34;13539:1;13531:6;13527:14;13520:58;13612:31;13607:2;13599:6;13595:15;13588:56;13403:248;:::o;13657:366::-;13799:3;13820:67;13884:2;13879:3;13820:67;:::i;:::-;13813:74;;13896:93;13985:3;13896:93;:::i;:::-;14014:2;14009:3;14005:12;13998:19;;13657:366;;;:::o;14029:419::-;14195:4;14233:2;14222:9;14218:18;14210:26;;14282:9;14276:4;14272:20;14268:1;14257:9;14253:17;14246:47;14310:131;14436:4;14310:131;:::i;:::-;14302:139;;14029:419;;;:::o;14454:232::-;14594:34;14590:1;14582:6;14578:14;14571:58;14663:15;14658:2;14650:6;14646:15;14639:40;14454:232;:::o;14692:366::-;14834:3;14855:67;14919:2;14914:3;14855:67;:::i;:::-;14848:74;;14931:93;15020:3;14931:93;:::i;:::-;15049:2;15044:3;15040:12;15033:19;;14692:366;;;:::o;15064:419::-;15230:4;15268:2;15257:9;15253:18;15245:26;;15317:9;15311:4;15307:20;15303:1;15292:9;15288:17;15281:47;15345:131;15471:4;15345:131;:::i;:::-;15337:139;;15064:419;;;:::o;15489:230::-;15629:34;15625:1;15617:6;15613:14;15606:58;15698:13;15693:2;15685:6;15681:15;15674:38;15489:230;:::o;15725:366::-;15867:3;15888:67;15952:2;15947:3;15888:67;:::i;:::-;15881:74;;15964:93;16053:3;15964:93;:::i;:::-;16082:2;16077:3;16073:12;16066:19;;15725:366;;;:::o;16097:419::-;16263:4;16301:2;16290:9;16286:18;16278:26;;16350:9;16344:4;16340:20;16336:1;16325:9;16321:17;16314:47;16378:131;16504:4;16378:131;:::i;:::-;16370:139;;16097:419;;;:::o;16522:230::-;16662:34;16658:1;16650:6;16646:14;16639:58;16731:13;16726:2;16718:6;16714:15;16707:38;16522:230;:::o;16758:366::-;16900:3;16921:67;16985:2;16980:3;16921:67;:::i;:::-;16914:74;;16997:93;17086:3;16997:93;:::i;:::-;17115:2;17110:3;17106:12;17099:19;;16758:366;;;:::o;17130:419::-;17296:4;17334:2;17323:9;17319:18;17311:26;;17383:9;17377:4;17373:20;17369:1;17358:9;17354:17;17347:47;17411:131;17537:4;17411:131;:::i;:::-;17403:139;;17130:419;;;:::o;17555:174::-;17695:26;17691:1;17683:6;17679:14;17672:50;17555:174;:::o;17735:366::-;17877:3;17898:67;17962:2;17957:3;17898:67;:::i;:::-;17891:74;;17974:93;18063:3;17974:93;:::i;:::-;18092:2;18087:3;18083:12;18076:19;;17735:366;;;:::o;18107:419::-;18273:4;18311:2;18300:9;18296:18;18288:26;;18360:9;18354:4;18350:20;18346:1;18335:9;18331:17;18324:47;18388:131;18514:4;18388:131;:::i;:::-;18380:139;;18107:419;;;:::o;18532:180::-;18580:77;18577:1;18570:88;18677:4;18674:1;18667:15;18701:4;18698:1;18691:15;18718:233;18757:3;18780:24;18798:5;18780:24;:::i;:::-;18771:33;;18826:66;18819:5;18816:77;18813:103;;;18896:18;;:::i;:::-;18813:103;18943:1;18936:5;18932:13;18925:20;;18718:233;;;:::o;18957:231::-;19097:34;19093:1;19085:6;19081:14;19074:58;19166:14;19161:2;19153:6;19149:15;19142:39;18957:231;:::o;19194:366::-;19336:3;19357:67;19421:2;19416:3;19357:67;:::i;:::-;19350:74;;19433:93;19522:3;19433:93;:::i;:::-;19551:2;19546:3;19542:12;19535:19;;19194:366;;;:::o;19566:419::-;19732:4;19770:2;19759:9;19755:18;19747:26;;19819:9;19813:4;19809:20;19805:1;19794:9;19790:17;19783:47;19847:131;19973:4;19847:131;:::i;:::-;19839:139;;19566:419;;;:::o;19991:180::-;20039:77;20036:1;20029:88;20136:4;20133:1;20126:15;20160:4;20157:1;20150:15;20177:174;20317:26;20313:1;20305:6;20301:14;20294:50;20177:174;:::o;20357:366::-;20499:3;20520:67;20584:2;20579:3;20520:67;:::i;:::-;20513:74;;20596:93;20685:3;20596:93;:::i;:::-;20714:2;20709:3;20705:12;20698:19;;20357:366;;;:::o;20729:419::-;20895:4;20933:2;20922:9;20918:18;20910:26;;20982:9;20976:4;20972:20;20968:1;20957:9;20953:17;20946:47;21010:131;21136:4;21010:131;:::i;:::-;21002:139;;20729:419;;;:::o;21154:228::-;21294:34;21290:1;21282:6;21278:14;21271:58;21363:11;21358:2;21350:6;21346:15;21339:36;21154:228;:::o;21388:366::-;21530:3;21551:67;21615:2;21610:3;21551:67;:::i;:::-;21544:74;;21627:93;21716:3;21627:93;:::i;:::-;21745:2;21740:3;21736:12;21729:19;;21388:366;;;:::o;21760:419::-;21926:4;21964:2;21953:9;21949:18;21941:26;;22013:9;22007:4;22003:20;21999:1;21988:9;21984:17;21977:47;22041:131;22167:4;22041:131;:::i;:::-;22033:139;;21760:419;;;:::o;22185:148::-;22287:11;22324:3;22309:18;;22185:148;;;;:::o;22339:377::-;22445:3;22473:39;22506:5;22473:39;:::i;:::-;22528:89;22610:6;22605:3;22528:89;:::i;:::-;22521:96;;22626:52;22671:6;22666:3;22659:4;22652:5;22648:16;22626:52;:::i;:::-;22703:6;22698:3;22694:16;22687:23;;22449:267;22339:377;;;;:::o;22722:435::-;22902:3;22924:95;23015:3;23006:6;22924:95;:::i;:::-;22917:102;;23036:95;23127:3;23118:6;23036:95;:::i;:::-;23029:102;;23148:3;23141:10;;22722:435;;;;;:::o;23163:225::-;23303:34;23299:1;23291:6;23287:14;23280:58;23372:8;23367:2;23359:6;23355:15;23348:33;23163:225;:::o;23394:366::-;23536:3;23557:67;23621:2;23616:3;23557:67;:::i;:::-;23550:74;;23633:93;23722:3;23633:93;:::i;:::-;23751:2;23746:3;23742:12;23735:19;;23394:366;;;:::o;23766:419::-;23932:4;23970:2;23959:9;23955:18;23947:26;;24019:9;24013:4;24009:20;24005:1;23994:9;23990:17;23983:47;24047:131;24173:4;24047:131;:::i;:::-;24039:139;;23766:419;;;:::o;24191:224::-;24331:34;24327:1;24319:6;24315:14;24308:58;24400:7;24395:2;24387:6;24383:15;24376:32;24191:224;:::o;24421:366::-;24563:3;24584:67;24648:2;24643:3;24584:67;:::i;:::-;24577:74;;24660:93;24749:3;24660:93;:::i;:::-;24778:2;24773:3;24769:12;24762:19;;24421:366;;;:::o;24793:419::-;24959:4;24997:2;24986:9;24982:18;24974:26;;25046:9;25040:4;25036:20;25032:1;25021:9;25017:17;25010:47;25074:131;25200:4;25074:131;:::i;:::-;25066:139;;24793:419;;;:::o;25218:223::-;25358:34;25354:1;25346:6;25342:14;25335:58;25427:6;25422:2;25414:6;25410:15;25403:31;25218:223;:::o;25447:366::-;25589:3;25610:67;25674:2;25669:3;25610:67;:::i;:::-;25603:74;;25686:93;25775:3;25686:93;:::i;:::-;25804:2;25799:3;25795:12;25788:19;;25447:366;;;:::o;25819:419::-;25985:4;26023:2;26012:9;26008:18;26000:26;;26072:9;26066:4;26062:20;26058:1;26047:9;26043:17;26036:47;26100:131;26226:4;26100:131;:::i;:::-;26092:139;;25819:419;;;:::o;26244:182::-;26384:34;26380:1;26372:6;26368:14;26361:58;26244:182;:::o;26432:366::-;26574:3;26595:67;26659:2;26654:3;26595:67;:::i;:::-;26588:74;;26671:93;26760:3;26671:93;:::i;:::-;26789:2;26784:3;26780:12;26773:19;;26432:366;;;:::o;26804:419::-;26970:4;27008:2;26997:9;26993:18;26985:26;;27057:9;27051:4;27047:20;27043:1;27032:9;27028:17;27021:47;27085:131;27211:4;27085:131;:::i;:::-;27077:139;;26804:419;;;:::o;27229:175::-;27369:27;27365:1;27357:6;27353:14;27346:51;27229:175;:::o;27410:366::-;27552:3;27573:67;27637:2;27632:3;27573:67;:::i;:::-;27566:74;;27649:93;27738:3;27649:93;:::i;:::-;27767:2;27762:3;27758:12;27751:19;;27410:366;;;:::o;27782:419::-;27948:4;27986:2;27975:9;27971:18;27963:26;;28035:9;28029:4;28025:20;28021:1;28010:9;28006:17;27999:47;28063:131;28189:4;28063:131;:::i;:::-;28055:139;;27782:419;;;:::o;28207:237::-;28347:34;28343:1;28335:6;28331:14;28324:58;28416:20;28411:2;28403:6;28399:15;28392:45;28207:237;:::o;28450:366::-;28592:3;28613:67;28677:2;28672:3;28613:67;:::i;:::-;28606:74;;28689:93;28778:3;28689:93;:::i;:::-;28807:2;28802:3;28798:12;28791:19;;28450:366;;;:::o;28822:419::-;28988:4;29026:2;29015:9;29011:18;29003:26;;29075:9;29069:4;29065:20;29061:1;29050:9;29046:17;29039:47;29103:131;29229:4;29103:131;:::i;:::-;29095:139;;28822:419;;;:::o;29247:180::-;29295:77;29292:1;29285:88;29392:4;29389:1;29382:15;29416:4;29413:1;29406:15;29433:98;29484:6;29518:5;29512:12;29502:22;;29433:98;;;:::o;29537:168::-;29620:11;29654:6;29649:3;29642:19;29694:4;29689:3;29685:14;29670:29;;29537:168;;;;:::o;29711:360::-;29797:3;29825:38;29857:5;29825:38;:::i;:::-;29879:70;29942:6;29937:3;29879:70;:::i;:::-;29872:77;;29958:52;30003:6;29998:3;29991:4;29984:5;29980:16;29958:52;:::i;:::-;30035:29;30057:6;30035:29;:::i;:::-;30030:3;30026:39;30019:46;;29801:270;29711:360;;;;:::o;30077:640::-;30272:4;30310:3;30299:9;30295:19;30287:27;;30324:71;30392:1;30381:9;30377:17;30368:6;30324:71;:::i;:::-;30405:72;30473:2;30462:9;30458:18;30449:6;30405:72;:::i;:::-;30487;30555:2;30544:9;30540:18;30531:6;30487:72;:::i;:::-;30606:9;30600:4;30596:20;30591:2;30580:9;30576:18;30569:48;30634:76;30705:4;30696:6;30634:76;:::i;:::-;30626:84;;30077:640;;;;;;;:::o;30723:141::-;30779:5;30810:6;30804:13;30795:22;;30826:32;30852:5;30826:32;:::i;:::-;30723:141;;;;:::o;30870:349::-;30939:6;30988:2;30976:9;30967:7;30963:23;30959:32;30956:119;;;30994:79;;:::i;:::-;30956:119;31114:1;31139:63;31194:7;31185:6;31174:9;31170:22;31139:63;:::i;:::-;31129:73;;31085:127;30870:349;;;;:::o;31225:240::-;31365:34;31361:1;31353:6;31349:14;31342:58;31434:23;31429:2;31421:6;31417:15;31410:48;31225:240;:::o;31471:366::-;31613:3;31634:67;31698:2;31693:3;31634:67;:::i;:::-;31627:74;;31710:93;31799:3;31710:93;:::i;:::-;31828:2;31823:3;31819:12;31812:19;;31471:366;;;:::o;31843:419::-;32009:4;32047:2;32036:9;32032:18;32024:26;;32096:9;32090:4;32086:20;32082:1;32071:9;32067:17;32060:47;32124:131;32250:4;32124:131;:::i;:::-;32116:139;;31843:419;;;:::o;32268:182::-;32408:34;32404:1;32396:6;32392:14;32385:58;32268:182;:::o;32456:366::-;32598:3;32619:67;32683:2;32678:3;32619:67;:::i;:::-;32612:74;;32695:93;32784:3;32695:93;:::i;:::-;32813:2;32808:3;32804:12;32797:19;;32456:366;;;:::o;32828:419::-;32994:4;33032:2;33021:9;33017:18;33009:26;;33081:9;33075:4;33071:20;33067:1;33056:9;33052:17;33045:47;33109:131;33235:4;33109:131;:::i;:::-;33101:139;;32828:419;;;:::o;33253:178::-;33393:30;33389:1;33381:6;33377:14;33370:54;33253:178;:::o;33437:366::-;33579:3;33600:67;33664:2;33659:3;33600:67;:::i;:::-;33593:74;;33676:93;33765:3;33676:93;:::i;:::-;33794:2;33789:3;33785:12;33778:19;;33437:366;;;:::o;33809:419::-;33975:4;34013:2;34002:9;33998:18;33990:26;;34062:9;34056:4;34052:20;34048:1;34037:9;34033:17;34026:47;34090:131;34216:4;34090:131;:::i;:::-;34082:139;;33809:419;;;:::o;34234:191::-;34274:4;34294:20;34312:1;34294:20;:::i;:::-;34289:25;;34328:20;34346:1;34328:20;:::i;:::-;34323:25;;34367:1;34364;34361:8;34358:34;;;34372:18;;:::i;:::-;34358:34;34417:1;34414;34410:9;34402:17;;34234:191;;;;:::o;34431:180::-;34479:77;34476:1;34469:88;34576:4;34573:1;34566:15;34600:4;34597:1;34590:15
Swarm Source
ipfs://0f3aa7a95f21fdbfd8d7564726d2ac5532b9f251b14184334df087af141ba9c4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.