Overview
ETH Balance
0.1 ETH
Eth Value
$323.44 (@ $3,234.41/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 304 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Leaderboard Mint | 18654945 | 244 days ago | IN | 0 ETH | 0.00437139 | ||||
Leaderboard Mint | 18619389 | 249 days ago | IN | 0 ETH | 0.00652678 | ||||
Reserved Mint | 18613290 | 250 days ago | IN | 0 ETH | 0.0054768 | ||||
Reserved Mint | 18613289 | 250 days ago | IN | 0 ETH | 0.0055005 | ||||
Reserved Mint | 18611842 | 250 days ago | IN | 0 ETH | 0.0067339 | ||||
Public Mint | 18607728 | 251 days ago | IN | 0.1 ETH | 0.00420909 | ||||
Leaderboard Mint | 18606494 | 251 days ago | IN | 0 ETH | 0.0037769 | ||||
Withdraw Eth Fun... | 18582966 | 254 days ago | IN | 0 ETH | 0.00114588 | ||||
Leaderboard Mint | 18553475 | 258 days ago | IN | 0 ETH | 0.00494869 | ||||
Leaderboard Mint | 18547326 | 259 days ago | IN | 0 ETH | 0.00557175 | ||||
Leaderboard Mint | 18464179 | 271 days ago | IN | 0 ETH | 0.01376601 | ||||
Leaderboard Mint | 18454209 | 272 days ago | IN | 0 ETH | 0.00257403 | ||||
Public Mint | 18452163 | 272 days ago | IN | 0.2 ETH | 0.00289365 | ||||
Leaderboard Mint | 18400455 | 280 days ago | IN | 0 ETH | 0.00442384 | ||||
Leaderboard Mint | 18395355 | 280 days ago | IN | 0 ETH | 0.00228462 | ||||
Public Mint | 18390818 | 281 days ago | IN | 0.1 ETH | 0.00202946 | ||||
Public Mint | 18345034 | 287 days ago | IN | 0.1 ETH | 0.00096119 | ||||
Reserved Mint | 18319369 | 291 days ago | IN | 0 ETH | 0.00143673 | ||||
Reserved Mint | 18319369 | 291 days ago | IN | 0 ETH | 0.00143673 | ||||
Reserved Mint | 18319368 | 291 days ago | IN | 0 ETH | 0.00134901 | ||||
Reserved Mint | 18319367 | 291 days ago | IN | 0 ETH | 0.00135671 | ||||
Reserved Mint | 18319366 | 291 days ago | IN | 0 ETH | 0.00138639 | ||||
Reserved Mint | 18319332 | 291 days ago | IN | 0 ETH | 0.00204155 | ||||
Reserved Mint | 18319331 | 291 days ago | IN | 0 ETH | 0.00203998 | ||||
Reserved Mint | 18319331 | 291 days ago | IN | 0 ETH | 0.00203998 |
Loading...
Loading
Contract Name:
FoundersContract
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-07-26 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } /** * @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; } } /** * @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); } } } /** * @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); } } } /** * @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)); } } /** * @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); } /** * @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; } } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } /** * @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); } } interface IERC721 { function mint(address to, uint256 tokenId) external; } contract FoundersContract is Ownable, ReentrancyGuard, AccessControl { using SafeMath for uint256; using ECDSA for bytes32; IERC721 NFT; bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); uint256 private totalCategories; uint256 private perTransactionCap; uint256 private leaderboardPerWalletCap; // used in leaderboard minting address private leaderboardSignerAddress; address private reservedSignerAddress; address payable private withdrawAddress; bool private isPublicSaleActive; mapping(uint256 => Category) private categories; mapping(bytes => bool) private signatures; mapping(address => uint256) private leaderboardWalletCap; struct Category { uint256 reservedSupplyPoint; // point 1 uint256 leaderboardSupplyPoint; // point 2 uint256 publicSupplyPoint; // point 3 uint256 maxSupplyPoint; // point 4 max point of category supply uint256 totalSupply; uint256 reservedSupply; uint256 reservedMintedSupply; uint256 leaderboardSupply; uint256 leaderboardMintedSupply; uint256 publicSupply; uint256 publicMintedSupply; uint256 categoryPrice; } event LeaderboardMint( address indexed _beneficiary, uint256 indexed _tokenId, uint256 indexed _category ); event ReservedMint( address indexed _beneficiary, uint256 indexed _tokenId, uint256 indexed _category ); event PublicMint( address indexed _beneficiary, uint256 indexed _tokenId, uint256 indexed _category, uint256 _price ); event UpdatePublicCounter( uint256 indexed _publicSupplyPoint, uint256 indexed _category, address indexed _msgSender ); event UpdatePerTransactionCap( uint256 indexed _perTransactionCap, address indexed _msgSender ); event UpdateLeaderboardPerWalletCap( uint256 indexed _leaderboardPerWalletCap, address indexed _msgSender ); event UpdateLeaderboardSignerAddress( address indexed _leaderboardSignerAddress, address indexed _msgSender ); event UpdateReservedSignerAddress( address indexed _reservedSignerAddress, address indexed _msgSender ); event UpdateNFTContractAddress( address indexed _nftContractAddress, address indexed _msgSender ); event UpdateWithdrawAddress( address indexed _withdrawAddress, address indexed _msgSender ); event WithdrawEthFunds( address indexed _withdrawAddress, uint256 indexed _amount ); constructor( Category[] memory _categories, uint256 _totalCategories, uint256 _perTransactionCap, uint256 _leaderboardPerWalletCap, address _nftContractAddress, address _leaderboardSignerAddress, address _reservedSignerAddress, address payable _withdrawAddress ) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(ADMIN_ROLE, _msgSender()); require( _totalCategories == _categories.length, "Founder Contract: Categories length do not match" ); perTransactionCap = _perTransactionCap; leaderboardPerWalletCap = _leaderboardPerWalletCap; totalCategories = _totalCategories; leaderboardSignerAddress = _leaderboardSignerAddress; reservedSignerAddress = _reservedSignerAddress; NFT = IERC721(_nftContractAddress); withdrawAddress = payable(_withdrawAddress); isPublicSaleActive = false; for (uint256 index = 0; index < _categories.length; index++) { _addCategory(_totalCategories, _categories[index]); _totalCategories--; } } function leaderboardMint( uint256 _timestamp, uint256 _category, address _nftContractAddress, bytes32 _msgHash, bytes memory _signature ) public { require( !signatures[_signature], "Founder Contract: Signature already used!" ); require( leaderboardWalletCap[msg.sender].add(1) <= leaderboardPerWalletCap, "Founder Contract: Leaderboard wallet cap reached!" ); require( categories[_category].leaderboardMintedSupply.add(1) <= categories[_category].leaderboardSupply, "Founder Contract: Max supply of leaders in this category minted!" ); bytes32 msgHash = getMessageHash( msg.sender, _timestamp, _category, _nftContractAddress ); bytes32 signedMsgHash = msgHash.toEthSignedMessageHash(); require( signedMsgHash == _msgHash, "Founder Contract: Invalid message hash!" ); require( _msgHash.recover(_signature) == leaderboardSignerAddress, "Founder Contract: Invalid signer!" ); signatures[_signature] = true; categories[_category].leaderboardMintedSupply++; leaderboardWalletCap[msg.sender]++; NFT.mint(msg.sender, categories[_category].leaderboardSupplyPoint); emit LeaderboardMint( msg.sender, categories[_category].leaderboardSupplyPoint, _category ); categories[_category].leaderboardSupplyPoint++; } function reservedMint( uint256 _timestamp, uint256 _category, address _nftContractAddress, bytes32 _msgHash, bytes memory _signature ) public { require( !signatures[_signature], "Founder Contract: Signature already used!" ); require( categories[_category].reservedMintedSupply.add(1) <= categories[_category].reservedSupply, "Founder Contract: Max supply of reserved in this category minted!" ); bytes32 msgHash = getMessageHash( msg.sender, _timestamp, _category, _nftContractAddress ); bytes32 signedMsgHash = msgHash.toEthSignedMessageHash(); require( signedMsgHash == _msgHash, "Founder Contract: Invalid message hash!" ); require( _msgHash.recover(_signature) == reservedSignerAddress, "Founder Contract: Invalid signer!" ); signatures[_signature] = true; categories[_category].reservedMintedSupply++; NFT.mint(msg.sender, categories[_category].reservedSupplyPoint); emit ReservedMint( msg.sender, categories[_category].reservedSupplyPoint, _category ); categories[_category].reservedSupplyPoint++; } function publicMint( uint256 _tokenIdsLength, uint256 _category ) public payable { require( isPublicSaleActive, "Founder Contract: Public sale is not active!" ); require( msg.value == _tokenIdsLength.mul(categories[_category].categoryPrice), "Founder Contract: Invalid Price!" ); require( _tokenIdsLength <= perTransactionCap, "Founder Contract: Cannot mint more than transaction cap!" ); require( categories[_category].publicMintedSupply.add(_tokenIdsLength) <= categories[_category].publicSupply, "Founder Contract: Max supply of public in this category minted!" ); for (uint256 index = 0; index < _tokenIdsLength; index++) { NFT.mint(msg.sender, categories[_category].publicSupplyPoint); emit PublicMint( msg.sender, categories[_category].publicSupplyPoint, _category, msg.value ); categories[_category].publicSupplyPoint++; } categories[_category].publicMintedSupply = categories[_category] .publicMintedSupply .add(_tokenIdsLength); } function _addCategory( uint256 _category, Category memory _categoryValue ) internal { require( _categoryValue.reservedSupplyPoint == categories[_category + 1].maxSupplyPoint.add(1), "Founder Contract: Next cateogry should start from last category ending!" ); require( _categoryValue.maxSupplyPoint == _categoryValue.reservedSupplyPoint.add( _categoryValue.totalSupply.sub(1) ), "Founder Contract: Invalid supply range!" ); require( _categoryValue.totalSupply == _categoryValue.publicSupply.add( _categoryValue.reservedSupply.add( _categoryValue.leaderboardSupply ) ), "Founder Contract: Should be equal to total supply!" ); categories[_category].publicSupplyPoint = _categoryValue.publicSupplyPoint; categories[_category].reservedSupplyPoint = _categoryValue.reservedSupplyPoint; categories[_category].leaderboardSupplyPoint = _categoryValue.leaderboardSupplyPoint; categories[_category].maxSupplyPoint = _categoryValue.maxSupplyPoint; categories[_category].totalSupply = _categoryValue.totalSupply; categories[_category].publicSupply = _categoryValue.publicSupply; categories[_category].reservedSupply = _categoryValue.reservedSupply; categories[_category].leaderboardSupply = _categoryValue.leaderboardSupply; categories[_category].categoryPrice = _categoryValue.categoryPrice; } function toggleIsPublicSaleActive() public { require( hasRole(ADMIN_ROLE, _msgSender()), "Founder Contract: Must have admin role to toggle value!" ); isPublicSaleActive = !isPublicSaleActive; } function updatePublicCounter(uint256[] memory _category) public { require( hasRole(ADMIN_ROLE, _msgSender()), "Founder Contract: Must have admin role!" ); require( _category.length <= totalCategories, "Founder Contract: Cannot be more than total categories!" ); for (uint256 index = 0; index < _category.length; index++) { require( categories[_category[index]].publicSupply == categories[_category[index]].publicMintedSupply, "Founder Contract: Public supply of this category not minted completely!" ); require( categories[_category[index]].leaderboardSupply.sub( categories[_category[index]].leaderboardMintedSupply ) != 0, "Founder Contract: Leaderboard supply already minted for this category!" ); // public counter == leaderboard counter categories[_category[index]].publicSupplyPoint = categories[ _category[index] ].leaderboardSupplyPoint; // public supply += leaderboard supply - leaderboard minted supply categories[_category[index]].publicSupply = categories[_category[index]].publicSupply.add( categories[_category[index]].leaderboardSupply.sub( categories[_category[index]].leaderboardMintedSupply ) ); // leaderboard supply = leaderboard minted supply categories[_category[index]].leaderboardSupply = categories[ _category[index] ].leaderboardMintedSupply; emit UpdatePublicCounter( categories[_category[index]].publicSupplyPoint, _category[index], msg.sender ); } } function updatePerTransactionCap(uint256 _perTransactionCap) public { require( hasRole(ADMIN_ROLE, _msgSender()), "Founder Contract: Must have admin role to update!" ); require( _perTransactionCap != 0, "Founder Contract: Invalid amount for transaction cap!" ); require( _perTransactionCap != perTransactionCap, "Founder Contract: Invalid amount for transaction cap!" ); perTransactionCap = _perTransactionCap; emit UpdatePerTransactionCap(_perTransactionCap, msg.sender); } function updateLeaderboardPerWalletCap( uint256 _leaderboardPerWalletCap ) public { require( hasRole(ADMIN_ROLE, _msgSender()), "Founder Contract: Must have admin role to update!" ); require( _leaderboardPerWalletCap != 0, "Founder Contract: Invalid amount for wallet cap!" ); require( _leaderboardPerWalletCap != leaderboardPerWalletCap, "Founder Contract: Invalid amount for wallet cap!" ); leaderboardPerWalletCap = _leaderboardPerWalletCap; emit UpdateLeaderboardPerWalletCap( _leaderboardPerWalletCap, msg.sender ); } function updateLeaderboardSignerAddress( address _leaderboardSignerAddress ) public { require( hasRole(ADMIN_ROLE, _msgSender()), "Founder Contract: Must have admin role to update!" ); require( _leaderboardSignerAddress != address(0), "Founder Contract: Invalid Address!" ); require( _leaderboardSignerAddress != leaderboardSignerAddress, "Founder Contract: Invalid Address!" ); leaderboardSignerAddress = _leaderboardSignerAddress; emit UpdateLeaderboardSignerAddress( _leaderboardSignerAddress, msg.sender ); } function updateReservedSignerAddress( address _reservedSignerAddress ) public { require( hasRole(ADMIN_ROLE, _msgSender()), "Founder Contract: Must have admin role to update!" ); require( _reservedSignerAddress != address(0), "Founder Contract: Invalid Address!" ); require( _reservedSignerAddress != reservedSignerAddress, "Founder Contract: Invalid Address!" ); reservedSignerAddress = _reservedSignerAddress; emit UpdateReservedSignerAddress(_reservedSignerAddress, msg.sender); } function updateNFTContractAddress(address _nftContractAddress) public { require( hasRole(ADMIN_ROLE, _msgSender()), "Founder Contract: Must have admin role to update!" ); require( _nftContractAddress != address(0), "Founder Contract: Invalid Address!" ); NFT = IERC721(_nftContractAddress); emit UpdateNFTContractAddress(_nftContractAddress, msg.sender); } function updateWithdrawAddress( address payable _withdrawAddress ) public onlyOwner { require( _withdrawAddress != address(0), "Founder Contract: Invalid address!" ); require( _withdrawAddress != withdrawAddress, "Founder Contract: Invalid address!" ); withdrawAddress = _withdrawAddress; emit UpdateWithdrawAddress(_withdrawAddress, msg.sender); } function withdrawEthFunds(uint256 _amount) public onlyOwner nonReentrant { require( _amount > 0 && _amount <= address(this).balance, "Founder Contract: Invalid amount!" ); withdrawAddress.transfer(_amount); emit WithdrawEthFunds(withdrawAddress, _amount); } function getMessageHash( address _to, uint256 _timestamp, uint256 _category, address _nftContractAddress ) public pure returns (bytes32) { return keccak256( abi.encodePacked( _to, _timestamp, _category, _nftContractAddress ) ); } function getCategoryDetail( uint256 _category ) public view returns ( uint256 _reservedSupplyPoint, uint256 _leaderboardSupplyPoint, uint256 _publicSupplyPoint, uint256 _maxSupplyPoint, uint256 _totalSupply, uint256 _reservedSupply, uint256 _reservedMintedSupply, uint256 _leaderboardSupply, uint256 _leaderboardMintedSupply, uint256 _publicSupply, uint256 _publicMintedSupply, uint256 _categoryPrice ) { _reservedSupplyPoint = categories[_category].reservedSupplyPoint; _leaderboardSupplyPoint = categories[_category].leaderboardSupplyPoint; _publicSupplyPoint = categories[_category].publicSupplyPoint; _maxSupplyPoint = categories[_category].maxSupplyPoint; _totalSupply = categories[_category].totalSupply; _reservedSupply = categories[_category].reservedSupply; _reservedMintedSupply = categories[_category].reservedMintedSupply; _leaderboardSupply = categories[_category].leaderboardSupply; _leaderboardMintedSupply = categories[_category].leaderboardMintedSupply; _publicSupply = categories[_category].publicSupply; _publicMintedSupply = categories[_category].publicMintedSupply; _categoryPrice = categories[_category].categoryPrice; } function getSignatureInfo( bytes memory _signature ) public view returns (bool) { return signatures[_signature]; } function getLeaderboardWalletCapOfAddress( address _address ) public view returns (uint256) { return leaderboardWalletCap[_address]; } function getIsPublicSaleActive() public view returns (bool) { return isPublicSaleActive; } function getPerTransactionCap() public view returns (uint256) { return perTransactionCap; } function getLeaderboardPerWalletCap() public view returns (uint256) { return leaderboardPerWalletCap; } function getTotalCategories() public view returns (uint256) { return totalCategories; } function getTotalSupply() public view returns (uint256 _totalSupply) { for (uint256 index = 0; index < totalCategories; index++) { _totalSupply = _totalSupply.add(categories[index + 1].totalSupply); } } function getTotalMintedSupplyOfCategory( uint256 _category ) public view returns (uint256) { return categories[_category].publicMintedSupply.add( categories[_category].reservedMintedSupply.add( categories[_category].leaderboardMintedSupply ) ); } function getTotalMintedSupply() public view returns (uint256 _totalMintedSupply) { for (uint256 index = 0; index < totalCategories; index++) { _totalMintedSupply = _totalMintedSupply.add( categories[index + 1].publicMintedSupply.add( categories[index + 1].reservedMintedSupply.add( categories[index + 1].leaderboardMintedSupply ) ) ); } } function getTotalPublicSupply() public view returns (uint256 _totalPublicSupply) { for (uint256 index = 0; index < totalCategories; index++) { _totalPublicSupply = _totalPublicSupply.add( categories[index + 1].publicSupply ); } } function getTotalPublicMintedSupply() public view returns (uint256 _totalPublicMintedSupply) { for (uint256 index = 0; index < totalCategories; index++) { _totalPublicMintedSupply = _totalPublicMintedSupply.add( categories[index + 1].publicMintedSupply ); } } function getTotalReservedSupply() public view returns (uint256 _totalReservedSupply) { for (uint256 index = 0; index < totalCategories; index++) { _totalReservedSupply = _totalReservedSupply.add( categories[index + 1].reservedSupply ); } } function getTotalReservedMintedSupply() public view returns (uint256 _totalReservedMintedSupply) { for (uint256 index = 0; index < totalCategories; index++) { _totalReservedMintedSupply = _totalReservedMintedSupply.add( categories[index + 1].reservedMintedSupply ); } } function getTotalLeaderboardSupply() public view returns (uint256 _totalLeaderboardSupply) { for (uint256 index = 0; index < totalCategories; index++) { _totalLeaderboardSupply = _totalLeaderboardSupply.add( categories[index + 1].leaderboardSupply ); } } function getTotalLeaderboardMintedSupply() public view returns (uint256 _totalLeaderboardMintedSupply) { for (uint256 index = 0; index < totalCategories; index++) { _totalLeaderboardMintedSupply = _totalLeaderboardMintedSupply.add( categories[index + 1].leaderboardMintedSupply ); } } function getLeaderboardSignerAddress() public view returns (address) { return leaderboardSignerAddress; } function getReservedSignerAddress() public view returns (address) { return reservedSignerAddress; } function getNFTContractAddress() public view returns (IERC721) { return NFT; } function getWithdrawAddress() public view returns (address) { return withdrawAddress; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"components":[{"internalType":"uint256","name":"reservedSupplyPoint","type":"uint256"},{"internalType":"uint256","name":"leaderboardSupplyPoint","type":"uint256"},{"internalType":"uint256","name":"publicSupplyPoint","type":"uint256"},{"internalType":"uint256","name":"maxSupplyPoint","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"reservedSupply","type":"uint256"},{"internalType":"uint256","name":"reservedMintedSupply","type":"uint256"},{"internalType":"uint256","name":"leaderboardSupply","type":"uint256"},{"internalType":"uint256","name":"leaderboardMintedSupply","type":"uint256"},{"internalType":"uint256","name":"publicSupply","type":"uint256"},{"internalType":"uint256","name":"publicMintedSupply","type":"uint256"},{"internalType":"uint256","name":"categoryPrice","type":"uint256"}],"internalType":"struct FoundersContract.Category[]","name":"_categories","type":"tuple[]"},{"internalType":"uint256","name":"_totalCategories","type":"uint256"},{"internalType":"uint256","name":"_perTransactionCap","type":"uint256"},{"internalType":"uint256","name":"_leaderboardPerWalletCap","type":"uint256"},{"internalType":"address","name":"_nftContractAddress","type":"address"},{"internalType":"address","name":"_leaderboardSignerAddress","type":"address"},{"internalType":"address","name":"_reservedSignerAddress","type":"address"},{"internalType":"address payable","name":"_withdrawAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_category","type":"uint256"}],"name":"LeaderboardMint","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":"_beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_category","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"PublicMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_category","type":"uint256"}],"name":"ReservedMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_leaderboardPerWalletCap","type":"uint256"},{"indexed":true,"internalType":"address","name":"_msgSender","type":"address"}],"name":"UpdateLeaderboardPerWalletCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_leaderboardSignerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"_msgSender","type":"address"}],"name":"UpdateLeaderboardSignerAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_nftContractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"_msgSender","type":"address"}],"name":"UpdateNFTContractAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_perTransactionCap","type":"uint256"},{"indexed":true,"internalType":"address","name":"_msgSender","type":"address"}],"name":"UpdatePerTransactionCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_publicSupplyPoint","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_category","type":"uint256"},{"indexed":true,"internalType":"address","name":"_msgSender","type":"address"}],"name":"UpdatePublicCounter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_reservedSignerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"_msgSender","type":"address"}],"name":"UpdateReservedSignerAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_withdrawAddress","type":"address"},{"indexed":true,"internalType":"address","name":"_msgSender","type":"address"}],"name":"UpdateWithdrawAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_withdrawAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WithdrawEthFunds","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_category","type":"uint256"}],"name":"getCategoryDetail","outputs":[{"internalType":"uint256","name":"_reservedSupplyPoint","type":"uint256"},{"internalType":"uint256","name":"_leaderboardSupplyPoint","type":"uint256"},{"internalType":"uint256","name":"_publicSupplyPoint","type":"uint256"},{"internalType":"uint256","name":"_maxSupplyPoint","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_reservedSupply","type":"uint256"},{"internalType":"uint256","name":"_reservedMintedSupply","type":"uint256"},{"internalType":"uint256","name":"_leaderboardSupply","type":"uint256"},{"internalType":"uint256","name":"_leaderboardMintedSupply","type":"uint256"},{"internalType":"uint256","name":"_publicSupply","type":"uint256"},{"internalType":"uint256","name":"_publicMintedSupply","type":"uint256"},{"internalType":"uint256","name":"_categoryPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeaderboardPerWalletCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeaderboardSignerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getLeaderboardWalletCapOfAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_category","type":"uint256"},{"internalType":"address","name":"_nftContractAddress","type":"address"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getNFTContractAddress","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPerTransactionCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReservedSignerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"getSignatureInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCategories","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLeaderboardMintedSupply","outputs":[{"internalType":"uint256","name":"_totalLeaderboardMintedSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLeaderboardSupply","outputs":[{"internalType":"uint256","name":"_totalLeaderboardSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalMintedSupply","outputs":[{"internalType":"uint256","name":"_totalMintedSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_category","type":"uint256"}],"name":"getTotalMintedSupplyOfCategory","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalPublicMintedSupply","outputs":[{"internalType":"uint256","name":"_totalPublicMintedSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalPublicSupply","outputs":[{"internalType":"uint256","name":"_totalPublicSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalReservedMintedSupply","outputs":[{"internalType":"uint256","name":"_totalReservedMintedSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalReservedSupply","outputs":[{"internalType":"uint256","name":"_totalReservedSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"_totalSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_category","type":"uint256"},{"internalType":"address","name":"_nftContractAddress","type":"address"},{"internalType":"bytes32","name":"_msgHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"leaderboardMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenIdsLength","type":"uint256"},{"internalType":"uint256","name":"_category","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_category","type":"uint256"},{"internalType":"address","name":"_nftContractAddress","type":"address"},{"internalType":"bytes32","name":"_msgHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_leaderboardPerWalletCap","type":"uint256"}],"name":"updateLeaderboardPerWalletCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_leaderboardSignerAddress","type":"address"}],"name":"updateLeaderboardSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContractAddress","type":"address"}],"name":"updateNFTContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_perTransactionCap","type":"uint256"}],"name":"updatePerTransactionCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_category","type":"uint256[]"}],"name":"updatePublicCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reservedSignerAddress","type":"address"}],"name":"updateReservedSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_withdrawAddress","type":"address"}],"name":"updateWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEthFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620066af380380620066af833981810160405281019062000037919062000b81565b620000576200004b620002ae60201b60201c565b620002b660201b60201c565b60018081905550620000826000801b62000076620002ae60201b60201c565b6200037a60201b60201c565b620000c37fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775620000b7620002ae60201b60201c565b6200037a60201b60201c565b8751871462000109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001009062000cf0565b60405180910390fd5b85600581905550846006819055508660048190555082600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600960146101000a81548160ff02191690831515021790555060005b88518110156200029f5762000279888a838151811062000265576200026462000d12565b5b60200260200101516200039060201b60201c565b8780620002869062000d70565b9850508080620002969062000d9e565b91505062000240565b5050505050505050506200104f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200038c82826200064060201b60201c565b5050565b620003cf6001600a6000600186620003a9919062000deb565b8152602001908152602001600020600301546200073260201b62002ea81790919060201c565b81600001511462000417576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200040e9062000ec2565b60405180910390fd5b620004536200043a600183608001516200074a60201b62002ebe1790919060201c565b82600001516200073260201b62002ea81790919060201c565b8160600151146200049b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004929062000f5a565b60405180910390fd5b620004db620004c18260e001518360a001516200073260201b62002ea81790919060201c565b8261012001516200073260201b62002ea81790919060201c565b81608001511462000523576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200051a9062000ff2565b60405180910390fd5b8060400151600a6000848152602001908152602001600020600201819055508060000151600a6000848152602001908152602001600020600001819055508060200151600a6000848152602001908152602001600020600101819055508060600151600a6000848152602001908152602001600020600301819055508060800151600a600084815260200190815260200160002060040181905550806101200151600a6000848152602001908152602001600020600901819055508060a00151600a6000848152602001908152602001600020600501819055508060e00151600a600084815260200190815260200160002060070181905550806101600151600a6000848152602001908152602001600020600b01819055505050565b6200065282826200076260201b60201c565b6200072e5760016002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620006d3620002ae60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000818362000742919062000deb565b905092915050565b600081836200075a919062001014565b905092915050565b60006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200083182620007e6565b810181811067ffffffffffffffff82111715620008535762000852620007f7565b5b80604052505050565b600062000868620007cd565b905062000876828262000826565b919050565b600067ffffffffffffffff821115620008995762000898620007f7565b5b602082029050602081019050919050565b600080fd5b600080fd5b6000819050919050565b620008c981620008b4565b8114620008d557600080fd5b50565b600081519050620008e981620008be565b92915050565b60006101808284031215620009095762000908620008af565b5b620009166101806200085c565b905060006200092884828501620008d8565b60008301525060206200093e84828501620008d8565b60208301525060406200095484828501620008d8565b60408301525060606200096a84828501620008d8565b60608301525060806200098084828501620008d8565b60808301525060a06200099684828501620008d8565b60a08301525060c0620009ac84828501620008d8565b60c08301525060e0620009c284828501620008d8565b60e083015250610100620009d984828501620008d8565b61010083015250610120620009f184828501620008d8565b6101208301525061014062000a0984828501620008d8565b6101408301525061016062000a2184828501620008d8565b6101608301525092915050565b600062000a4562000a3f846200087b565b6200085c565b905080838252602082019050610180840283018581111562000a6c5762000a6b620008aa565b5b835b8181101562000a9a578062000a848882620008ef565b8452602084019350506101808101905062000a6e565b5050509392505050565b600082601f83011262000abc5762000abb620007e1565b5b815162000ace84826020860162000a2e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b048262000ad7565b9050919050565b62000b168162000af7565b811462000b2257600080fd5b50565b60008151905062000b368162000b0b565b92915050565b600062000b498262000ad7565b9050919050565b62000b5b8162000b3c565b811462000b6757600080fd5b50565b60008151905062000b7b8162000b50565b92915050565b600080600080600080600080610100898b03121562000ba55762000ba4620007d7565b5b600089015167ffffffffffffffff81111562000bc65762000bc5620007dc565b5b62000bd48b828c0162000aa4565b985050602062000be78b828c01620008d8565b975050604062000bfa8b828c01620008d8565b965050606062000c0d8b828c01620008d8565b955050608062000c208b828c0162000b25565b94505060a062000c338b828c0162000b25565b93505060c062000c468b828c0162000b25565b92505060e062000c598b828c0162000b6a565b9150509295985092959890939650565b600082825260208201905092915050565b7f466f756e64657220436f6e74726163743a2043617465676f72696573206c656e60008201527f67746820646f206e6f74206d6174636800000000000000000000000000000000602082015250565b600062000cd860308362000c69565b915062000ce58262000c7a565b604082019050919050565b6000602082019050818103600083015262000d0b8162000cc9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d7d82620008b4565b91506000820362000d935762000d9262000d41565b5b600182039050919050565b600062000dab82620008b4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000de05762000ddf62000d41565b5b600182019050919050565b600062000df882620008b4565b915062000e0583620008b4565b925082820190508082111562000e205762000e1f62000d41565b5b92915050565b7f466f756e64657220436f6e74726163743a204e65787420636174656f6772792060008201527f73686f756c642073746172742066726f6d206c6173742063617465676f72792060208201527f656e64696e672100000000000000000000000000000000000000000000000000604082015250565b600062000eaa60478362000c69565b915062000eb78262000e26565b606082019050919050565b6000602082019050818103600083015262000edd8162000e9b565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c696420737570706c7960008201527f2072616e67652100000000000000000000000000000000000000000000000000602082015250565b600062000f4260278362000c69565b915062000f4f8262000ee4565b604082019050919050565b6000602082019050818103600083015262000f758162000f33565b9050919050565b7f466f756e64657220436f6e74726163743a2053686f756c64206265206571756160008201527f6c20746f20746f74616c20737570706c79210000000000000000000000000000602082015250565b600062000fda60328362000c69565b915062000fe78262000f7c565b604082019050919050565b600060208201905081810360008301526200100d8162000fcb565b9050919050565b60006200102182620008b4565b91506200102e83620008b4565b925082820390508181111562001049576200104862000d41565b5b92915050565b615650806200105f6000396000f3fe6080604052600436106102675760003560e01c80638da5cb5b11610144578063cae13a91116100b6578063d7d92d0a1161007a578063d7d92d0a146108fb578063d884424114610926578063db435f7614610951578063e8e7f8001461097c578063f21b874c146109a7578063f2fde38b146109ef57610267565b8063cae13a911461083c578063cbbc0db114610867578063d27a787914610892578063d3241089146108bb578063d547741f146108d257610267565b8063a823739611610108578063a82373961461072c578063af8c949314610755578063b6d3f48e1461077e578063bfa4bf9a146107a9578063c4e41b22146107e6578063c7f0ed5e1461081157610267565b80638da5cb5b1461065457806391d148541461067f57806398ae99a8146106bc578063a217fddf146106d8578063a3f4b5731461070357610267565b8063410ad60a116101dd5780636b54576a116101a15780636b54576a146105565780636c03beba146105815780636e4c5406146105be578063715018a6146105e757806375b238fc146105fe5780638bc9a4c61461062957610267565b8063410ad60a146104715780634290a4d71461049a57806355464d59146104c55780635beb1dc5146105025780635edaff651461052b57610267565b806322375dc61161022f57806322375dc61461034f578063248a9ca31461038c578063280a0b67146103c95780632f2ff15d146103f457806336568abe1461041d57806338b3b5b51461044657610267565b806301ffc9a71461026c578063039114b5146102a95780631128704c146102d257806314d9f301146102fb5780631c908fa414610326575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061391d565b610a18565b6040516102a09190613965565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb91906139de565b610a92565b005b3480156102de57600080fd5b506102f960048036038101906102f49190613b9a565b610c0f565b005b34801561030757600080fd5b50610310611080565b60405161031d9190613bf2565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613c0d565b6110e0565b005b34801561035b57600080fd5b5061037660048036038101906103719190613cef565b611219565b6040516103839190613965565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190613d6e565b61124e565b6040516103c09190613daa565b60405180910390f35b3480156103d557600080fd5b506103de61126e565b6040516103eb9190613dd4565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613def565b611298565b005b34801561042957600080fd5b50610444600480360381019061043f9190613def565b6112b9565b005b34801561045257600080fd5b5061045b61133c565b6040516104689190613e8e565b60405180910390f35b34801561047d57600080fd5b50610498600480360381019061049391906139de565b611366565b005b3480156104a657600080fd5b506104af611573565b6040516104bc9190613dd4565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613c0d565b61159d565b6040516104f99190613bf2565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190613c0d565b61160d565b005b34801561053757600080fd5b50610540611752565b60405161054d9190613bf2565b60405180910390f35b34801561056257600080fd5b5061056b61181a565b6040516105789190613bf2565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a391906139de565b61187a565b6040516105b59190613bf2565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e091906139de565b6118c3565b005b3480156105f357600080fd5b506105fc611ad0565b005b34801561060a57600080fd5b50610613611ae4565b6040516106209190613daa565b60405180910390f35b34801561063557600080fd5b5061063e611b08565b60405161064b9190613965565b60405180910390f35b34801561066057600080fd5b50610669611b1f565b6040516106769190613dd4565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a19190613def565b611b48565b6040516106b39190613965565b60405180910390f35b6106d660048036038101906106d19190613ea9565b611bb3565b005b3480156106e457600080fd5b506106ed611ecf565b6040516106fa9190613daa565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190613f27565b611ed6565b005b34801561073857600080fd5b50610753600480360381019061074e9190613c0d565b61207b565b005b34801561076157600080fd5b5061077c60048036038101906107779190613f54565b6121c0565b005b34801561078a57600080fd5b50610793612633565b6040516107a09190613bf2565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613feb565b61263d565b6040516107dd9190613daa565b60405180910390f35b3480156107f257600080fd5b506107fb612676565b6040516108089190613bf2565b60405180910390f35b34801561081d57600080fd5b506108266126d6565b6040516108339190613bf2565b60405180910390f35b34801561084857600080fd5b506108516126e0565b60405161085e9190613bf2565b60405180910390f35b34801561087357600080fd5b5061087c612740565b6040516108899190613bf2565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613f54565b6127a0565b005b3480156108c757600080fd5b506108d0612b27565b005b3480156108de57600080fd5b506108f960048036038101906108f49190613def565b612bc3565b005b34801561090757600080fd5b50610910612be4565b60405161091d9190613bf2565b60405180910390f35b34801561093257600080fd5b5061093b612c44565b6040516109489190613bf2565b60405180910390f35b34801561095d57600080fd5b50610966612c4e565b6040516109739190613bf2565b60405180910390f35b34801561098857600080fd5b50610991612cae565b60405161099e9190613dd4565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c99190613c0d565b612cd8565b6040516109e69c9b9a99989796959493929190614052565b60405180910390f35b3480156109fb57600080fd5b50610a166004803603810190610a1191906139de565b612e25565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8b5750610a8a82612ed4565b5b9050919050565b610ac37fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610abe612f3e565b611b48565b610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af99061418f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6890614221565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2e776359ab2269e85ef67545ef925594f19512e3499f91f1accc50e7027a46ae60405160405180910390a350565b610c407fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610c3b612f3e565b611b48565b610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906142b3565b60405180910390fd5b60045481511115610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90614345565b60405180910390fd5b60005b815181101561107c57600a6000838381518110610ce857610ce7614365565b5b60200260200101518152602001908152602001600020600a0154600a6000848481518110610d1957610d18614365565b5b602002602001015181526020019081526020016000206009015414610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a9061442c565b60405180910390fd5b6000610de8600a6000858581518110610d8f57610d8e614365565b5b6020026020010151815260200190815260200160002060080154600a6000868681518110610dc057610dbf614365565b5b6020026020010151815260200190815260200160002060070154612ebe90919063ffffffff16565b03610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906144e4565b60405180910390fd5b600a6000838381518110610e3f57610e3e614365565b5b6020026020010151815260200190815260200160002060010154600a6000848481518110610e7057610e6f614365565b5b6020026020010151815260200190815260200160002060020181905550610f42610f03600a6000858581518110610eaa57610ea9614365565b5b6020026020010151815260200190815260200160002060080154600a6000868681518110610edb57610eda614365565b5b6020026020010151815260200190815260200160002060070154612ebe90919063ffffffff16565b600a6000858581518110610f1a57610f19614365565b5b6020026020010151815260200190815260200160002060090154612ea890919063ffffffff16565b600a6000848481518110610f5957610f58614365565b5b6020026020010151815260200190815260200160002060090181905550600a6000838381518110610f8d57610f8c614365565b5b6020026020010151815260200190815260200160002060080154600a6000848481518110610fbe57610fbd614365565b5b60200260200101518152602001908152602001600020600701819055503373ffffffffffffffffffffffffffffffffffffffff1682828151811061100557611004614365565b5b6020026020010151600a600085858151811061102457611023614365565b5b60200260200101518152602001908152602001600020600201547e3b29410523bf788723f2693aae61c7f653f6a3fc058c7ed802dcf04728955f60405160405180910390a4808061107490614533565b915050610cc8565b5050565b600080600090505b6004548110156110dc576110c7600a60006001846110a6919061457b565b81526020019081526020016000206005015483612ea890919063ffffffff16565b915080806110d490614533565b915050611088565b5090565b6110e8612f46565b6110f0612fc4565b6000811180156111005750478111155b61113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690614621565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111a7573d6000803e3d6000fd5b5080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f43c9b9ec1d0207f015c69980d7999b1508c50eace27b42848c7f056367af802460405160405180910390a3611216613013565b50565b6000600b8260405161122b91906146b2565b908152602001604051809103902060009054906101000a900460ff169050919050565b600060026000838152602001908152602001600020600101549050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112a18261124e565b6112aa8161301c565b6112b48383613030565b505050565b6112c1612f3e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461132e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113259061473b565b60405180910390fd5b6113388282613111565b5050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113977fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611392612f3e565b611b48565b6113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd9061418f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90614221565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cc90614221565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f94e28c1a09607c5b81ff2dcef2e954ebafae7f4f450022fc2cc63ee94ee537cb60405160405180910390a350565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006116066115e1600a600085815260200190815260200160002060080154600a600086815260200190815260200160002060060154612ea890919063ffffffff16565b600a6000858152602001908152602001600020600a0154612ea890919063ffffffff16565b9050919050565b61163e7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611639612f3e565b611b48565b61167d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116749061418f565b60405180910390fd5b600081036116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b7906147cd565b60405180910390fd5b6005548103611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb906147cd565b60405180910390fd5b806005819055503373ffffffffffffffffffffffffffffffffffffffff16817f708bebf42dff2d4b471f4de86be65fcbc85e1aac2845c7250dd57f444f27f2c760405160405180910390a350565b600080600090505b600454811015611816576118016117f26117c1600a600060018661177e919061457b565b815260200190815260200160002060080154600a60006001876117a1919061457b565b815260200190815260200160002060060154612ea890919063ffffffff16565b600a60006001866117d2919061457b565b8152602001908152602001600020600a0154612ea890919063ffffffff16565b83612ea890919063ffffffff16565b9150808061180e90614533565b91505061175a565b5090565b600080600090505b60045481101561187657611861600a6000600184611840919061457b565b81526020019081526020016000206006015483612ea890919063ffffffff16565b9150808061186e90614533565b915050611822565b5090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118f47fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756118ef612f3e565b611b48565b611933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192a9061418f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990614221565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990614221565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f75c68543495d8a19d8c1df1fc9455745fd57a018b92cf94710b293831ac61a8a60405160405180910390a350565b611ad8612f46565b611ae260006131f3565b565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6000600960149054906101000a900460ff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600960149054906101000a900460ff16611c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf99061485f565b60405180910390fd5b611c2b600a6000838152602001908152602001600020600b0154836132b790919063ffffffff16565b3414611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c63906148cb565b60405180910390fd5b600554821115611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca89061495d565b60405180910390fd5b600a600082815260200190815260200160002060090154611cf183600a6000858152602001908152602001600020600a0154612ea890919063ffffffff16565b1115611d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d29906149ef565b60405180910390fd5b60005b82811015611e8757600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933600a6000868152602001908152602001600020600201546040518363ffffffff1660e01b8152600401611db0929190614a0f565b600060405180830381600087803b158015611dca57600080fd5b505af1158015611dde573d6000803e3d6000fd5b5050505081600a6000848152602001908152602001600020600201543373ffffffffffffffffffffffffffffffffffffffff167f8ddc186473c7d1fecde9341fa025d12932d93518eddfa154543b7fb5c69aaf4d34604051611e409190613bf2565b60405180910390a4600a60008381526020019081526020016000206002016000815480929190611e6f90614533565b91905055508080611e7f90614533565b915050611d35565b50611eb182600a6000848152602001908152602001600020600a0154612ea890919063ffffffff16565b600a6000838152602001908152602001600020600a01819055505050565b6000801b81565b611ede612f46565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4490614aaa565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490614aaa565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fa5ff87d2cb91acdb677c32d4e70485fce8bad164d68ff2930cd4f289a4586760405160405180910390a350565b6120ac7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756120a7612f3e565b611b48565b6120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e29061418f565b60405180910390fd5b6000810361212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212590614b3c565b60405180910390fd5b6006548103612172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216990614b3c565b60405180910390fd5b806006819055503373ffffffffffffffffffffffffffffffffffffffff16817fb83905c728739f5eca496675e71dbd2a42f99ab3b0c5c4827d5e0b3e4e222dd960405160405180910390a350565b600b816040516121d091906146b2565b908152602001604051809103902060009054906101000a900460ff161561222c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222390614bce565b60405180910390fd5b6006546122826001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ea890919063ffffffff16565b11156122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba90614c60565b60405180910390fd5b600a6000858152602001908152602001600020600701546123046001600a600088815260200190815260200160002060080154612ea890919063ffffffff16565b1115612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c90614cf2565b60405180910390fd5b60006123533387878761263d565b90506000612360826132cd565b90508381146123a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239b90614d84565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123f0848661330390919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff1614612446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243d90614e16565b60405180910390fd5b6001600b8460405161245891906146b2565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600a600087815260200190815260200160002060080160008154809291906124a490614533565b9190505550600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906124f990614533565b9190505550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933600a60008a8152602001908152602001600020600101546040518363ffffffff1660e01b8152600401612571929190614a0f565b600060405180830381600087803b15801561258b57600080fd5b505af115801561259f573d6000803e3d6000fd5b5050505085600a6000888152602001908152602001600020600101543373ffffffffffffffffffffffffffffffffffffffff167fb1c081189e5cb5189e04b4e5dfac3e92acf856f6317dd8627ad103cdb1d094d860405160405180910390a4600a6000878152602001908152602001600020600101600081548092919061262590614533565b919050555050505050505050565b6000600654905090565b6000848484846040516020016126569493929190614e9f565b604051602081830303815290604052805190602001209050949350505050565b600080600090505b6004548110156126d2576126bd600a600060018461269c919061457b565b81526020019081526020016000206004015483612ea890919063ffffffff16565b915080806126ca90614533565b91505061267e565b5090565b6000600554905090565b600080600090505b60045481101561273c57612727600a6000600184612706919061457b565b8152602001908152602001600020600a015483612ea890919063ffffffff16565b9150808061273490614533565b9150506126e8565b5090565b600080600090505b60045481101561279c57612787600a6000600184612766919061457b565b81526020019081526020016000206008015483612ea890919063ffffffff16565b9150808061279490614533565b915050612748565b5090565b600b816040516127b091906146b2565b908152602001604051809103902060009054906101000a900460ff161561280c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280390614bce565b60405180910390fd5b600a60008581526020019081526020016000206005015461284d6001600a600088815260200190815260200160002060060154612ea890919063ffffffff16565b111561288e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288590614f85565b60405180910390fd5b600061289c3387878761263d565b905060006128a9826132cd565b90508381146128ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e490614d84565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612939848661330390919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161461298f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298690614e16565b60405180910390fd5b6001600b846040516129a191906146b2565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600a600087815260200190815260200160002060060160008154809291906129ed90614533565b9190505550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933600a60008a8152602001908152602001600020600001546040518363ffffffff1660e01b8152600401612a65929190614a0f565b600060405180830381600087803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b5050505085600a6000888152602001908152602001600020600001543373ffffffffffffffffffffffffffffffffffffffff167fe22749c40dfb3e46e3d0b7f9b46b86315c2d07dfe5ddf4eb3dc1cfff2a4bc92e60405160405180910390a4600a60008781526020019081526020016000206000016000815480929190612b1990614533565b919050555050505050505050565b612b587fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775612b53612f3e565b611b48565b612b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8e90615017565b60405180910390fd5b600960149054906101000a900460ff1615600960146101000a81548160ff021916908315150217905550565b612bcc8261124e565b612bd58161301c565b612bdf8383613111565b505050565b600080600090505b600454811015612c4057612c2b600a6000600184612c0a919061457b565b81526020019081526020016000206009015483612ea890919063ffffffff16565b91508080612c3890614533565b915050612bec565b5090565b6000600454905090565b600080600090505b600454811015612caa57612c95600a6000600184612c74919061457b565b81526020019081526020016000206007015483612ea890919063ffffffff16565b91508080612ca290614533565b915050612c56565b5090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600080600080600080600080600080600a60008e8152602001908152602001600020600001549b50600a60008e8152602001908152602001600020600101549a50600a60008e8152602001908152602001600020600201549950600a60008e8152602001908152602001600020600301549850600a60008e8152602001908152602001600020600401549750600a60008e8152602001908152602001600020600501549650600a60008e8152602001908152602001600020600601549550600a60008e8152602001908152602001600020600701549450600a60008e8152602001908152602001600020600801549350600a60008e8152602001908152602001600020600901549250600a60008e8152602001908152602001600020600a01549150600a60008e8152602001908152602001600020600b0154905091939597999b5091939597999b565b612e2d612f46565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e93906150a9565b60405180910390fd5b612ea5816131f3565b50565b60008183612eb6919061457b565b905092915050565b60008183612ecc91906150c9565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b612f4e612f3e565b73ffffffffffffffffffffffffffffffffffffffff16612f6c611b1f565b73ffffffffffffffffffffffffffffffffffffffff1614612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb990615149565b60405180910390fd5b565b600260015403613009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613000906151b5565b60405180910390fd5b6002600181905550565b60018081905550565b61302d81613028612f3e565b61332a565b50565b61303a8282611b48565b61310d5760016002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506130b2612f3e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61311b8282611b48565b156131ef5760006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613194612f3e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836132c591906151d5565b905092915050565b60007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005281601c52603c6000209050919050565b600080600061331285856133af565b9150915061331f81613400565b819250505092915050565b6133348282611b48565b6133ab5761334181613566565b61334f8360001c6020613593565b6040516020016133609291906152f6565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a29190615369565b60405180910390fd5b5050565b60008060418351036133f05760008060006020860151925060408601519150606086015160001a90506133e4878285856137cf565b945094505050506133f9565b60006002915091505b9250929050565b600060048111156134145761341361538b565b5b8160048111156134275761342661538b565b5b031561356357600160048111156134415761344061538b565b5b8160048111156134545761345361538b565b5b03613494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348b90615406565b60405180910390fd5b600260048111156134a8576134a761538b565b5b8160048111156134bb576134ba61538b565b5b036134fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f290615472565b60405180910390fd5b6003600481111561350f5761350e61538b565b5b8160048111156135225761352161538b565b5b03613562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355990615504565b60405180910390fd5b5b50565b606061358c8273ffffffffffffffffffffffffffffffffffffffff16601460ff16613593565b9050919050565b6060600060028360026135a691906151d5565b6135b0919061457b565b67ffffffffffffffff8111156135c9576135c8613a21565b5b6040519080825280601f01601f1916602001820160405280156135fb5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061363357613632614365565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061369757613696614365565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026136d791906151d5565b6136e1919061457b565b90505b6001811115613781577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061372357613722614365565b5b1a60f81b82828151811061373a57613739614365565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061377a90615524565b90506136e4565b50600084146137c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bc90615599565b60405180910390fd5b8091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561380a5760006003915091506138a8565b60006001878787876040516000815260200160405260405161382f94939291906155d5565b6020604051602081039080840390855afa158015613851573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361389f576000600192509250506138a8565b80600092509250505b94509492505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138fa816138c5565b811461390557600080fd5b50565b600081359050613917816138f1565b92915050565b600060208284031215613933576139326138bb565b5b600061394184828501613908565b91505092915050565b60008115159050919050565b61395f8161394a565b82525050565b600060208201905061397a6000830184613956565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139ab82613980565b9050919050565b6139bb816139a0565b81146139c657600080fd5b50565b6000813590506139d8816139b2565b92915050565b6000602082840312156139f4576139f36138bb565b5b6000613a02848285016139c9565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a5982613a10565b810181811067ffffffffffffffff82111715613a7857613a77613a21565b5b80604052505050565b6000613a8b6138b1565b9050613a978282613a50565b919050565b600067ffffffffffffffff821115613ab757613ab6613a21565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613ae081613acd565b8114613aeb57600080fd5b50565b600081359050613afd81613ad7565b92915050565b6000613b16613b1184613a9c565b613a81565b90508083825260208201905060208402830185811115613b3957613b38613ac8565b5b835b81811015613b625780613b4e8882613aee565b845260208401935050602081019050613b3b565b5050509392505050565b600082601f830112613b8157613b80613a0b565b5b8135613b91848260208601613b03565b91505092915050565b600060208284031215613bb057613baf6138bb565b5b600082013567ffffffffffffffff811115613bce57613bcd6138c0565b5b613bda84828501613b6c565b91505092915050565b613bec81613acd565b82525050565b6000602082019050613c076000830184613be3565b92915050565b600060208284031215613c2357613c226138bb565b5b6000613c3184828501613aee565b91505092915050565b600080fd5b600067ffffffffffffffff821115613c5a57613c59613a21565b5b613c6382613a10565b9050602081019050919050565b82818337600083830152505050565b6000613c92613c8d84613c3f565b613a81565b905082815260208101848484011115613cae57613cad613c3a565b5b613cb9848285613c70565b509392505050565b600082601f830112613cd657613cd5613a0b565b5b8135613ce6848260208601613c7f565b91505092915050565b600060208284031215613d0557613d046138bb565b5b600082013567ffffffffffffffff811115613d2357613d226138c0565b5b613d2f84828501613cc1565b91505092915050565b6000819050919050565b613d4b81613d38565b8114613d5657600080fd5b50565b600081359050613d6881613d42565b92915050565b600060208284031215613d8457613d836138bb565b5b6000613d9284828501613d59565b91505092915050565b613da481613d38565b82525050565b6000602082019050613dbf6000830184613d9b565b92915050565b613dce816139a0565b82525050565b6000602082019050613de96000830184613dc5565b92915050565b60008060408385031215613e0657613e056138bb565b5b6000613e1485828601613d59565b9250506020613e25858286016139c9565b9150509250929050565b6000819050919050565b6000613e54613e4f613e4a84613980565b613e2f565b613980565b9050919050565b6000613e6682613e39565b9050919050565b6000613e7882613e5b565b9050919050565b613e8881613e6d565b82525050565b6000602082019050613ea36000830184613e7f565b92915050565b60008060408385031215613ec057613ebf6138bb565b5b6000613ece85828601613aee565b9250506020613edf85828601613aee565b9150509250929050565b6000613ef482613980565b9050919050565b613f0481613ee9565b8114613f0f57600080fd5b50565b600081359050613f2181613efb565b92915050565b600060208284031215613f3d57613f3c6138bb565b5b6000613f4b84828501613f12565b91505092915050565b600080600080600060a08688031215613f7057613f6f6138bb565b5b6000613f7e88828901613aee565b9550506020613f8f88828901613aee565b9450506040613fa0888289016139c9565b9350506060613fb188828901613d59565b925050608086013567ffffffffffffffff811115613fd257613fd16138c0565b5b613fde88828901613cc1565b9150509295509295909350565b60008060008060808587031215614005576140046138bb565b5b6000614013878288016139c9565b945050602061402487828801613aee565b935050604061403587828801613aee565b9250506060614046878288016139c9565b91505092959194509250565b600061018082019050614068600083018f613be3565b614075602083018e613be3565b614082604083018d613be3565b61408f606083018c613be3565b61409c608083018b613be3565b6140a960a083018a613be3565b6140b660c0830189613be3565b6140c360e0830188613be3565b6140d1610100830187613be3565b6140df610120830186613be3565b6140ed610140830185613be3565b6140fb610160830184613be3565b9d9c50505050505050505050505050565b600082825260208201905092915050565b7f466f756e64657220436f6e74726163743a204d75737420686176652061646d6960008201527f6e20726f6c6520746f2075706461746521000000000000000000000000000000602082015250565b600061417960318361410c565b91506141848261411d565b604082019050919050565b600060208201905081810360008301526141a88161416c565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c69642041646472657360008201527f7321000000000000000000000000000000000000000000000000000000000000602082015250565b600061420b60228361410c565b9150614216826141af565b604082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b7f466f756e64657220436f6e74726163743a204d75737420686176652061646d6960008201527f6e20726f6c652100000000000000000000000000000000000000000000000000602082015250565b600061429d60278361410c565b91506142a882614241565b604082019050919050565b600060208201905081810360008301526142cc81614290565b9050919050565b7f466f756e64657220436f6e74726163743a2043616e6e6f74206265206d6f726560008201527f207468616e20746f74616c2063617465676f7269657321000000000000000000602082015250565b600061432f60378361410c565b915061433a826142d3565b604082019050919050565b6000602082019050818103600083015261435e81614322565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f466f756e64657220436f6e74726163743a205075626c696320737570706c792060008201527f6f6620746869732063617465676f7279206e6f74206d696e74656420636f6d7060208201527f6c6574656c792100000000000000000000000000000000000000000000000000604082015250565b600061441660478361410c565b915061442182614394565b606082019050919050565b6000602082019050818103600083015261444581614409565b9050919050565b7f466f756e64657220436f6e74726163743a204c6561646572626f61726420737560008201527f70706c7920616c7265616479206d696e74656420666f7220746869732063617460208201527f65676f7279210000000000000000000000000000000000000000000000000000604082015250565b60006144ce60468361410c565b91506144d98261444c565b606082019050919050565b600060208201905081810360008301526144fd816144c1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453e82613acd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145705761456f614504565b5b600182019050919050565b600061458682613acd565b915061459183613acd565b92508282019050808211156145a9576145a8614504565b5b92915050565b7f466f756e64657220436f6e74726163743a20496e76616c696420616d6f756e7460008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b600061460b60218361410c565b9150614616826145af565b604082019050919050565b6000602082019050818103600083015261463a816145fe565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561467557808201518184015260208101905061465a565b60008484015250505050565b600061468c82614641565b614696818561464c565b93506146a6818560208601614657565b80840191505092915050565b60006146be8284614681565b915081905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614725602f8361410c565b9150614730826146c9565b604082019050919050565b6000602082019050818103600083015261475481614718565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c696420616d6f756e7460008201527f20666f72207472616e73616374696f6e20636170210000000000000000000000602082015250565b60006147b760358361410c565b91506147c28261475b565b604082019050919050565b600060208201905081810360008301526147e6816147aa565b9050919050565b7f466f756e64657220436f6e74726163743a205075626c69632073616c6520697360008201527f206e6f7420616374697665210000000000000000000000000000000000000000602082015250565b6000614849602c8361410c565b9150614854826147ed565b604082019050919050565b600060208201905081810360008301526148788161483c565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c696420507269636521600082015250565b60006148b560208361410c565b91506148c08261487f565b602082019050919050565b600060208201905081810360008301526148e4816148a8565b9050919050565b7f466f756e64657220436f6e74726163743a2043616e6e6f74206d696e74206d6f60008201527f7265207468616e207472616e73616374696f6e20636170210000000000000000602082015250565b600061494760388361410c565b9150614952826148eb565b604082019050919050565b600060208201905081810360008301526149768161493a565b9050919050565b7f466f756e64657220436f6e74726163743a204d617820737570706c79206f662060008201527f7075626c696320696e20746869732063617465676f7279206d696e7465642100602082015250565b60006149d9603f8361410c565b91506149e48261497d565b604082019050919050565b60006020820190508181036000830152614a08816149cc565b9050919050565b6000604082019050614a246000830185613dc5565b614a316020830184613be3565b9392505050565b7f466f756e64657220436f6e74726163743a20496e76616c69642061646472657360008201527f7321000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a9460228361410c565b9150614a9f82614a38565b604082019050919050565b60006020820190508181036000830152614ac381614a87565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c696420616d6f756e7460008201527f20666f722077616c6c6574206361702100000000000000000000000000000000602082015250565b6000614b2660308361410c565b9150614b3182614aca565b604082019050919050565b60006020820190508181036000830152614b5581614b19565b9050919050565b7f466f756e64657220436f6e74726163743a205369676e617475726520616c726560008201527f6164792075736564210000000000000000000000000000000000000000000000602082015250565b6000614bb860298361410c565b9150614bc382614b5c565b604082019050919050565b60006020820190508181036000830152614be781614bab565b9050919050565b7f466f756e64657220436f6e74726163743a204c6561646572626f61726420776160008201527f6c6c657420636170207265616368656421000000000000000000000000000000602082015250565b6000614c4a60318361410c565b9150614c5582614bee565b604082019050919050565b60006020820190508181036000830152614c7981614c3d565b9050919050565b7f466f756e64657220436f6e74726163743a204d617820737570706c79206f662060008201527f6c65616465727320696e20746869732063617465676f7279206d696e74656421602082015250565b6000614cdc60408361410c565b9150614ce782614c80565b604082019050919050565b60006020820190508181036000830152614d0b81614ccf565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c6964206d657373616760008201527f6520686173682100000000000000000000000000000000000000000000000000602082015250565b6000614d6e60278361410c565b9150614d7982614d12565b604082019050919050565b60006020820190508181036000830152614d9d81614d61565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c6964207369676e657260008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e0060218361410c565b9150614e0b82614da4565b604082019050919050565b60006020820190508181036000830152614e2f81614df3565b9050919050565b60008160601b9050919050565b6000614e4e82614e36565b9050919050565b6000614e6082614e43565b9050919050565b614e78614e73826139a0565b614e55565b82525050565b6000819050919050565b614e99614e9482613acd565b614e7e565b82525050565b6000614eab8287614e67565b601482019150614ebb8286614e88565b602082019150614ecb8285614e88565b602082019150614edb8284614e67565b60148201915081905095945050505050565b7f466f756e64657220436f6e74726163743a204d617820737570706c79206f662060008201527f726573657276656420696e20746869732063617465676f7279206d696e74656460208201527f2100000000000000000000000000000000000000000000000000000000000000604082015250565b6000614f6f60418361410c565b9150614f7a82614eed565b606082019050919050565b60006020820190508181036000830152614f9e81614f62565b9050919050565b7f466f756e64657220436f6e74726163743a204d75737420686176652061646d6960008201527f6e20726f6c6520746f20746f67676c652076616c756521000000000000000000602082015250565b600061500160378361410c565b915061500c82614fa5565b604082019050919050565b6000602082019050818103600083015261503081614ff4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061509360268361410c565b915061509e82615037565b604082019050919050565b600060208201905081810360008301526150c281615086565b9050919050565b60006150d482613acd565b91506150df83613acd565b92508282039050818111156150f7576150f6614504565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061513360208361410c565b915061513e826150fd565b602082019050919050565b6000602082019050818103600083015261516281615126565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061519f601f8361410c565b91506151aa82615169565b602082019050919050565b600060208201905081810360008301526151ce81615192565b9050919050565b60006151e082613acd565b91506151eb83613acd565b92508282026151f981613acd565b915082820484148315176152105761520f614504565b5b5092915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615258601783615217565b915061526382615222565b601782019050919050565b600081519050919050565b60006152848261526e565b61528e8185615217565b935061529e818560208601614657565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006152e0601183615217565b91506152eb826152aa565b601182019050919050565b60006153018261524b565b915061530d8285615279565b9150615318826152d3565b91506153248284615279565b91508190509392505050565b600061533b8261526e565b615345818561410c565b9350615355818560208601614657565b61535e81613a10565b840191505092915050565b600060208201905081810360008301526153838184615330565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006153f060188361410c565b91506153fb826153ba565b602082019050919050565b6000602082019050818103600083015261541f816153e3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061545c601f8361410c565b915061546782615426565b602082019050919050565b6000602082019050818103600083015261548b8161544f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006154ee60228361410c565b91506154f982615492565b604082019050919050565b6000602082019050818103600083015261551d816154e1565b9050919050565b600061552f82613acd565b91506000820361554257615541614504565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061558360208361410c565b915061558e8261554d565b602082019050919050565b600060208201905081810360008301526155b281615576565b9050919050565b600060ff82169050919050565b6155cf816155b9565b82525050565b60006080820190506155ea6000830187613d9b565b6155f760208301866155c6565b6156046040830185613d9b565b6156116060830184613d9b565b9594505050505056fea26469706673582212206f2e31ba8b2fd55197f412d80cb5781b1316676050b7f779bc4001360ab4e6f264736f6c634300081100330000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000903c1a5c54f6f74302d1e8b9cca8ca6d930ac16a0000000000000000000000005d97cbd2732426a8e62b5dd84739ae887a507e030000000000000000000000006aa6760c6487e28eaf2e1c3702e598e8af6f8b08000000000000000000000000689cdf503ba3566a701155466a6ced27a5a921f900000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000d8000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000ed0000000000000000000000000000000000000000000000000000000000000177000000000000000000000000000000000000000000000000000000000000029300000000000000000000000000000000000000000000000000000000000001bb00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a741a46278000000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002b2000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000006130000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000063c00000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000d0500000000000000000000000000000000000000000000000000000000000006f20000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058d15e17628000
Deployed Bytecode
0x6080604052600436106102675760003560e01c80638da5cb5b11610144578063cae13a91116100b6578063d7d92d0a1161007a578063d7d92d0a146108fb578063d884424114610926578063db435f7614610951578063e8e7f8001461097c578063f21b874c146109a7578063f2fde38b146109ef57610267565b8063cae13a911461083c578063cbbc0db114610867578063d27a787914610892578063d3241089146108bb578063d547741f146108d257610267565b8063a823739611610108578063a82373961461072c578063af8c949314610755578063b6d3f48e1461077e578063bfa4bf9a146107a9578063c4e41b22146107e6578063c7f0ed5e1461081157610267565b80638da5cb5b1461065457806391d148541461067f57806398ae99a8146106bc578063a217fddf146106d8578063a3f4b5731461070357610267565b8063410ad60a116101dd5780636b54576a116101a15780636b54576a146105565780636c03beba146105815780636e4c5406146105be578063715018a6146105e757806375b238fc146105fe5780638bc9a4c61461062957610267565b8063410ad60a146104715780634290a4d71461049a57806355464d59146104c55780635beb1dc5146105025780635edaff651461052b57610267565b806322375dc61161022f57806322375dc61461034f578063248a9ca31461038c578063280a0b67146103c95780632f2ff15d146103f457806336568abe1461041d57806338b3b5b51461044657610267565b806301ffc9a71461026c578063039114b5146102a95780631128704c146102d257806314d9f301146102fb5780631c908fa414610326575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061391d565b610a18565b6040516102a09190613965565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb91906139de565b610a92565b005b3480156102de57600080fd5b506102f960048036038101906102f49190613b9a565b610c0f565b005b34801561030757600080fd5b50610310611080565b60405161031d9190613bf2565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613c0d565b6110e0565b005b34801561035b57600080fd5b5061037660048036038101906103719190613cef565b611219565b6040516103839190613965565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190613d6e565b61124e565b6040516103c09190613daa565b60405180910390f35b3480156103d557600080fd5b506103de61126e565b6040516103eb9190613dd4565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613def565b611298565b005b34801561042957600080fd5b50610444600480360381019061043f9190613def565b6112b9565b005b34801561045257600080fd5b5061045b61133c565b6040516104689190613e8e565b60405180910390f35b34801561047d57600080fd5b50610498600480360381019061049391906139de565b611366565b005b3480156104a657600080fd5b506104af611573565b6040516104bc9190613dd4565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613c0d565b61159d565b6040516104f99190613bf2565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190613c0d565b61160d565b005b34801561053757600080fd5b50610540611752565b60405161054d9190613bf2565b60405180910390f35b34801561056257600080fd5b5061056b61181a565b6040516105789190613bf2565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a391906139de565b61187a565b6040516105b59190613bf2565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e091906139de565b6118c3565b005b3480156105f357600080fd5b506105fc611ad0565b005b34801561060a57600080fd5b50610613611ae4565b6040516106209190613daa565b60405180910390f35b34801561063557600080fd5b5061063e611b08565b60405161064b9190613965565b60405180910390f35b34801561066057600080fd5b50610669611b1f565b6040516106769190613dd4565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a19190613def565b611b48565b6040516106b39190613965565b60405180910390f35b6106d660048036038101906106d19190613ea9565b611bb3565b005b3480156106e457600080fd5b506106ed611ecf565b6040516106fa9190613daa565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190613f27565b611ed6565b005b34801561073857600080fd5b50610753600480360381019061074e9190613c0d565b61207b565b005b34801561076157600080fd5b5061077c60048036038101906107779190613f54565b6121c0565b005b34801561078a57600080fd5b50610793612633565b6040516107a09190613bf2565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613feb565b61263d565b6040516107dd9190613daa565b60405180910390f35b3480156107f257600080fd5b506107fb612676565b6040516108089190613bf2565b60405180910390f35b34801561081d57600080fd5b506108266126d6565b6040516108339190613bf2565b60405180910390f35b34801561084857600080fd5b506108516126e0565b60405161085e9190613bf2565b60405180910390f35b34801561087357600080fd5b5061087c612740565b6040516108899190613bf2565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613f54565b6127a0565b005b3480156108c757600080fd5b506108d0612b27565b005b3480156108de57600080fd5b506108f960048036038101906108f49190613def565b612bc3565b005b34801561090757600080fd5b50610910612be4565b60405161091d9190613bf2565b60405180910390f35b34801561093257600080fd5b5061093b612c44565b6040516109489190613bf2565b60405180910390f35b34801561095d57600080fd5b50610966612c4e565b6040516109739190613bf2565b60405180910390f35b34801561098857600080fd5b50610991612cae565b60405161099e9190613dd4565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c99190613c0d565b612cd8565b6040516109e69c9b9a99989796959493929190614052565b60405180910390f35b3480156109fb57600080fd5b50610a166004803603810190610a1191906139de565b612e25565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8b5750610a8a82612ed4565b5b9050919050565b610ac37fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610abe612f3e565b611b48565b610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af99061418f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6890614221565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2e776359ab2269e85ef67545ef925594f19512e3499f91f1accc50e7027a46ae60405160405180910390a350565b610c407fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610c3b612f3e565b611b48565b610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906142b3565b60405180910390fd5b60045481511115610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90614345565b60405180910390fd5b60005b815181101561107c57600a6000838381518110610ce857610ce7614365565b5b60200260200101518152602001908152602001600020600a0154600a6000848481518110610d1957610d18614365565b5b602002602001015181526020019081526020016000206009015414610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a9061442c565b60405180910390fd5b6000610de8600a6000858581518110610d8f57610d8e614365565b5b6020026020010151815260200190815260200160002060080154600a6000868681518110610dc057610dbf614365565b5b6020026020010151815260200190815260200160002060070154612ebe90919063ffffffff16565b03610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906144e4565b60405180910390fd5b600a6000838381518110610e3f57610e3e614365565b5b6020026020010151815260200190815260200160002060010154600a6000848481518110610e7057610e6f614365565b5b6020026020010151815260200190815260200160002060020181905550610f42610f03600a6000858581518110610eaa57610ea9614365565b5b6020026020010151815260200190815260200160002060080154600a6000868681518110610edb57610eda614365565b5b6020026020010151815260200190815260200160002060070154612ebe90919063ffffffff16565b600a6000858581518110610f1a57610f19614365565b5b6020026020010151815260200190815260200160002060090154612ea890919063ffffffff16565b600a6000848481518110610f5957610f58614365565b5b6020026020010151815260200190815260200160002060090181905550600a6000838381518110610f8d57610f8c614365565b5b6020026020010151815260200190815260200160002060080154600a6000848481518110610fbe57610fbd614365565b5b60200260200101518152602001908152602001600020600701819055503373ffffffffffffffffffffffffffffffffffffffff1682828151811061100557611004614365565b5b6020026020010151600a600085858151811061102457611023614365565b5b60200260200101518152602001908152602001600020600201547e3b29410523bf788723f2693aae61c7f653f6a3fc058c7ed802dcf04728955f60405160405180910390a4808061107490614533565b915050610cc8565b5050565b600080600090505b6004548110156110dc576110c7600a60006001846110a6919061457b565b81526020019081526020016000206005015483612ea890919063ffffffff16565b915080806110d490614533565b915050611088565b5090565b6110e8612f46565b6110f0612fc4565b6000811180156111005750478111155b61113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690614621565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111a7573d6000803e3d6000fd5b5080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f43c9b9ec1d0207f015c69980d7999b1508c50eace27b42848c7f056367af802460405160405180910390a3611216613013565b50565b6000600b8260405161122b91906146b2565b908152602001604051809103902060009054906101000a900460ff169050919050565b600060026000838152602001908152602001600020600101549050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112a18261124e565b6112aa8161301c565b6112b48383613030565b505050565b6112c1612f3e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461132e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113259061473b565b60405180910390fd5b6113388282613111565b5050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113977fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611392612f3e565b611b48565b6113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd9061418f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90614221565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cc90614221565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f94e28c1a09607c5b81ff2dcef2e954ebafae7f4f450022fc2cc63ee94ee537cb60405160405180910390a350565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006116066115e1600a600085815260200190815260200160002060080154600a600086815260200190815260200160002060060154612ea890919063ffffffff16565b600a6000858152602001908152602001600020600a0154612ea890919063ffffffff16565b9050919050565b61163e7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611639612f3e565b611b48565b61167d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116749061418f565b60405180910390fd5b600081036116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b7906147cd565b60405180910390fd5b6005548103611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb906147cd565b60405180910390fd5b806005819055503373ffffffffffffffffffffffffffffffffffffffff16817f708bebf42dff2d4b471f4de86be65fcbc85e1aac2845c7250dd57f444f27f2c760405160405180910390a350565b600080600090505b600454811015611816576118016117f26117c1600a600060018661177e919061457b565b815260200190815260200160002060080154600a60006001876117a1919061457b565b815260200190815260200160002060060154612ea890919063ffffffff16565b600a60006001866117d2919061457b565b8152602001908152602001600020600a0154612ea890919063ffffffff16565b83612ea890919063ffffffff16565b9150808061180e90614533565b91505061175a565b5090565b600080600090505b60045481101561187657611861600a6000600184611840919061457b565b81526020019081526020016000206006015483612ea890919063ffffffff16565b9150808061186e90614533565b915050611822565b5090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118f47fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756118ef612f3e565b611b48565b611933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192a9061418f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990614221565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990614221565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f75c68543495d8a19d8c1df1fc9455745fd57a018b92cf94710b293831ac61a8a60405160405180910390a350565b611ad8612f46565b611ae260006131f3565b565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6000600960149054906101000a900460ff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600960149054906101000a900460ff16611c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf99061485f565b60405180910390fd5b611c2b600a6000838152602001908152602001600020600b0154836132b790919063ffffffff16565b3414611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c63906148cb565b60405180910390fd5b600554821115611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca89061495d565b60405180910390fd5b600a600082815260200190815260200160002060090154611cf183600a6000858152602001908152602001600020600a0154612ea890919063ffffffff16565b1115611d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d29906149ef565b60405180910390fd5b60005b82811015611e8757600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933600a6000868152602001908152602001600020600201546040518363ffffffff1660e01b8152600401611db0929190614a0f565b600060405180830381600087803b158015611dca57600080fd5b505af1158015611dde573d6000803e3d6000fd5b5050505081600a6000848152602001908152602001600020600201543373ffffffffffffffffffffffffffffffffffffffff167f8ddc186473c7d1fecde9341fa025d12932d93518eddfa154543b7fb5c69aaf4d34604051611e409190613bf2565b60405180910390a4600a60008381526020019081526020016000206002016000815480929190611e6f90614533565b91905055508080611e7f90614533565b915050611d35565b50611eb182600a6000848152602001908152602001600020600a0154612ea890919063ffffffff16565b600a6000838152602001908152602001600020600a01819055505050565b6000801b81565b611ede612f46565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4490614aaa565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490614aaa565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fa5ff87d2cb91acdb677c32d4e70485fce8bad164d68ff2930cd4f289a4586760405160405180910390a350565b6120ac7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756120a7612f3e565b611b48565b6120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e29061418f565b60405180910390fd5b6000810361212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212590614b3c565b60405180910390fd5b6006548103612172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216990614b3c565b60405180910390fd5b806006819055503373ffffffffffffffffffffffffffffffffffffffff16817fb83905c728739f5eca496675e71dbd2a42f99ab3b0c5c4827d5e0b3e4e222dd960405160405180910390a350565b600b816040516121d091906146b2565b908152602001604051809103902060009054906101000a900460ff161561222c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222390614bce565b60405180910390fd5b6006546122826001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ea890919063ffffffff16565b11156122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba90614c60565b60405180910390fd5b600a6000858152602001908152602001600020600701546123046001600a600088815260200190815260200160002060080154612ea890919063ffffffff16565b1115612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c90614cf2565b60405180910390fd5b60006123533387878761263d565b90506000612360826132cd565b90508381146123a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239b90614d84565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123f0848661330390919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff1614612446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243d90614e16565b60405180910390fd5b6001600b8460405161245891906146b2565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600a600087815260200190815260200160002060080160008154809291906124a490614533565b9190505550600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906124f990614533565b9190505550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933600a60008a8152602001908152602001600020600101546040518363ffffffff1660e01b8152600401612571929190614a0f565b600060405180830381600087803b15801561258b57600080fd5b505af115801561259f573d6000803e3d6000fd5b5050505085600a6000888152602001908152602001600020600101543373ffffffffffffffffffffffffffffffffffffffff167fb1c081189e5cb5189e04b4e5dfac3e92acf856f6317dd8627ad103cdb1d094d860405160405180910390a4600a6000878152602001908152602001600020600101600081548092919061262590614533565b919050555050505050505050565b6000600654905090565b6000848484846040516020016126569493929190614e9f565b604051602081830303815290604052805190602001209050949350505050565b600080600090505b6004548110156126d2576126bd600a600060018461269c919061457b565b81526020019081526020016000206004015483612ea890919063ffffffff16565b915080806126ca90614533565b91505061267e565b5090565b6000600554905090565b600080600090505b60045481101561273c57612727600a6000600184612706919061457b565b8152602001908152602001600020600a015483612ea890919063ffffffff16565b9150808061273490614533565b9150506126e8565b5090565b600080600090505b60045481101561279c57612787600a6000600184612766919061457b565b81526020019081526020016000206008015483612ea890919063ffffffff16565b9150808061279490614533565b915050612748565b5090565b600b816040516127b091906146b2565b908152602001604051809103902060009054906101000a900460ff161561280c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280390614bce565b60405180910390fd5b600a60008581526020019081526020016000206005015461284d6001600a600088815260200190815260200160002060060154612ea890919063ffffffff16565b111561288e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288590614f85565b60405180910390fd5b600061289c3387878761263d565b905060006128a9826132cd565b90508381146128ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e490614d84565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612939848661330390919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161461298f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298690614e16565b60405180910390fd5b6001600b846040516129a191906146b2565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600a600087815260200190815260200160002060060160008154809291906129ed90614533565b9190505550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933600a60008a8152602001908152602001600020600001546040518363ffffffff1660e01b8152600401612a65929190614a0f565b600060405180830381600087803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b5050505085600a6000888152602001908152602001600020600001543373ffffffffffffffffffffffffffffffffffffffff167fe22749c40dfb3e46e3d0b7f9b46b86315c2d07dfe5ddf4eb3dc1cfff2a4bc92e60405160405180910390a4600a60008781526020019081526020016000206000016000815480929190612b1990614533565b919050555050505050505050565b612b587fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775612b53612f3e565b611b48565b612b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8e90615017565b60405180910390fd5b600960149054906101000a900460ff1615600960146101000a81548160ff021916908315150217905550565b612bcc8261124e565b612bd58161301c565b612bdf8383613111565b505050565b600080600090505b600454811015612c4057612c2b600a6000600184612c0a919061457b565b81526020019081526020016000206009015483612ea890919063ffffffff16565b91508080612c3890614533565b915050612bec565b5090565b6000600454905090565b600080600090505b600454811015612caa57612c95600a6000600184612c74919061457b565b81526020019081526020016000206007015483612ea890919063ffffffff16565b91508080612ca290614533565b915050612c56565b5090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600080600080600080600080600080600a60008e8152602001908152602001600020600001549b50600a60008e8152602001908152602001600020600101549a50600a60008e8152602001908152602001600020600201549950600a60008e8152602001908152602001600020600301549850600a60008e8152602001908152602001600020600401549750600a60008e8152602001908152602001600020600501549650600a60008e8152602001908152602001600020600601549550600a60008e8152602001908152602001600020600701549450600a60008e8152602001908152602001600020600801549350600a60008e8152602001908152602001600020600901549250600a60008e8152602001908152602001600020600a01549150600a60008e8152602001908152602001600020600b0154905091939597999b5091939597999b565b612e2d612f46565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e93906150a9565b60405180910390fd5b612ea5816131f3565b50565b60008183612eb6919061457b565b905092915050565b60008183612ecc91906150c9565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b612f4e612f3e565b73ffffffffffffffffffffffffffffffffffffffff16612f6c611b1f565b73ffffffffffffffffffffffffffffffffffffffff1614612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb990615149565b60405180910390fd5b565b600260015403613009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613000906151b5565b60405180910390fd5b6002600181905550565b60018081905550565b61302d81613028612f3e565b61332a565b50565b61303a8282611b48565b61310d5760016002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506130b2612f3e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61311b8282611b48565b156131ef5760006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613194612f3e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836132c591906151d5565b905092915050565b60007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005281601c52603c6000209050919050565b600080600061331285856133af565b9150915061331f81613400565b819250505092915050565b6133348282611b48565b6133ab5761334181613566565b61334f8360001c6020613593565b6040516020016133609291906152f6565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a29190615369565b60405180910390fd5b5050565b60008060418351036133f05760008060006020860151925060408601519150606086015160001a90506133e4878285856137cf565b945094505050506133f9565b60006002915091505b9250929050565b600060048111156134145761341361538b565b5b8160048111156134275761342661538b565b5b031561356357600160048111156134415761344061538b565b5b8160048111156134545761345361538b565b5b03613494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348b90615406565b60405180910390fd5b600260048111156134a8576134a761538b565b5b8160048111156134bb576134ba61538b565b5b036134fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f290615472565b60405180910390fd5b6003600481111561350f5761350e61538b565b5b8160048111156135225761352161538b565b5b03613562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355990615504565b60405180910390fd5b5b50565b606061358c8273ffffffffffffffffffffffffffffffffffffffff16601460ff16613593565b9050919050565b6060600060028360026135a691906151d5565b6135b0919061457b565b67ffffffffffffffff8111156135c9576135c8613a21565b5b6040519080825280601f01601f1916602001820160405280156135fb5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061363357613632614365565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061369757613696614365565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026136d791906151d5565b6136e1919061457b565b90505b6001811115613781577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061372357613722614365565b5b1a60f81b82828151811061373a57613739614365565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061377a90615524565b90506136e4565b50600084146137c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bc90615599565b60405180910390fd5b8091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561380a5760006003915091506138a8565b60006001878787876040516000815260200160405260405161382f94939291906155d5565b6020604051602081039080840390855afa158015613851573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361389f576000600192509250506138a8565b80600092509250505b94509492505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138fa816138c5565b811461390557600080fd5b50565b600081359050613917816138f1565b92915050565b600060208284031215613933576139326138bb565b5b600061394184828501613908565b91505092915050565b60008115159050919050565b61395f8161394a565b82525050565b600060208201905061397a6000830184613956565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139ab82613980565b9050919050565b6139bb816139a0565b81146139c657600080fd5b50565b6000813590506139d8816139b2565b92915050565b6000602082840312156139f4576139f36138bb565b5b6000613a02848285016139c9565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a5982613a10565b810181811067ffffffffffffffff82111715613a7857613a77613a21565b5b80604052505050565b6000613a8b6138b1565b9050613a978282613a50565b919050565b600067ffffffffffffffff821115613ab757613ab6613a21565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613ae081613acd565b8114613aeb57600080fd5b50565b600081359050613afd81613ad7565b92915050565b6000613b16613b1184613a9c565b613a81565b90508083825260208201905060208402830185811115613b3957613b38613ac8565b5b835b81811015613b625780613b4e8882613aee565b845260208401935050602081019050613b3b565b5050509392505050565b600082601f830112613b8157613b80613a0b565b5b8135613b91848260208601613b03565b91505092915050565b600060208284031215613bb057613baf6138bb565b5b600082013567ffffffffffffffff811115613bce57613bcd6138c0565b5b613bda84828501613b6c565b91505092915050565b613bec81613acd565b82525050565b6000602082019050613c076000830184613be3565b92915050565b600060208284031215613c2357613c226138bb565b5b6000613c3184828501613aee565b91505092915050565b600080fd5b600067ffffffffffffffff821115613c5a57613c59613a21565b5b613c6382613a10565b9050602081019050919050565b82818337600083830152505050565b6000613c92613c8d84613c3f565b613a81565b905082815260208101848484011115613cae57613cad613c3a565b5b613cb9848285613c70565b509392505050565b600082601f830112613cd657613cd5613a0b565b5b8135613ce6848260208601613c7f565b91505092915050565b600060208284031215613d0557613d046138bb565b5b600082013567ffffffffffffffff811115613d2357613d226138c0565b5b613d2f84828501613cc1565b91505092915050565b6000819050919050565b613d4b81613d38565b8114613d5657600080fd5b50565b600081359050613d6881613d42565b92915050565b600060208284031215613d8457613d836138bb565b5b6000613d9284828501613d59565b91505092915050565b613da481613d38565b82525050565b6000602082019050613dbf6000830184613d9b565b92915050565b613dce816139a0565b82525050565b6000602082019050613de96000830184613dc5565b92915050565b60008060408385031215613e0657613e056138bb565b5b6000613e1485828601613d59565b9250506020613e25858286016139c9565b9150509250929050565b6000819050919050565b6000613e54613e4f613e4a84613980565b613e2f565b613980565b9050919050565b6000613e6682613e39565b9050919050565b6000613e7882613e5b565b9050919050565b613e8881613e6d565b82525050565b6000602082019050613ea36000830184613e7f565b92915050565b60008060408385031215613ec057613ebf6138bb565b5b6000613ece85828601613aee565b9250506020613edf85828601613aee565b9150509250929050565b6000613ef482613980565b9050919050565b613f0481613ee9565b8114613f0f57600080fd5b50565b600081359050613f2181613efb565b92915050565b600060208284031215613f3d57613f3c6138bb565b5b6000613f4b84828501613f12565b91505092915050565b600080600080600060a08688031215613f7057613f6f6138bb565b5b6000613f7e88828901613aee565b9550506020613f8f88828901613aee565b9450506040613fa0888289016139c9565b9350506060613fb188828901613d59565b925050608086013567ffffffffffffffff811115613fd257613fd16138c0565b5b613fde88828901613cc1565b9150509295509295909350565b60008060008060808587031215614005576140046138bb565b5b6000614013878288016139c9565b945050602061402487828801613aee565b935050604061403587828801613aee565b9250506060614046878288016139c9565b91505092959194509250565b600061018082019050614068600083018f613be3565b614075602083018e613be3565b614082604083018d613be3565b61408f606083018c613be3565b61409c608083018b613be3565b6140a960a083018a613be3565b6140b660c0830189613be3565b6140c360e0830188613be3565b6140d1610100830187613be3565b6140df610120830186613be3565b6140ed610140830185613be3565b6140fb610160830184613be3565b9d9c50505050505050505050505050565b600082825260208201905092915050565b7f466f756e64657220436f6e74726163743a204d75737420686176652061646d6960008201527f6e20726f6c6520746f2075706461746521000000000000000000000000000000602082015250565b600061417960318361410c565b91506141848261411d565b604082019050919050565b600060208201905081810360008301526141a88161416c565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c69642041646472657360008201527f7321000000000000000000000000000000000000000000000000000000000000602082015250565b600061420b60228361410c565b9150614216826141af565b604082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b7f466f756e64657220436f6e74726163743a204d75737420686176652061646d6960008201527f6e20726f6c652100000000000000000000000000000000000000000000000000602082015250565b600061429d60278361410c565b91506142a882614241565b604082019050919050565b600060208201905081810360008301526142cc81614290565b9050919050565b7f466f756e64657220436f6e74726163743a2043616e6e6f74206265206d6f726560008201527f207468616e20746f74616c2063617465676f7269657321000000000000000000602082015250565b600061432f60378361410c565b915061433a826142d3565b604082019050919050565b6000602082019050818103600083015261435e81614322565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f466f756e64657220436f6e74726163743a205075626c696320737570706c792060008201527f6f6620746869732063617465676f7279206e6f74206d696e74656420636f6d7060208201527f6c6574656c792100000000000000000000000000000000000000000000000000604082015250565b600061441660478361410c565b915061442182614394565b606082019050919050565b6000602082019050818103600083015261444581614409565b9050919050565b7f466f756e64657220436f6e74726163743a204c6561646572626f61726420737560008201527f70706c7920616c7265616479206d696e74656420666f7220746869732063617460208201527f65676f7279210000000000000000000000000000000000000000000000000000604082015250565b60006144ce60468361410c565b91506144d98261444c565b606082019050919050565b600060208201905081810360008301526144fd816144c1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453e82613acd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145705761456f614504565b5b600182019050919050565b600061458682613acd565b915061459183613acd565b92508282019050808211156145a9576145a8614504565b5b92915050565b7f466f756e64657220436f6e74726163743a20496e76616c696420616d6f756e7460008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b600061460b60218361410c565b9150614616826145af565b604082019050919050565b6000602082019050818103600083015261463a816145fe565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561467557808201518184015260208101905061465a565b60008484015250505050565b600061468c82614641565b614696818561464c565b93506146a6818560208601614657565b80840191505092915050565b60006146be8284614681565b915081905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614725602f8361410c565b9150614730826146c9565b604082019050919050565b6000602082019050818103600083015261475481614718565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c696420616d6f756e7460008201527f20666f72207472616e73616374696f6e20636170210000000000000000000000602082015250565b60006147b760358361410c565b91506147c28261475b565b604082019050919050565b600060208201905081810360008301526147e6816147aa565b9050919050565b7f466f756e64657220436f6e74726163743a205075626c69632073616c6520697360008201527f206e6f7420616374697665210000000000000000000000000000000000000000602082015250565b6000614849602c8361410c565b9150614854826147ed565b604082019050919050565b600060208201905081810360008301526148788161483c565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c696420507269636521600082015250565b60006148b560208361410c565b91506148c08261487f565b602082019050919050565b600060208201905081810360008301526148e4816148a8565b9050919050565b7f466f756e64657220436f6e74726163743a2043616e6e6f74206d696e74206d6f60008201527f7265207468616e207472616e73616374696f6e20636170210000000000000000602082015250565b600061494760388361410c565b9150614952826148eb565b604082019050919050565b600060208201905081810360008301526149768161493a565b9050919050565b7f466f756e64657220436f6e74726163743a204d617820737570706c79206f662060008201527f7075626c696320696e20746869732063617465676f7279206d696e7465642100602082015250565b60006149d9603f8361410c565b91506149e48261497d565b604082019050919050565b60006020820190508181036000830152614a08816149cc565b9050919050565b6000604082019050614a246000830185613dc5565b614a316020830184613be3565b9392505050565b7f466f756e64657220436f6e74726163743a20496e76616c69642061646472657360008201527f7321000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a9460228361410c565b9150614a9f82614a38565b604082019050919050565b60006020820190508181036000830152614ac381614a87565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c696420616d6f756e7460008201527f20666f722077616c6c6574206361702100000000000000000000000000000000602082015250565b6000614b2660308361410c565b9150614b3182614aca565b604082019050919050565b60006020820190508181036000830152614b5581614b19565b9050919050565b7f466f756e64657220436f6e74726163743a205369676e617475726520616c726560008201527f6164792075736564210000000000000000000000000000000000000000000000602082015250565b6000614bb860298361410c565b9150614bc382614b5c565b604082019050919050565b60006020820190508181036000830152614be781614bab565b9050919050565b7f466f756e64657220436f6e74726163743a204c6561646572626f61726420776160008201527f6c6c657420636170207265616368656421000000000000000000000000000000602082015250565b6000614c4a60318361410c565b9150614c5582614bee565b604082019050919050565b60006020820190508181036000830152614c7981614c3d565b9050919050565b7f466f756e64657220436f6e74726163743a204d617820737570706c79206f662060008201527f6c65616465727320696e20746869732063617465676f7279206d696e74656421602082015250565b6000614cdc60408361410c565b9150614ce782614c80565b604082019050919050565b60006020820190508181036000830152614d0b81614ccf565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c6964206d657373616760008201527f6520686173682100000000000000000000000000000000000000000000000000602082015250565b6000614d6e60278361410c565b9150614d7982614d12565b604082019050919050565b60006020820190508181036000830152614d9d81614d61565b9050919050565b7f466f756e64657220436f6e74726163743a20496e76616c6964207369676e657260008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e0060218361410c565b9150614e0b82614da4565b604082019050919050565b60006020820190508181036000830152614e2f81614df3565b9050919050565b60008160601b9050919050565b6000614e4e82614e36565b9050919050565b6000614e6082614e43565b9050919050565b614e78614e73826139a0565b614e55565b82525050565b6000819050919050565b614e99614e9482613acd565b614e7e565b82525050565b6000614eab8287614e67565b601482019150614ebb8286614e88565b602082019150614ecb8285614e88565b602082019150614edb8284614e67565b60148201915081905095945050505050565b7f466f756e64657220436f6e74726163743a204d617820737570706c79206f662060008201527f726573657276656420696e20746869732063617465676f7279206d696e74656460208201527f2100000000000000000000000000000000000000000000000000000000000000604082015250565b6000614f6f60418361410c565b9150614f7a82614eed565b606082019050919050565b60006020820190508181036000830152614f9e81614f62565b9050919050565b7f466f756e64657220436f6e74726163743a204d75737420686176652061646d6960008201527f6e20726f6c6520746f20746f67676c652076616c756521000000000000000000602082015250565b600061500160378361410c565b915061500c82614fa5565b604082019050919050565b6000602082019050818103600083015261503081614ff4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061509360268361410c565b915061509e82615037565b604082019050919050565b600060208201905081810360008301526150c281615086565b9050919050565b60006150d482613acd565b91506150df83613acd565b92508282039050818111156150f7576150f6614504565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061513360208361410c565b915061513e826150fd565b602082019050919050565b6000602082019050818103600083015261516281615126565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061519f601f8361410c565b91506151aa82615169565b602082019050919050565b600060208201905081810360008301526151ce81615192565b9050919050565b60006151e082613acd565b91506151eb83613acd565b92508282026151f981613acd565b915082820484148315176152105761520f614504565b5b5092915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615258601783615217565b915061526382615222565b601782019050919050565b600081519050919050565b60006152848261526e565b61528e8185615217565b935061529e818560208601614657565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006152e0601183615217565b91506152eb826152aa565b601182019050919050565b60006153018261524b565b915061530d8285615279565b9150615318826152d3565b91506153248284615279565b91508190509392505050565b600061533b8261526e565b615345818561410c565b9350615355818560208601614657565b61535e81613a10565b840191505092915050565b600060208201905081810360008301526153838184615330565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006153f060188361410c565b91506153fb826153ba565b602082019050919050565b6000602082019050818103600083015261541f816153e3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061545c601f8361410c565b915061546782615426565b602082019050919050565b6000602082019050818103600083015261548b8161544f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006154ee60228361410c565b91506154f982615492565b604082019050919050565b6000602082019050818103600083015261551d816154e1565b9050919050565b600061552f82613acd565b91506000820361554257615541614504565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061558360208361410c565b915061558e8261554d565b602082019050919050565b600060208201905081810360008301526155b281615576565b9050919050565b600060ff82169050919050565b6155cf816155b9565b82525050565b60006080820190506155ea6000830187613d9b565b6155f760208301866155c6565b6156046040830185613d9b565b6156116060830184613d9b565b9594505050505056fea26469706673582212206f2e31ba8b2fd55197f412d80cb5781b1316676050b7f779bc4001360ab4e6f264736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000903c1a5c54f6f74302d1e8b9cca8ca6d930ac16a0000000000000000000000005d97cbd2732426a8e62b5dd84739ae887a507e030000000000000000000000006aa6760c6487e28eaf2e1c3702e598e8af6f8b08000000000000000000000000689cdf503ba3566a701155466a6ced27a5a921f900000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000d8000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000ed0000000000000000000000000000000000000000000000000000000000000177000000000000000000000000000000000000000000000000000000000000029300000000000000000000000000000000000000000000000000000000000001bb00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a741a46278000000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002b2000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000006130000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000063c00000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000d0500000000000000000000000000000000000000000000000000000000000006f20000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058d15e17628000
-----Decoded View---------------
Arg [0] : _categories (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : _totalCategories (uint256): 4
Arg [2] : _perTransactionCap (uint256): 5
Arg [3] : _leaderboardPerWalletCap (uint256): 1
Arg [4] : _nftContractAddress (address): 0x903C1A5c54f6f74302d1e8b9Cca8ca6D930aC16A
Arg [5] : _leaderboardSignerAddress (address): 0x5d97CBd2732426a8E62b5Dd84739AE887A507E03
Arg [6] : _reservedSignerAddress (address): 0x6Aa6760C6487e28EAF2E1c3702e598e8Af6F8B08
Arg [7] : _withdrawAddress (address): 0x689cDF503Ba3566a701155466a6CED27A5A921F9
-----Encoded View---------------
57 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000903c1a5c54f6f74302d1e8b9cca8ca6d930ac16a
Arg [5] : 0000000000000000000000005d97cbd2732426a8e62b5dd84739ae887a507e03
Arg [6] : 0000000000000000000000006aa6760c6487e28eaf2e1c3702e598e8af6f8b08
Arg [7] : 000000000000000000000000689cdf503ba3566a701155466a6ced27a5a921f9
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [12] : 00000000000000000000000000000000000000000000000000000000000000d8
Arg [13] : 00000000000000000000000000000000000000000000000000000000000000d8
Arg [14] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [16] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [18] : 00000000000000000000000000000000000000000000000000000000000000c2
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [21] : 00000000000000000000000000000000000000000000000000000000000000d9
Arg [22] : 00000000000000000000000000000000000000000000000000000000000000ed
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000177
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000293
Arg [25] : 00000000000000000000000000000000000000000000000000000000000001bb
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [28] : 000000000000000000000000000000000000000000000000000000000000008a
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [30] : 000000000000000000000000000000000000000000000000000000000000011d
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [32] : 000000000000000000000000000000000000000000000000010a741a46278000
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000294
Arg [34] : 00000000000000000000000000000000000000000000000000000000000002b2
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000410
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000613
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000380
Arg [38] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [40] : 000000000000000000000000000000000000000000000000000000000000015e
Arg [41] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [42] : 0000000000000000000000000000000000000000000000000000000000000204
Arg [43] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [44] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [45] : 0000000000000000000000000000000000000000000000000000000000000614
Arg [46] : 000000000000000000000000000000000000000000000000000000000000063c
Arg [47] : 0000000000000000000000000000000000000000000000000000000000000830
Arg [48] : 0000000000000000000000000000000000000000000000000000000000000d05
Arg [49] : 00000000000000000000000000000000000000000000000000000000000006f2
Arg [50] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [51] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [52] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [53] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [54] : 00000000000000000000000000000000000000000000000000000000000004d6
Arg [55] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [56] : 0000000000000000000000000000000000000000000000000058d15e17628000
Deployed Bytecode Sourcemap
53329:22948:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24692:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68531:471;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63781:1975;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74355:337;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69495:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71739:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26515:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75825:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26956:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28100:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76073:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67867:656;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75952:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72764:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65764:633;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73127:520;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74700:367;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71889:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67139:720;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52426:103;;;;;;;;;;;;;:::i;:::-;;53490:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72059:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51785:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24988:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60445:1358;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24093:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69010:477;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66405:726;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57308:1684;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72284:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69829:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72518:238;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72171:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73990:357;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75435:382;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59000:1437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63520:253;;;;;;;;;;;;;:::i;:::-;;27396:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73655:327;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72409:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75075:352;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76173:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70265:1466;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;52684:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24692:204;24777:4;24816:32;24801:47;;;:11;:47;;;;:87;;;;24852:36;24876:11;24852:23;:36::i;:::-;24801:87;24794:94;;24692:204;;;:::o;68531:471::-;68634:33;53527:23;68654:12;:10;:12::i;:::-;68634:7;:33::i;:::-;68612:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;68808:1;68777:33;;:19;:33;;;68755:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;68899:19;68885:3;;:34;;;;;;;;;;;;;;;;;;68983:10;68937:57;;68962:19;68937:57;;;;;;;;;;;;68531:471;:::o;63781:1975::-;63878:33;53527:23;63898:12;:10;:12::i;:::-;63878:7;:33::i;:::-;63856:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;64031:15;;64011:9;:16;:35;;63989:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;64145:13;64140:1609;64172:9;:16;64164:5;:24;64140:1609;;;64306:10;:28;64317:9;64327:5;64317:16;;;;;;;;:::i;:::-;;;;;;;;64306:28;;;;;;;;;;;:47;;;64240:10;:28;64251:9;64261:5;64251:16;;;;;;;;:::i;:::-;;;;;;;;64240:28;;;;;;;;;;;:41;;;:113;64214:246;;;;;;;;;;;;:::i;:::-;;;;;;;;;64649:1;64501:144;64574:10;:28;64585:9;64595:5;64585:16;;;;;;;;:::i;:::-;;;;;;;;64574:28;;;;;;;;;;;:52;;;64501:10;:28;64512:9;64522:5;64512:16;;;;;;;;:::i;:::-;;;;;;;;64501:28;;;;;;;;;;;:46;;;:50;;:144;;;;:::i;:::-;:149;64475:281;;;;;;;;;;;;:::i;:::-;;;;;;;;;64876:10;:60;64905:9;64915:5;64905:16;;;;;;;;:::i;:::-;;;;;;;;64876:60;;;;;;;;;;;:83;;;64827:10;:28;64838:9;64848:5;64838:16;;;;;;;;:::i;:::-;;;;;;;;64827:28;;;;;;;;;;;:46;;:132;;;;65100:239;65168:152;65245:10;:28;65256:9;65266:5;65256:16;;;;;;;;:::i;:::-;;;;;;;;65245:28;;;;;;;;;;;:52;;;65168:10;:28;65179:9;65189:5;65179:16;;;;;;;;:::i;:::-;;;;;;;;65168:28;;;;;;;;;;;:46;;;:50;;:152;;;;:::i;:::-;65100:10;:28;65111:9;65121:5;65111:16;;;;;;;;:::i;:::-;;;;;;;;65100:28;;;;;;;;;;;:41;;;:45;;:239;;;;:::i;:::-;65056:10;:28;65067:9;65077:5;65067:16;;;;;;;;:::i;:::-;;;;;;;;65056:28;;;;;;;;;;;:41;;:283;;;;65468:10;:60;65497:9;65507:5;65497:16;;;;;;;;:::i;:::-;;;;;;;;65468:60;;;;;;;;;;;:84;;;65419:10;:28;65430:9;65440:5;65430:16;;;;;;;;:::i;:::-;;;;;;;;65419:28;;;;;;;;;;;:46;;:133;;;;65712:10;65574:163;;65677:9;65687:5;65677:16;;;;;;;;:::i;:::-;;;;;;;;65612:10;:28;65623:9;65633:5;65623:16;;;;;;;;:::i;:::-;;;;;;;;65612:28;;;;;;;;;;;:46;;;65574:163;;;;;;;;;;64190:7;;;;;:::i;:::-;;;;64140:1609;;;;63781:1975;:::o;74355:337::-;74437:28;74488:13;74504:1;74488:17;;74483:202;74515:15;;74507:5;:23;74483:202;;;74579:94;74622:10;:21;74641:1;74633:5;:9;;;;:::i;:::-;74622:21;;;;;;;;;;;:36;;;74579:20;:24;;:94;;;;:::i;:::-;74556:117;;74532:7;;;;;:::i;:::-;;;;74483:202;;;;74355:337;:::o;69495:326::-;51671:13;:11;:13::i;:::-;49811:21:::1;:19;:21::i;:::-;69611:1:::2;69601:7;:11;:47;;;;;69627:21;69616:7;:32;;69601:47;69579:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;69720:15;;;;;;;;;;;:24;;:33;69745:7;69720:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;69805:7;69788:15;;;;;;;;;;;69771:42;;;;;;;;;;;;49855:20:::1;:18;:20::i;:::-;69495:326:::0;:::o;71739:142::-;71827:4;71851:10;71862;71851:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;71844:29;;71739:142;;;:::o;26515:131::-;26589:7;26616:6;:12;26623:4;26616:12;;;;;;;;;;;:22;;;26609:29;;26515:131;;;:::o;75825:119::-;75885:7;75912:24;;;;;;;;;;;75905:31;;75825:119;:::o;26956:147::-;27039:18;27052:4;27039:12;:18::i;:::-;24584:16;24595:4;24584:10;:16::i;:::-;27070:25:::1;27081:4;27087:7;27070:10;:25::i;:::-;26956:147:::0;;;:::o;28100:218::-;28207:12;:10;:12::i;:::-;28196:23;;:7;:23;;;28188:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;28284:26;28296:4;28302:7;28284:11;:26::i;:::-;28100:218;;:::o;76073:92::-;76127:7;76154:3;;;;;;;;;;;76147:10;;76073:92;:::o;67867:656::-;67992:33;53527:23;68012:12;:10;:12::i;:::-;67992:7;:33::i;:::-;67970:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;68169:1;68135:36;;:22;:36;;;68113:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;68292:21;;;;;;;;;;;68266:47;;:22;:47;;;68244:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;68412:22;68388:21;;:46;;;;;;;;;;;;;;;;;;68504:10;68452:63;;68480:22;68452:63;;;;;;;;;;;;67867:656;:::o;75952:113::-;76009:7;76036:21;;;;;;;;;;;76029:28;;75952:113;:::o;72764:355::-;72860:7;72900:211;72963:133;73032:10;:21;73043:9;73032:21;;;;;;;;;;;:45;;;72963:10;:21;72974:9;72963:21;;;;;;;;;;;:42;;;:46;;:133;;;;:::i;:::-;72900:10;:21;72911:9;72900:21;;;;;;;;;;;:40;;;:44;;:211;;;;:::i;:::-;72880:231;;72764:355;;;:::o;65764:633::-;65865:33;53527:23;65885:12;:10;:12::i;:::-;65865:7;:33::i;:::-;65843:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;66030:1;66008:18;:23;65986:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;66167:17;;66145:18;:39;66123:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;66298:18;66278:17;:38;;;;66378:10;66334:55;;66358:18;66334:55;;;;;;;;;;65764:633;:::o;73127:520::-;73207:26;73256:13;73272:1;73256:17;;73251:389;73283:15;;73275:5;:23;73251:389;;;73345:283;73386:227;73453:141;73526:10;:21;73545:1;73537:5;:9;;;;:::i;:::-;73526:21;;;;;;;;;;;:45;;;73453:10;:21;73472:1;73464:5;:9;;;;:::i;:::-;73453:21;;;;;;;;;;;:42;;;:46;;:141;;;;:::i;:::-;73386:10;:21;73405:1;73397:5;:9;;;;:::i;:::-;73386:21;;;;;;;;;;;:40;;;:44;;:227;;;;:::i;:::-;73345:18;:22;;:283;;;;:::i;:::-;73324:304;;73300:7;;;;;:::i;:::-;;;;73251:389;;;;73127:520;:::o;74700:367::-;74788:34;74845:13;74861:1;74845:17;;74840:220;74872:15;;74864:5;:23;74840:220;;;74942:106;74991:10;:21;75010:1;75002:5;:9;;;;:::i;:::-;74991:21;;;;;;;;;;;:42;;;74942:26;:30;;:106;;;;:::i;:::-;74913:135;;74889:7;;;;;:::i;:::-;;;;74840:220;;;;74700:367;:::o;71889:162::-;71986:7;72013:20;:30;72034:8;72013:30;;;;;;;;;;;;;;;;72006:37;;71889:162;;;:::o;67139:720::-;67270:33;53527:23;67290:12;:10;:12::i;:::-;67270:7;:33::i;:::-;67248:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;67450:1;67413:39;;:25;:39;;;67391:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;67576:24;;;;;;;;;;;67547:53;;:25;:53;;;67525:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;67702:25;67675:24;;:52;;;;;;;;;;;;;;;;;;67830:10;67745:106;;67790:25;67745:106;;;;;;;;;;;;67139:720;:::o;52426:103::-;51671:13;:11;:13::i;:::-;52491:30:::1;52518:1;52491:18;:30::i;:::-;52426:103::o:0;53490:60::-;53527:23;53490:60;:::o;72059:104::-;72113:4;72137:18;;;;;;;;;;;72130:25;;72059:104;:::o;51785:87::-;51831:7;51858:6;;;;;;;;;;;51851:13;;51785:87;:::o;24988:147::-;25074:4;25098:6;:12;25105:4;25098:12;;;;;;;;;;;:20;;:29;25119:7;25098:29;;;;;;;;;;;;;;;;;;;;;;;;;25091:36;;24988:147;;;;:::o;60445:1358::-;60582:18;;;;;;;;;;;60560:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;60735:56;60755:10;:21;60766:9;60755:21;;;;;;;;;;;:35;;;60735:15;:19;;:56;;;;:::i;:::-;60705:9;:86;60683:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;60903:17;;60884:15;:36;;60862:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;61119:10;:21;61130:9;61119:21;;;;;;;;;;;:34;;;61037:61;61082:15;61037:10;:21;61048:9;61037:21;;;;;;;;;;;:40;;;:44;;:61;;;;:::i;:::-;:116;;61015:229;;;;;;;;;;;;:::i;:::-;;;;;;;;;61262:13;61257:394;61289:15;61281:5;:23;61257:394;;;61330:3;;;;;;;;;;;:8;;;61339:10;61351;:21;61362:9;61351:21;;;;;;;;;;;:39;;;61330:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61529:9;61471:10;:21;61482:9;61471:21;;;;;;;;;;;:39;;;61442:10;61413:168;;;61557:9;61413:168;;;;;;:::i;:::-;;;;;;;;61598:10;:21;61609:9;61598:21;;;;;;;;;;;:39;;;:41;;;;;;;;;:::i;:::-;;;;;;61306:7;;;;;:::i;:::-;;;;61257:394;;;;61706:89;61779:15;61706:10;:21;61717:9;61706:21;;;;;;;;;;;:54;;;:72;;:89;;;;:::i;:::-;61663:10;:21;61674:9;61663:21;;;;;;;;;;;:40;;:132;;;;60445:1358;;:::o;24093:49::-;24138:4;24093:49;;;:::o;69010:477::-;51671:13;:11;:13::i;:::-;69169:1:::1;69141:30;;:16;:30;;::::0;69119:114:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69286:15;;;;;;;;;;;69266:35;;:16;:35;;::::0;69244:119:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69394:16;69376:15;;:34;;;;;;;;;;;;;;;;;;69468:10;69428:51;;69450:16;69428:51;;;;;;;;;;;;69010:477:::0;:::o;66405:726::-;66534:33;53527:23;66554:12;:10;:12::i;:::-;66534:7;:33::i;:::-;66512:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;66705:1;66677:24;:29;66655:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;66843:23;;66815:24;:51;66793:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;66979:24;66953:23;:50;;;;67102:10;67019:104;;67063:24;67019:104;;;;;;;;;;66405:726;:::o;57308:1684::-;57537:10;57548;57537:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;57536:23;57514:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;57704:23;;57661:39;57698:1;57661:20;:32;57682:10;57661:32;;;;;;;;;;;;;;;;:36;;:39;;;;:::i;:::-;:66;;57639:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;57910:10;:21;57921:9;57910:21;;;;;;;;;;;:39;;;57837:52;57887:1;57837:10;:21;57848:9;57837:21;;;;;;;;;;;:45;;;:49;;:52;;;;:::i;:::-;:112;;57815:226;;;;;;;;;;;;:::i;:::-;;;;;;;;;58054:15;58072:133;58101:10;58126;58151:9;58175:19;58072:14;:133::i;:::-;58054:151;;58216:21;58240:32;:7;:30;:32::i;:::-;58216:56;;58324:8;58307:13;:25;58285:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;58464:24;;;;;;;;;;;58432:56;;:28;58449:10;58432:8;:16;;:28;;;;:::i;:::-;:56;;;58410:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;58587:4;58562:10;58573;58562:22;;;;;;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58602:10;:21;58613:9;58602:21;;;;;;;;;;;:45;;;:47;;;;;;;;;:::i;:::-;;;;;;58660:20;:32;58681:10;58660:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;58707:3;;;;;;;;;;;:8;;;58716:10;58728;:21;58739:9;58728:21;;;;;;;;;;;:44;;;58707:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58905:9;58846:10;:21;58857:9;58846:21;;;;;;;;;;;:44;;;58821:10;58791:134;;;;;;;;;;;;58938:10;:21;58949:9;58938:21;;;;;;;;;;;:44;;;:46;;;;;;;;;:::i;:::-;;;;;;57503:1489;;57308:1684;;;;;:::o;72284:117::-;72343:7;72370:23;;72363:30;;72284:117;:::o;69829:428::-;69998:7;70105:3;70131:10;70164:9;70196:19;70066:168;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70038:211;;;;;;70018:231;;69829:428;;;;;;:::o;72518:238::-;72565:20;72603:13;72619:1;72603:17;;72598:151;72630:15;;72622:5;:23;72598:151;;;72686:51;72703:10;:21;72722:1;72714:5;:9;;;;:::i;:::-;72703:21;;;;;;;;;;;:33;;;72686:12;:16;;:51;;;;:::i;:::-;72671:66;;72647:7;;;;;:::i;:::-;;;;72598:151;;;;72518:238;:::o;72171:105::-;72224:7;72251:17;;72244:24;;72171:105;:::o;73990:357::-;74076:32;74131:13;74147:1;74131:17;;74126:214;74158:15;;74150:5;:23;74126:214;;;74226:102;74273:10;:21;74292:1;74284:5;:9;;;;:::i;:::-;74273:21;;;;;;;;;;;:40;;;74226:24;:28;;:102;;;;:::i;:::-;74199:129;;74175:7;;;;;:::i;:::-;;;;74126:214;;;;73990:357;:::o;75435:382::-;75526:37;75586:13;75602:1;75586:17;;75581:229;75613:15;;75605:5;:23;75581:229;;;75686:112;75738:10;:21;75757:1;75749:5;:9;;;;:::i;:::-;75738:21;;;;;;;;;;;:45;;;75686:29;:33;;:112;;;;:::i;:::-;75654:144;;75630:7;;;;;:::i;:::-;;;;75581:229;;;;75435:382;:::o;59000:1437::-;59226:10;59237;59226:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;59225:23;59203:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;59420:10;:21;59431:9;59420:21;;;;;;;;;;;:36;;;59350:49;59397:1;59350:10;:21;59361:9;59350:21;;;;;;;;;;;:42;;;:46;;:49;;;;:::i;:::-;:106;;59328:221;;;;;;;;;;;;:::i;:::-;;;;;;;;;59562:15;59580:133;59609:10;59634;59659:9;59683:19;59580:14;:133::i;:::-;59562:151;;59724:21;59748:32;:7;:30;:32::i;:::-;59724:56;;59832:8;59815:13;:25;59793:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;59972:21;;;;;;;;;;;59940:53;;:28;59957:10;59940:8;:16;;:28;;;;:::i;:::-;:53;;;59918:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;60092:4;60067:10;60078;60067:22;;;;;;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60107:10;:21;60118:9;60107:21;;;;;;;;;;;:42;;;:44;;;;;;;;;:::i;:::-;;;;;;60164:3;;;;;;;;;;;:8;;;60173:10;60185;:21;60196:9;60185:21;;;;;;;;;;;:41;;;60164:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60353:9;60297:10;:21;60308:9;60297:21;;;;;;;;;;;:41;;;60272:10;60245:128;;;;;;;;;;;;60386:10;:21;60397:9;60386:21;;;;;;;;;;;:41;;;:43;;;;;;;;;:::i;:::-;;;;;;59192:1245;;59000:1437;;;;;:::o;63520:253::-;63596:33;53527:23;63616:12;:10;:12::i;:::-;63596:7;:33::i;:::-;63574:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;63747:18;;;;;;;;;;;63746:19;63725:18;;:40;;;;;;;;;;;;;;;;;;63520:253::o;27396:149::-;27480:18;27493:4;27480:12;:18::i;:::-;24584:16;24595:4;24584:10;:16::i;:::-;27511:26:::1;27523:4;27529:7;27511:11;:26::i;:::-;27396:149:::0;;;:::o;73655:327::-;73735:26;73784:13;73800:1;73784:17;;73779:196;73811:15;;73803:5;:23;73779:196;;;73873:90;73914:10;:21;73933:1;73925:5;:9;;;;:::i;:::-;73914:21;;;;;;;;;;;:34;;;73873:18;:22;;:90;;;;:::i;:::-;73852:111;;73828:7;;;;;:::i;:::-;;;;73779:196;;;;73655:327;:::o;72409:101::-;72460:7;72487:15;;72480:22;;72409:101;:::o;75075:352::-;75160:31;75214:13;75230:1;75214:17;;75209:211;75241:15;;75233:5;:23;75209:211;;;75308:100;75354:10;:21;75373:1;75365:5;:9;;;;:::i;:::-;75354:21;;;;;;;;;;;:39;;;75308:23;:27;;:100;;;;:::i;:::-;75282:126;;75258:7;;;;;:::i;:::-;;;;75209:211;;;;75075:352;:::o;76173:101::-;76224:7;76251:15;;;;;;;;;;;76244:22;;76173:101;:::o;70265:1466::-;70389:28;70432:31;70478:26;70519:23;70557:20;70592:23;70630:29;70674:26;70715:32;70762:21;70798:27;70840:22;70913:10;:21;70924:9;70913:21;;;;;;;;;;;:41;;;70890:64;;70991:10;:21;71002:9;70991:21;;;;;;;;;;;:44;;;70965:70;;71067:10;:21;71078:9;71067:21;;;;;;;;;;;:39;;;71046:60;;71135:10;:21;71146:9;71135:21;;;;;;;;;;;:36;;;71117:54;;71197:10;:21;71208:9;71197:21;;;;;;;;;;;:33;;;71182:48;;71259:10;:21;71270:9;71259:21;;;;;;;;;;;:36;;;71241:54;;71330:10;:21;71341:9;71330:21;;;;;;;;;;;:42;;;71306:66;;71404:10;:21;71415:9;71404:21;;;;;;;;;;;:39;;;71383:60;;71481:10;:21;71492:9;71481:21;;;;;;;;;;;:45;;;71454:72;;71553:10;:21;71564:9;71553:21;;;;;;;;;;;:34;;;71537:50;;71620:10;:21;71631:9;71620:21;;;;;;;;;;;:40;;;71598:62;;71688:10;:21;71699:9;71688:21;;;;;;;;;;;:35;;;71671:52;;70265:1466;;;;;;;;;;;;;:::o;52684:201::-;51671:13;:11;:13::i;:::-;52793:1:::1;52773:22;;:8;:22;;::::0;52765:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;52849:28;52868:8;52849:18;:28::i;:::-;52684:201:::0;:::o;33071:98::-;33129:7;33160:1;33156;:5;;;;:::i;:::-;33149:12;;33071:98;;;;:::o;33452:::-;33510:7;33541:1;33537;:5;;;;:::i;:::-;33530:12;;33452:98;;;;:::o;21998:157::-;22083:4;22122:25;22107:40;;;:11;:40;;;;22100:47;;21998:157;;;:::o;3490:98::-;3543:7;3570:10;3563:17;;3490:98;:::o;51950:132::-;52025:12;:10;:12::i;:::-;52014:23;;:7;:5;:7::i;:::-;:23;;;52006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51950:132::o;49891:293::-;49293:1;50025:7;;:19;50017:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49293:1;50158:7;:18;;;;49891:293::o;50192:213::-;49249:1;50375:7;:22;;;;50192:213::o;25439:105::-;25506:30;25517:4;25523:12;:10;:12::i;:::-;25506:10;:30::i;:::-;25439:105;:::o;29697:238::-;29781:22;29789:4;29795:7;29781;:22::i;:::-;29776:152;;29852:4;29820:6;:12;29827:4;29820:12;;;;;;;;;;;:20;;:29;29841:7;29820:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;29903:12;:10;:12::i;:::-;29876:40;;29894:7;29876:40;;29888:4;29876:40;;;;;;;;;;29776:152;29697:238;;:::o;30115:239::-;30199:22;30207:4;30213:7;30199;:22::i;:::-;30195:152;;;30270:5;30238:6;:12;30245:4;30238:12;;;;;;;;;;;:20;;:29;30259:7;30238:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;30322:12;:10;:12::i;:::-;30295:40;;30313:7;30295:40;;30307:4;30295:40;;;;;;;;;;30195:152;30115:239;;:::o;53045:191::-;53119:16;53138:6;;;;;;;;;;;53119:25;;53164:8;53155:6;;:17;;;;;;;;;;;;;;;;;;53219:8;53188:40;;53209:8;53188:40;;;;;;;;;;;;53108:128;53045:191;:::o;33809:98::-;33867:7;33898:1;33894;:5;;;;:::i;:::-;33887:12;;33809:98;;;;:::o;44250:405::-;44319:15;44524:34;44518:4;44511:48;44586:4;44580;44573:18;44632:4;44626;44616:21;44605:32;;44250:405;;;:::o;40714:231::-;40792:7;40813:17;40832:18;40854:27;40865:4;40871:9;40854:10;:27::i;:::-;40812:69;;;;40892:18;40904:5;40892:11;:18::i;:::-;40928:9;40921:16;;;;40714:231;;;;:::o;25834:492::-;25923:22;25931:4;25937:7;25923;:22::i;:::-;25918:401;;26111:28;26131:7;26111:19;:28::i;:::-;26212:38;26240:4;26232:13;;26247:2;26212:19;:38::i;:::-;26016:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25962:345;;;;;;;;;;;:::i;:::-;;;;;;;;25918:401;25834:492;;:::o;39165:747::-;39246:7;39255:12;39304:2;39284:9;:16;:22;39280:625;;39323:9;39347;39371:7;39628:4;39617:9;39613:20;39607:27;39602:32;;39678:4;39667:9;39663:20;39657:27;39652:32;;39736:4;39725:9;39721:20;39715:27;39712:1;39707:36;39702:41;;39779:25;39790:4;39796:1;39799;39802;39779:10;:25::i;:::-;39772:32;;;;;;;;;39280:625;39853:1;39857:35;39837:56;;;;39165:747;;;;;;:::o;37558:521::-;37636:20;37627:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;37623:449;37673:7;37623:449;37734:29;37725:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;37721:351;;37780:34;;;;;;;;;;:::i;:::-;;;;;;;;37721:351;37845:35;37836:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;37832:240;;37897:41;;;;;;;;;;:::i;:::-;;;;;;;;37832:240;37969:30;37960:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;37956:116;;38016:44;;;;;;;;;;:::i;:::-;;;;;;;;37956:116;37558:521;;:::o;20160:151::-;20218:13;20251:52;20279:4;20263:22;;18035:2;20251:52;;:11;:52::i;:::-;20244:59;;20160:151;;;:::o;19556:447::-;19631:13;19657:19;19702:1;19693:6;19689:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19679:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19657:47;;19715:15;:6;19722:1;19715:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19741;:6;19748:1;19741:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19772:9;19797:1;19788:6;19784:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19772:26;;19767:131;19804:1;19800;:5;19767:131;;;19839:8;19856:3;19848:5;:11;19839:21;;;;;;;:::i;:::-;;;;;19827:6;19834:1;19827:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;19885:1;19875:11;;;;;19807:3;;;;:::i;:::-;;;19767:131;;;;19925:1;19916:5;:10;19908:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;19988:6;19974:21;;;19556:447;;;;:::o;42098:1477::-;42186:7;42195:12;43120:66;43115:1;43107:10;;:79;43103:163;;;43219:1;43223:30;43203:51;;;;;;43103:163;43363:14;43380:24;43390:4;43396:1;43399;43402;43380:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43363:41;;43437:1;43419:20;;:6;:20;;;43415:103;;43472:1;43476:29;43456:50;;;;;;;43415:103;43538:6;43546:20;43530:37;;;;;42098:1477;;;;;;;;:::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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:117::-;2469:1;2466;2459:12;2483:102;2524:6;2575:2;2571:7;2566:2;2559:5;2555:14;2551:28;2541:38;;2483:102;;;:::o;2591:180::-;2639:77;2636:1;2629:88;2736:4;2733:1;2726:15;2760:4;2757:1;2750:15;2777:281;2860:27;2882:4;2860:27;:::i;:::-;2852:6;2848:40;2990:6;2978:10;2975:22;2954:18;2942:10;2939:34;2936:62;2933:88;;;3001:18;;:::i;:::-;2933:88;3041:10;3037:2;3030:22;2820:238;2777:281;;:::o;3064:129::-;3098:6;3125:20;;:::i;:::-;3115:30;;3154:33;3182:4;3174:6;3154:33;:::i;:::-;3064:129;;;:::o;3199:311::-;3276:4;3366:18;3358:6;3355:30;3352:56;;;3388:18;;:::i;:::-;3352:56;3438:4;3430:6;3426:17;3418:25;;3498:4;3492;3488:15;3480:23;;3199:311;;;:::o;3516:117::-;3625:1;3622;3615:12;3639:77;3676:7;3705:5;3694:16;;3639:77;;;:::o;3722:122::-;3795:24;3813:5;3795:24;:::i;:::-;3788:5;3785:35;3775:63;;3834:1;3831;3824:12;3775:63;3722:122;:::o;3850:139::-;3896:5;3934:6;3921:20;3912:29;;3950:33;3977:5;3950:33;:::i;:::-;3850:139;;;;:::o;4012:710::-;4108:5;4133:81;4149:64;4206:6;4149:64;:::i;:::-;4133:81;:::i;:::-;4124:90;;4234:5;4263:6;4256:5;4249:21;4297:4;4290:5;4286:16;4279:23;;4350:4;4342:6;4338:17;4330:6;4326:30;4379:3;4371:6;4368:15;4365:122;;;4398:79;;:::i;:::-;4365:122;4513:6;4496:220;4530:6;4525:3;4522:15;4496:220;;;4605:3;4634:37;4667:3;4655:10;4634:37;:::i;:::-;4629:3;4622:50;4701:4;4696:3;4692:14;4685:21;;4572:144;4556:4;4551:3;4547:14;4540:21;;4496:220;;;4500:21;4114:608;;4012:710;;;;;:::o;4745:370::-;4816:5;4865:3;4858:4;4850:6;4846:17;4842:27;4832:122;;4873:79;;:::i;:::-;4832:122;4990:6;4977:20;5015:94;5105:3;5097:6;5090:4;5082:6;5078:17;5015:94;:::i;:::-;5006:103;;4822:293;4745:370;;;;:::o;5121:539::-;5205:6;5254:2;5242:9;5233:7;5229:23;5225:32;5222:119;;;5260:79;;:::i;:::-;5222:119;5408:1;5397:9;5393:17;5380:31;5438:18;5430:6;5427:30;5424:117;;;5460:79;;:::i;:::-;5424:117;5565:78;5635:7;5626:6;5615:9;5611:22;5565:78;:::i;:::-;5555:88;;5351:302;5121:539;;;;:::o;5666:118::-;5753:24;5771:5;5753:24;:::i;:::-;5748:3;5741:37;5666:118;;:::o;5790:222::-;5883:4;5921:2;5910:9;5906:18;5898:26;;5934:71;6002:1;5991:9;5987:17;5978:6;5934:71;:::i;:::-;5790:222;;;;:::o;6018:329::-;6077:6;6126:2;6114:9;6105:7;6101:23;6097:32;6094:119;;;6132:79;;:::i;:::-;6094:119;6252:1;6277:53;6322:7;6313:6;6302:9;6298:22;6277:53;:::i;:::-;6267:63;;6223:117;6018:329;;;;:::o;6353:117::-;6462:1;6459;6452:12;6476:307;6537:4;6627:18;6619:6;6616:30;6613:56;;;6649:18;;:::i;:::-;6613:56;6687:29;6709:6;6687:29;:::i;:::-;6679:37;;6771:4;6765;6761:15;6753:23;;6476:307;;;:::o;6789:146::-;6886:6;6881:3;6876;6863:30;6927:1;6918:6;6913:3;6909:16;6902:27;6789:146;;;:::o;6941:423::-;7018:5;7043:65;7059:48;7100:6;7059:48;:::i;:::-;7043:65;:::i;:::-;7034:74;;7131:6;7124:5;7117:21;7169:4;7162:5;7158:16;7207:3;7198:6;7193:3;7189:16;7186:25;7183:112;;;7214:79;;:::i;:::-;7183:112;7304:54;7351:6;7346:3;7341;7304:54;:::i;:::-;7024:340;6941:423;;;;;:::o;7383:338::-;7438:5;7487:3;7480:4;7472:6;7468:17;7464:27;7454:122;;7495:79;;:::i;:::-;7454:122;7612:6;7599:20;7637:78;7711:3;7703:6;7696:4;7688:6;7684:17;7637:78;:::i;:::-;7628:87;;7444:277;7383:338;;;;:::o;7727:507::-;7795:6;7844:2;7832:9;7823:7;7819:23;7815:32;7812:119;;;7850:79;;:::i;:::-;7812:119;7998:1;7987:9;7983:17;7970:31;8028:18;8020:6;8017:30;8014:117;;;8050:79;;:::i;:::-;8014:117;8155:62;8209:7;8200:6;8189:9;8185:22;8155:62;:::i;:::-;8145:72;;7941:286;7727:507;;;;:::o;8240:77::-;8277:7;8306:5;8295:16;;8240:77;;;:::o;8323:122::-;8396:24;8414:5;8396:24;:::i;:::-;8389:5;8386:35;8376:63;;8435:1;8432;8425:12;8376:63;8323:122;:::o;8451:139::-;8497:5;8535:6;8522:20;8513:29;;8551:33;8578:5;8551:33;:::i;:::-;8451:139;;;;:::o;8596:329::-;8655:6;8704:2;8692:9;8683:7;8679:23;8675:32;8672:119;;;8710:79;;:::i;:::-;8672:119;8830:1;8855:53;8900:7;8891:6;8880:9;8876:22;8855:53;:::i;:::-;8845:63;;8801:117;8596:329;;;;:::o;8931:118::-;9018:24;9036:5;9018:24;:::i;:::-;9013:3;9006:37;8931:118;;:::o;9055:222::-;9148:4;9186:2;9175:9;9171:18;9163:26;;9199:71;9267:1;9256:9;9252:17;9243:6;9199:71;:::i;:::-;9055:222;;;;:::o;9283:118::-;9370:24;9388:5;9370:24;:::i;:::-;9365:3;9358:37;9283:118;;:::o;9407:222::-;9500:4;9538:2;9527:9;9523:18;9515:26;;9551:71;9619:1;9608:9;9604:17;9595:6;9551:71;:::i;:::-;9407:222;;;;:::o;9635:474::-;9703:6;9711;9760:2;9748:9;9739:7;9735:23;9731:32;9728:119;;;9766:79;;:::i;:::-;9728:119;9886:1;9911:53;9956:7;9947:6;9936:9;9932:22;9911:53;:::i;:::-;9901:63;;9857:117;10013:2;10039:53;10084:7;10075:6;10064:9;10060:22;10039:53;:::i;:::-;10029:63;;9984:118;9635:474;;;;;:::o;10115:60::-;10143:3;10164:5;10157:12;;10115:60;;;:::o;10181:142::-;10231:9;10264:53;10282:34;10291:24;10309:5;10291:24;:::i;:::-;10282:34;:::i;:::-;10264:53;:::i;:::-;10251:66;;10181:142;;;:::o;10329:126::-;10379:9;10412:37;10443:5;10412:37;:::i;:::-;10399:50;;10329:126;;;:::o;10461:142::-;10527:9;10560:37;10591:5;10560:37;:::i;:::-;10547:50;;10461:142;;;:::o;10609:163::-;10712:53;10759:5;10712:53;:::i;:::-;10707:3;10700:66;10609:163;;:::o;10778:254::-;10887:4;10925:2;10914:9;10910:18;10902:26;;10938:87;11022:1;11011:9;11007:17;10998:6;10938:87;:::i;:::-;10778:254;;;;:::o;11038:474::-;11106:6;11114;11163:2;11151:9;11142:7;11138:23;11134:32;11131:119;;;11169:79;;:::i;:::-;11131:119;11289:1;11314:53;11359:7;11350:6;11339:9;11335:22;11314:53;:::i;:::-;11304:63;;11260:117;11416:2;11442:53;11487:7;11478:6;11467:9;11463:22;11442:53;:::i;:::-;11432:63;;11387:118;11038:474;;;;;:::o;11518:104::-;11563:7;11592:24;11610:5;11592:24;:::i;:::-;11581:35;;11518:104;;;:::o;11628:138::-;11709:32;11735:5;11709:32;:::i;:::-;11702:5;11699:43;11689:71;;11756:1;11753;11746:12;11689:71;11628:138;:::o;11772:155::-;11826:5;11864:6;11851:20;11842:29;;11880:41;11915:5;11880:41;:::i;:::-;11772:155;;;;:::o;11933:345::-;12000:6;12049:2;12037:9;12028:7;12024:23;12020:32;12017:119;;;12055:79;;:::i;:::-;12017:119;12175:1;12200:61;12253:7;12244:6;12233:9;12229:22;12200:61;:::i;:::-;12190:71;;12146:125;11933:345;;;;:::o;12284:1089::-;12388:6;12396;12404;12412;12420;12469:3;12457:9;12448:7;12444:23;12440:33;12437:120;;;12476:79;;:::i;:::-;12437:120;12596:1;12621:53;12666:7;12657:6;12646:9;12642:22;12621:53;:::i;:::-;12611:63;;12567:117;12723:2;12749:53;12794:7;12785:6;12774:9;12770:22;12749:53;:::i;:::-;12739:63;;12694:118;12851:2;12877:53;12922:7;12913:6;12902:9;12898:22;12877:53;:::i;:::-;12867:63;;12822:118;12979:2;13005:53;13050:7;13041:6;13030:9;13026:22;13005:53;:::i;:::-;12995:63;;12950:118;13135:3;13124:9;13120:19;13107:33;13167:18;13159:6;13156:30;13153:117;;;13189:79;;:::i;:::-;13153:117;13294:62;13348:7;13339:6;13328:9;13324:22;13294:62;:::i;:::-;13284:72;;13078:288;12284:1089;;;;;;;;:::o;13379:765::-;13465:6;13473;13481;13489;13538:3;13526:9;13517:7;13513:23;13509:33;13506:120;;;13545:79;;:::i;:::-;13506:120;13665:1;13690:53;13735:7;13726:6;13715:9;13711:22;13690:53;:::i;:::-;13680:63;;13636:117;13792:2;13818:53;13863:7;13854:6;13843:9;13839:22;13818:53;:::i;:::-;13808:63;;13763:118;13920:2;13946:53;13991:7;13982:6;13971:9;13967:22;13946:53;:::i;:::-;13936:63;;13891:118;14048:2;14074:53;14119:7;14110:6;14099:9;14095:22;14074:53;:::i;:::-;14064:63;;14019:118;13379:765;;;;;;;:::o;14150:1445::-;14553:4;14591:3;14580:9;14576:19;14568:27;;14605:71;14673:1;14662:9;14658:17;14649:6;14605:71;:::i;:::-;14686:72;14754:2;14743:9;14739:18;14730:6;14686:72;:::i;:::-;14768;14836:2;14825:9;14821:18;14812:6;14768:72;:::i;:::-;14850;14918:2;14907:9;14903:18;14894:6;14850:72;:::i;:::-;14932:73;15000:3;14989:9;14985:19;14976:6;14932:73;:::i;:::-;15015;15083:3;15072:9;15068:19;15059:6;15015:73;:::i;:::-;15098;15166:3;15155:9;15151:19;15142:6;15098:73;:::i;:::-;15181;15249:3;15238:9;15234:19;15225:6;15181:73;:::i;:::-;15264;15332:3;15321:9;15317:19;15308:6;15264:73;:::i;:::-;15347;15415:3;15404:9;15400:19;15391:6;15347:73;:::i;:::-;15430:74;15499:3;15488:9;15484:19;15474:7;15430:74;:::i;:::-;15514;15583:3;15572:9;15568:19;15558:7;15514:74;:::i;:::-;14150:1445;;;;;;;;;;;;;;;:::o;15601:169::-;15685:11;15719:6;15714:3;15707:19;15759:4;15754:3;15750:14;15735:29;;15601:169;;;;:::o;15776:236::-;15916:34;15912:1;15904:6;15900:14;15893:58;15985:19;15980:2;15972:6;15968:15;15961:44;15776:236;:::o;16018:366::-;16160:3;16181:67;16245:2;16240:3;16181:67;:::i;:::-;16174:74;;16257:93;16346:3;16257:93;:::i;:::-;16375:2;16370:3;16366:12;16359:19;;16018:366;;;:::o;16390:419::-;16556:4;16594:2;16583:9;16579:18;16571:26;;16643:9;16637:4;16633:20;16629:1;16618:9;16614:17;16607:47;16671:131;16797:4;16671:131;:::i;:::-;16663:139;;16390:419;;;:::o;16815:221::-;16955:34;16951:1;16943:6;16939:14;16932:58;17024:4;17019:2;17011:6;17007:15;17000:29;16815:221;:::o;17042:366::-;17184:3;17205:67;17269:2;17264:3;17205:67;:::i;:::-;17198:74;;17281:93;17370:3;17281:93;:::i;:::-;17399:2;17394:3;17390:12;17383:19;;17042:366;;;:::o;17414:419::-;17580:4;17618:2;17607:9;17603:18;17595:26;;17667:9;17661:4;17657:20;17653:1;17642:9;17638:17;17631:47;17695:131;17821:4;17695:131;:::i;:::-;17687:139;;17414:419;;;:::o;17839:226::-;17979:34;17975:1;17967:6;17963:14;17956:58;18048:9;18043:2;18035:6;18031:15;18024:34;17839:226;:::o;18071:366::-;18213:3;18234:67;18298:2;18293:3;18234:67;:::i;:::-;18227:74;;18310:93;18399:3;18310:93;:::i;:::-;18428:2;18423:3;18419:12;18412:19;;18071:366;;;:::o;18443:419::-;18609:4;18647:2;18636:9;18632:18;18624:26;;18696:9;18690:4;18686:20;18682:1;18671:9;18667:17;18660:47;18724:131;18850:4;18724:131;:::i;:::-;18716:139;;18443:419;;;:::o;18868:242::-;19008:34;19004:1;18996:6;18992:14;18985:58;19077:25;19072:2;19064:6;19060:15;19053:50;18868:242;:::o;19116:366::-;19258:3;19279:67;19343:2;19338:3;19279:67;:::i;:::-;19272:74;;19355:93;19444:3;19355:93;:::i;:::-;19473:2;19468:3;19464:12;19457:19;;19116:366;;;:::o;19488:419::-;19654:4;19692:2;19681:9;19677:18;19669:26;;19741:9;19735:4;19731:20;19727:1;19716:9;19712:17;19705:47;19769:131;19895:4;19769:131;:::i;:::-;19761:139;;19488:419;;;:::o;19913:180::-;19961:77;19958:1;19951:88;20058:4;20055:1;20048:15;20082:4;20079:1;20072:15;20099:295;20239:34;20235:1;20227:6;20223:14;20216:58;20308:34;20303:2;20295:6;20291:15;20284:59;20377:9;20372:2;20364:6;20360:15;20353:34;20099:295;:::o;20400:366::-;20542:3;20563:67;20627:2;20622:3;20563:67;:::i;:::-;20556:74;;20639:93;20728:3;20639:93;:::i;:::-;20757:2;20752:3;20748:12;20741:19;;20400:366;;;:::o;20772:419::-;20938:4;20976:2;20965:9;20961:18;20953:26;;21025:9;21019:4;21015:20;21011:1;21000:9;20996:17;20989:47;21053:131;21179:4;21053:131;:::i;:::-;21045:139;;20772:419;;;:::o;21197:294::-;21337:34;21333:1;21325:6;21321:14;21314:58;21406:34;21401:2;21393:6;21389:15;21382:59;21475:8;21470:2;21462:6;21458:15;21451:33;21197:294;:::o;21497:366::-;21639:3;21660:67;21724:2;21719:3;21660:67;:::i;:::-;21653:74;;21736:93;21825:3;21736:93;:::i;:::-;21854:2;21849:3;21845:12;21838:19;;21497:366;;;:::o;21869:419::-;22035:4;22073:2;22062:9;22058:18;22050:26;;22122:9;22116:4;22112:20;22108:1;22097:9;22093:17;22086:47;22150:131;22276:4;22150:131;:::i;:::-;22142:139;;21869:419;;;:::o;22294:180::-;22342:77;22339:1;22332:88;22439:4;22436:1;22429:15;22463:4;22460:1;22453:15;22480:233;22519:3;22542:24;22560:5;22542:24;:::i;:::-;22533:33;;22588:66;22581:5;22578:77;22575:103;;22658:18;;:::i;:::-;22575:103;22705:1;22698:5;22694:13;22687:20;;22480:233;;;:::o;22719:191::-;22759:3;22778:20;22796:1;22778:20;:::i;:::-;22773:25;;22812:20;22830:1;22812:20;:::i;:::-;22807:25;;22855:1;22852;22848:9;22841:16;;22876:3;22873:1;22870:10;22867:36;;;22883:18;;:::i;:::-;22867:36;22719:191;;;;:::o;22916:220::-;23056:34;23052:1;23044:6;23040:14;23033:58;23125:3;23120:2;23112:6;23108:15;23101:28;22916:220;:::o;23142:366::-;23284:3;23305:67;23369:2;23364:3;23305:67;:::i;:::-;23298:74;;23381:93;23470:3;23381:93;:::i;:::-;23499:2;23494:3;23490:12;23483:19;;23142:366;;;:::o;23514:419::-;23680:4;23718:2;23707:9;23703:18;23695:26;;23767:9;23761:4;23757:20;23753:1;23742:9;23738:17;23731:47;23795:131;23921:4;23795:131;:::i;:::-;23787:139;;23514:419;;;:::o;23939:98::-;23990:6;24024:5;24018:12;24008:22;;23939:98;;;:::o;24043:147::-;24144:11;24181:3;24166:18;;24043:147;;;;:::o;24196:246::-;24277:1;24287:113;24301:6;24298:1;24295:13;24287:113;;;24386:1;24381:3;24377:11;24371:18;24367:1;24362:3;24358:11;24351:39;24323:2;24320:1;24316:10;24311:15;;24287:113;;;24434:1;24425:6;24420:3;24416:16;24409:27;24258:184;24196:246;;;:::o;24448:386::-;24552:3;24580:38;24612:5;24580:38;:::i;:::-;24634:88;24715:6;24710:3;24634:88;:::i;:::-;24627:95;;24731:65;24789:6;24784:3;24777:4;24770:5;24766:16;24731:65;:::i;:::-;24821:6;24816:3;24812:16;24805:23;;24556:278;24448:386;;;;:::o;24840:271::-;24970:3;24992:93;25081:3;25072:6;24992:93;:::i;:::-;24985:100;;25102:3;25095:10;;24840:271;;;;:::o;25117:234::-;25257:34;25253:1;25245:6;25241:14;25234:58;25326:17;25321:2;25313:6;25309:15;25302:42;25117:234;:::o;25357:366::-;25499:3;25520:67;25584:2;25579:3;25520:67;:::i;:::-;25513:74;;25596:93;25685:3;25596:93;:::i;:::-;25714:2;25709:3;25705:12;25698:19;;25357:366;;;:::o;25729:419::-;25895:4;25933:2;25922:9;25918:18;25910:26;;25982:9;25976:4;25972:20;25968:1;25957:9;25953:17;25946:47;26010:131;26136:4;26010:131;:::i;:::-;26002:139;;25729:419;;;:::o;26154:240::-;26294:34;26290:1;26282:6;26278:14;26271:58;26363:23;26358:2;26350:6;26346:15;26339:48;26154:240;:::o;26400:366::-;26542:3;26563:67;26627:2;26622:3;26563:67;:::i;:::-;26556:74;;26639:93;26728:3;26639:93;:::i;:::-;26757:2;26752:3;26748:12;26741:19;;26400:366;;;:::o;26772:419::-;26938:4;26976:2;26965:9;26961:18;26953:26;;27025:9;27019:4;27015:20;27011:1;27000:9;26996:17;26989:47;27053:131;27179:4;27053:131;:::i;:::-;27045:139;;26772:419;;;:::o;27197:231::-;27337:34;27333:1;27325:6;27321:14;27314:58;27406:14;27401:2;27393:6;27389:15;27382:39;27197:231;:::o;27434:366::-;27576:3;27597:67;27661:2;27656:3;27597:67;:::i;:::-;27590:74;;27673:93;27762:3;27673:93;:::i;:::-;27791:2;27786:3;27782:12;27775:19;;27434:366;;;:::o;27806:419::-;27972:4;28010:2;27999:9;27995:18;27987:26;;28059:9;28053:4;28049:20;28045:1;28034:9;28030:17;28023:47;28087:131;28213:4;28087:131;:::i;:::-;28079:139;;27806:419;;;:::o;28231:182::-;28371:34;28367:1;28359:6;28355:14;28348:58;28231:182;:::o;28419:366::-;28561:3;28582:67;28646:2;28641:3;28582:67;:::i;:::-;28575:74;;28658:93;28747:3;28658:93;:::i;:::-;28776:2;28771:3;28767:12;28760:19;;28419:366;;;:::o;28791:419::-;28957:4;28995:2;28984:9;28980:18;28972:26;;29044:9;29038:4;29034:20;29030:1;29019:9;29015:17;29008:47;29072:131;29198:4;29072:131;:::i;:::-;29064:139;;28791:419;;;:::o;29216:243::-;29356:34;29352:1;29344:6;29340:14;29333:58;29425:26;29420:2;29412:6;29408:15;29401:51;29216:243;:::o;29465:366::-;29607:3;29628:67;29692:2;29687:3;29628:67;:::i;:::-;29621:74;;29704:93;29793:3;29704:93;:::i;:::-;29822:2;29817:3;29813:12;29806:19;;29465:366;;;:::o;29837:419::-;30003:4;30041:2;30030:9;30026:18;30018:26;;30090:9;30084:4;30080:20;30076:1;30065:9;30061:17;30054:47;30118:131;30244:4;30118:131;:::i;:::-;30110:139;;29837:419;;;:::o;30262:250::-;30402:34;30398:1;30390:6;30386:14;30379:58;30471:33;30466:2;30458:6;30454:15;30447:58;30262:250;:::o;30518:366::-;30660:3;30681:67;30745:2;30740:3;30681:67;:::i;:::-;30674:74;;30757:93;30846:3;30757:93;:::i;:::-;30875:2;30870:3;30866:12;30859:19;;30518:366;;;:::o;30890:419::-;31056:4;31094:2;31083:9;31079:18;31071:26;;31143:9;31137:4;31133:20;31129:1;31118:9;31114:17;31107:47;31171:131;31297:4;31171:131;:::i;:::-;31163:139;;30890:419;;;:::o;31315:332::-;31436:4;31474:2;31463:9;31459:18;31451:26;;31487:71;31555:1;31544:9;31540:17;31531:6;31487:71;:::i;:::-;31568:72;31636:2;31625:9;31621:18;31612:6;31568:72;:::i;:::-;31315:332;;;;;:::o;31653:221::-;31793:34;31789:1;31781:6;31777:14;31770:58;31862:4;31857:2;31849:6;31845:15;31838:29;31653:221;:::o;31880:366::-;32022:3;32043:67;32107:2;32102:3;32043:67;:::i;:::-;32036:74;;32119:93;32208:3;32119:93;:::i;:::-;32237:2;32232:3;32228:12;32221:19;;31880:366;;;:::o;32252:419::-;32418:4;32456:2;32445:9;32441:18;32433:26;;32505:9;32499:4;32495:20;32491:1;32480:9;32476:17;32469:47;32533:131;32659:4;32533:131;:::i;:::-;32525:139;;32252:419;;;:::o;32677:235::-;32817:34;32813:1;32805:6;32801:14;32794:58;32886:18;32881:2;32873:6;32869:15;32862:43;32677:235;:::o;32918:366::-;33060:3;33081:67;33145:2;33140:3;33081:67;:::i;:::-;33074:74;;33157:93;33246:3;33157:93;:::i;:::-;33275:2;33270:3;33266:12;33259:19;;32918:366;;;:::o;33290:419::-;33456:4;33494:2;33483:9;33479:18;33471:26;;33543:9;33537:4;33533:20;33529:1;33518:9;33514:17;33507:47;33571:131;33697:4;33571:131;:::i;:::-;33563:139;;33290:419;;;:::o;33715:228::-;33855:34;33851:1;33843:6;33839:14;33832:58;33924:11;33919:2;33911:6;33907:15;33900:36;33715:228;:::o;33949:366::-;34091:3;34112:67;34176:2;34171:3;34112:67;:::i;:::-;34105:74;;34188:93;34277:3;34188:93;:::i;:::-;34306:2;34301:3;34297:12;34290:19;;33949:366;;;:::o;34321:419::-;34487:4;34525:2;34514:9;34510:18;34502:26;;34574:9;34568:4;34564:20;34560:1;34549:9;34545:17;34538:47;34602:131;34728:4;34602:131;:::i;:::-;34594:139;;34321:419;;;:::o;34746:236::-;34886:34;34882:1;34874:6;34870:14;34863:58;34955:19;34950:2;34942:6;34938:15;34931:44;34746:236;:::o;34988:366::-;35130:3;35151:67;35215:2;35210:3;35151:67;:::i;:::-;35144:74;;35227:93;35316:3;35227:93;:::i;:::-;35345:2;35340:3;35336:12;35329:19;;34988:366;;;:::o;35360:419::-;35526:4;35564:2;35553:9;35549:18;35541:26;;35613:9;35607:4;35603:20;35599:1;35588:9;35584:17;35577:47;35641:131;35767:4;35641:131;:::i;:::-;35633:139;;35360:419;;;:::o;35785:251::-;35925:34;35921:1;35913:6;35909:14;35902:58;35994:34;35989:2;35981:6;35977:15;35970:59;35785:251;:::o;36042:366::-;36184:3;36205:67;36269:2;36264:3;36205:67;:::i;:::-;36198:74;;36281:93;36370:3;36281:93;:::i;:::-;36399:2;36394:3;36390:12;36383:19;;36042:366;;;:::o;36414:419::-;36580:4;36618:2;36607:9;36603:18;36595:26;;36667:9;36661:4;36657:20;36653:1;36642:9;36638:17;36631:47;36695:131;36821:4;36695:131;:::i;:::-;36687:139;;36414:419;;;:::o;36839:226::-;36979:34;36975:1;36967:6;36963:14;36956:58;37048:9;37043:2;37035:6;37031:15;37024:34;36839:226;:::o;37071:366::-;37213:3;37234:67;37298:2;37293:3;37234:67;:::i;:::-;37227:74;;37310:93;37399:3;37310:93;:::i;:::-;37428:2;37423:3;37419:12;37412:19;;37071:366;;;:::o;37443:419::-;37609:4;37647:2;37636:9;37632:18;37624:26;;37696:9;37690:4;37686:20;37682:1;37671:9;37667:17;37660:47;37724:131;37850:4;37724:131;:::i;:::-;37716:139;;37443:419;;;:::o;37868:220::-;38008:34;38004:1;37996:6;37992:14;37985:58;38077:3;38072:2;38064:6;38060:15;38053:28;37868:220;:::o;38094:366::-;38236:3;38257:67;38321:2;38316:3;38257:67;:::i;:::-;38250:74;;38333:93;38422:3;38333:93;:::i;:::-;38451:2;38446:3;38442:12;38435:19;;38094:366;;;:::o;38466:419::-;38632:4;38670:2;38659:9;38655:18;38647:26;;38719:9;38713:4;38709:20;38705:1;38694:9;38690:17;38683:47;38747:131;38873:4;38747:131;:::i;:::-;38739:139;;38466:419;;;:::o;38891:94::-;38924:8;38972:5;38968:2;38964:14;38943:35;;38891:94;;;:::o;38991:::-;39030:7;39059:20;39073:5;39059:20;:::i;:::-;39048:31;;38991:94;;;:::o;39091:100::-;39130:7;39159:26;39179:5;39159:26;:::i;:::-;39148:37;;39091:100;;;:::o;39197:157::-;39302:45;39322:24;39340:5;39322:24;:::i;:::-;39302:45;:::i;:::-;39297:3;39290:58;39197:157;;:::o;39360:79::-;39399:7;39428:5;39417:16;;39360:79;;;:::o;39445:157::-;39550:45;39570:24;39588:5;39570:24;:::i;:::-;39550:45;:::i;:::-;39545:3;39538:58;39445:157;;:::o;39608:679::-;39804:3;39819:75;39890:3;39881:6;39819:75;:::i;:::-;39919:2;39914:3;39910:12;39903:19;;39932:75;40003:3;39994:6;39932:75;:::i;:::-;40032:2;40027:3;40023:12;40016:19;;40045:75;40116:3;40107:6;40045:75;:::i;:::-;40145:2;40140:3;40136:12;40129:19;;40158:75;40229:3;40220:6;40158:75;:::i;:::-;40258:2;40253:3;40249:12;40242:19;;40278:3;40271:10;;39608:679;;;;;;;:::o;40293:289::-;40433:34;40429:1;40421:6;40417:14;40410:58;40502:34;40497:2;40489:6;40485:15;40478:59;40571:3;40566:2;40558:6;40554:15;40547:28;40293:289;:::o;40588:366::-;40730:3;40751:67;40815:2;40810:3;40751:67;:::i;:::-;40744:74;;40827:93;40916:3;40827:93;:::i;:::-;40945:2;40940:3;40936:12;40929:19;;40588:366;;;:::o;40960:419::-;41126:4;41164:2;41153:9;41149:18;41141:26;;41213:9;41207:4;41203:20;41199:1;41188:9;41184:17;41177:47;41241:131;41367:4;41241:131;:::i;:::-;41233:139;;40960:419;;;:::o;41385:242::-;41525:34;41521:1;41513:6;41509:14;41502:58;41594:25;41589:2;41581:6;41577:15;41570:50;41385:242;:::o;41633:366::-;41775:3;41796:67;41860:2;41855:3;41796:67;:::i;:::-;41789:74;;41872:93;41961:3;41872:93;:::i;:::-;41990:2;41985:3;41981:12;41974:19;;41633:366;;;:::o;42005:419::-;42171:4;42209:2;42198:9;42194:18;42186:26;;42258:9;42252:4;42248:20;42244:1;42233:9;42229:17;42222:47;42286:131;42412:4;42286:131;:::i;:::-;42278:139;;42005:419;;;:::o;42430:225::-;42570:34;42566:1;42558:6;42554:14;42547:58;42639:8;42634:2;42626:6;42622:15;42615:33;42430:225;:::o;42661:366::-;42803:3;42824:67;42888:2;42883:3;42824:67;:::i;:::-;42817:74;;42900:93;42989:3;42900:93;:::i;:::-;43018:2;43013:3;43009:12;43002:19;;42661:366;;;:::o;43033:419::-;43199:4;43237:2;43226:9;43222:18;43214:26;;43286:9;43280:4;43276:20;43272:1;43261:9;43257:17;43250:47;43314:131;43440:4;43314:131;:::i;:::-;43306:139;;43033:419;;;:::o;43458:194::-;43498:4;43518:20;43536:1;43518:20;:::i;:::-;43513:25;;43552:20;43570:1;43552:20;:::i;:::-;43547:25;;43596:1;43593;43589:9;43581:17;;43620:1;43614:4;43611:11;43608:37;;;43625:18;;:::i;:::-;43608:37;43458:194;;;;:::o;43658:182::-;43798:34;43794:1;43786:6;43782:14;43775:58;43658:182;:::o;43846:366::-;43988:3;44009:67;44073:2;44068:3;44009:67;:::i;:::-;44002:74;;44085:93;44174:3;44085:93;:::i;:::-;44203:2;44198:3;44194:12;44187:19;;43846:366;;;:::o;44218:419::-;44384:4;44422:2;44411:9;44407:18;44399:26;;44471:9;44465:4;44461:20;44457:1;44446:9;44442:17;44435:47;44499:131;44625:4;44499:131;:::i;:::-;44491:139;;44218:419;;;:::o;44643:181::-;44783:33;44779:1;44771:6;44767:14;44760:57;44643:181;:::o;44830:366::-;44972:3;44993:67;45057:2;45052:3;44993:67;:::i;:::-;44986:74;;45069:93;45158:3;45069:93;:::i;:::-;45187:2;45182:3;45178:12;45171:19;;44830:366;;;:::o;45202:419::-;45368:4;45406:2;45395:9;45391:18;45383:26;;45455:9;45449:4;45445:20;45441:1;45430:9;45426:17;45419:47;45483:131;45609:4;45483:131;:::i;:::-;45475:139;;45202:419;;;:::o;45627:410::-;45667:7;45690:20;45708:1;45690:20;:::i;:::-;45685:25;;45724:20;45742:1;45724:20;:::i;:::-;45719:25;;45779:1;45776;45772:9;45801:30;45819:11;45801:30;:::i;:::-;45790:41;;45980:1;45971:7;45967:15;45964:1;45961:22;45941:1;45934:9;45914:83;45891:139;;46010:18;;:::i;:::-;45891:139;45675:362;45627:410;;;;:::o;46043:148::-;46145:11;46182:3;46167:18;;46043:148;;;;:::o;46197:173::-;46337:25;46333:1;46325:6;46321:14;46314:49;46197:173;:::o;46376:402::-;46536:3;46557:85;46639:2;46634:3;46557:85;:::i;:::-;46550:92;;46651:93;46740:3;46651:93;:::i;:::-;46769:2;46764:3;46760:12;46753:19;;46376:402;;;:::o;46784:99::-;46836:6;46870:5;46864:12;46854:22;;46784:99;;;:::o;46889:390::-;46995:3;47023:39;47056:5;47023:39;:::i;:::-;47078:89;47160:6;47155:3;47078:89;:::i;:::-;47071:96;;47176:65;47234:6;47229:3;47222:4;47215:5;47211:16;47176:65;:::i;:::-;47266:6;47261:3;47257:16;47250:23;;46999:280;46889:390;;;;:::o;47285:167::-;47425:19;47421:1;47413:6;47409:14;47402:43;47285:167;:::o;47458:402::-;47618:3;47639:85;47721:2;47716:3;47639:85;:::i;:::-;47632:92;;47733:93;47822:3;47733:93;:::i;:::-;47851:2;47846:3;47842:12;47835:19;;47458:402;;;:::o;47866:967::-;48248:3;48270:148;48414:3;48270:148;:::i;:::-;48263:155;;48435:95;48526:3;48517:6;48435:95;:::i;:::-;48428:102;;48547:148;48691:3;48547:148;:::i;:::-;48540:155;;48712:95;48803:3;48794:6;48712:95;:::i;:::-;48705:102;;48824:3;48817:10;;47866:967;;;;;:::o;48839:377::-;48927:3;48955:39;48988:5;48955:39;:::i;:::-;49010:71;49074:6;49069:3;49010:71;:::i;:::-;49003:78;;49090:65;49148:6;49143:3;49136:4;49129:5;49125:16;49090:65;:::i;:::-;49180:29;49202:6;49180:29;:::i;:::-;49175:3;49171:39;49164:46;;48931:285;48839:377;;;;:::o;49222:313::-;49335:4;49373:2;49362:9;49358:18;49350:26;;49422:9;49416:4;49412:20;49408:1;49397:9;49393:17;49386:47;49450:78;49523:4;49514:6;49450:78;:::i;:::-;49442:86;;49222:313;;;;:::o;49541:180::-;49589:77;49586:1;49579:88;49686:4;49683:1;49676:15;49710:4;49707:1;49700:15;49727:174;49867:26;49863:1;49855:6;49851:14;49844:50;49727:174;:::o;49907:366::-;50049:3;50070:67;50134:2;50129:3;50070:67;:::i;:::-;50063:74;;50146:93;50235:3;50146:93;:::i;:::-;50264:2;50259:3;50255:12;50248:19;;49907:366;;;:::o;50279:419::-;50445:4;50483:2;50472:9;50468:18;50460:26;;50532:9;50526:4;50522:20;50518:1;50507:9;50503:17;50496:47;50560:131;50686:4;50560:131;:::i;:::-;50552:139;;50279:419;;;:::o;50704:181::-;50844:33;50840:1;50832:6;50828:14;50821:57;50704:181;:::o;50891:366::-;51033:3;51054:67;51118:2;51113:3;51054:67;:::i;:::-;51047:74;;51130:93;51219:3;51130:93;:::i;:::-;51248:2;51243:3;51239:12;51232:19;;50891:366;;;:::o;51263:419::-;51429:4;51467:2;51456:9;51452:18;51444:26;;51516:9;51510:4;51506:20;51502:1;51491:9;51487:17;51480:47;51544:131;51670:4;51544:131;:::i;:::-;51536:139;;51263:419;;;:::o;51688:221::-;51828:34;51824:1;51816:6;51812:14;51805:58;51897:4;51892:2;51884:6;51880:15;51873:29;51688:221;:::o;51915:366::-;52057:3;52078:67;52142:2;52137:3;52078:67;:::i;:::-;52071:74;;52154:93;52243:3;52154:93;:::i;:::-;52272:2;52267:3;52263:12;52256:19;;51915:366;;;:::o;52287:419::-;52453:4;52491:2;52480:9;52476:18;52468:26;;52540:9;52534:4;52530:20;52526:1;52515:9;52511:17;52504:47;52568:131;52694:4;52568:131;:::i;:::-;52560:139;;52287:419;;;:::o;52712:171::-;52751:3;52774:24;52792:5;52774:24;:::i;:::-;52765:33;;52820:4;52813:5;52810:15;52807:41;;52828:18;;:::i;:::-;52807:41;52875:1;52868:5;52864:13;52857:20;;52712:171;;;:::o;52889:182::-;53029:34;53025:1;53017:6;53013:14;53006:58;52889:182;:::o;53077:366::-;53219:3;53240:67;53304:2;53299:3;53240:67;:::i;:::-;53233:74;;53316:93;53405:3;53316:93;:::i;:::-;53434:2;53429:3;53425:12;53418:19;;53077:366;;;:::o;53449:419::-;53615:4;53653:2;53642:9;53638:18;53630:26;;53702:9;53696:4;53692:20;53688:1;53677:9;53673:17;53666:47;53730:131;53856:4;53730:131;:::i;:::-;53722:139;;53449:419;;;:::o;53874:86::-;53909:7;53949:4;53942:5;53938:16;53927:27;;53874:86;;;:::o;53966:112::-;54049:22;54065:5;54049:22;:::i;:::-;54044:3;54037:35;53966:112;;:::o;54084:545::-;54257:4;54295:3;54284:9;54280:19;54272:27;;54309:71;54377:1;54366:9;54362:17;54353:6;54309:71;:::i;:::-;54390:68;54454:2;54443:9;54439:18;54430:6;54390:68;:::i;:::-;54468:72;54536:2;54525:9;54521:18;54512:6;54468:72;:::i;:::-;54550;54618:2;54607:9;54603:18;54594:6;54550:72;:::i;:::-;54084:545;;;;;;;:::o
Swarm Source
ipfs://6f2e31ba8b2fd55197f412d80cb5781b1316676050b7f779bc4001360ab4e6f2
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.