Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 19383226 | 179 days ago | IN | 0 ETH | 0.19087641 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MintableEditionsFreePhasesGlobalUserLimit
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-07 */ // SPDX-License-Identifier: MIT pragma solidity =0.8.9; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @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 Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } } /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * @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 IERC165Upgradeable { /** * @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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } /** * @dev String operations. */ library StringsUpgradeable { 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 = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.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 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: * * ``` * 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}: * * ``` * 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. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } 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(IAccessControlUpgradeable).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 ", StringsUpgradeable.toHexString(account), " is missing role ", StringsUpgradeable.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()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981Upgradeable is IERC165Upgradeable { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981Upgradeable is Initializable, IERC2981Upgradeable, ERC165Upgradeable { function __ERC2981_init() internal onlyInitializing { } function __ERC2981_init_unchained() internal onlyInitializing { } struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC165Upgradeable) returns (bool) { return interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981Upgradeable */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; } /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURIUpgradeable is IERC1155Upgradeable { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable { using AddressUpgradeable for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ function __ERC1155_init(string memory uri_) internal onlyInitializing { __ERC1155_init_unchained(uri_); } function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155Upgradeable).interfaceId || interfaceId == type(IERC1155MetadataURIUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[47] private __gap; } /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155SupplyUpgradeable is Initializable, ERC1155Upgradeable { function __ERC1155Supply_init() internal onlyInitializing { } function __ERC1155Supply_init_unchained() internal onlyInitializing { } mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155SupplyUpgradeable.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; } } } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } abstract contract AccessControlUpgradeableEx is AccessControlUpgradeable { function modifyRoleBatch( bytes32 _role, address[] calldata _addList, address[] calldata _removeList ) external onlyRole(getRoleAdmin(_role)) { require(_addList.length != 0 || _removeList.length != 0, "Empty modify role lists"); _modifyRoleBatch(_role, _addList, _removeList); } function _modifyRoleBatch( bytes32 _role, address[] calldata _addList, address[] calldata _removeList ) internal virtual { _grantRoleBatch(_role, _addList); _revokeRoleBatch(_role, _removeList); } function _grantRoleBatch(bytes32 _role, address[] calldata _addressList) internal virtual { for (uint16 i = 0; i < _addressList.length; ++i) { _grantRole(_role, _addressList[i]); } } function _revokeRoleBatch(bytes32 _role, address[] calldata _addressList) internal virtual { for (uint16 i = 0; i < _addressList.length; ++i) { _revokeRole(_role, _addressList[i]); } } function _grantRole(bytes32 _role, address _account) internal virtual override { require(_account != address(0), "Unable to grant role to zero address"); super._grantRole(_role, _account); } function _revokeRole(bytes32 _role, address _account) internal virtual override { require(_account != address(0), "Unable to revoke role from zero address"); super._revokeRole(_role, _account); } } struct AssetRoyalty { uint256 assetId; address receiver; uint96 percentage; } struct AssetAmount { uint256 assetId; uint256 amount; } struct Phase { uint256 startTimestamp; // may be zero = always started uint256 endTimestamp; // may be zero = never ended address allowlistSigner; // may be address(0) = anybody can mint } struct PhaseSettings { uint256 phaseId; uint256 startTimestamp; // may be zero = always started uint256 endTimestamp; // may be zero = never ended address allowlistSigner; // may be address(0) = anybody can mint } contract MintableEditionsFreePhasesGlobalUserLimit is ERC1155SupplyUpgradeable, ERC2981Upgradeable, AccessControlUpgradeableEx { uint96 private constant PERCENTAGE_100 = 100_000; mapping(uint256/*asset id*/ => uint256/*max supply*/) public maxSupply_; mapping(uint256/*phase id*/ => Phase) public phases_; mapping(uint256/*asset id*/ => uint256/*amount*/) public maxAmountsForOneUser_; mapping(uint256/*asset id*/ => mapping(address/*user*/ => uint256/*amount*/)) public mintedAmounts_; event SetDefaultRoyalty(address indexed operator, address indexed receiver, uint96 percentage); event SetTokenRoyalties(address indexed operator, AssetRoyalty[] royalties); function version() external pure returns (string memory) { return "MintableEditionsFreePhasesGlobalUserLimit v1.1"; } constructor() { _disableInitializers(); } function initialize( string memory _uri, address _admin, address _defaultRoyaltyReceiver, uint96 _defaultRoyaltyPercentage, AssetAmount[] calldata _maxSupplies, AssetAmount[] calldata _maxAmountsForOneUser, PhaseSettings[] calldata _phases ) external initializer { __ERC1155_init(_uri); _grantRole(DEFAULT_ADMIN_ROLE, _admin); if (_defaultRoyaltyReceiver != address(0)) { _setDefaultRoyalty(_defaultRoyaltyReceiver, _defaultRoyaltyPercentage); } else { require(_defaultRoyaltyPercentage == 0, "ME-1: invalid default royalty"); } emit SetDefaultRoyalty(address(0), _defaultRoyaltyReceiver, _defaultRoyaltyPercentage); _setMaxSupplies(_maxSupplies); _setMaxAmountsForOneUser(_maxAmountsForOneUser); _setPhases(_phases); } function setUri(string memory _uri) external onlyRole(DEFAULT_ADMIN_ROLE) { _setURI(_uri); } function _feeDenominator() internal pure virtual override returns (uint96) { return PERCENTAGE_100; } function setDefaultRoyalty(address _receiver, uint96 _percentage) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultRoyalty(_receiver, _percentage); emit SetDefaultRoyalty(_msgSender(), _receiver, _percentage); } function deleteDefaultRoyalty() external onlyRole(DEFAULT_ADMIN_ROLE) { _deleteDefaultRoyalty(); emit SetDefaultRoyalty(_msgSender(), address(0), 0); } function setTokenRoyalties(AssetRoyalty[] calldata _royalties) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_royalties.length != 0, "ME-2: empty data"); for (uint256 i; i < _royalties.length; ) { if (_royalties[i].receiver == address(0)) { require(_royalties[i].percentage == 0, "ME-3: invalid token royalty"); _resetTokenRoyalty(_royalties[i].assetId); } else { require(_royalties[i].percentage != 0, "ME-4: invalid token royalty"); _setTokenRoyalty(_royalties[i].assetId, _royalties[i].receiver, _royalties[i].percentage); } unchecked { ++i; } } emit SetTokenRoyalties(_msgSender(), _royalties); } function setMaxSupplies(AssetAmount[] calldata _maxSupplies) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_maxSupplies.length != 0, "ME-5: empty data"); _setMaxSupplies(_maxSupplies); } function _setMaxSupplies(AssetAmount[] calldata _maxSupplies) private { for (uint256 i; i < _maxSupplies.length; ) { maxSupply_[_maxSupplies[i].assetId] = _maxSupplies[i].amount; unchecked { ++i; } } } function setPhases(PhaseSettings[] calldata _phases) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_phases.length != 0, "ME-6: empty data"); _setPhases(_phases); } function _setPhases(PhaseSettings[] calldata _phases) private { for (uint256 i; i < _phases.length; ) { _validateTimePeriod(_phases[i].startTimestamp, _phases[i].endTimestamp); _setPhaseSettings(_phases[i].phaseId, _phases[i]); unchecked { ++i; } } } function _validateTimePeriod(uint256 _startTimestamp, uint256 _endTimestamp) private pure { require( _startTimestamp == 0 || _endTimestamp == 0 || _startTimestamp < _endTimestamp, "ME-7: invalid phase time period" ); } function _setPhaseSettings(uint256 _phaseId, PhaseSettings calldata _settings) private { Phase storage phase = phases_[_phaseId]; phase.startTimestamp = _settings.startTimestamp; phase.endTimestamp = _settings.endTimestamp; phase.allowlistSigner = _settings.allowlistSigner; } function setTimePeriod( uint256 _phaseId, uint256 _startTimestamp, uint256 _endTimestamp ) external onlyRole(DEFAULT_ADMIN_ROLE) { _validateTimePeriod(_startTimestamp, _endTimestamp); phases_[_phaseId].startTimestamp = _startTimestamp; phases_[_phaseId].endTimestamp = _endTimestamp; } function setMaxAmountsForOneUser( AssetAmount[] calldata _maxAmountsForOneUser ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setMaxAmountsForOneUser(_maxAmountsForOneUser); } function _setMaxAmountsForOneUser(AssetAmount[] calldata _limits) private { for (uint256 i; i < _limits.length; ) { maxAmountsForOneUser_[_limits[i].assetId] = _limits[i].amount; unchecked { ++i; } } } function setAllowlistSigner(uint256 _phaseId, address _signer) external onlyRole(DEFAULT_ADMIN_ROLE) { _setAllowlistSigner(_phaseId, _signer); } function _setAllowlistSigner(uint256 _phaseId, address _signer) private { phases_[_phaseId].allowlistSigner = _signer; } function _beforeTokenTransfer( address _operator, address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data ) internal virtual override { super._beforeTokenTransfer(_operator, _from, _to, _ids, _amounts, _data); if (_from != address(0)) return; // only minting for (uint256 i; i < _ids.length; ) { require(totalSupply(_ids[i]) + _amounts[i] <= maxSupply_[_ids[i]], "ME-8: max supply exceeded"); unchecked { ++i; } } } function getAvailableForMintAmounts( address _recipient, uint256[] calldata _assetIds ) external view returns ( uint256[] memory ) { uint256[] memory availableAmounts = new uint256[](_assetIds.length); for (uint256 i; i < _assetIds.length; ) { availableAmounts[i] = _safeSub( maxAmountsForOneUser_[_assetIds[i]], mintedAmounts_[_assetIds[i]][_recipient] ); if (availableAmounts[i] != 0) { availableAmounts[i] = _min( _safeSub(maxSupply_[_assetIds[i]], totalSupply(_assetIds[i])), availableAmounts[i] ); } unchecked { ++i; } } return availableAmounts; } function mint( uint256 _phaseId, address _recipient, uint256[] calldata _assetIds, uint256[] calldata _amounts, bytes calldata _data, bytes calldata _signature ) external { require(_assetIds.length != 0, "ME-9: empty data"); require(_assetIds.length == _amounts.length, "ME-10: asset ids and amounts length mismatch"); Phase storage phase = phases_[_phaseId]; require(_isPhaseTimestamp(phase, block.timestamp), "ME-11: phase not active"); if (!hasRole(DEFAULT_ADMIN_ROLE, _msgSender())) { address requiredSigner = phase.allowlistSigner; require(requiredSigner != address(0), "ME-17: invalid phase id"); _verifyAllowlistSignature( abi.encode(_phaseId, _recipient, _assetIds, _amounts, _data), requiredSigner, _signature ); } for (uint256 i; i < _assetIds.length; ) { require(_amounts[i] != 0, "ME-12: zero mint amount"); _addMintedAmount(_recipient, _assetIds[i], _amounts[i]); unchecked { ++i; } } _mintTo(_recipient, _assetIds, _amounts, _data); } function _isPhaseTimestamp(Phase storage _phase, uint256 _timestamp) private view returns (bool) { uint256 startTimestamp = _phase.startTimestamp; uint256 endTimestamp = _phase.endTimestamp; return (startTimestamp == 0 || _timestamp >= startTimestamp) && (endTimestamp == 0 || _timestamp <= endTimestamp); } function _addMintedAmount(address _recipient, uint256 _assetId, uint256 _amount) private { uint256 maxAmount = maxAmountsForOneUser_[_assetId]; uint256 mintedAmount = mintedAmounts_[_assetId][_recipient]; require(mintedAmount + _amount <= maxAmount, "ME-13: mint amount exceeds individual limit"); mintedAmounts_[_assetId][_recipient] = mintedAmount + _amount; } function _mintTo( address _recipient, uint256[] calldata _assetIds, uint256[] calldata _amounts, bytes calldata _data ) private { if (_assetIds.length == 1) { _mint(_recipient, _assetIds[0], _amounts[0], _data); } else { _mintBatch(_recipient, _assetIds, _amounts, _data); } } function _verifyAllowlistSignature( bytes memory _data, address _requiredSigner, bytes calldata _signature ) private view { require(_requiredSigner == _getMessageSigner(_data, _signature), "ME-14: invalid signature"); } function _getMessageSigner(bytes memory _data, bytes calldata _signature) private view returns (address) { string memory message = string(abi.encode(block.chainid, address(this), _data)); bytes32 messageHash = keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(message))) ); return _recover(messageHash, _signature); } function _recover(bytes32 _hash, bytes memory _sig) private pure returns (address) { bytes32 r; bytes32 s; uint8 v; if (_sig.length != 65) return address(0); assembly { r := mload(add(_sig, 32)) s := mload(add(_sig, 64)) v := byte(0, mload(add(_sig, 96))) } if (v < 27) v += 27; if (v != 27 && v != 28) return address(0); return ecrecover(_hash, v, r, s); } function _safeSub(uint256 _value, uint256 _sub) private pure returns (uint256) { unchecked { return _value > _sub ? _value - _sub : 0; } } function _min(uint256 _a, uint256 _b) private pure returns (uint256) { return _a <= _b ? _a : _b; } function supportsInterface( bytes4 _interfaceId ) public view virtual override( ERC1155Upgradeable, ERC2981Upgradeable, AccessControlUpgradeable ) returns (bool) { return ERC1155Upgradeable.supportsInterface(_interfaceId) || ERC2981Upgradeable.supportsInterface(_interfaceId) || AccessControlUpgradeable.supportsInterface(_interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"percentage","type":"uint96"}],"name":"SetDefaultRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"percentage","type":"uint96"}],"indexed":false,"internalType":"struct AssetRoyalty[]","name":"royalties","type":"tuple[]"}],"name":"SetTokenRoyalties","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256[]","name":"_assetIds","type":"uint256[]"}],"name":"getAvailableForMintAmounts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"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":"string","name":"_uri","type":"string"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_defaultRoyaltyReceiver","type":"address"},{"internalType":"uint96","name":"_defaultRoyaltyPercentage","type":"uint96"},{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct AssetAmount[]","name":"_maxSupplies","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct AssetAmount[]","name":"_maxAmountsForOneUser","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"phaseId","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"address","name":"allowlistSigner","type":"address"}],"internalType":"struct PhaseSettings[]","name":"_phases","type":"tuple[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxAmountsForOneUser_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupply_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256[]","name":"_assetIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"mintedAmounts_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address[]","name":"_addList","type":"address[]"},{"internalType":"address[]","name":"_removeList","type":"address[]"}],"name":"modifyRoleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"phases_","outputs":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"address","name":"allowlistSigner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"}],"name":"setAllowlistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_percentage","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct AssetAmount[]","name":"_maxAmountsForOneUser","type":"tuple[]"}],"name":"setMaxAmountsForOneUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct AssetAmount[]","name":"_maxSupplies","type":"tuple[]"}],"name":"setMaxSupplies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"phaseId","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"address","name":"allowlistSigner","type":"address"}],"internalType":"struct PhaseSettings[]","name":"_phases","type":"tuple[]"}],"name":"setPhases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"setTimePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"percentage","type":"uint96"}],"internalType":"struct AssetRoyalty[]","name":"_royalties","type":"tuple[]"}],"name":"setTokenRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUri","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61411580620000f46000396000f3fe608060405234801561001057600080fd5b50600436106102105760003560e01c80635aa0ca5d11610125578063a22cb465116100ad578063cead13221161007c578063cead132214610529578063d547741f1461054a578063de2c8fc21461055d578063e985e9c514610570578063f242432a146105ac57600080fd5b8063a22cb465146104db578063aa1b103f146104ee578063bd85b039146104f6578063c4758b171461051657600080fd5b80638f35d656116100f45780638f35d6561461048757806391d148541461049a578063978f47c6146104ad5780639b642de1146104c0578063a217fddf146104d357600080fd5b80635aa0ca5d146104225780636a084178146104355780637d62253214610448578063862b68f41461045b57600080fd5b80632eb2c2d6116101a85780633a430b99116101775780633a430b99146103a457806341326f44146103c55780634e1273f4146103d85780634f558e79146103f857806354fd4d501461041a57600080fd5b80632eb2c2d6146103585780632f2ff15d1461036b57806336568abe1461037e57806338a365a71461039157600080fd5b80630e89341c116101e45780630e89341c146102d05780631f456df5146102f0578063248a9ca3146103035780632a55205a1461032657600080fd5b8062fdd58e1461021557806301ffc9a71461023b57806304634d8d1461025e578063077b6fed14610273575b600080fd5b610228610223366004612f73565b6105bf565b6040519081526020015b60405180910390f35b61024e610249366004612fb3565b61065a565b6040519015158152602001610232565b61027161026c366004612fe7565b610683565b005b6102ac61028136600461301a565b61012e602052600090815260409020805460018201546002909201549091906001600160a01b031683565b6040805193845260208401929092526001600160a01b031690820152606001610232565b6102e36102de36600461301a565b6106e7565b604051610232919061308b565b6102716102fe36600461309e565b61077b565b61022861031136600461301a565b600090815260fb602052604090206001015490565b6103396103343660046130ca565b6107aa565b604080516001600160a01b039093168352602083019190915201610232565b610271610366366004613235565b610859565b6102716103793660046132de565b6108a5565b61027161038c3660046132de565b6108cf565b61027161039f366004613345565b61094d565b6102286103b236600461301a565b61012d6020526000908152604090205481565b6102716103d336600461340b565b6109a2565b6103eb6103e63660046134eb565b610c24565b60405161023291906135f0565b61024e61040636600461301a565b600090815260976020526040902054151590565b6102e3610d4d565b6102716104303660046132de565b610d6d565b610271610443366004613603565b610da8565b6102716104563660046136c0565b610e31565b6102286104693660046132de565b61013060209081526000928352604080842090915290825290205481565b6103eb610495366004613799565b611034565b61024e6104a83660046132de565b611200565b6102716104bb3660046137eb565b61122b565b6102716104ce366004613820565b611280565b610228600081565b6102716104e936600461385c565b611294565b61027161129f565b61022861050436600461301a565b60009081526097602052604090205490565b6102716105243660046137eb565b6112ef565b61022861053736600461301a565b61012f6020526000908152604090205481565b6102716105583660046132de565b611304565b61027161056b366004613898565b611329565b61024e61057e36600461390c565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b6102716105ba366004613936565b6115b7565b60006001600160a01b03831661062f5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526065602090815260408083206001600160a01b03861684529091529020545b92915050565b6000610665826115fc565b8061067457506106748261164c565b80610654575061065482611671565b600061068e81611696565b61069883836116a3565b6040516001600160601b03831681526001600160a01b0384169033907fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed906020015b60405180910390a3505050565b6060606780546106f69061399a565b80601f01602080910402602001604051908101604052809291908181526020018280546107229061399a565b801561076f5780601f106107445761010080835404028352916020019161076f565b820191906000526020600020905b81548152906001019060200180831161075257829003601f168201915b50505050509050919050565b600061078681611696565b610790838361175e565b50600092835261012e602052604090922090815560010155565b600082815260ca602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161081f57506040805180820190915260c9546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090620186a09061083f906001600160601b0316876139eb565b6108499190613a0a565b91519350909150505b9250929050565b6001600160a01b0385163314806108755750610875853361057e565b6108915760405162461bcd60e51b815260040161062690613a2c565b61089e85858585856117bf565b5050505050565b600082815260fb60205260409020600101546108c081611696565b6108ca8383611964565b505050565b6001600160a01b038116331461093f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610626565b61094982826119d0565b5050565b600061095881611696565b816109985760405162461bcd60e51b815260206004820152601060248201526f4d452d363a20656d707479206461746160801b6044820152606401610626565b6108ca8383611a40565b866109e25760405162461bcd60e51b815260206004820152601060248201526f4d452d393a20656d707479206461746160801b6044820152606401610626565b868514610a465760405162461bcd60e51b815260206004820152602c60248201527f4d452d31303a2061737365742069647320616e6420616d6f756e7473206c656e60448201526b0cee8d040dad2e6dac2e8c6d60a31b6064820152608401610626565b60008a815261012e60205260409020610a5f8142611acf565b610aab5760405162461bcd60e51b815260206004820152601760248201527f4d452d31313a207068617365206e6f74206163746976650000000000000000006044820152606401610626565b610ab6600033611200565b610b505760028101546001600160a01b031680610b155760405162461bcd60e51b815260206004820152601760248201527f4d452d31373a20696e76616c69642070686173652069640000000000000000006044820152606401610626565b610b4e8c8c8c8c8c8c8c8c604051602001610b37989796959493929190613ab0565b604051602081830303815290604052828686611b04565b505b60005b88811015610c0757878782818110610b6d57610b6d613b28565b9050602002013560001415610bc45760405162461bcd60e51b815260206004820152601760248201527f4d452d31323a207a65726f206d696e7420616d6f756e740000000000000000006044820152606401610626565b610bff8b8b8b84818110610bda57610bda613b28565b905060200201358a8a85818110610bf357610bf3613b28565b90506020020135611b75565b600101610b53565b50610c178a8a8a8a8a8a8a611c49565b5050505050505050505050565b60608151835114610c895760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610626565b600083516001600160401b03811115610ca457610ca46130ec565b604051908082528060200260200182016040528015610ccd578160200160208202803683370190505b50905060005b8451811015610d4557610d18858281518110610cf157610cf1613b28565b6020026020010151858381518110610d0b57610d0b613b28565b60200260200101516105bf565b828281518110610d2a57610d2a613b28565b6020908102919091010152610d3e81613b3e565b9050610cd3565b509392505050565b60606040518060600160405280602e81526020016140b2602e9139905090565b6000610d7881611696565b600083815261012e6020526040902060020180546001600160a01b0319166001600160a01b038416179055505050565b600085815260fb6020526040902060010154610dc381611696565b83151580610dd057508115155b610e1c5760405162461bcd60e51b815260206004820152601760248201527f456d707479206d6f6469667920726f6c65206c697374730000000000000000006044820152606401610626565b610e298686868686611d76565b505050505050565b600054610100900460ff1615808015610e515750600054600160ff909116105b80610e6b5750303b158015610e6b575060005460ff166001145b610ece5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610626565b6000805460ff191660011790558015610ef1576000805461ff0019166101001790555b610efa8b611d8c565b610f0560008b611964565b6001600160a01b03891615610f2357610f1e89896116a3565b610f7a565b6001600160601b03881615610f7a5760405162461bcd60e51b815260206004820152601d60248201527f4d452d313a20696e76616c69642064656661756c7420726f79616c74790000006044820152606401610626565b6040516001600160601b03891681526001600160a01b038a16906000907fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed9060200160405180910390a3610fce8787611dbc565b610fd88585611e1c565b610fe28383611a40565b8015610c17576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b60606000826001600160401b03811115611050576110506130ec565b604051908082528060200260200182016040528015611079578160200160208202803683370190505b50905060005b838110156111f75761110c61012f60008787858181106110a1576110a1613b28565b9050602002013581526020019081526020016000205461013060008888868181106110ce576110ce613b28565b9050602002013581526020019081526020016000206000896001600160a01b03166001600160a01b0316815260200190815260200160002054611e7c565b82828151811061111e5761111e613b28565b60200260200101818152505081818151811061113c5761113c613b28565b60200260200101516000146111ef576111d06111b161012d600088888681811061116857611168613b28565b905060200201358152602001908152602001600020546111ac88888681811061119357611193613b28565b9050602002013560009081526097602052604090205490565b611e7c565b8383815181106111c3576111c3613b28565b6020026020010151611e97565b8282815181106111e2576111e2613b28565b6020026020010181815250505b60010161107f565b50949350505050565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061123681611696565b816112765760405162461bcd60e51b815260206004820152601060248201526f4d452d353a20656d707479206461746160801b6044820152606401610626565b6108ca8383611dbc565b600061128b81611696565b61094982611eae565b610949338383611ec1565b60006112aa81611696565b6112b4600060c955565b604080516000808252915133917fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed919081900360200190a350565b60006112fa81611696565b6108ca8383611e1c565b600082815260fb602052604090206001015461131f81611696565b6108ca83836119d0565b600061133481611696565b816113745760405162461bcd60e51b815260206004820152601060248201526f4d452d323a20656d707479206461746160801b6044820152606401610626565b60005b8281101561156e57600084848381811061139357611393613b28565b90506060020160200160208101906113ab9190613b59565b6001600160a01b0316141561146f578383828181106113cc576113cc613b28565b90506060020160400160208101906113e49190613b74565b6001600160601b03161561143a5760405162461bcd60e51b815260206004820152601b60248201527f4d452d333a20696e76616c696420746f6b656e20726f79616c747900000000006044820152606401610626565b61146a84848381811061144f5761144f613b28565b90506060020160000135600090815260ca6020526040812055565b611566565b83838281811061148157611481613b28565b90506060020160400160208101906114999190613b74565b6001600160601b03166114ee5760405162461bcd60e51b815260206004820152601b60248201527f4d452d343a20696e76616c696420746f6b656e20726f79616c747900000000006044820152606401610626565b61156684848381811061150357611503613b28565b9050606002016000013585858481811061151f5761151f613b28565b90506060020160200160208101906115379190613b59565b86868581811061154957611549613b28565b90506060020160400160208101906115619190613b74565b611f9a565b600101611377565b50336001600160a01b03167f56afe560bd896316a6a3421197574269ef42195f3f155048c908c45f8db21aeb84846040516115aa929190613b8f565b60405180910390a2505050565b6001600160a01b0385163314806115d357506115d3853361057e565b6115ef5760405162461bcd60e51b815260040161062690613a2c565b61089e8585858585612066565b60006001600160e01b03198216636cdb3d1360e11b148061162d57506001600160e01b031982166303a24d0760e21b145b8061065457506301ffc9a760e01b6001600160e01b0319831614610654565b60006001600160e01b0319821663152a902d60e11b14806106545750610654826115fc565b60006001600160e01b03198216637965db0b60e01b148061065457506106548261164c565b6116a081336121a2565b50565b620186a06001600160601b03821611156116cf5760405162461bcd60e51b815260040161062690613c01565b6001600160a01b0382166117255760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610626565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b9091021760c955565b811580611769575080155b8061177357508082105b6109495760405162461bcd60e51b815260206004820152601f60248201527f4d452d373a20696e76616c69642070686173652074696d6520706572696f64006044820152606401610626565b81518351146117e05760405162461bcd60e51b815260040161062690613c4b565b6001600160a01b0384166118065760405162461bcd60e51b815260040161062690613c93565b336118158187878787876121fb565b60005b84518110156118fe57600085828151811061183557611835613b28565b60200260200101519050600085838151811061185357611853613b28565b60209081029190910181015160008481526065835260408082206001600160a01b038e1683529093529190912054909150818110156118a45760405162461bcd60e51b815260040161062690613cd8565b60008381526065602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906118e3908490613d22565b92505081905550505050806118f790613b3e565b9050611818565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161194e929190613d3a565b60405180910390a4610e29818787878787612300565b6001600160a01b0381166119c65760405162461bcd60e51b8152602060048201526024808201527f556e61626c6520746f206772616e7420726f6c6520746f207a65726f206164646044820152637265737360e01b6064820152608401610626565b610949828261246b565b6001600160a01b038116611a365760405162461bcd60e51b815260206004820152602760248201527f556e61626c6520746f207265766f6b6520726f6c652066726f6d207a65726f206044820152666164647265737360c81b6064820152608401610626565b61094982826124f1565b60005b818110156108ca57611a8b838383818110611a6057611a60613b28565b90506080020160200135848484818110611a7c57611a7c613b28565b9050608002016040013561175e565b611ac7838383818110611aa057611aa0613b28565b90506080020160000135848484818110611abc57611abc613b28565b905060800201612558565b600101611a43565b8154600183015460009190811580611ae75750818410155b8015611afb5750801580611afb5750808411155b95945050505050565b611b0f8483836125b1565b6001600160a01b0316836001600160a01b031614611b6f5760405162461bcd60e51b815260206004820152601860248201527f4d452d31343a20696e76616c6964207369676e617475726500000000000000006044820152606401610626565b50505050565b600082815261012f602090815260408083205461013083528184206001600160a01b03881685529092529091205481611bae8483613d22565b1115611c105760405162461bcd60e51b815260206004820152602b60248201527f4d452d31333a206d696e7420616d6f756e74206578636565647320696e64697660448201526a1a591d585b081b1a5b5a5d60aa1b6064820152608401610626565b611c1a8382613d22565b6000948552610130602090815260408087206001600160a01b0390981687529690529490932093909355505050565b6001851415611ccb57611cc68787876000818110611c6957611c69613b28565b9050602002013586866000818110611c8357611c83613b28565b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061269892505050565b611d6d565b611d6d8787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061277a92505050565b50505050505050565b611d818585856128d5565b61089e858383612928565b600054610100900460ff16611db35760405162461bcd60e51b815260040161062690613d5f565b6116a08161297b565b60005b818110156108ca57828282818110611dd957611dd9613b28565b9050604002016020013561012d6000858585818110611dfa57611dfa613b28565b6040908102929092013583525060208201929092520160002055600101611dbf565b60005b818110156108ca57828282818110611e3957611e39613b28565b9050604002016020013561012f6000858585818110611e5a57611e5a613b28565b6040908102929092013583525060208201929092520160002055600101611e1f565b6000818311611e8c576000611e90565b8183035b9392505050565b600081831115611ea75781611e90565b5090919050565b8051610949906067906020840190612ebe565b816001600160a01b0316836001600160a01b03161415611f355760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610626565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191016106da565b620186a06001600160601b0382161115611fc65760405162461bcd60e51b815260040161062690613c01565b6001600160a01b03821661201c5760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610626565b6040805180820182526001600160a01b0393841681526001600160601b039283166020808301918252600096875260ca90529190942093519051909116600160a01b029116179055565b6001600160a01b03841661208c5760405162461bcd60e51b815260040161062690613c93565b336000612098856129ab565b905060006120a5856129ab565b90506120b58389898585896121fb565b60008681526065602090815260408083206001600160a01b038c168452909152902054858110156120f85760405162461bcd60e51b815260040161062690613cd8565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612137908490613d22565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612197848a8a8a8a8a6129f6565b505050505050505050565b6121ac8282611200565b610949576121b981612ac0565b6121c4836020612ad2565b6040516020016121d5929190613daa565b60408051601f198184030181529082905262461bcd60e51b82526106269160040161308b565b612209868686868686612c6d565b6001600160a01b0385161561221d57610e29565b60005b8351811015611d6d5761012d600085838151811061224057612240613b28565b602002602001015181526020019081526020016000205483828151811061226957612269613b28565b60200260200101516122a086848151811061228657612286613b28565b602002602001015160009081526097602052604090205490565b6122aa9190613d22565b11156122f85760405162461bcd60e51b815260206004820152601960248201527f4d452d383a206d617820737570706c79206578636565646564000000000000006044820152606401610626565b600101612220565b6001600160a01b0384163b15610e295760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906123449089908990889088908890600401613e1f565b602060405180830381600087803b15801561235e57600080fd5b505af192505050801561238e575060408051601f3d908101601f1916820190925261238b91810190613e7d565b60015b61243b5761239a613e9a565b806308c379a014156123d457506123af613eb6565b806123ba57506123d6565b8060405162461bcd60e51b8152600401610626919061308b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610626565b6001600160e01b0319811663bc197c8160e01b14611d6d5760405162461bcd60e51b815260040161062690613f3f565b6124758282611200565b61094957600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff191660011790556124ad3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6124fb8282611200565b1561094957600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600082815261012e602090815260409182902090830135815590820135600182015561258a6080830160608401613b59565b60029190910180546001600160a01b0319166001600160a01b039092169190911790555050565b6000804630866040516020016125c993929190613f87565b60405160208183030381529060405290506000816040516020016125ed9190613fb1565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160405160208183030381529060405280519060200120905061268e8186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612de692505050565b9695505050505050565b6001600160a01b0384166126be5760405162461bcd60e51b815260040161062690613fcd565b3360006126ca856129ab565b905060006126d7856129ab565b90506126e8836000898585896121fb565b60008681526065602090815260408083206001600160a01b038b1684529091528120805487929061271a908490613d22565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d6d836000898989896129f6565b6001600160a01b0384166127a05760405162461bcd60e51b815260040161062690613fcd565b81518351146127c15760405162461bcd60e51b815260040161062690613c4b565b336127d1816000878787876121fb565b60005b845181101561286d578381815181106127ef576127ef613b28565b60200260200101516065600087848151811061280d5761280d613b28565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546128559190613d22565b9091555081905061286581613b3e565b9150506127d4565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128be929190613d3a565b60405180910390a461089e81600087878787612300565b60005b61ffff8116821115611b6f576129188484848461ffff168181106128fe576128fe613b28565b90506020020160208101906129139190613b59565b611964565b6129218161400e565b90506128d8565b60005b61ffff8116821115611b6f5761296b8484848461ffff1681811061295157612951613b28565b90506020020160208101906129669190613b59565b6119d0565b6129748161400e565b905061292b565b600054610100900460ff166129a25760405162461bcd60e51b815260040161062690613d5f565b6116a081611eae565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106129e5576129e5613b28565b602090810291909101015292915050565b6001600160a01b0384163b15610e295760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612a3a9089908990889088908890600401614030565b602060405180830381600087803b158015612a5457600080fd5b505af1925050508015612a84575060408051601f3d908101601f19168201909252612a8191810190613e7d565b60015b612a905761239a613e9a565b6001600160e01b0319811663f23a6e6160e01b14611d6d5760405162461bcd60e51b815260040161062690613f3f565b60606106546001600160a01b03831660145b60606000612ae18360026139eb565b612aec906002613d22565b6001600160401b03811115612b0357612b036130ec565b6040519080825280601f01601f191660200182016040528015612b2d576020820181803683370190505b509050600360fc1b81600081518110612b4857612b48613b28565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612b7757612b77613b28565b60200101906001600160f81b031916908160001a9053506000612b9b8460026139eb565b612ba6906001613d22565b90505b6001811115612c1e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612bda57612bda613b28565b1a60f81b828281518110612bf057612bf0613b28565b60200101906001600160f81b031916908160001a90535060049490941c93612c1781614075565b9050612ba9565b508315611e905760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610626565b6001600160a01b038516612cf45760005b8351811015612cf257828181518110612c9957612c99613b28565b602002602001015160976000868481518110612cb757612cb7613b28565b602002602001015181526020019081526020016000206000828254612cdc9190613d22565b90915550612ceb905081613b3e565b9050612c7e565b505b6001600160a01b038416610e295760005b8351811015611d6d576000848281518110612d2257612d22613b28565b602002602001015190506000848381518110612d4057612d40613b28565b6020026020010151905060006097600084815260200190815260200160002054905081811015612dc35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610626565b60009283526097602052604090922091039055612ddf81613b3e565b9050612d05565b6000806000808451604114612e015760009350505050610654565b50505060208201516040830151606084015160001a601b811015612e2d57612e2a601b8261408c565b90505b8060ff16601b14158015612e4557508060ff16601c14155b15612e565760009350505050610654565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015612ea9573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b828054612eca9061399a565b90600052602060002090601f016020900481019282612eec5760008555612f32565b82601f10612f0557805160ff1916838001178555612f32565b82800160010185558215612f32579182015b82811115612f32578251825591602001919060010190612f17565b50612f3e929150612f42565b5090565b5b80821115612f3e5760008155600101612f43565b80356001600160a01b0381168114612f6e57600080fd5b919050565b60008060408385031215612f8657600080fd5b612f8f83612f57565b946020939093013593505050565b6001600160e01b0319811681146116a057600080fd5b600060208284031215612fc557600080fd5b8135611e9081612f9d565b80356001600160601b0381168114612f6e57600080fd5b60008060408385031215612ffa57600080fd5b61300383612f57565b915061301160208401612fd0565b90509250929050565b60006020828403121561302c57600080fd5b5035919050565b60005b8381101561304e578181015183820152602001613036565b83811115611b6f5750506000910152565b60008151808452613077816020860160208601613033565b601f01601f19169290920160200192915050565b602081526000611e90602083018461305f565b6000806000606084860312156130b357600080fd5b505081359360208301359350604090920135919050565b600080604083850312156130dd57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715613127576131276130ec565b6040525050565b60006001600160401b03821115613147576131476130ec565b5060051b60200190565b600082601f83011261316257600080fd5b8135602061316f8261312e565b60405161317c8282613102565b83815260059390931b850182019282810191508684111561319c57600080fd5b8286015b848110156131b757803583529183019183016131a0565b509695505050505050565b600082601f8301126131d357600080fd5b81356001600160401b038111156131ec576131ec6130ec565b604051613203601f8301601f191660200182613102565b81815284602083860101111561321857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561324d57600080fd5b61325686612f57565b945061326460208701612f57565b935060408601356001600160401b038082111561328057600080fd5b61328c89838a01613151565b945060608801359150808211156132a257600080fd5b6132ae89838a01613151565b935060808801359150808211156132c457600080fd5b506132d1888289016131c2565b9150509295509295909350565b600080604083850312156132f157600080fd5b8235915061301160208401612f57565b60008083601f84011261331357600080fd5b5081356001600160401b0381111561332a57600080fd5b6020830191508360208260071b850101111561085257600080fd5b6000806020838503121561335857600080fd5b82356001600160401b0381111561336e57600080fd5b61337a85828601613301565b90969095509350505050565b60008083601f84011261339857600080fd5b5081356001600160401b038111156133af57600080fd5b6020830191508360208260051b850101111561085257600080fd5b60008083601f8401126133dc57600080fd5b5081356001600160401b038111156133f357600080fd5b60208301915083602082850101111561085257600080fd5b60008060008060008060008060008060c08b8d03121561342a57600080fd5b8a35995061343a60208c01612f57565b985060408b01356001600160401b038082111561345657600080fd5b6134628e838f01613386565b909a50985060608d013591508082111561347b57600080fd5b6134878e838f01613386565b909850965060808d01359150808211156134a057600080fd5b6134ac8e838f016133ca565b909650945060a08d01359150808211156134c557600080fd5b506134d28d828e016133ca565b915080935050809150509295989b9194979a5092959850565b600080604083850312156134fe57600080fd5b82356001600160401b038082111561351557600080fd5b818501915085601f83011261352957600080fd5b813560206135368261312e565b6040516135438282613102565b83815260059390931b850182019282810191508984111561356357600080fd5b948201945b838610156135885761357986612f57565b82529482019490820190613568565b9650508601359250508082111561359e57600080fd5b506135ab85828601613151565b9150509250929050565b600081518084526020808501945080840160005b838110156135e5578151875295820195908201906001016135c9565b509495945050505050565b602081526000611e9060208301846135b5565b60008060008060006060868803121561361b57600080fd5b8535945060208601356001600160401b038082111561363957600080fd5b61364589838a01613386565b9096509450604088013591508082111561365e57600080fd5b5061366b88828901613386565b969995985093965092949392505050565b60008083601f84011261368e57600080fd5b5081356001600160401b038111156136a557600080fd5b6020830191508360208260061b850101111561085257600080fd5b60008060008060008060008060008060e08b8d0312156136df57600080fd5b8a356001600160401b03808211156136f657600080fd5b6137028e838f016131c2565b9b5061371060208e01612f57565b9a5061371e60408e01612f57565b995061372c60608e01612fd0565b985060808d013591508082111561374257600080fd5b61374e8e838f0161367c565b909850965060a08d013591508082111561376757600080fd5b6137738e838f0161367c565b909650945060c08d013591508082111561378c57600080fd5b506134d28d828e01613301565b6000806000604084860312156137ae57600080fd5b6137b784612f57565b925060208401356001600160401b038111156137d257600080fd5b6137de86828701613386565b9497909650939450505050565b600080602083850312156137fe57600080fd5b82356001600160401b0381111561381457600080fd5b61337a8582860161367c565b60006020828403121561383257600080fd5b81356001600160401b0381111561384857600080fd5b613854848285016131c2565b949350505050565b6000806040838503121561386f57600080fd5b61387883612f57565b91506020830135801515811461388d57600080fd5b809150509250929050565b600080602083850312156138ab57600080fd5b82356001600160401b03808211156138c257600080fd5b818501915085601f8301126138d657600080fd5b8135818111156138e557600080fd5b8660206060830285010111156138fa57600080fd5b60209290920196919550909350505050565b6000806040838503121561391f57600080fd5b61392883612f57565b915061301160208401612f57565b600080600080600060a0868803121561394e57600080fd5b61395786612f57565b945061396560208701612f57565b9350604086013592506060860135915060808601356001600160401b0381111561398e57600080fd5b6132d1888289016131c2565b600181811c908216806139ae57607f821691505b602082108114156139cf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613a0557613a056139d5565b500290565b600082613a2757634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b81835260006001600160fb1b03831115613a9357600080fd5b8260051b8083602087013760009401602001938452509192915050565b8881526001600160a01b038816602082015260a060408201819052600090613adb908301888a613a7a565b8281036060840152613aee818789613a7a565b90508281036080840152838152838560208301376000602085830101526020601f19601f8601168201019150509998505050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613b5257613b526139d5565b5060010190565b600060208284031215613b6b57600080fd5b611e9082612f57565b600060208284031215613b8657600080fd5b611e9082612fd0565b6020808252818101839052600090604080840186845b87811015613bf457813583526001600160a01b03613bc4868401612f57565b16858401526001600160601b03613bdc858401612fd0565b16838501526060928301929190910190600101613ba5565b5090979650505050505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008219821115613d3557613d356139d5565b500190565b604081526000613d4d60408301856135b5565b8281036020840152611afb81856135b5565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613de2816017850160208801613033565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613e13816028840160208801613033565b01602801949350505050565b6001600160a01b0386811682528516602082015260a060408201819052600090613e4b908301866135b5565b8281036060840152613e5d81866135b5565b90508281036080840152613e71818561305f565b98975050505050505050565b600060208284031215613e8f57600080fd5b8151611e9081612f9d565b600060033d1115613eb35760046000803e5060005160e01c5b90565b600060443d1015613ec45790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613ef357505050505090565b8285019150815181811115613f0b5750505050505090565b843d8701016020828501011115613f255750505050505090565b613f3460208286010187613102565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b8381526001600160a01b0383166020820152606060408201819052600090611afb9083018461305f565b60008251613fc3818460208701613033565b9190910192915050565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600061ffff80831681811415614026576140266139d5565b6001019392505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061406a9083018461305f565b979650505050505050565b600081614084576140846139d5565b506000190190565b600060ff821660ff84168060ff038211156140a9576140a96139d5565b01939250505056fe4d696e7461626c6545646974696f6e7346726565506861736573476c6f62616c557365724c696d69742076312e31a264697066735822122069c7e1f497be15ff4215ab217cf1e5db527633ae634374a3769431bb3eedb64d64736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102105760003560e01c80635aa0ca5d11610125578063a22cb465116100ad578063cead13221161007c578063cead132214610529578063d547741f1461054a578063de2c8fc21461055d578063e985e9c514610570578063f242432a146105ac57600080fd5b8063a22cb465146104db578063aa1b103f146104ee578063bd85b039146104f6578063c4758b171461051657600080fd5b80638f35d656116100f45780638f35d6561461048757806391d148541461049a578063978f47c6146104ad5780639b642de1146104c0578063a217fddf146104d357600080fd5b80635aa0ca5d146104225780636a084178146104355780637d62253214610448578063862b68f41461045b57600080fd5b80632eb2c2d6116101a85780633a430b99116101775780633a430b99146103a457806341326f44146103c55780634e1273f4146103d85780634f558e79146103f857806354fd4d501461041a57600080fd5b80632eb2c2d6146103585780632f2ff15d1461036b57806336568abe1461037e57806338a365a71461039157600080fd5b80630e89341c116101e45780630e89341c146102d05780631f456df5146102f0578063248a9ca3146103035780632a55205a1461032657600080fd5b8062fdd58e1461021557806301ffc9a71461023b57806304634d8d1461025e578063077b6fed14610273575b600080fd5b610228610223366004612f73565b6105bf565b6040519081526020015b60405180910390f35b61024e610249366004612fb3565b61065a565b6040519015158152602001610232565b61027161026c366004612fe7565b610683565b005b6102ac61028136600461301a565b61012e602052600090815260409020805460018201546002909201549091906001600160a01b031683565b6040805193845260208401929092526001600160a01b031690820152606001610232565b6102e36102de36600461301a565b6106e7565b604051610232919061308b565b6102716102fe36600461309e565b61077b565b61022861031136600461301a565b600090815260fb602052604090206001015490565b6103396103343660046130ca565b6107aa565b604080516001600160a01b039093168352602083019190915201610232565b610271610366366004613235565b610859565b6102716103793660046132de565b6108a5565b61027161038c3660046132de565b6108cf565b61027161039f366004613345565b61094d565b6102286103b236600461301a565b61012d6020526000908152604090205481565b6102716103d336600461340b565b6109a2565b6103eb6103e63660046134eb565b610c24565b60405161023291906135f0565b61024e61040636600461301a565b600090815260976020526040902054151590565b6102e3610d4d565b6102716104303660046132de565b610d6d565b610271610443366004613603565b610da8565b6102716104563660046136c0565b610e31565b6102286104693660046132de565b61013060209081526000928352604080842090915290825290205481565b6103eb610495366004613799565b611034565b61024e6104a83660046132de565b611200565b6102716104bb3660046137eb565b61122b565b6102716104ce366004613820565b611280565b610228600081565b6102716104e936600461385c565b611294565b61027161129f565b61022861050436600461301a565b60009081526097602052604090205490565b6102716105243660046137eb565b6112ef565b61022861053736600461301a565b61012f6020526000908152604090205481565b6102716105583660046132de565b611304565b61027161056b366004613898565b611329565b61024e61057e36600461390c565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b6102716105ba366004613936565b6115b7565b60006001600160a01b03831661062f5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526065602090815260408083206001600160a01b03861684529091529020545b92915050565b6000610665826115fc565b8061067457506106748261164c565b80610654575061065482611671565b600061068e81611696565b61069883836116a3565b6040516001600160601b03831681526001600160a01b0384169033907fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed906020015b60405180910390a3505050565b6060606780546106f69061399a565b80601f01602080910402602001604051908101604052809291908181526020018280546107229061399a565b801561076f5780601f106107445761010080835404028352916020019161076f565b820191906000526020600020905b81548152906001019060200180831161075257829003601f168201915b50505050509050919050565b600061078681611696565b610790838361175e565b50600092835261012e602052604090922090815560010155565b600082815260ca602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161081f57506040805180820190915260c9546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090620186a09061083f906001600160601b0316876139eb565b6108499190613a0a565b91519350909150505b9250929050565b6001600160a01b0385163314806108755750610875853361057e565b6108915760405162461bcd60e51b815260040161062690613a2c565b61089e85858585856117bf565b5050505050565b600082815260fb60205260409020600101546108c081611696565b6108ca8383611964565b505050565b6001600160a01b038116331461093f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610626565b61094982826119d0565b5050565b600061095881611696565b816109985760405162461bcd60e51b815260206004820152601060248201526f4d452d363a20656d707479206461746160801b6044820152606401610626565b6108ca8383611a40565b866109e25760405162461bcd60e51b815260206004820152601060248201526f4d452d393a20656d707479206461746160801b6044820152606401610626565b868514610a465760405162461bcd60e51b815260206004820152602c60248201527f4d452d31303a2061737365742069647320616e6420616d6f756e7473206c656e60448201526b0cee8d040dad2e6dac2e8c6d60a31b6064820152608401610626565b60008a815261012e60205260409020610a5f8142611acf565b610aab5760405162461bcd60e51b815260206004820152601760248201527f4d452d31313a207068617365206e6f74206163746976650000000000000000006044820152606401610626565b610ab6600033611200565b610b505760028101546001600160a01b031680610b155760405162461bcd60e51b815260206004820152601760248201527f4d452d31373a20696e76616c69642070686173652069640000000000000000006044820152606401610626565b610b4e8c8c8c8c8c8c8c8c604051602001610b37989796959493929190613ab0565b604051602081830303815290604052828686611b04565b505b60005b88811015610c0757878782818110610b6d57610b6d613b28565b9050602002013560001415610bc45760405162461bcd60e51b815260206004820152601760248201527f4d452d31323a207a65726f206d696e7420616d6f756e740000000000000000006044820152606401610626565b610bff8b8b8b84818110610bda57610bda613b28565b905060200201358a8a85818110610bf357610bf3613b28565b90506020020135611b75565b600101610b53565b50610c178a8a8a8a8a8a8a611c49565b5050505050505050505050565b60608151835114610c895760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610626565b600083516001600160401b03811115610ca457610ca46130ec565b604051908082528060200260200182016040528015610ccd578160200160208202803683370190505b50905060005b8451811015610d4557610d18858281518110610cf157610cf1613b28565b6020026020010151858381518110610d0b57610d0b613b28565b60200260200101516105bf565b828281518110610d2a57610d2a613b28565b6020908102919091010152610d3e81613b3e565b9050610cd3565b509392505050565b60606040518060600160405280602e81526020016140b2602e9139905090565b6000610d7881611696565b600083815261012e6020526040902060020180546001600160a01b0319166001600160a01b038416179055505050565b600085815260fb6020526040902060010154610dc381611696565b83151580610dd057508115155b610e1c5760405162461bcd60e51b815260206004820152601760248201527f456d707479206d6f6469667920726f6c65206c697374730000000000000000006044820152606401610626565b610e298686868686611d76565b505050505050565b600054610100900460ff1615808015610e515750600054600160ff909116105b80610e6b5750303b158015610e6b575060005460ff166001145b610ece5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610626565b6000805460ff191660011790558015610ef1576000805461ff0019166101001790555b610efa8b611d8c565b610f0560008b611964565b6001600160a01b03891615610f2357610f1e89896116a3565b610f7a565b6001600160601b03881615610f7a5760405162461bcd60e51b815260206004820152601d60248201527f4d452d313a20696e76616c69642064656661756c7420726f79616c74790000006044820152606401610626565b6040516001600160601b03891681526001600160a01b038a16906000907fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed9060200160405180910390a3610fce8787611dbc565b610fd88585611e1c565b610fe28383611a40565b8015610c17576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b60606000826001600160401b03811115611050576110506130ec565b604051908082528060200260200182016040528015611079578160200160208202803683370190505b50905060005b838110156111f75761110c61012f60008787858181106110a1576110a1613b28565b9050602002013581526020019081526020016000205461013060008888868181106110ce576110ce613b28565b9050602002013581526020019081526020016000206000896001600160a01b03166001600160a01b0316815260200190815260200160002054611e7c565b82828151811061111e5761111e613b28565b60200260200101818152505081818151811061113c5761113c613b28565b60200260200101516000146111ef576111d06111b161012d600088888681811061116857611168613b28565b905060200201358152602001908152602001600020546111ac88888681811061119357611193613b28565b9050602002013560009081526097602052604090205490565b611e7c565b8383815181106111c3576111c3613b28565b6020026020010151611e97565b8282815181106111e2576111e2613b28565b6020026020010181815250505b60010161107f565b50949350505050565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061123681611696565b816112765760405162461bcd60e51b815260206004820152601060248201526f4d452d353a20656d707479206461746160801b6044820152606401610626565b6108ca8383611dbc565b600061128b81611696565b61094982611eae565b610949338383611ec1565b60006112aa81611696565b6112b4600060c955565b604080516000808252915133917fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed919081900360200190a350565b60006112fa81611696565b6108ca8383611e1c565b600082815260fb602052604090206001015461131f81611696565b6108ca83836119d0565b600061133481611696565b816113745760405162461bcd60e51b815260206004820152601060248201526f4d452d323a20656d707479206461746160801b6044820152606401610626565b60005b8281101561156e57600084848381811061139357611393613b28565b90506060020160200160208101906113ab9190613b59565b6001600160a01b0316141561146f578383828181106113cc576113cc613b28565b90506060020160400160208101906113e49190613b74565b6001600160601b03161561143a5760405162461bcd60e51b815260206004820152601b60248201527f4d452d333a20696e76616c696420746f6b656e20726f79616c747900000000006044820152606401610626565b61146a84848381811061144f5761144f613b28565b90506060020160000135600090815260ca6020526040812055565b611566565b83838281811061148157611481613b28565b90506060020160400160208101906114999190613b74565b6001600160601b03166114ee5760405162461bcd60e51b815260206004820152601b60248201527f4d452d343a20696e76616c696420746f6b656e20726f79616c747900000000006044820152606401610626565b61156684848381811061150357611503613b28565b9050606002016000013585858481811061151f5761151f613b28565b90506060020160200160208101906115379190613b59565b86868581811061154957611549613b28565b90506060020160400160208101906115619190613b74565b611f9a565b600101611377565b50336001600160a01b03167f56afe560bd896316a6a3421197574269ef42195f3f155048c908c45f8db21aeb84846040516115aa929190613b8f565b60405180910390a2505050565b6001600160a01b0385163314806115d357506115d3853361057e565b6115ef5760405162461bcd60e51b815260040161062690613a2c565b61089e8585858585612066565b60006001600160e01b03198216636cdb3d1360e11b148061162d57506001600160e01b031982166303a24d0760e21b145b8061065457506301ffc9a760e01b6001600160e01b0319831614610654565b60006001600160e01b0319821663152a902d60e11b14806106545750610654826115fc565b60006001600160e01b03198216637965db0b60e01b148061065457506106548261164c565b6116a081336121a2565b50565b620186a06001600160601b03821611156116cf5760405162461bcd60e51b815260040161062690613c01565b6001600160a01b0382166117255760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610626565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b9091021760c955565b811580611769575080155b8061177357508082105b6109495760405162461bcd60e51b815260206004820152601f60248201527f4d452d373a20696e76616c69642070686173652074696d6520706572696f64006044820152606401610626565b81518351146117e05760405162461bcd60e51b815260040161062690613c4b565b6001600160a01b0384166118065760405162461bcd60e51b815260040161062690613c93565b336118158187878787876121fb565b60005b84518110156118fe57600085828151811061183557611835613b28565b60200260200101519050600085838151811061185357611853613b28565b60209081029190910181015160008481526065835260408082206001600160a01b038e1683529093529190912054909150818110156118a45760405162461bcd60e51b815260040161062690613cd8565b60008381526065602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906118e3908490613d22565b92505081905550505050806118f790613b3e565b9050611818565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161194e929190613d3a565b60405180910390a4610e29818787878787612300565b6001600160a01b0381166119c65760405162461bcd60e51b8152602060048201526024808201527f556e61626c6520746f206772616e7420726f6c6520746f207a65726f206164646044820152637265737360e01b6064820152608401610626565b610949828261246b565b6001600160a01b038116611a365760405162461bcd60e51b815260206004820152602760248201527f556e61626c6520746f207265766f6b6520726f6c652066726f6d207a65726f206044820152666164647265737360c81b6064820152608401610626565b61094982826124f1565b60005b818110156108ca57611a8b838383818110611a6057611a60613b28565b90506080020160200135848484818110611a7c57611a7c613b28565b9050608002016040013561175e565b611ac7838383818110611aa057611aa0613b28565b90506080020160000135848484818110611abc57611abc613b28565b905060800201612558565b600101611a43565b8154600183015460009190811580611ae75750818410155b8015611afb5750801580611afb5750808411155b95945050505050565b611b0f8483836125b1565b6001600160a01b0316836001600160a01b031614611b6f5760405162461bcd60e51b815260206004820152601860248201527f4d452d31343a20696e76616c6964207369676e617475726500000000000000006044820152606401610626565b50505050565b600082815261012f602090815260408083205461013083528184206001600160a01b03881685529092529091205481611bae8483613d22565b1115611c105760405162461bcd60e51b815260206004820152602b60248201527f4d452d31333a206d696e7420616d6f756e74206578636565647320696e64697660448201526a1a591d585b081b1a5b5a5d60aa1b6064820152608401610626565b611c1a8382613d22565b6000948552610130602090815260408087206001600160a01b0390981687529690529490932093909355505050565b6001851415611ccb57611cc68787876000818110611c6957611c69613b28565b9050602002013586866000818110611c8357611c83613b28565b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061269892505050565b611d6d565b611d6d8787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061277a92505050565b50505050505050565b611d818585856128d5565b61089e858383612928565b600054610100900460ff16611db35760405162461bcd60e51b815260040161062690613d5f565b6116a08161297b565b60005b818110156108ca57828282818110611dd957611dd9613b28565b9050604002016020013561012d6000858585818110611dfa57611dfa613b28565b6040908102929092013583525060208201929092520160002055600101611dbf565b60005b818110156108ca57828282818110611e3957611e39613b28565b9050604002016020013561012f6000858585818110611e5a57611e5a613b28565b6040908102929092013583525060208201929092520160002055600101611e1f565b6000818311611e8c576000611e90565b8183035b9392505050565b600081831115611ea75781611e90565b5090919050565b8051610949906067906020840190612ebe565b816001600160a01b0316836001600160a01b03161415611f355760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610626565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191016106da565b620186a06001600160601b0382161115611fc65760405162461bcd60e51b815260040161062690613c01565b6001600160a01b03821661201c5760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610626565b6040805180820182526001600160a01b0393841681526001600160601b039283166020808301918252600096875260ca90529190942093519051909116600160a01b029116179055565b6001600160a01b03841661208c5760405162461bcd60e51b815260040161062690613c93565b336000612098856129ab565b905060006120a5856129ab565b90506120b58389898585896121fb565b60008681526065602090815260408083206001600160a01b038c168452909152902054858110156120f85760405162461bcd60e51b815260040161062690613cd8565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612137908490613d22565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612197848a8a8a8a8a6129f6565b505050505050505050565b6121ac8282611200565b610949576121b981612ac0565b6121c4836020612ad2565b6040516020016121d5929190613daa565b60408051601f198184030181529082905262461bcd60e51b82526106269160040161308b565b612209868686868686612c6d565b6001600160a01b0385161561221d57610e29565b60005b8351811015611d6d5761012d600085838151811061224057612240613b28565b602002602001015181526020019081526020016000205483828151811061226957612269613b28565b60200260200101516122a086848151811061228657612286613b28565b602002602001015160009081526097602052604090205490565b6122aa9190613d22565b11156122f85760405162461bcd60e51b815260206004820152601960248201527f4d452d383a206d617820737570706c79206578636565646564000000000000006044820152606401610626565b600101612220565b6001600160a01b0384163b15610e295760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906123449089908990889088908890600401613e1f565b602060405180830381600087803b15801561235e57600080fd5b505af192505050801561238e575060408051601f3d908101601f1916820190925261238b91810190613e7d565b60015b61243b5761239a613e9a565b806308c379a014156123d457506123af613eb6565b806123ba57506123d6565b8060405162461bcd60e51b8152600401610626919061308b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610626565b6001600160e01b0319811663bc197c8160e01b14611d6d5760405162461bcd60e51b815260040161062690613f3f565b6124758282611200565b61094957600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff191660011790556124ad3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6124fb8282611200565b1561094957600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600082815261012e602090815260409182902090830135815590820135600182015561258a6080830160608401613b59565b60029190910180546001600160a01b0319166001600160a01b039092169190911790555050565b6000804630866040516020016125c993929190613f87565b60405160208183030381529060405290506000816040516020016125ed9190613fb1565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160405160208183030381529060405280519060200120905061268e8186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612de692505050565b9695505050505050565b6001600160a01b0384166126be5760405162461bcd60e51b815260040161062690613fcd565b3360006126ca856129ab565b905060006126d7856129ab565b90506126e8836000898585896121fb565b60008681526065602090815260408083206001600160a01b038b1684529091528120805487929061271a908490613d22565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d6d836000898989896129f6565b6001600160a01b0384166127a05760405162461bcd60e51b815260040161062690613fcd565b81518351146127c15760405162461bcd60e51b815260040161062690613c4b565b336127d1816000878787876121fb565b60005b845181101561286d578381815181106127ef576127ef613b28565b60200260200101516065600087848151811061280d5761280d613b28565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546128559190613d22565b9091555081905061286581613b3e565b9150506127d4565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128be929190613d3a565b60405180910390a461089e81600087878787612300565b60005b61ffff8116821115611b6f576129188484848461ffff168181106128fe576128fe613b28565b90506020020160208101906129139190613b59565b611964565b6129218161400e565b90506128d8565b60005b61ffff8116821115611b6f5761296b8484848461ffff1681811061295157612951613b28565b90506020020160208101906129669190613b59565b6119d0565b6129748161400e565b905061292b565b600054610100900460ff166129a25760405162461bcd60e51b815260040161062690613d5f565b6116a081611eae565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106129e5576129e5613b28565b602090810291909101015292915050565b6001600160a01b0384163b15610e295760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612a3a9089908990889088908890600401614030565b602060405180830381600087803b158015612a5457600080fd5b505af1925050508015612a84575060408051601f3d908101601f19168201909252612a8191810190613e7d565b60015b612a905761239a613e9a565b6001600160e01b0319811663f23a6e6160e01b14611d6d5760405162461bcd60e51b815260040161062690613f3f565b60606106546001600160a01b03831660145b60606000612ae18360026139eb565b612aec906002613d22565b6001600160401b03811115612b0357612b036130ec565b6040519080825280601f01601f191660200182016040528015612b2d576020820181803683370190505b509050600360fc1b81600081518110612b4857612b48613b28565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612b7757612b77613b28565b60200101906001600160f81b031916908160001a9053506000612b9b8460026139eb565b612ba6906001613d22565b90505b6001811115612c1e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612bda57612bda613b28565b1a60f81b828281518110612bf057612bf0613b28565b60200101906001600160f81b031916908160001a90535060049490941c93612c1781614075565b9050612ba9565b508315611e905760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610626565b6001600160a01b038516612cf45760005b8351811015612cf257828181518110612c9957612c99613b28565b602002602001015160976000868481518110612cb757612cb7613b28565b602002602001015181526020019081526020016000206000828254612cdc9190613d22565b90915550612ceb905081613b3e565b9050612c7e565b505b6001600160a01b038416610e295760005b8351811015611d6d576000848281518110612d2257612d22613b28565b602002602001015190506000848381518110612d4057612d40613b28565b6020026020010151905060006097600084815260200190815260200160002054905081811015612dc35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610626565b60009283526097602052604090922091039055612ddf81613b3e565b9050612d05565b6000806000808451604114612e015760009350505050610654565b50505060208201516040830151606084015160001a601b811015612e2d57612e2a601b8261408c565b90505b8060ff16601b14158015612e4557508060ff16601c14155b15612e565760009350505050610654565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015612ea9573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b828054612eca9061399a565b90600052602060002090601f016020900481019282612eec5760008555612f32565b82601f10612f0557805160ff1916838001178555612f32565b82800160010185558215612f32579182015b82811115612f32578251825591602001919060010190612f17565b50612f3e929150612f42565b5090565b5b80821115612f3e5760008155600101612f43565b80356001600160a01b0381168114612f6e57600080fd5b919050565b60008060408385031215612f8657600080fd5b612f8f83612f57565b946020939093013593505050565b6001600160e01b0319811681146116a057600080fd5b600060208284031215612fc557600080fd5b8135611e9081612f9d565b80356001600160601b0381168114612f6e57600080fd5b60008060408385031215612ffa57600080fd5b61300383612f57565b915061301160208401612fd0565b90509250929050565b60006020828403121561302c57600080fd5b5035919050565b60005b8381101561304e578181015183820152602001613036565b83811115611b6f5750506000910152565b60008151808452613077816020860160208601613033565b601f01601f19169290920160200192915050565b602081526000611e90602083018461305f565b6000806000606084860312156130b357600080fd5b505081359360208301359350604090920135919050565b600080604083850312156130dd57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715613127576131276130ec565b6040525050565b60006001600160401b03821115613147576131476130ec565b5060051b60200190565b600082601f83011261316257600080fd5b8135602061316f8261312e565b60405161317c8282613102565b83815260059390931b850182019282810191508684111561319c57600080fd5b8286015b848110156131b757803583529183019183016131a0565b509695505050505050565b600082601f8301126131d357600080fd5b81356001600160401b038111156131ec576131ec6130ec565b604051613203601f8301601f191660200182613102565b81815284602083860101111561321857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561324d57600080fd5b61325686612f57565b945061326460208701612f57565b935060408601356001600160401b038082111561328057600080fd5b61328c89838a01613151565b945060608801359150808211156132a257600080fd5b6132ae89838a01613151565b935060808801359150808211156132c457600080fd5b506132d1888289016131c2565b9150509295509295909350565b600080604083850312156132f157600080fd5b8235915061301160208401612f57565b60008083601f84011261331357600080fd5b5081356001600160401b0381111561332a57600080fd5b6020830191508360208260071b850101111561085257600080fd5b6000806020838503121561335857600080fd5b82356001600160401b0381111561336e57600080fd5b61337a85828601613301565b90969095509350505050565b60008083601f84011261339857600080fd5b5081356001600160401b038111156133af57600080fd5b6020830191508360208260051b850101111561085257600080fd5b60008083601f8401126133dc57600080fd5b5081356001600160401b038111156133f357600080fd5b60208301915083602082850101111561085257600080fd5b60008060008060008060008060008060c08b8d03121561342a57600080fd5b8a35995061343a60208c01612f57565b985060408b01356001600160401b038082111561345657600080fd5b6134628e838f01613386565b909a50985060608d013591508082111561347b57600080fd5b6134878e838f01613386565b909850965060808d01359150808211156134a057600080fd5b6134ac8e838f016133ca565b909650945060a08d01359150808211156134c557600080fd5b506134d28d828e016133ca565b915080935050809150509295989b9194979a5092959850565b600080604083850312156134fe57600080fd5b82356001600160401b038082111561351557600080fd5b818501915085601f83011261352957600080fd5b813560206135368261312e565b6040516135438282613102565b83815260059390931b850182019282810191508984111561356357600080fd5b948201945b838610156135885761357986612f57565b82529482019490820190613568565b9650508601359250508082111561359e57600080fd5b506135ab85828601613151565b9150509250929050565b600081518084526020808501945080840160005b838110156135e5578151875295820195908201906001016135c9565b509495945050505050565b602081526000611e9060208301846135b5565b60008060008060006060868803121561361b57600080fd5b8535945060208601356001600160401b038082111561363957600080fd5b61364589838a01613386565b9096509450604088013591508082111561365e57600080fd5b5061366b88828901613386565b969995985093965092949392505050565b60008083601f84011261368e57600080fd5b5081356001600160401b038111156136a557600080fd5b6020830191508360208260061b850101111561085257600080fd5b60008060008060008060008060008060e08b8d0312156136df57600080fd5b8a356001600160401b03808211156136f657600080fd5b6137028e838f016131c2565b9b5061371060208e01612f57565b9a5061371e60408e01612f57565b995061372c60608e01612fd0565b985060808d013591508082111561374257600080fd5b61374e8e838f0161367c565b909850965060a08d013591508082111561376757600080fd5b6137738e838f0161367c565b909650945060c08d013591508082111561378c57600080fd5b506134d28d828e01613301565b6000806000604084860312156137ae57600080fd5b6137b784612f57565b925060208401356001600160401b038111156137d257600080fd5b6137de86828701613386565b9497909650939450505050565b600080602083850312156137fe57600080fd5b82356001600160401b0381111561381457600080fd5b61337a8582860161367c565b60006020828403121561383257600080fd5b81356001600160401b0381111561384857600080fd5b613854848285016131c2565b949350505050565b6000806040838503121561386f57600080fd5b61387883612f57565b91506020830135801515811461388d57600080fd5b809150509250929050565b600080602083850312156138ab57600080fd5b82356001600160401b03808211156138c257600080fd5b818501915085601f8301126138d657600080fd5b8135818111156138e557600080fd5b8660206060830285010111156138fa57600080fd5b60209290920196919550909350505050565b6000806040838503121561391f57600080fd5b61392883612f57565b915061301160208401612f57565b600080600080600060a0868803121561394e57600080fd5b61395786612f57565b945061396560208701612f57565b9350604086013592506060860135915060808601356001600160401b0381111561398e57600080fd5b6132d1888289016131c2565b600181811c908216806139ae57607f821691505b602082108114156139cf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613a0557613a056139d5565b500290565b600082613a2757634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b81835260006001600160fb1b03831115613a9357600080fd5b8260051b8083602087013760009401602001938452509192915050565b8881526001600160a01b038816602082015260a060408201819052600090613adb908301888a613a7a565b8281036060840152613aee818789613a7a565b90508281036080840152838152838560208301376000602085830101526020601f19601f8601168201019150509998505050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613b5257613b526139d5565b5060010190565b600060208284031215613b6b57600080fd5b611e9082612f57565b600060208284031215613b8657600080fd5b611e9082612fd0565b6020808252818101839052600090604080840186845b87811015613bf457813583526001600160a01b03613bc4868401612f57565b16858401526001600160601b03613bdc858401612fd0565b16838501526060928301929190910190600101613ba5565b5090979650505050505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008219821115613d3557613d356139d5565b500190565b604081526000613d4d60408301856135b5565b8281036020840152611afb81856135b5565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613de2816017850160208801613033565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613e13816028840160208801613033565b01602801949350505050565b6001600160a01b0386811682528516602082015260a060408201819052600090613e4b908301866135b5565b8281036060840152613e5d81866135b5565b90508281036080840152613e71818561305f565b98975050505050505050565b600060208284031215613e8f57600080fd5b8151611e9081612f9d565b600060033d1115613eb35760046000803e5060005160e01c5b90565b600060443d1015613ec45790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613ef357505050505090565b8285019150815181811115613f0b5750505050505090565b843d8701016020828501011115613f255750505050505090565b613f3460208286010187613102565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b8381526001600160a01b0383166020820152606060408201819052600090611afb9083018461305f565b60008251613fc3818460208701613033565b9190910192915050565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600061ffff80831681811415614026576140266139d5565b6001019392505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061406a9083018461305f565b979650505050505050565b600081614084576140846139d5565b506000190190565b600060ff821660ff84168060ff038211156140a9576140a96139d5565b01939250505056fe4d696e7461626c6545646974696f6e7346726565506861736573476c6f62616c557365724c696d69742076312e31a264697066735822122069c7e1f497be15ff4215ab217cf1e5db527633ae634374a3769431bb3eedb64d64736f6c63430008090033
Deployed Bytecode Sourcemap
79689:11960:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59239:230;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;59239:230:0;;;;;;;;91240:406;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;91240:406:0;1019:187:1;81757:236:0;;;;;;:::i;:::-;;:::i;:::-;;79976:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;79976:52:0;;;;;;;2045:25:1;;;2101:2;2086:18;;2079:34;;;;-1:-1:-1;;;;;2149:32:1;2129:18;;;2122:60;2033:2;2018:18;79976:52:0;1843:345:1;58983:105:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;84652:351::-;;;;;;:::i;:::-;;:::i;40679:131::-;;;;;;:::i;:::-;40753:7;40780:12;;;:6;:12;;;;;:22;;;;40679:131;47295:442;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4077:32:1;;;4059:51;;4141:2;4126:18;;4119:34;;;;4032:18;47295:442:0;3885:274:1;61182:438:0;;;;;;:::i;:::-;;:::i;41120:147::-;;;;;;:::i;:::-;;:::i;42264:218::-;;;;;;:::i;:::-;;:::i;83500:188::-;;;;;;:::i;:::-;;:::i;79896:71::-;;;;;;:::i;:::-;;;;;;;;;;;;;;87293:1281;;;;;;:::i;:::-;;:::i;59635:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;76044:133::-;;;;;;:::i;:::-;76101:4;75922:16;;;:12;:16;;;;;;-1:-1:-1;;;76044:133:0;80415:117;;;:::i;85508:158::-;;;;;;:::i;:::-;;:::i;77568:335::-;;;;;;:::i;:::-;;:::i;80603:909::-;;;;;;:::i;:::-;;:::i;80122:99::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;86442:843;;;;;;:::i;:::-;;:::i;39130:147::-;;;;;;:::i;:::-;;:::i;82991:211::-;;;;;;:::i;:::-;;:::i;81520:106::-;;;;;;:::i;:::-;;:::i;38224:49::-;;38269:4;38224:49;;60232:155;;;;;;:::i;:::-;;:::i;82001:174::-;;;:::i;75833:113::-;;;;;;:::i;:::-;75895:7;75922:16;;;:12;:16;;;;;;;75833:113;85011:199;;;;;;:::i;:::-;;:::i;80037:78::-;;;;;;:::i;:::-;;;;;;;;;;;;;;41560:149;;;;;;:::i;:::-;;:::i;82183:800::-;;;;;;:::i;:::-;;:::i;60459:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;60582:27:0;;;60558:4;60582:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;60459:168;60699:406;;;;;;:::i;:::-;;:::i;59239:230::-;59325:7;-1:-1:-1;;;;;59353:21:0;;59345:76;;;;-1:-1:-1;;;59345:76:0;;18855:2:1;59345:76:0;;;18837:21:1;18894:2;18874:18;;;18867:30;18933:34;18913:18;;;18906:62;-1:-1:-1;;;18984:18:1;;;18977:40;19034:19;;59345:76:0;;;;;;;;;-1:-1:-1;59439:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;59439:22:0;;;;;;;;;;59239:230;;;;;:::o;91240:406::-;91424:4;91448:50;91485:12;91448:36;:50::i;:::-;:117;;;;91515:50;91552:12;91515:36;:50::i;:::-;91448:190;;;;91582:56;91625:12;91582:42;:56::i;81757:236::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;81872:42:::1;81891:9;81902:11;81872:18;:42::i;:::-;81930:55;::::0;-1:-1:-1;;;;;19226:39:1;;19208:58;;-1:-1:-1;;;;;81930:55:0;::::1;::::0;18729:10;;81930:55:::1;::::0;19196:2:1;19181:18;81930:55:0::1;;;;;;;;81757:236:::0;;;:::o;58983:105::-;59043:13;59076:4;59069:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58983:105;;;:::o;84652:351::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;84824:51:::1;84844:15;84861:13;84824:19;:51::i;:::-;-1:-1:-1::0;84888:17:0::1;::::0;;;:7:::1;:17;::::0;;;;;:50;;;84949:30:::1;;:46:::0;84652:351::o;47295:442::-;47392:7;47450:27;;;:17;:27;;;;;;;;47421:56;;;;;;;;;-1:-1:-1;;;;;47421:56:0;;;;;-1:-1:-1;;;47421:56:0;;;-1:-1:-1;;;;;47421:56:0;;;;;;;;47392:7;;47490:92;;-1:-1:-1;47541:29:0;;;;;;;;;47551:19;47541:29;-1:-1:-1;;;;;47541:29:0;;;;-1:-1:-1;;;47541:29:0;;-1:-1:-1;;;;;47541:29:0;;;;;47490:92;47632:23;;;;47594:21;;79880:7;;47619:36;;-1:-1:-1;;;;;47619:36:0;:10;:36;:::i;:::-;47618:58;;;;:::i;:::-;47697:16;;;-1:-1:-1;47594:82:0;;-1:-1:-1;;47295:442:0;;;;;;:::o;61182:438::-;-1:-1:-1;;;;;61415:20:0;;18729:10;61415:20;;:60;;-1:-1:-1;61439:36:0;61456:4;18729:10;60459:168;:::i;61439:36::-;61393:156;;;;-1:-1:-1;;;61393:156:0;;;;;;;:::i;:::-;61560:52;61583:4;61589:2;61593:3;61598:7;61607:4;61560:22;:52::i;:::-;61182:438;;;;;:::o;41120:147::-;40753:7;40780:12;;;:6;:12;;;;;:22;;;38715:16;38726:4;38715:10;:16::i;:::-;41234:25:::1;41245:4;41251:7;41234:10;:25::i;:::-;41120:147:::0;;;:::o;42264:218::-;-1:-1:-1;;;;;42360:23:0;;18729:10;42360:23;42352:83;;;;-1:-1:-1;;;42352:83:0;;20806:2:1;42352:83:0;;;20788:21:1;20845:2;20825:18;;;20818:30;20884:34;20864:18;;;20857:62;-1:-1:-1;;;20935:18:1;;;20928:45;20990:19;;42352:83:0;20604:411:1;42352:83:0;42448:26;42460:4;42466:7;42448:11;:26::i;:::-;42264:218;;:::o;83500:188::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;83610:19;83602:48:::1;;;::::0;-1:-1:-1;;;83602:48:0;;21222:2:1;83602:48:0::1;::::0;::::1;21204:21:1::0;21261:2;21241:18;;;21234:30;-1:-1:-1;;;21280:18:1;;;21273:46;21336:18;;83602:48:0::1;21020:340:1::0;83602:48:0::1;83661:19;83672:7;;83661:10;:19::i;87293:1281::-:0;87542:21;87534:50;;;;-1:-1:-1;;;87534:50:0;;21567:2:1;87534:50:0;;;21549:21:1;21606:2;21586:18;;;21579:30;-1:-1:-1;;;21625:18:1;;;21618:46;21681:18;;87534:50:0;21365:340:1;87534:50:0;87603:35;;;87595:92;;;;-1:-1:-1;;;87595:92:0;;21912:2:1;87595:92:0;;;21894:21:1;21951:2;21931:18;;;21924:30;21990:34;21970:18;;;21963:62;-1:-1:-1;;;22041:18:1;;;22034:42;22093:19;;87595:92:0;21710:408:1;87595:92:0;87700:19;87722:17;;;:7;:17;;;;;87760:41;87722:17;87785:15;87760:17;:41::i;:::-;87752:77;;;;-1:-1:-1;;;87752:77:0;;22325:2:1;87752:77:0;;;22307:21:1;22364:2;22344:18;;;22337:30;22403:25;22383:18;;;22376:53;22446:18;;87752:77:0;22123:347:1;87752:77:0;87847:41;38269:4;18729:10;39130:147;:::i;87847:41::-;87842:398;;87930:21;;;;-1:-1:-1;;;;;87930:21:0;87974:28;87966:64;;;;-1:-1:-1;;;87966:64:0;;22677:2:1;87966:64:0;;;22659:21:1;22716:2;22696:18;;;22689:30;22755:25;22735:18;;;22728:53;22798:18;;87966:64:0;22475:347:1;87966:64:0;88047:181;88102:8;88112:10;88124:9;;88135:8;;88145:5;;88091:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;88170:14;88203:10;;88047:25;:181::i;:::-;87890:350;87842:398;88257:9;88252:255;88268:20;;;88252:255;;;88315:8;;88324:1;88315:11;;;;;;;:::i;:::-;;;;;;;88330:1;88315:16;;88307:52;;;;-1:-1:-1;;;88307:52:0;;24537:2:1;88307:52:0;;;24519:21:1;24576:2;24556:18;;;24549:30;24615:25;24595:18;;;24588:53;24658:18;;88307:52:0;24335:347:1;88307:52:0;88376:55;88393:10;88405:9;;88415:1;88405:12;;;;;;;:::i;:::-;;;;;;;88419:8;;88428:1;88419:11;;;;;;;:::i;:::-;;;;;;;88376:16;:55::i;:::-;88477:3;;88252:255;;;;88519:47;88527:10;88539:9;;88550:8;;88560:5;;88519:7;:47::i;:::-;87523:1051;87293:1281;;;;;;;;;;:::o;59635:524::-;59791:16;59852:3;:10;59833:8;:15;:29;59825:83;;;;-1:-1:-1;;;59825:83:0;;24889:2:1;59825:83:0;;;24871:21:1;24928:2;24908:18;;;24901:30;24967:34;24947:18;;;24940:62;-1:-1:-1;;;25018:18:1;;;25011:39;25067:19;;59825:83:0;24687:405:1;59825:83:0;59921:30;59968:8;:15;-1:-1:-1;;;;;59954:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59954:30:0;;59921:63;;60002:9;59997:122;60021:8;:15;60017:1;:19;59997:122;;;60077:30;60087:8;60096:1;60087:11;;;;;;;;:::i;:::-;;;;;;;60100:3;60104:1;60100:6;;;;;;;;:::i;:::-;;;;;;;60077:9;:30::i;:::-;60058:13;60072:1;60058:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;60038:3;;;:::i;:::-;;;59997:122;;;-1:-1:-1;60138:13:0;59635:524;-1:-1:-1;;;59635:524:0:o;80415:117::-;80457:13;80474:55;;;;;;;;;;;;;;;;;;;80415:117;:::o;85508:158::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;85757:17;;;;:7;:17;;;;;:33;;:43;;-1:-1:-1;;;;;;85757:43:0;-1:-1:-1;;;;;85757:43:0;;;;;41120:147;;;:::o;77568:335::-;40753:7;40780:12;;;:6;:12;;;;;:22;;;38715:16;38726:4;38715:10;:16::i;:::-;77761:20;;::::1;::::0;:47:::1;;-1:-1:-1::0;77785:23:0;;::::1;77761:47;77753:83;;;::::0;-1:-1:-1;;;77753:83:0;;25439:2:1;77753:83:0::1;::::0;::::1;25421:21:1::0;25478:2;25458:18;;;25451:30;25517:25;25497:18;;;25490:53;25560:18;;77753:83:0::1;25237:347:1::0;77753:83:0::1;77849:46;77866:5;77873:8;;77883:11;;77849:16;:46::i;:::-;77568:335:::0;;;;;;:::o;80603:909::-;14491:19;14514:13;;;;;;14513:14;;14561:34;;;;-1:-1:-1;14579:12:0;;14594:1;14579:12;;;;:16;14561:34;14560:108;;;-1:-1:-1;14640:4:0;4344:19;:23;;;14601:66;;-1:-1:-1;14650:12:0;;;;;:17;14601:66;14538:204;;;;-1:-1:-1;;;14538:204:0;;25791:2:1;14538:204:0;;;25773:21:1;25830:2;25810:18;;;25803:30;25869:34;25849:18;;;25842:62;-1:-1:-1;;;25920:18:1;;;25913:44;25974:19;;14538:204:0;25589:410:1;14538:204:0;14753:12;:16;;-1:-1:-1;;14753:16:0;14768:1;14753:16;;;14780:67;;;;14815:13;:20;;-1:-1:-1;;14815:20:0;;;;;14780:67;80945:20:::1;80960:4;80945:14;:20::i;:::-;80978:38;38269:4;81009:6:::0;80978:10:::1;:38::i;:::-;-1:-1:-1::0;;;;;81033:37:0;::::1;::::0;81029:245:::1;;81087:70;81106:23;81131:25;81087:18;:70::i;:::-;81029:245;;;-1:-1:-1::0;;;;;81198:30:0;::::1;::::0;81190:72:::1;;;::::0;-1:-1:-1;;;81190:72:0;;26206:2:1;81190:72:0::1;::::0;::::1;26188:21:1::0;26245:2;26225:18;;;26218:30;26284:31;26264:18;;;26257:59;26333:18;;81190:72:0::1;26004:353:1::0;81190:72:0::1;81289:81;::::0;-1:-1:-1;;;;;19226:39:1;;19208:58;;-1:-1:-1;;;;;81289:81:0;::::1;::::0;81315:1:::1;::::0;81289:81:::1;::::0;19196:2:1;19181:18;81289:81:0::1;;;;;;;81383:29;81399:12;;81383:15;:29::i;:::-;81425:47;81450:21;;81425:24;:47::i;:::-;81485:19;81496:7;;81485:10;:19::i;:::-;14873:14:::0;14869:102;;;14920:5;14904:21;;-1:-1:-1;;14904:21:0;;;14945:14;;-1:-1:-1;26514:36:1;;14945:14:0;;26502:2:1;26487:18;14945:14:0;;;;;;;14480:498;80603:909;;;;;;;;;;:::o;86442:843::-;86586:16;86621:33;86671:9;-1:-1:-1;;;;;86657:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;86657:31:0;;86621:67;;86706:9;86701:541;86717:20;;;86701:541;;;86778:136;86805:21;:35;86827:9;;86837:1;86827:12;;;;;;;:::i;:::-;;;;;;;86805:35;;;;;;;;;;;;86859:14;:28;86874:9;;86884:1;86874:12;;;;;;;:::i;:::-;;;;;;;86859:28;;;;;;;;;;;:40;86888:10;-1:-1:-1;;;;;86859:40:0;-1:-1:-1;;;;;86859:40:0;;;;;;;;;;;;;86778:8;:136::i;:::-;86756:16;86773:1;86756:19;;;;;;;;:::i;:::-;;;;;;:158;;;;;86935:16;86952:1;86935:19;;;;;;;;:::i;:::-;;;;;;;86958:1;86935:24;86931:236;;87002:149;87029:61;87038:10;:24;87049:9;;87059:1;87049:12;;;;;;;:::i;:::-;;;;;;;87038:24;;;;;;;;;;;;87064:25;87076:9;;87086:1;87076:12;;;;;;;:::i;:::-;;;;;;;75895:7;75922:16;;;:12;:16;;;;;;;75833:113;87064:25;87029:8;:61::i;:::-;87113:16;87130:1;87113:19;;;;;;;;:::i;:::-;;;;;;;87002:4;:149::i;:::-;86980:16;86997:1;86980:19;;;;;;;;:::i;:::-;;;;;;:171;;;;;86931:236;87212:3;;86701:541;;;-1:-1:-1;87261:16:0;86442:843;-1:-1:-1;;;;86442:843:0:o;39130:147::-;39216:4;39240:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;39240:29:0;;;;;;;;;;;;;;;39130:147::o;82991:211::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;83109:24;83101:53:::1;;;::::0;-1:-1:-1;;;83101:53:0;;26763:2:1;83101:53:0::1;::::0;::::1;26745:21:1::0;26802:2;26782:18;;;26775:30;-1:-1:-1;;;26821:18:1;;;26814:46;26877:18;;83101:53:0::1;26561:340:1::0;83101:53:0::1;83165:29;83181:12;;83165:15;:29::i;81520:106::-:0;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;81605:13:::1;81613:4;81605:7;:13::i;60232:155::-:0;60327:52;18729:10;60360:8;60370;60327:18;:52::i;82001:174::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;82082:23:::1;48863:19:::0;;48856:26;48795:95;82082:23:::1;82121:46;::::0;;82161:1:::1;19208:58:1::0;;;82121:46:0;;18729:10;;82121:46:::1;::::0;;;;;19196:2:1;82121:46:0;;::::1;82001:174:::0;:::o;85011:199::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;85155:47:::1;85180:21;;85155:24;:47::i;41560:149::-:0;40753:7;40780:12;;;:6;:12;;;;;:22;;;38715:16;38726:4;38715:10;:16::i;:::-;41675:26:::1;41687:4;41693:7;41675:11;:26::i;82183:800::-:0;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;82303:22;82295:51:::1;;;::::0;-1:-1:-1;;;82295:51:0;;27330:2:1;82295:51:0::1;::::0;::::1;27312:21:1::0;27369:2;27349:18;;;27342:30;-1:-1:-1;;;27388:18:1;;;27381:46;27444:18;;82295:51:0::1;27128:340:1::0;82295:51:0::1;82364:9;82359:556;82375:21:::0;;::::1;82359:556;;;82453:1;82419:10:::0;;82430:1;82419:13;;::::1;;;;;:::i;:::-;;;;;;:22;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;82419:36:0::1;;82415:424;;;82484:10;;82495:1;82484:13;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;82484:29:0::1;::::0;82476:69:::1;;;::::0;-1:-1:-1;;;82476:69:0;;28055:2:1;82476:69:0::1;::::0;::::1;28037:21:1::0;28094:2;28074:18;;;28067:30;28133:29;28113:18;;;28106:57;28180:18;;82476:69:0::1;27853:351:1::0;82476:69:0::1;82564:41;82583:10;;82594:1;82583:13;;;;;;;:::i;:::-;;;;;;:21;;;49751:26:::0;;;;:17;:26;;;;;49744:33;49671:114;82564:41:::1;82415:424;;;82654:10;;82665:1;82654:13;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;82654:29:0::1;82646:69;;;::::0;-1:-1:-1;;;82646:69:0;;28411:2:1;82646:69:0::1;::::0;::::1;28393:21:1::0;28450:2;28430:18;;;28423:30;28489:29;28469:18;;;28462:57;28536:18;;82646:69:0::1;28209:351:1::0;82646:69:0::1;82734:89;82751:10;;82762:1;82751:13;;;;;;;:::i;:::-;;;;;;:21;;;82774:10;;82785:1;82774:13;;;;;;;:::i;:::-;;;;;;:22;;;;;;;;;;:::i;:::-;82798:10;;82809:1;82798:13;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;82734:16;:89::i;:::-;82885:3;;82359:556;;;-1:-1:-1::0;18729:10:0;-1:-1:-1;;;;;82932:43:0::1;;82964:10;;82932:43;;;;;;;:::i;:::-;;;;;;;;82183:800:::0;;;:::o;60699:406::-;-1:-1:-1;;;;;60907:20:0;;18729:10;60907:20;;:60;;-1:-1:-1;60931:36:0;60948:4;18729:10;60459:168;:::i;60931:36::-;60885:156;;;;-1:-1:-1;;;60885:156:0;;;;;;;:::i;:::-;61052:45;61070:4;61076:2;61080;61084:6;61092:4;61052:17;:45::i;58218:354::-;58342:4;-1:-1:-1;;;;;;58379:52:0;;-1:-1:-1;;;58379:52:0;;:132;;-1:-1:-1;;;;;;;58448:63:0;;-1:-1:-1;;;58448:63:0;58379:132;:185;;;-1:-1:-1;;;;;;;;;;20908:51:0;;;58528:36;20799:168;46981:248;47105:4;-1:-1:-1;;;;;;47129:52:0;;-1:-1:-1;;;47129:52:0;;:92;;;47185:36;47209:11;47185:23;:36::i;38823:215::-;38908:4;-1:-1:-1;;;;;;38932:58:0;;-1:-1:-1;;;38932:58:0;;:98;;;38994:36;39018:11;38994:23;:36::i;39581:105::-;39648:30;39659:4;18729:10;39648;:30::i;:::-;39581:105;:::o;48387:332::-;79880:7;-1:-1:-1;;;;;48490:33:0;;;;48482:88;;;;-1:-1:-1;;;48482:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48589:22:0;;48581:60;;;;-1:-1:-1;;;48581:60:0;;30095:2:1;48581:60:0;;;30077:21:1;30134:2;30114:18;;;30107:30;30173:27;30153:18;;;30146:55;30218:18;;48581:60:0;29893:349:1;48581:60:0;48676:35;;;;;;;;;-1:-1:-1;;;;;48676:35:0;;;;;;-1:-1:-1;;;;;48676:35:0;;;;;;;;;;-1:-1:-1;;;48654:57:0;;;;:19;:57;48387:332::o;84048:267::-;84171:20;;;:42;;-1:-1:-1;84195:18:0;;84171:42;:77;;;;84235:13;84217:15;:31;84171:77;84149:158;;;;-1:-1:-1;;;84149:158:0;;30449:2:1;84149:158:0;;;30431:21:1;30488:2;30468:18;;;30461:30;30527:33;30507:18;;;30500:61;30578:18;;84149:158:0;30247:355:1;63416:1146:0;63643:7;:14;63629:3;:10;:28;63621:81;;;;-1:-1:-1;;;63621:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63721:16:0;;63713:66;;;;-1:-1:-1;;;63713:66:0;;;;;;;:::i;:::-;18729:10;63836:60;18729:10;63867:4;63873:2;63877:3;63882:7;63891:4;63836:20;:60::i;:::-;63914:9;63909:421;63933:3;:10;63929:1;:14;63909:421;;;63965:10;63978:3;63982:1;63978:6;;;;;;;;:::i;:::-;;;;;;;63965:19;;63999:14;64016:7;64024:1;64016:10;;;;;;;;:::i;:::-;;;;;;;;;;;;64043:19;64065:13;;;:9;:13;;;;;;-1:-1:-1;;;;;64065:19:0;;;;;;;;;;;;64016:10;;-1:-1:-1;64107:21:0;;;;64099:76;;;;-1:-1:-1;;;64099:76:0;;;;;;;:::i;:::-;64219:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;64219:19:0;;;;;;;;;;64241:20;;;64219:42;;64291:17;;;;;;;:27;;64241:20;;64219:13;64291:27;;64241:20;;64291:27;:::i;:::-;;;;;;;;63950:380;;;63945:3;;;;:::i;:::-;;;63909:421;;;;64377:2;-1:-1:-1;;;;;64347:47:0;64371:4;-1:-1:-1;;;;;64347:47:0;64361:8;-1:-1:-1;;;;;64347:47:0;;64381:3;64386:7;64347:47;;;;;;;:::i;:::-;;;;;;;;64479:75;64515:8;64525:4;64531:2;64535:3;64540:7;64549:4;64479:35;:75::i;78624:213::-;-1:-1:-1;;;;;78722:22:0;;78714:71;;;;-1:-1:-1;;;78714:71:0;;32638:2:1;78714:71:0;;;32620:21:1;32677:2;32657:18;;;32650:30;32716:34;32696:18;;;32689:62;-1:-1:-1;;;32767:18:1;;;32760:34;32811:19;;78714:71:0;32436:400:1;78714:71:0;78796:33;78813:5;78820:8;78796:16;:33::i;78845:218::-;-1:-1:-1;;;;;78944:22:0;;78936:74;;;;-1:-1:-1;;;78936:74:0;;33043:2:1;78936:74:0;;;33025:21:1;33082:2;33062:18;;;33055:30;33121:34;33101:18;;;33094:62;-1:-1:-1;;;33172:18:1;;;33165:37;33219:19;;78936:74:0;32841:403:1;78936:74:0;79021:34;79039:5;79046:8;79021:17;:34::i;83696:344::-;83774:9;83769:264;83785:18;;;83769:264;;;83822:71;83842:7;;83850:1;83842:10;;;;;;;:::i;:::-;;;;;;:25;;;83869:7;;83877:1;83869:10;;;;;;;:::i;:::-;;;;;;:23;;;83822:19;:71::i;:::-;83908:49;83926:7;;83934:1;83926:10;;;;;;;:::i;:::-;;;;;;:18;;;83946:7;;83954:1;83946:10;;;;;;;:::i;:::-;;;;;;83908:17;:49::i;:::-;84003:3;;83769:264;;88582:354;88715:21;;88770:19;;;;88673:4;;88715:21;88810:19;;;:51;;;88847:14;88833:10;:28;;88810:51;88809:119;;;;-1:-1:-1;88880:17:0;;;:47;;;88915:12;88901:10;:26;;88880:47;88802:126;88582:354;-1:-1:-1;;;;;88582:354:0:o;89740:265::-;89932:36;89950:5;89957:10;;89932:17;:36::i;:::-;-1:-1:-1;;;;;89913:55:0;:15;-1:-1:-1;;;;;89913:55:0;;89905:92;;;;-1:-1:-1;;;89905:92:0;;33451:2:1;89905:92:0;;;33433:21:1;33490:2;33470:18;;;33463:30;33529:26;33509:18;;;33502:54;33573:18;;89905:92:0;33249:348:1;89905:92:0;89740:265;;;;:::o;88944:405::-;89044:17;89064:31;;;:21;:31;;;;;;;;;89129:14;:24;;;;;-1:-1:-1;;;;;89129:36:0;;;;;;;;;;;89064:31;89186:22;89201:7;89129:36;89186:22;:::i;:::-;:35;;89178:91;;;;-1:-1:-1;;;89178:91:0;;33804:2:1;89178:91:0;;;33786:21:1;33843:2;33823:18;;;33816:30;33882:34;33862:18;;;33855:62;-1:-1:-1;;;33933:18:1;;;33926:41;33984:19;;89178:91:0;33602:407:1;89178:91:0;89319:22;89334:7;89319:12;:22;:::i;:::-;89280:24;;;;:14;:24;;;;;;;;-1:-1:-1;;;;;89280:36:0;;;;;;;;;;;;:61;;;;-1:-1:-1;;;88944:405:0:o;89357:375::-;89561:1;89541:21;;89537:188;;;89579:51;89585:10;89597:9;;89607:1;89597:12;;;;;;;:::i;:::-;;;;;;;89611:8;;89620:1;89611:11;;;;;;;:::i;:::-;;;;;;;89624:5;;89579:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89579:5:0;;-1:-1:-1;;;89579:51:0:i;:::-;89537:188;;;89663:50;89674:10;89686:9;;89663:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;89663:50:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89697:8:0;;-1:-1:-1;89697:8:0;;;;89663:50;;;89697:8;;89663:50;89697:8;89663:50;;;;;;;;;-1:-1:-1;;89663:50:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89707:5:0;;-1:-1:-1;89707:5:0;;;;89663:50;;89707:5;;;;89663:50;;;;;;;;;-1:-1:-1;89663:10:0;;-1:-1:-1;;;89663:50:0:i;:::-;89357:375;;;;;;;:::o;77911:251::-;78075:32;78091:5;78098:8;;78075:15;:32::i;:::-;78118:36;78135:5;78142:11;;78118:16;:36::i;57907:119::-;16634:13;;;;;;;16626:69;;;;-1:-1:-1;;;16626:69:0;;;;;;;:::i;:::-;57988:30:::1;58013:4;57988:24;:30::i;83210:282::-:0;83296:9;83291:194;83307:23;;;83291:194;;;83387:12;;83400:1;83387:15;;;;;;;:::i;:::-;;;;;;:22;;;83349:10;:35;83360:12;;83373:1;83360:15;;;;;;;:::i;:::-;;;;;;;;;:23;83349:35;;-1:-1:-1;83349:35:0;;;;;;;;83360:23;83349:35;:60;83455:3;;83291:194;;85218:282;85308:9;85303:190;85319:18;;;85303:190;;;85400:7;;85408:1;85400:10;;;;;;;:::i;:::-;;;;;;:17;;;85356:21;:41;85378:7;;85386:1;85378:10;;;;;;;:::i;:::-;;;;;;;;;:18;85356:41;;-1:-1:-1;85356:41:0;;;;;;;;85378:18;85356:41;:61;85463:3;;85303:190;;90937:174;91007:7;91068:4;91059:6;:13;:33;;91091:1;91059:33;;;91084:4;91075:6;:13;91059:33;91052:40;90937:174;-1:-1:-1;;;90937:174:0:o;91119:113::-;91179:7;91212:2;91206;:8;;:18;;91222:2;91206:18;;;-1:-1:-1;91217:2:0;;91119:113;-1:-1:-1;91119:113:0:o;65406:88::-;65473:13;;;;:4;;:13;;;;;:::i;70293:331::-;70448:8;-1:-1:-1;;;;;70439:17:0;:5;-1:-1:-1;;;;;70439:17:0;;;70431:71;;;;-1:-1:-1;;;70431:71:0;;34628:2:1;70431:71:0;;;34610:21:1;34667:2;34647:18;;;34640:30;34706:34;34686:18;;;34679:62;-1:-1:-1;;;34757:18:1;;;34750:39;34806:19;;70431:71:0;34426:405:1;70431:71:0;-1:-1:-1;;;;;70513:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;70513:46:0;;;;;;;;;;70575:41;;1159::1;;;70575::0;;1132:18:1;70575:41:0;1019:187:1;49170:390:0;79880:7;-1:-1:-1;;;;;49322:33:0;;;;49314:88;;;;-1:-1:-1;;;49314:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49421:22:0;;49413:62;;;;-1:-1:-1;;;49413:62:0;;35038:2:1;49413:62:0;;;35020:21:1;35077:2;35057:18;;;35050:30;35116:29;35096:18;;;35089:57;35163:18;;49413:62:0;34836:351:1;49413:62:0;49517:35;;;;;;;;-1:-1:-1;;;;;49517:35:0;;;;;-1:-1:-1;;;;;49517:35:0;;;;;;;;;;-1:-1:-1;49488:26:0;;;:17;:26;;;;;;:64;;;;;;;-1:-1:-1;;;49488:64:0;;;;;;49170:390::o;62084:974::-;-1:-1:-1;;;;;62272:16:0;;62264:66;;;;-1:-1:-1;;;62264:66:0;;;;;;;:::i;:::-;18729:10;62343:16;62408:21;62426:2;62408:17;:21::i;:::-;62385:44;;62440:24;62467:25;62485:6;62467:17;:25::i;:::-;62440:52;;62505:60;62526:8;62536:4;62542:2;62546:3;62551:7;62560:4;62505:20;:60::i;:::-;62578:19;62600:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;62600:19:0;;;;;;;;;;62638:21;;;;62630:76;;;;-1:-1:-1;;;62630:76:0;;;;;;;:::i;:::-;62742:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;62742:19:0;;;;;;;;;;62764:20;;;62742:42;;62806:17;;;;;;;:27;;62764:20;;62742:13;62806:27;;62764:20;;62806:27;:::i;:::-;;;;-1:-1:-1;;62851:46:0;;;35366:25:1;;;35422:2;35407:18;;35400:34;;;-1:-1:-1;;;;;62851:46:0;;;;;;;;;;;;;;35339:18:1;62851:46:0;;;;;;;62982:68;63013:8;63023:4;63029:2;63033;63037:6;63045:4;62982:30;:68::i;:::-;62253:805;;;;62084:974;;;;;:::o;39976:514::-;40065:22;40073:4;40079:7;40065;:22::i;:::-;40060:423;;40253:39;40284:7;40253:30;:39::i;:::-;40365:49;40404:4;40411:2;40365:30;:49::i;:::-;40158:279;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;40158:279:0;;;;;;;;;;-1:-1:-1;;;40104:367:0;;;;;;;:::i;85816:618::-;86061:72;86088:9;86099:5;86106:3;86111:4;86117:8;86127:5;86061:26;:72::i;:::-;-1:-1:-1;;;;;86150:19:0;;;86146:32;;86171:7;;86146:32;86211:9;86206:221;86226:4;:11;86222:1;:15;86206:221;;;86302:10;:19;86313:4;86318:1;86313:7;;;;;;;;:::i;:::-;;;;;;;86302:19;;;;;;;;;;;;86287:8;86296:1;86287:11;;;;;;;;:::i;:::-;;;;;;;86264:20;86276:4;86281:1;86276:7;;;;;;;;:::i;:::-;;;;;;;75895;75922:16;;;:12;:16;;;;;;;75833:113;86264:20;:34;;;;:::i;:::-;:57;;86256:95;;;;-1:-1:-1;;;86256:95:0;;36438:2:1;86256:95:0;;;36420:21:1;36477:2;36457:18;;;36450:30;36516:27;36496:18;;;36489:55;36561:18;;86256:95:0;36236:349:1;86256:95:0;86397:3;;86206:221;;73760:835;-1:-1:-1;;;;;74000:13:0;;4344:19;:23;73996:592;;74036:90;;-1:-1:-1;;;74036:90:0;;-1:-1:-1;;;;;74036:54:0;;;;;:90;;74091:8;;74101:4;;74107:3;;74112:7;;74121:4;;74036:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74036:90:0;;;;;;;;-1:-1:-1;;74036:90:0;;;;;;;;;;;;:::i;:::-;;;74032:545;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;74450:6;74443:14;;-1:-1:-1;;;74443:14:0;;;;;;;;:::i;74032:545::-;;;74499:62;;-1:-1:-1;;;74499:62:0;;38738:2:1;74499:62:0;;;38720:21:1;38777:2;38757:18;;;38750:30;38816:34;38796:18;;;38789:62;-1:-1:-1;;;38867:18:1;;;38860:50;38927:19;;74499:62:0;38536:416:1;74032:545:0;-1:-1:-1;;;;;;74208:71:0;;-1:-1:-1;;;74208:71:0;74204:170;;74304:50;;-1:-1:-1;;;74304:50:0;;;;;;;:::i;43861:238::-;43945:22;43953:4;43959:7;43945;:22::i;:::-;43940:152;;43984:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;43984:29:0;;;;;;;;;:36;;-1:-1:-1;;43984:36:0;44016:4;43984:36;;;44067:12;18729:10;;18649:98;44067:12;-1:-1:-1;;;;;44040:40:0;44058:7;-1:-1:-1;;;;;44040:40:0;44052:4;44040:40;;;;;;;;;;43861:238;;:::o;44279:239::-;44363:22;44371:4;44377:7;44363;:22::i;:::-;44359:152;;;44434:5;44402:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;44402:29:0;;;;;;;;;;:37;;-1:-1:-1;;44402:37:0;;;44459:40;18729:10;;44402:12;;44459:40;;44434:5;44459:40;44279:239;;:::o;84323:321::-;84421:19;84443:17;;;:7;:17;;;;;;;;;84496:24;;;;84473:47;;84552:22;;;;84531:18;;;:43;84611:25;;;;;;;;:::i;:::-;84587:21;;;;;:49;;-1:-1:-1;;;;;;84587:49:0;-1:-1:-1;;;;;84587:49:0;;;;;;;;;-1:-1:-1;;84323:321:0:o;90013:416::-;90109:7;90129:21;90171:13;90194:4;90201:5;90160:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90129:79;;90221:19;90347:7;90330:25;;;;;;;;:::i;:::-;;;;-1:-1:-1;;90330:25:0;;;;;;;;;;90320:36;;90330:25;90320:36;;;;40280:66:1;90267:90:0;;;40268:79:1;;;;40363:12;;;40356:28;40400:12;;90267:90:0;;;;;;;;;;;;90243:125;;;;;;90221:147;;90388:33;90397:11;90410:10;;90388:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90388:8:0;;-1:-1:-1;;;90388:33:0:i;:::-;90381:40;90013:416;-1:-1:-1;;;;;;90013:416:0:o;65880:729::-;-1:-1:-1;;;;;66033:16:0;;66025:62;;;;-1:-1:-1;;;66025:62:0;;;;;;;:::i;:::-;18729:10;66100:16;66165:21;66183:2;66165:17;:21::i;:::-;66142:44;;66197:24;66224:25;66242:6;66224:17;:25::i;:::-;66197:52;;66262:66;66283:8;66301:1;66305:2;66309:3;66314:7;66323:4;66262:20;:66::i;:::-;66341:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;66341:17:0;;;;;;;;;:27;;66362:6;;66341:13;:27;;66362:6;;66341:27;:::i;:::-;;;;-1:-1:-1;;66384:52:0;;;35366:25:1;;;35422:2;35407:18;;35400:34;;;-1:-1:-1;;;;;66384:52:0;;;;66417:1;;66384:52;;;;;;35339:18:1;66384:52:0;;;;;;;66527:74;66558:8;66576:1;66580:2;66584;66588:6;66596:4;66527:30;:74::i;67012:813::-;-1:-1:-1;;;;;67190:16:0;;67182:62;;;;-1:-1:-1;;;67182:62:0;;;;;;;:::i;:::-;67277:7;:14;67263:3;:10;:28;67255:81;;;;-1:-1:-1;;;67255:81:0;;;;;;;:::i;:::-;18729:10;67393:66;18729:10;67349:16;67436:2;67440:3;67445:7;67454:4;67393:20;:66::i;:::-;67477:9;67472:103;67496:3;:10;67492:1;:14;67472:103;;;67553:7;67561:1;67553:10;;;;;;;;:::i;:::-;;;;;;;67528:9;:17;67538:3;67542:1;67538:6;;;;;;;;:::i;:::-;;;;;;;67528:17;;;;;;;;;;;:21;67546:2;-1:-1:-1;;;;;67528:21:0;-1:-1:-1;;;;;67528:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;67508:3:0;;-1:-1:-1;67508:3:0;;;:::i;:::-;;;;67472:103;;;;67628:2;-1:-1:-1;;;;;67592:53:0;67624:1;-1:-1:-1;;;;;67592:53:0;67606:8;-1:-1:-1;;;;;67592:53:0;;67632:3;67637:7;67592:53;;;;;;;:::i;:::-;;;;;;;;67736:81;67772:8;67790:1;67794:2;67798:3;67803:7;67812:4;67736:35;:81::i;78170:218::-;78276:8;78271:110;78290:23;;;;-1:-1:-1;78271:110:0;;;78335:34;78346:5;78353:12;;78366:1;78353:15;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;78335:10;:34::i;:::-;78315:3;;;:::i;:::-;;;78271:110;;78396:220;78503:8;78498:111;78517:23;;;;-1:-1:-1;78498:111:0;;;78562:35;78574:5;78581:12;;78594:1;78581:15;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;78562:11;:35::i;:::-;78542:3;;;:::i;:::-;;;78498:111;;58034:112;16634:13;;;;;;;16626:69;;;;-1:-1:-1;;;16626:69:0;;;;;;;:::i;:::-;58125:13:::1;58133:4;58125:7;:13::i;74603:198::-:0;74723:16;;;74737:1;74723:16;;;;;;;;;74669;;74698:22;;74723:16;;;;;;;;;;;;-1:-1:-1;74723:16:0;74698:41;;74761:7;74750:5;74756:1;74750:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;74788:5;74603:198;-1:-1:-1;;74603:198:0:o;72986:766::-;-1:-1:-1;;;;;73201:13:0;;4344:19;:23;73197:548;;73237:83;;-1:-1:-1;;;73237:83:0;;-1:-1:-1;;;;;73237:49:0;;;;;:83;;73287:8;;73297:4;;73303:2;;73307:6;;73315:4;;73237:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73237:83:0;;;;;;;;-1:-1:-1;;73237:83:0;;;;;;;;;;;;:::i;:::-;;;73233:501;;;;:::i;:::-;-1:-1:-1;;;;;;73370:66:0;;-1:-1:-1;;;73370:66:0;73366:165;;73461:50;;-1:-1:-1;;;73461:50:0;;;;;;;:::i;36049:151::-;36107:13;36140:52;-1:-1:-1;;;;;36152:22:0;;34182:2;35445:447;35520:13;35546:19;35578:10;35582:6;35578:1;:10;:::i;:::-;:14;;35591:1;35578:14;:::i;:::-;-1:-1:-1;;;;;35568:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35568:25:0;;35546:47;;-1:-1:-1;;;35604:6:0;35611:1;35604:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;35604:15:0;;;;;;;;;-1:-1:-1;;;35630:6:0;35637:1;35630:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;35630:15:0;;;;;;;;-1:-1:-1;35661:9:0;35673:10;35677:6;35673:1;:10;:::i;:::-;:14;;35686:1;35673:14;:::i;:::-;35661:26;;35656:131;35693:1;35689;:5;35656:131;;;-1:-1:-1;;;35737:5:0;35745:3;35737:11;35728:21;;;;;;;:::i;:::-;;;;35716:6;35723:1;35716:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;35716:33:0;;;;;;;;-1:-1:-1;35774:1:0;35764:11;;;;;35696:3;;;:::i;:::-;;;35656:131;;;-1:-1:-1;35805:10:0;;35797:55;;;;-1:-1:-1;;;35797:55:0;;41936:2:1;35797:55:0;;;41918:21:1;;;41955:18;;;41948:30;42014:34;41994:18;;;41987:62;42066:18;;35797:55:0;41734:356:1;76252:931:0;-1:-1:-1;;;;;76574:18:0;;76570:160;;76614:9;76609:110;76633:3;:10;76629:1;:14;76609:110;;;76693:7;76701:1;76693:10;;;;;;;;:::i;:::-;;;;;;;76669:12;:20;76682:3;76686:1;76682:6;;;;;;;;:::i;:::-;;;;;;;76669:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;76645:3:0;;-1:-1:-1;76645:3:0;;:::i;:::-;;;76609:110;;;;76570:160;-1:-1:-1;;;;;76746:16:0;;76742:434;;76784:9;76779:386;76803:3;:10;76799:1;:14;76779:386;;;76839:10;76852:3;76856:1;76852:6;;;;;;;;:::i;:::-;;;;;;;76839:19;;76877:14;76894:7;76902:1;76894:10;;;;;;;;:::i;:::-;;;;;;;76877:27;;76923:14;76940:12;:16;76953:2;76940:16;;;;;;;;;;;;76923:33;;76993:6;76983;:16;;76975:69;;;;-1:-1:-1;;;76975:69:0;;42297:2:1;76975:69:0;;;42279:21:1;42336:2;42316:18;;;42309:30;42375:34;42355:18;;;42348:62;-1:-1:-1;;;42426:18:1;;;42419:38;42474:19;;76975:69:0;42095:404:1;76975:69:0;77096:16;;;;:12;:16;;;;;;77115:15;;77096:34;;76815:3;;;:::i;:::-;;;76779:386;;90437:492;90511:7;90531:9;90551;90571:7;90595:4;:11;90610:2;90595:17;90591:40;;90629:1;90614:17;;;;;;;90591:40;-1:-1:-1;;;90689:2:0;90679:13;;90673:20;90728:2;90718:13;;90712:20;90775:2;90765:13;;90759:20;90756:1;90751:29;90811:2;90807:6;;90803:19;;;90815:7;90820:2;90815:7;;:::i;:::-;;;90803:19;90839:1;:7;;90844:2;90839:7;;:18;;;;;90850:1;:7;;90855:2;90850:7;;90839:18;90835:41;;;90874:1;90859:17;;;;;;;90835:41;90896:25;;;;;;;;;;;;42940::1;;;43013:4;43001:17;;42981:18;;;42974:45;;;;43035:18;;;43028:34;;;43078:18;;;43071:34;;;90896:25:0;;42912:19:1;;90896:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;90896:25:0;;-1:-1:-1;;90896:25:0;;;90437:492;-1:-1:-1;;;;;;;90437:492:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:179::-;1278:20;;-1:-1:-1;;;;;1327:38:1;;1317:49;;1307:77;;1380:1;1377;1370:12;1395:258;1462:6;1470;1523:2;1511:9;1502:7;1498:23;1494:32;1491:52;;;1539:1;1536;1529:12;1491:52;1562:29;1581:9;1562:29;:::i;:::-;1552:39;;1610:37;1643:2;1632:9;1628:18;1610:37;:::i;:::-;1600:47;;1395:258;;;;;:::o;1658:180::-;1717:6;1770:2;1758:9;1749:7;1745:23;1741:32;1738:52;;;1786:1;1783;1776:12;1738:52;-1:-1:-1;1809:23:1;;1658:180;-1:-1:-1;1658:180:1:o;2193:258::-;2265:1;2275:113;2289:6;2286:1;2283:13;2275:113;;;2365:11;;;2359:18;2346:11;;;2339:39;2311:2;2304:10;2275:113;;;2406:6;2403:1;2400:13;2397:48;;;-1:-1:-1;;2441:1:1;2423:16;;2416:27;2193:258::o;2456:::-;2498:3;2536:5;2530:12;2563:6;2558:3;2551:19;2579:63;2635:6;2628:4;2623:3;2619:14;2612:4;2605:5;2601:16;2579:63;:::i;:::-;2696:2;2675:15;-1:-1:-1;;2671:29:1;2662:39;;;;2703:4;2658:50;;2456:258;-1:-1:-1;;2456:258:1:o;2719:220::-;2868:2;2857:9;2850:21;2831:4;2888:45;2929:2;2918:9;2914:18;2906:6;2888:45;:::i;2944:316::-;3021:6;3029;3037;3090:2;3078:9;3069:7;3065:23;3061:32;3058:52;;;3106:1;3103;3096:12;3058:52;-1:-1:-1;;3129:23:1;;;3199:2;3184:18;;3171:32;;-1:-1:-1;3250:2:1;3235:18;;;3222:32;;2944:316;-1:-1:-1;2944:316:1:o;3632:248::-;3700:6;3708;3761:2;3749:9;3740:7;3736:23;3732:32;3729:52;;;3777:1;3774;3767:12;3729:52;-1:-1:-1;;3800:23:1;;;3870:2;3855:18;;;3842:32;;-1:-1:-1;3632:248:1:o;4164:127::-;4225:10;4220:3;4216:20;4213:1;4206:31;4256:4;4253:1;4246:15;4280:4;4277:1;4270:15;4296:249;4406:2;4387:13;;-1:-1:-1;;4383:27:1;4371:40;;-1:-1:-1;;;;;4426:34:1;;4462:22;;;4423:62;4420:88;;;4488:18;;:::i;:::-;4524:2;4517:22;-1:-1:-1;;4296:249:1:o;4550:183::-;4610:4;-1:-1:-1;;;;;4635:6:1;4632:30;4629:56;;;4665:18;;:::i;:::-;-1:-1:-1;4710:1:1;4706:14;4722:4;4702:25;;4550:183::o;4738:724::-;4792:5;4845:3;4838:4;4830:6;4826:17;4822:27;4812:55;;4863:1;4860;4853:12;4812:55;4899:6;4886:20;4925:4;4948:43;4988:2;4948:43;:::i;:::-;5020:2;5014:9;5032:31;5060:2;5052:6;5032:31;:::i;:::-;5098:18;;;5190:1;5186:10;;;;5174:23;;5170:32;;;5132:15;;;;-1:-1:-1;5214:15:1;;;5211:35;;;5242:1;5239;5232:12;5211:35;5278:2;5270:6;5266:15;5290:142;5306:6;5301:3;5298:15;5290:142;;;5372:17;;5360:30;;5410:12;;;;5323;;5290:142;;;-1:-1:-1;5450:6:1;4738:724;-1:-1:-1;;;;;;4738:724:1:o;5467:555::-;5509:5;5562:3;5555:4;5547:6;5543:17;5539:27;5529:55;;5580:1;5577;5570:12;5529:55;5616:6;5603:20;-1:-1:-1;;;;;5638:2:1;5635:26;5632:52;;;5664:18;;:::i;:::-;5713:2;5707:9;5725:67;5780:2;5761:13;;-1:-1:-1;;5757:27:1;5786:4;5753:38;5707:9;5725:67;:::i;:::-;5816:2;5808:6;5801:18;5862:3;5855:4;5850:2;5842:6;5838:15;5834:26;5831:35;5828:55;;;5879:1;5876;5869:12;5828:55;5943:2;5936:4;5928:6;5924:17;5917:4;5909:6;5905:17;5892:54;5990:1;5966:15;;;5983:4;5962:26;5955:37;;;;5970:6;5467:555;-1:-1:-1;;;5467:555:1:o;6027:943::-;6181:6;6189;6197;6205;6213;6266:3;6254:9;6245:7;6241:23;6237:33;6234:53;;;6283:1;6280;6273:12;6234:53;6306:29;6325:9;6306:29;:::i;:::-;6296:39;;6354:38;6388:2;6377:9;6373:18;6354:38;:::i;:::-;6344:48;;6443:2;6432:9;6428:18;6415:32;-1:-1:-1;;;;;6507:2:1;6499:6;6496:14;6493:34;;;6523:1;6520;6513:12;6493:34;6546:61;6599:7;6590:6;6579:9;6575:22;6546:61;:::i;:::-;6536:71;;6660:2;6649:9;6645:18;6632:32;6616:48;;6689:2;6679:8;6676:16;6673:36;;;6705:1;6702;6695:12;6673:36;6728:63;6783:7;6772:8;6761:9;6757:24;6728:63;:::i;:::-;6718:73;;6844:3;6833:9;6829:19;6816:33;6800:49;;6874:2;6864:8;6861:16;6858:36;;;6890:1;6887;6880:12;6858:36;;6913:51;6956:7;6945:8;6934:9;6930:24;6913:51;:::i;:::-;6903:61;;;6027:943;;;;;;;;:::o;6975:254::-;7043:6;7051;7104:2;7092:9;7083:7;7079:23;7075:32;7072:52;;;7120:1;7117;7110:12;7072:52;7156:9;7143:23;7133:33;;7185:38;7219:2;7208:9;7204:18;7185:38;:::i;7234:389::-;7319:8;7329:6;7383:3;7376:4;7368:6;7364:17;7360:27;7350:55;;7401:1;7398;7391:12;7350:55;-1:-1:-1;7424:20:1;;-1:-1:-1;;;;;7456:30:1;;7453:50;;;7499:1;7496;7489:12;7453:50;7536:4;7528:6;7524:17;7512:29;;7596:3;7589:4;7579:6;7576:1;7572:14;7564:6;7560:27;7556:38;7553:47;7550:67;;;7613:1;7610;7603:12;7628:492;7747:6;7755;7808:2;7796:9;7787:7;7783:23;7779:32;7776:52;;;7824:1;7821;7814:12;7776:52;7864:9;7851:23;-1:-1:-1;;;;;7889:6:1;7886:30;7883:50;;;7929:1;7926;7919:12;7883:50;7968:92;8052:7;8043:6;8032:9;8028:22;7968:92;:::i;:::-;8079:8;;7942:118;;-1:-1:-1;7628:492:1;-1:-1:-1;;;;7628:492:1:o;8125:367::-;8188:8;8198:6;8252:3;8245:4;8237:6;8233:17;8229:27;8219:55;;8270:1;8267;8260:12;8219:55;-1:-1:-1;8293:20:1;;-1:-1:-1;;;;;8325:30:1;;8322:50;;;8368:1;8365;8358:12;8322:50;8405:4;8397:6;8393:17;8381:29;;8465:3;8458:4;8448:6;8445:1;8441:14;8433:6;8429:27;8425:38;8422:47;8419:67;;;8482:1;8479;8472:12;8497:347;8548:8;8558:6;8612:3;8605:4;8597:6;8593:17;8589:27;8579:55;;8630:1;8627;8620:12;8579:55;-1:-1:-1;8653:20:1;;-1:-1:-1;;;;;8685:30:1;;8682:50;;;8728:1;8725;8718:12;8682:50;8765:4;8757:6;8753:17;8741:29;;8817:3;8810:4;8801:6;8793;8789:19;8785:30;8782:39;8779:59;;;8834:1;8831;8824:12;8849:1492;9029:6;9037;9045;9053;9061;9069;9077;9085;9093;9101;9154:3;9142:9;9133:7;9129:23;9125:33;9122:53;;;9171:1;9168;9161:12;9122:53;9207:9;9194:23;9184:33;;9236:38;9270:2;9259:9;9255:18;9236:38;:::i;:::-;9226:48;;9325:2;9314:9;9310:18;9297:32;-1:-1:-1;;;;;9389:2:1;9381:6;9378:14;9375:34;;;9405:1;9402;9395:12;9375:34;9444:70;9506:7;9497:6;9486:9;9482:22;9444:70;:::i;:::-;9533:8;;-1:-1:-1;9418:96:1;-1:-1:-1;9621:2:1;9606:18;;9593:32;;-1:-1:-1;9637:16:1;;;9634:36;;;9666:1;9663;9656:12;9634:36;9705:72;9769:7;9758:8;9747:9;9743:24;9705:72;:::i;:::-;9796:8;;-1:-1:-1;9679:98:1;-1:-1:-1;9884:3:1;9869:19;;9856:33;;-1:-1:-1;9901:16:1;;;9898:36;;;9930:1;9927;9920:12;9898:36;9969:60;10021:7;10010:8;9999:9;9995:24;9969:60;:::i;:::-;10048:8;;-1:-1:-1;9943:86:1;-1:-1:-1;10136:3:1;10121:19;;10108:33;;-1:-1:-1;10153:16:1;;;10150:36;;;10182:1;10179;10172:12;10150:36;;10221:60;10273:7;10262:8;10251:9;10247:24;10221:60;:::i;:::-;10195:86;;10300:8;10290:18;;;10327:8;10317:18;;;8849:1492;;;;;;;;;;;;;:::o;10346:1208::-;10464:6;10472;10525:2;10513:9;10504:7;10500:23;10496:32;10493:52;;;10541:1;10538;10531:12;10493:52;10581:9;10568:23;-1:-1:-1;;;;;10651:2:1;10643:6;10640:14;10637:34;;;10667:1;10664;10657:12;10637:34;10705:6;10694:9;10690:22;10680:32;;10750:7;10743:4;10739:2;10735:13;10731:27;10721:55;;10772:1;10769;10762:12;10721:55;10808:2;10795:16;10830:4;10853:43;10893:2;10853:43;:::i;:::-;10925:2;10919:9;10937:31;10965:2;10957:6;10937:31;:::i;:::-;11003:18;;;11091:1;11087:10;;;;11079:19;;11075:28;;;11037:15;;;;-1:-1:-1;11115:19:1;;;11112:39;;;11147:1;11144;11137:12;11112:39;11171:11;;;;11191:148;11207:6;11202:3;11199:15;11191:148;;;11273:23;11292:3;11273:23;:::i;:::-;11261:36;;11224:12;;;;11317;;;;11191:148;;;11358:6;-1:-1:-1;;11402:18:1;;11389:32;;-1:-1:-1;;11433:16:1;;;11430:36;;;11462:1;11459;11452:12;11430:36;;11485:63;11540:7;11529:8;11518:9;11514:24;11485:63;:::i;:::-;11475:73;;;10346:1208;;;;;:::o;11559:435::-;11612:3;11650:5;11644:12;11677:6;11672:3;11665:19;11703:4;11732:2;11727:3;11723:12;11716:19;;11769:2;11762:5;11758:14;11790:1;11800:169;11814:6;11811:1;11808:13;11800:169;;;11875:13;;11863:26;;11909:12;;;;11944:15;;;;11836:1;11829:9;11800:169;;;-1:-1:-1;11985:3:1;;11559:435;-1:-1:-1;;;;;11559:435:1:o;11999:261::-;12178:2;12167:9;12160:21;12141:4;12198:56;12250:2;12239:9;12235:18;12227:6;12198:56;:::i;12524:841::-;12655:6;12663;12671;12679;12687;12740:2;12728:9;12719:7;12715:23;12711:32;12708:52;;;12756:1;12753;12746:12;12708:52;12792:9;12779:23;12769:33;;12853:2;12842:9;12838:18;12825:32;-1:-1:-1;;;;;12917:2:1;12909:6;12906:14;12903:34;;;12933:1;12930;12923:12;12903:34;12972:70;13034:7;13025:6;13014:9;13010:22;12972:70;:::i;:::-;13061:8;;-1:-1:-1;12946:96:1;-1:-1:-1;13149:2:1;13134:18;;13121:32;;-1:-1:-1;13165:16:1;;;13162:36;;;13194:1;13191;13184:12;13162:36;;13233:72;13297:7;13286:8;13275:9;13271:24;13233:72;:::i;:::-;12524:841;;;;-1:-1:-1;12524:841:1;;-1:-1:-1;13324:8:1;;13207:98;12524:841;-1:-1:-1;;;12524:841:1:o;13370:387::-;13453:8;13463:6;13517:3;13510:4;13502:6;13498:17;13494:27;13484:55;;13535:1;13532;13525:12;13484:55;-1:-1:-1;13558:20:1;;-1:-1:-1;;;;;13590:30:1;;13587:50;;;13633:1;13630;13623:12;13587:50;13670:4;13662:6;13658:17;13646:29;;13730:3;13723:4;13713:6;13710:1;13706:14;13698:6;13694:27;13690:38;13687:47;13684:67;;;13747:1;13744;13737:12;13762:1668;14060:6;14068;14076;14084;14092;14100;14108;14116;14124;14132;14185:3;14173:9;14164:7;14160:23;14156:33;14153:53;;;14202:1;14199;14192:12;14153:53;14242:9;14229:23;-1:-1:-1;;;;;14312:2:1;14304:6;14301:14;14298:34;;;14328:1;14325;14318:12;14298:34;14351:49;14392:7;14383:6;14372:9;14368:22;14351:49;:::i;:::-;14341:59;;14419:38;14453:2;14442:9;14438:18;14419:38;:::i;:::-;14409:48;;14476:38;14510:2;14499:9;14495:18;14476:38;:::i;:::-;14466:48;;14533:37;14566:2;14555:9;14551:18;14533:37;:::i;:::-;14523:47;;14623:3;14612:9;14608:19;14595:33;14579:49;;14653:2;14643:8;14640:16;14637:36;;;14669:1;14666;14659:12;14637:36;14708:92;14792:7;14781:8;14770:9;14766:24;14708:92;:::i;:::-;14819:8;;-1:-1:-1;14682:118:1;-1:-1:-1;14907:3:1;14892:19;;14879:33;;-1:-1:-1;14924:16:1;;;14921:36;;;14953:1;14950;14943:12;14921:36;14992:92;15076:7;15065:8;15054:9;15050:24;14992:92;:::i;:::-;15103:8;;-1:-1:-1;14966:118:1;-1:-1:-1;15191:3:1;15176:19;;15163:33;;-1:-1:-1;15208:16:1;;;15205:36;;;15237:1;15234;15227:12;15205:36;;15276:94;15362:7;15351:8;15340:9;15336:24;15276:94;:::i;15435:511::-;15530:6;15538;15546;15599:2;15587:9;15578:7;15574:23;15570:32;15567:52;;;15615:1;15612;15605:12;15567:52;15638:29;15657:9;15638:29;:::i;:::-;15628:39;;15718:2;15707:9;15703:18;15690:32;-1:-1:-1;;;;;15737:6:1;15734:30;15731:50;;;15777:1;15774;15767:12;15731:50;15816:70;15878:7;15869:6;15858:9;15854:22;15816:70;:::i;:::-;15435:511;;15905:8;;-1:-1:-1;15790:96:1;;-1:-1:-1;;;;15435:511:1:o;15951:488::-;16068:6;16076;16129:2;16117:9;16108:7;16104:23;16100:32;16097:52;;;16145:1;16142;16135:12;16097:52;16185:9;16172:23;-1:-1:-1;;;;;16210:6:1;16207:30;16204:50;;;16250:1;16247;16240:12;16204:50;16289:90;16371:7;16362:6;16351:9;16347:22;16289:90;:::i;16444:321::-;16513:6;16566:2;16554:9;16545:7;16541:23;16537:32;16534:52;;;16582:1;16579;16572:12;16534:52;16622:9;16609:23;-1:-1:-1;;;;;16647:6:1;16644:30;16641:50;;;16687:1;16684;16677:12;16641:50;16710:49;16751:7;16742:6;16731:9;16727:22;16710:49;:::i;:::-;16700:59;16444:321;-1:-1:-1;;;;16444:321:1:o;16770:347::-;16835:6;16843;16896:2;16884:9;16875:7;16871:23;16867:32;16864:52;;;16912:1;16909;16902:12;16864:52;16935:29;16954:9;16935:29;:::i;:::-;16925:39;;17014:2;17003:9;16999:18;16986:32;17061:5;17054:13;17047:21;17040:5;17037:32;17027:60;;17083:1;17080;17073:12;17027:60;17106:5;17096:15;;;16770:347;;;;;:::o;17122:650::-;17240:6;17248;17301:2;17289:9;17280:7;17276:23;17272:32;17269:52;;;17317:1;17314;17307:12;17269:52;17357:9;17344:23;-1:-1:-1;;;;;17427:2:1;17419:6;17416:14;17413:34;;;17443:1;17440;17433:12;17413:34;17481:6;17470:9;17466:22;17456:32;;17526:7;17519:4;17515:2;17511:13;17507:27;17497:55;;17548:1;17545;17538:12;17497:55;17588:2;17575:16;17614:2;17606:6;17603:14;17600:34;;;17630:1;17627;17620:12;17600:34;17686:7;17681:2;17673:4;17665:6;17661:17;17657:2;17653:26;17649:35;17646:48;17643:68;;;17707:1;17704;17697:12;17643:68;17738:2;17730:11;;;;;17760:6;;-1:-1:-1;17122:650:1;;-1:-1:-1;;;;17122:650:1:o;17777:260::-;17845:6;17853;17906:2;17894:9;17885:7;17881:23;17877:32;17874:52;;;17922:1;17919;17912:12;17874:52;17945:29;17964:9;17945:29;:::i;:::-;17935:39;;17993:38;18027:2;18016:9;18012:18;17993:38;:::i;18042:606::-;18146:6;18154;18162;18170;18178;18231:3;18219:9;18210:7;18206:23;18202:33;18199:53;;;18248:1;18245;18238:12;18199:53;18271:29;18290:9;18271:29;:::i;:::-;18261:39;;18319:38;18353:2;18342:9;18338:18;18319:38;:::i;:::-;18309:48;;18404:2;18393:9;18389:18;18376:32;18366:42;;18455:2;18444:9;18440:18;18427:32;18417:42;;18510:3;18499:9;18495:19;18482:33;-1:-1:-1;;;;;18530:6:1;18527:30;18524:50;;;18570:1;18567;18560:12;18524:50;18593:49;18634:7;18625:6;18614:9;18610:22;18593:49;:::i;19277:380::-;19356:1;19352:12;;;;19399;;;19420:61;;19474:4;19466:6;19462:17;19452:27;;19420:61;19527:2;19519:6;19516:14;19496:18;19493:38;19490:161;;;19573:10;19568:3;19564:20;19561:1;19554:31;19608:4;19605:1;19598:15;19636:4;19633:1;19626:15;19490:161;;19277:380;;;:::o;19662:127::-;19723:10;19718:3;19714:20;19711:1;19704:31;19754:4;19751:1;19744:15;19778:4;19775:1;19768:15;19794:168;19834:7;19900:1;19896;19892:6;19888:14;19885:1;19882:21;19877:1;19870:9;19863:17;19859:45;19856:71;;;19907:18;;:::i;:::-;-1:-1:-1;19947:9:1;;19794:168::o;19967:217::-;20007:1;20033;20023:132;;20077:10;20072:3;20068:20;20065:1;20058:31;20112:4;20109:1;20102:15;20140:4;20137:1;20130:15;20023:132;-1:-1:-1;20169:9:1;;19967:217::o;20189:410::-;20391:2;20373:21;;;20430:2;20410:18;;;20403:30;20469:34;20464:2;20449:18;;20442:62;-1:-1:-1;;;20535:2:1;20520:18;;20513:44;20589:3;20574:19;;20189:410::o;22827:354::-;22915:19;;;22897:3;-1:-1:-1;;;;;22946:31:1;;22943:51;;;22990:1;22987;22980:12;22943:51;23026:6;23023:1;23019:14;23078:8;23071:5;23064:4;23059:3;23055:14;23042:45;23155:1;23110:18;;23130:4;23106:29;23144:13;;;-1:-1:-1;23106:29:1;;22827:354;-1:-1:-1;;22827:354:1:o;23186:1012::-;23557:25;;;-1:-1:-1;;;;;23618:32:1;;23613:2;23598:18;;23591:60;23638:3;23682:2;23667:18;;23660:31;;;-1:-1:-1;;23714:74:1;;23768:19;;23760:6;23752;23714:74;:::i;:::-;23836:9;23828:6;23824:22;23819:2;23808:9;23804:18;23797:50;23870:61;23924:6;23916;23908;23870:61;:::i;:::-;23856:75;;23980:9;23972:6;23968:22;23962:3;23951:9;23947:19;23940:51;24015:6;24007;24000:22;24069:6;24061;24056:2;24048:6;24044:15;24031:45;24122:1;24117:2;24108:6;24100;24096:19;24092:28;24085:39;24189:2;24182;24178:7;24173:2;24165:6;24161:15;24157:29;24149:6;24145:42;24141:51;24133:59;;;23186:1012;;;;;;;;;;;:::o;24203:127::-;24264:10;24259:3;24255:20;24252:1;24245:31;24295:4;24292:1;24285:15;24319:4;24316:1;24309:15;25097:135;25136:3;-1:-1:-1;;25157:17:1;;25154:43;;;25177:18;;:::i;:::-;-1:-1:-1;25224:1:1;25213:13;;25097:135::o;27473:186::-;27532:6;27585:2;27573:9;27564:7;27560:23;27556:32;27553:52;;;27601:1;27598;27591:12;27553:52;27624:29;27643:9;27624:29;:::i;27664:184::-;27722:6;27775:2;27763:9;27754:7;27750:23;27746:32;27743:52;;;27791:1;27788;27781:12;27743:52;27814:28;27832:9;27814:28;:::i;28565:912::-;28808:2;28860:21;;;28833:18;;;28916:22;;;28779:4;;28957:2;28975:18;;;29016:6;28779:4;29050:401;29064:6;29061:1;29058:13;29050:401;;;29125:20;;29113:33;;-1:-1:-1;;;;;29184:35:1;29203:15;;;29184:35;:::i;:::-;29180:61;29175:2;29170:3;29166:12;29159:83;-1:-1:-1;;;;;29280:34:1;29310:2;29302:6;29298:15;29280:34;:::i;:::-;29276:67;29262:12;;;29255:89;29367:4;29391:12;;;;29426:15;;;;;29086:1;29079:9;29050:401;;;-1:-1:-1;29468:3:1;;28565:912;-1:-1:-1;;;;;;;28565:912:1:o;29482:406::-;29684:2;29666:21;;;29723:2;29703:18;;;29696:30;29762:34;29757:2;29742:18;;29735:62;-1:-1:-1;;;29828:2:1;29813:18;;29806:40;29878:3;29863:19;;29482:406::o;30607:404::-;30809:2;30791:21;;;30848:2;30828:18;;;30821:30;30887:34;30882:2;30867:18;;30860:62;-1:-1:-1;;;30953:2:1;30938:18;;30931:38;31001:3;30986:19;;30607:404::o;31016:401::-;31218:2;31200:21;;;31257:2;31237:18;;;31230:30;31296:34;31291:2;31276:18;;31269:62;-1:-1:-1;;;31362:2:1;31347:18;;31340:35;31407:3;31392:19;;31016:401::o;31422:406::-;31624:2;31606:21;;;31663:2;31643:18;;;31636:30;31702:34;31697:2;31682:18;;31675:62;-1:-1:-1;;;31768:2:1;31753:18;;31746:40;31818:3;31803:19;;31422:406::o;31833:128::-;31873:3;31904:1;31900:6;31897:1;31894:13;31891:39;;;31910:18;;:::i;:::-;-1:-1:-1;31946:9:1;;31833:128::o;31966:465::-;32223:2;32212:9;32205:21;32186:4;32249:56;32301:2;32290:9;32286:18;32278:6;32249:56;:::i;:::-;32353:9;32345:6;32341:22;32336:2;32325:9;32321:18;32314:50;32381:44;32418:6;32410;32381:44;:::i;34014:407::-;34216:2;34198:21;;;34255:2;34235:18;;;34228:30;34294:34;34289:2;34274:18;;34267:62;-1:-1:-1;;;34360:2:1;34345:18;;34338:41;34411:3;34396:19;;34014:407::o;35445:786::-;35856:25;35851:3;35844:38;35826:3;35911:6;35905:13;35927:62;35982:6;35977:2;35972:3;35968:12;35961:4;35953:6;35949:17;35927:62;:::i;:::-;-1:-1:-1;;;36048:2:1;36008:16;;;36040:11;;;36033:40;36098:13;;36120:63;36098:13;36169:2;36161:11;;36154:4;36142:17;;36120:63;:::i;:::-;36203:17;36222:2;36199:26;;35445:786;-1:-1:-1;;;;35445:786:1:o;36590:827::-;-1:-1:-1;;;;;36987:15:1;;;36969:34;;37039:15;;37034:2;37019:18;;37012:43;36949:3;37086:2;37071:18;;37064:31;;;36912:4;;37118:57;;37155:19;;37147:6;37118:57;:::i;:::-;37223:9;37215:6;37211:22;37206:2;37195:9;37191:18;37184:50;37257:44;37294:6;37286;37257:44;:::i;:::-;37243:58;;37350:9;37342:6;37338:22;37332:3;37321:9;37317:19;37310:51;37378:33;37404:6;37396;37378:33;:::i;:::-;37370:41;36590:827;-1:-1:-1;;;;;;;;36590:827:1:o;37422:249::-;37491:6;37544:2;37532:9;37523:7;37519:23;37515:32;37512:52;;;37560:1;37557;37550:12;37512:52;37592:9;37586:16;37611:30;37635:5;37611:30;:::i;37676:179::-;37711:3;37753:1;37735:16;37732:23;37729:120;;;37799:1;37796;37793;37778:23;-1:-1:-1;37836:1:1;37830:8;37825:3;37821:18;37729:120;37676:179;:::o;37860:671::-;37899:3;37941:4;37923:16;37920:26;37917:39;;;37860:671;:::o;37917:39::-;37983:2;37977:9;-1:-1:-1;;38048:16:1;38044:25;;38041:1;37977:9;38020:50;38099:4;38093:11;38123:16;-1:-1:-1;;;;;38229:2:1;38222:4;38214:6;38210:17;38207:25;38202:2;38194:6;38191:14;38188:45;38185:58;;;38236:5;;;;;37860:671;:::o;38185:58::-;38273:6;38267:4;38263:17;38252:28;;38309:3;38303:10;38336:2;38328:6;38325:14;38322:27;;;38342:5;;;;;;37860:671;:::o;38322:27::-;38426:2;38407:16;38401:4;38397:27;38393:36;38386:4;38377:6;38372:3;38368:16;38364:27;38361:69;38358:82;;;38433:5;;;;;;37860:671;:::o;38358:82::-;38449:57;38500:4;38491:6;38483;38479:19;38475:30;38469:4;38449:57;:::i;:::-;-1:-1:-1;38522:3:1;;37860:671;-1:-1:-1;;;;;37860:671:1:o;38957:404::-;39159:2;39141:21;;;39198:2;39178:18;;;39171:30;39237:34;39232:2;39217:18;;39210:62;-1:-1:-1;;;39303:2:1;39288:18;;39281:38;39351:3;39336:19;;38957:404::o;39366:386::-;39551:25;;;-1:-1:-1;;;;;39612:32:1;;39607:2;39592:18;;39585:60;39681:2;39676;39661:18;;39654:30;;;-1:-1:-1;;39701:45:1;;39727:18;;39719:6;39701:45;:::i;39757:276::-;39888:3;39926:6;39920:13;39942:53;39988:6;39983:3;39976:4;39968:6;39964:17;39942:53;:::i;:::-;40011:16;;;;;39757:276;-1:-1:-1;;39757:276:1:o;40423:397::-;40625:2;40607:21;;;40664:2;40644:18;;;40637:30;40703:34;40698:2;40683:18;;40676:62;-1:-1:-1;;;40769:2:1;40754:18;;40747:31;40810:3;40795:19;;40423:397::o;40825:197::-;40863:3;40891:6;40932:2;40925:5;40921:14;40959:2;40950:7;40947:15;40944:41;;;40965:18;;:::i;:::-;41014:1;41001:15;;40825:197;-1:-1:-1;;;40825:197:1:o;41027:561::-;-1:-1:-1;;;;;41324:15:1;;;41306:34;;41376:15;;41371:2;41356:18;;41349:43;41423:2;41408:18;;41401:34;;;41466:2;41451:18;;41444:34;;;41286:3;41509;41494:19;;41487:32;;;41249:4;;41536:46;;41562:19;;41554:6;41536:46;:::i;:::-;41528:54;41027:561;-1:-1:-1;;;;;;;41027:561:1:o;41593:136::-;41632:3;41660:5;41650:39;;41669:18;;:::i;:::-;-1:-1:-1;;;41705:18:1;;41593:136::o;42504:204::-;42542:3;42578:4;42575:1;42571:12;42610:4;42607:1;42603:12;42645:3;42639:4;42635:14;42630:3;42627:23;42624:49;;;42653:18;;:::i;:::-;42689:13;;42504:204;-1:-1:-1;;;42504:204:1:o
Swarm Source
ipfs://69c7e1f497be15ff4215ab217cf1e5db527633ae634374a3769431bb3eedb64d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.