Contract Overview
Balance:
1 CRO
CRO Value:
$0.15 (@ $0.15/CRO)
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x1bb8c4a1838bb44688c843f2593338b87ce85181b35ae90b56ba8f836e8f8eef | Make Offer | 2424895 | 707 days 17 hrs ago | 0xf6c9ebd49c948888b921f150b03cf63a7ab58a3a | IN | 0xdc025d776b7c437e4ad533a488212d96a5ce9e40 | 1 CRO | 1.01044 | |
0x35f96418e8a58bf4cd5131f008fa6d42e8a7635997f0e32638787d3634aa26fb | 0x60a06040 | 2354049 | 712 days 20 hrs ago | schwiz.cro | IN | Create: OfferContract | 0 CRO | 15.066135 |
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
OfferContract
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-04-15 */ // Sources flattened with hardhat v2.7.0 https://hardhat.org // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @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; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @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 a proxied contract can't have 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. * * 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 initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @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 initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); } function __AccessControl_init_unchained() internal initializer { } 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, _msgSender()); _; } /** * @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 override returns (bool) { return _roles[role].members[account]; } /** * @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 { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " 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 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. */ 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. */ 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`. */ 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. * * [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. */ 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. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] // OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/proxy/beacon/[email protected] // OpenZeppelin Contracts v4.4.0 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly { r.slot := slot } } } // File @openzeppelin/contracts-upgradeable/proxy/ERC1967/[email protected] // OpenZeppelin Contracts v4.4.0 (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal initializer { __ERC1967Upgrade_init_unchained(); } function __ERC1967Upgrade_init_unchained() internal initializer { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallSecure( address newImplementation, bytes memory data, bool forceCall ) internal { address oldImplementation = _getImplementation(); // Initial upgrade and setup call _setImplementation(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } // Perform rollback test if not already in progress StorageSlotUpgradeable.BooleanSlot storage rollbackTesting = StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT); if (!rollbackTesting.value) { // Trigger rollback using upgradeTo from the new implementation rollbackTesting.value = true; _functionDelegateCall( newImplementation, abi.encodeWithSignature("upgradeTo(address)", oldImplementation) ); rollbackTesting.value = false; // Check rollback was effective require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades"); // Finally reset to the new implementation and log the upgrade _upgradeTo(newImplementation); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal initializer { __ERC1967Upgrade_init_unchained(); __UUPSUpgradeable_init_unchained(); } function __UUPSUpgradeable_init_unchained() internal initializer { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallSecure(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallSecure(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; uint256[50] private __gap; } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @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 IERC1155 is IERC165 { /** * @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 be 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; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface, */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return _supportsERC165Interface(account, type(IERC165).interfaceId) && !_supportsERC165Interface(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && _supportsERC165Interface(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in _interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!_supportsERC165Interface(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * Interface identification is specified in ERC-165. */ function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) { bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId); (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams); if (result.length < 32) return false; return success && abi.decode(result, (bool)); } } // File contracts/SafeMathLite.sol pragma solidity 0.8.4; library SafeMathLite{ /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } } // File contracts/SafePct.sol pragma solidity 0.8.4; /** * @dev Compute percentages safely without phantom overflows. * * Intermediate operations can overflow even when the result will always * fit into computed type. Developers usually * assume that overflows raise errors. `SafePct` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafePct { using SafeMathLite for uint256; /** * Requirements: * * - intermediate operations must revert on overflow */ function mulDiv(uint256 x, uint256 y, uint256 z) internal pure returns (uint256) { require(z > 0, "Division by zero"); if (x == 0) return 0; uint256 xy = x * y; if (xy / x == y) { // no overflow happened - same as in SafeMath mul return xy / z; } //slither-disable-next-line divide-before-multiply uint256 a = x / z; uint256 b = x % z; // x = a * z + b //slither-disable-next-line divide-before-multiply uint256 c = y / z; uint256 d = y % z; // y = c * z + d return (a.mul(c).mul(z)).add(a.mul(d)).add(b.mul(c)).add(b.mul(d).div(z)); } } // File contracts/Offer.sol pragma solidity 0.8.4; struct Royalty { address ipHolder; uint16 percent; } abstract contract Market { mapping(address => uint) public royalties; function getRoyalty(address _address) public virtual view returns(Royalty memory); //Returns fee as a percent in 10k scale (ie 300 = 3%) function fee(address user) public virtual view returns (uint16 userFee); function addToEscrow(address _address) external virtual payable; function cancelActive(address _nft, uint256 _id, address _seller) virtual external; } enum Status { Created, Rejected, Cancelled, Accepted, Updated } struct Offer { address nft; address seller; address buyer; address coinAddress; Status status; uint256 id; uint256 amount; uint256 date; } contract OfferContract is ReentrancyGuardUpgradeable, AccessControlUpgradeable, UUPSUpgradeable { event OfferMade(address indexed nft, uint256 id, uint256 offerIndex, address indexed buyer, uint256 amount, address coinAddress, uint256 time); event OfferUpdated(address indexed nft, uint256 id, uint256 offerIndex, address indexed buyer, uint256 amount, address coinAddress, uint256 time); event OfferCancelled(address indexed nft, uint256 id, uint256 offerIndex, address indexed buyer, uint256 time); event OfferAccepted(address indexed nft, uint256 id, uint256 offerIndex, address indexed buyer, address indexed seller, uint256 amount, address coinAddress, uint256 time); event OfferRejected(address indexed nft, uint256 id, uint256 offerIndex, address indexed buyer, address indexed seller, uint256 amount, address coinAddress, uint256 time); using ERC165Checker for address; using SafePct for uint256; using SafeMathLite for uint256; uint128 constant internal SCALE = 10000; bytes4 public constant IID_IERC1155 = type(IERC1155).interfaceId; bytes4 public constant IID_IERC721 = type(IERC721).interfaceId; mapping(bytes32 => Offer[]) offers; bytes32[] offerHashes; Market marketContract; address payable stakerAddress; bytes32 public constant UPGRADER_ROLE = keccak256('UPGRADER_ROLE'); bytes32 public constant STAFF_ROLE = keccak256('STAFF_ROLE'); // userInfo. wallet => hash => offerIndex mapping(address => mapping(bytes32 => uint256)) userOfferInfo; modifier onlyNFT(address _nft) { require(is1155(_nft) || is721(_nft), "unsupported type"); _; } function initialize(address payable _market, address payable _stakerAddress) public initializer { marketContract = Market(_market); stakerAddress = _stakerAddress; __AccessControl_init(); __UUPSUpgradeable_init(); __ReentrancyGuard_init(); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(UPGRADER_ROLE, msg.sender); } function _authorizeUpgrade(address newImplementation) internal onlyRole(UPGRADER_ROLE) override { } function generateHash(address _nft, uint256 _nftId) public pure returns(bytes32) { return keccak256(abi.encodePacked(_nft, _nftId)); } function getOffers(address _nft, uint256 _id) public view returns(Offer[] memory) { bytes32 hash = generateHash(_nft, _id); return offers[hash]; } function getOffer(bytes32 _hash, uint256 _offerIndex) public view returns(bool, Offer memory offer) { bool isExist; if (offers[_hash].length <= 0) { return (false, offer); } if (offers[_hash][_offerIndex].nft != address(0) ) { isExist = true; } return (isExist, offers[_hash][_offerIndex]); } function is721(address _nft) public view returns(bool){ return _nft.supportsInterface(IID_IERC721); } function is1155(address _nft) public view returns(bool){ return _nft.supportsInterface(IID_IERC1155); } // function makeOfferWithToken(address _nft, uint256 _id, uint256 _amount, address _coinAddress) external onlyNFT(_nft) { // uint256 balance = IERC20(_coinAddress).balanceOf(msg.sender); // require(_amount <= balance, "not enough funds"); // (bool success) = IERC20(_coinAddress).transferFrom(msg.sender, address(this), _amount); // require(success == true, "transfer token failed"); // bytes32 hash = generateHash(_nft, _id); // Offer memory _offer; // _offer.nft = _nft; // _offer.id = _id; // _offer.buyer = msg.sender; // _offer.amount = _amount; // _offer.coinAddress = _coinAddress; // _offer.date = block.timestamp; // _offer.status = Status.Created; // offers[hash].push(_offer); // emit OfferMade(_nft, _id, msg.sender, _amount, _coinAddress, block.timestamp); // } function makeOffer(address _nft, uint256 _id) external payable onlyNFT(_nft) { require(0 < msg.value, "invalid amount"); bytes32 hash = generateHash(_nft, _id); // check if the offer already exists uint256 offerIndex = userOfferInfo[msg.sender][hash]; if (offerIndex == 0 || offers[hash][offerIndex - 1].status == Status.Rejected || offers[hash][offerIndex - 1].status == Status.Cancelled || offers[hash][offerIndex - 1].status == Status.Accepted) { Offer memory _offer; _offer.nft = _nft; _offer.id = _id; _offer.buyer = msg.sender; _offer.amount = msg.value; _offer.date = block.timestamp; _offer.status = Status.Created; offers[hash].push(_offer); userOfferInfo[msg.sender][hash] = offers[hash].length; offerIndex = offers[hash].length; emit OfferMade(_nft, _id, offerIndex - 1, msg.sender, msg.value, address(0), _offer.date); } else { Offer memory _offer = offers[hash][offerIndex - 1]; //should increase the offer amount _offer.amount += msg.value; _offer.date = block.timestamp; _offer.status = Status.Updated; offers[hash][offerIndex - 1] = _offer; emit OfferUpdated(_nft, _id, offerIndex - 1, msg.sender, _offer.amount, address(0), _offer.date); } } function cancelOffer(bytes32 _hash, uint256 _offerIndex) external nonReentrant{ (bool isExist, Offer memory _offer) = getOffer(_hash, _offerIndex); require(isExist, "offer not exist"); require(_offer.status == Status.Created || _offer.status == Status.Updated, "offer is not opened"); if (!hasRole(STAFF_ROLE, msg.sender)) { require(_offer.buyer == msg.sender, "incorrect buyer"); } offers[_hash][_offerIndex].status = Status.Cancelled; offers[_hash][_offerIndex].date = block.timestamp; if (_offer.coinAddress != address(0)) { revert("not support crc20"); // IERC20(_offer.coinAddress).transfer(_offer.buyer, _offer.amount); } else { (bool sent, ) = payable(_offer.buyer).call{value:_offer.amount}(""); require(sent, "transfer failed"); } emit OfferCancelled(_offer.nft, _offer.id, _offerIndex, _offer.buyer, block.timestamp); } function acceptOffer(bytes32 _hash, uint256 _offerIndex) external nonReentrant { (bool isExist, Offer memory _offer) = getOffer(_hash, _offerIndex); require(isExist, "offer not exist"); require(_offer.status == Status.Created || _offer.status == Status.Updated, "offer is not opened"); if (is721(_offer.nft)) { require(IERC721(_offer.nft).ownerOf(_offer.id) == msg.sender, "not nft owner"); } else { require(IERC1155(_offer.nft).balanceOf(msg.sender, _offer.id) > 0 , "not enough balance for token"); } offers[_hash][_offerIndex].status = Status.Accepted; offers[_hash][_offerIndex].seller = msg.sender; offers[_hash][_offerIndex].date = block.timestamp; uint256 fee = marketContract.fee(msg.sender); Royalty memory royalty = marketContract.getRoyalty(_offer.nft); uint256 amountFee = _offer.amount.mulDiv(fee, SCALE); uint256 royaltyAmount = _offer.amount.mulDiv(royalty.percent, SCALE); uint256 amount = _offer.amount - amountFee - royaltyAmount; if (_offer.coinAddress != address(0)) { revert("not support crc20"); // bool sent = IERC20(_offer.coinAddress).transfer(address(marketContract), amountFee); // require(sent, "transfer fee failed"); // sent = IERC20(_offer.coinAddress).transfer(royalty.ipHolder, royaltyAmount); // require(sent, "transfer royalty failed"); // sent = IERC20(_offer.coinAddress).transfer(msg.sender, amount); // require(sent, "transfer failed to the seller"); } else { marketContract.addToEscrow{value: royaltyAmount}(royalty.ipHolder); uint256 stakerFee = amountFee.mulDiv(1, 2); (bool sent, ) = (address(marketContract)).call{value: amountFee - stakerFee}(""); require(sent, "transfer fee failed"); (sent, ) = (stakerAddress).call{value: stakerFee}(""); require(sent, "transfer staker fee failed"); (sent, ) = payable(msg.sender).call{value: amount}(""); require(sent, "transfer failed to the seller"); marketContract.cancelActive(_offer.nft, _offer.id, msg.sender); } //transfer nft if (is721(_offer.nft)) { IERC721(_offer.nft).safeTransferFrom(msg.sender, _offer.buyer, _offer.id); } else { IERC1155(_offer.nft).safeTransferFrom(msg.sender, _offer.buyer, _offer.id, 1, ""); } // reject other offers for this nft // rejectAllOffers(_hash); emit OfferAccepted(_offer.nft, _offer.id, _offerIndex, _offer.buyer, msg.sender, _offer.amount, _offer.coinAddress, block.timestamp); } function rejectOffer(bytes32 _hash, uint256 _offerIndex) public nonReentrant { (bool isExist, Offer memory _offer) = getOffer(_hash, _offerIndex); require(isExist, "offer not exist"); if (is721(_offer.nft)) { require(IERC721(_offer.nft).ownerOf(_offer.id) == msg.sender, "not nft owner"); } else { revert("shouldn't reject 1155"); } require(_offer.status == Status.Created || _offer.status == Status.Updated, "offer is not opened"); offerRejection(offers[_hash][_offerIndex]); emit OfferRejected(_offer.nft, _offer.id, _offerIndex, _offer.buyer, msg.sender, _offer.amount, _offer.coinAddress, block.timestamp); } function offerRejection(Offer storage _offer) private { _offer.status = Status.Rejected; _offer.seller = msg.sender; _offer.date = block.timestamp; bool sent; if (_offer.coinAddress != address(0)) { revert("not support crc20"); // sent = IERC20(_offer.coinAddress).transfer(_offer.buyer, _offer.amount); } else { (sent, ) = payable(_offer.buyer).call{value:_offer.amount}(""); } require(sent, "transfer failed"); } // function rejectAllOffers(bytes32 _hash) private { // Offer[] storage _offers = offers[_hash]; // uint256 offerLen = _offers.length; // for(uint256 i = 0; i < offerLen; i ++) { // if (_offers[i].status == Status.Created || _offers[i].status == Status.Updated) { // offerRejection(_offers[i]); // } // } // } }
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"offerIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"coinAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"OfferAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"offerIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"offerIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"coinAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"OfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"offerIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"coinAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"OfferRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"offerIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"coinAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"OfferUpdated","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":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IID_IERC1155","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IID_IERC721","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAFF_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint256","name":"_offerIndex","type":"uint256"}],"name":"acceptOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint256","name":"_offerIndex","type":"uint256"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"generateHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint256","name":"_offerIndex","type":"uint256"}],"name":"getOffer","outputs":[{"internalType":"bool","name":"","type":"bool"},{"components":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"coinAddress","type":"address"},{"internalType":"enum Status","name":"status","type":"uint8"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"date","type":"uint256"}],"internalType":"struct Offer","name":"offer","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getOffers","outputs":[{"components":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"coinAddress","type":"address"},{"internalType":"enum Status","name":"status","type":"uint8"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"date","type":"uint256"}],"internalType":"struct Offer[]","name":"","type":"tuple[]"}],"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":"address payable","name":"_market","type":"address"},{"internalType":"address payable","name":"_stakerAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"is1155","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"is721","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint256","name":"_offerIndex","type":"uint256"}],"name":"rejectOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a06040523060601b60805234801561001757600080fd5b5060805160601c61359261004b6000396000818161083c0152818161087c0152818161138801526113c801526135926000f3fe6080604052600436106101405760003560e01c8063616f8863116100b6578063a96508ee1161006f578063a96508ee146103aa578063b2a4706e146103d8578063d547741f146103eb578063e0966dad1461040b578063ea98a95014610426578063f72c0d8b1461045357600080fd5b8063616f8863146102cd57806361f33525146102ed57806385290fa11461030d57806391d14854146103415780639b8cfe5214610361578063a217fddf1461039557600080fd5b806336568abe1161010857806336568abe1461021a5780633659cfe61461023a5780633e314b5a1461025a578063485cc9551461027a5780634f1ef2861461029a57806360750a4f146102ad57600080fd5b806301ffc9a71461014557806304811f5a1461017a578063248a9ca31461019a578063254a2ccc146101d85780632f2ff15d146101fa575b600080fd5b34801561015157600080fd5b50610165610160366004612fcd565b610487565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b50610165610195366004612e13565b6104be565b3480156101a657600080fd5b506101ca6101b5366004612f70565b60009081526097602052604090206001015490565b604051908152602001610171565b3480156101e457600080fd5b506101f86101f3366004612fac565b6104da565b005b34801561020657600080fd5b506101f8610215366004612f88565b610788565b34801561022657600080fd5b506101f8610235366004612f88565b6107b3565b34801561024657600080fd5b506101f8610255366004612e13565b610831565b34801561026657600080fd5b506101f8610275366004612fac565b6108fa565b34801561028657600080fd5b506101f8610295366004612e4b565b611291565b6101f86102a8366004612e83565b61137d565b3480156102b957600080fd5b506101ca6102c8366004612f25565b611433565b3480156102d957600080fd5b506101f86102e8366004612fac565b61147a565b3480156102f957600080fd5b50610165610308366004612e13565b6117bb565b34801561031957600080fd5b506101ca7f5620a1113a72b02a617976b3f6b15600dd7a8b3a916a9ca01e23119d989a054381565b34801561034d57600080fd5b5061016561035c366004612f88565b6117d7565b34801561036d57600080fd5b5061037c636cdb3d1360e11b81565b6040516001600160e01b03199091168152602001610171565b3480156103a157600080fd5b506101ca600081565b3480156103b657600080fd5b506103ca6103c5366004612fac565b611802565b6040516101719291906131dc565b6101f86103e6366004612f25565b611986565b3480156103f757600080fd5b506101f8610406366004612f88565b612007565b34801561041757600080fd5b5061037c6380ac58cd60e01b81565b34801561043257600080fd5b50610446610441366004612f25565b61202d565b604051610171919061318d565b34801561045f57600080fd5b506101ca7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b03198216637965db0b60e01b14806104b857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006104b86001600160a01b038316636cdb3d1360e11b61215b565b600260015414156105065760405162461bcd60e51b81526004016104fd90613339565b60405180910390fd5b60026001556000806105188484611802565b91509150816105395760405162461bcd60e51b81526004016104fd9061339b565b8051610544906117bb565b1561061557805160a08201516040516331a9108f60e11b8152600481019190915233916001600160a01b031690636352211e9060240160206040518083038186803b15801561059257600080fd5b505afa1580156105a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190612e2f565b6001600160a01b0316146106105760405162461bcd60e51b815260206004820152600d60248201526c3737ba1037333a1037bbb732b960991b60448201526064016104fd565b610655565b60405162461bcd60e51b815260206004820152601560248201527473686f756c646e27742072656a656374203131353560581b60448201526064016104fd565b60008160800151600481111561067b57634e487b7160e01b600052602160045260246000fd5b14806106aa57506004816080015160048111156106a857634e487b7160e01b600052602160045260246000fd5b145b6106c65760405162461bcd60e51b81526004016104fd906132be565b600084815261012d60205260409020805461070d9190859081106106fa57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020161217e565b336001600160a01b031681604001516001600160a01b031682600001516001600160a01b03167fce3b06a03e443e1cbea4f292cb2900c5be35ae90ed73fdbed88610b6ce3d5d868460a00151878660c001518760600151426040516107769594939291906133c4565b60405180910390a45050600180555050565b6000828152609760205260409020600101546107a48133612273565b6107ae83836122d7565b505050565b6001600160a01b03811633146108235760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016104fd565b61082d828261235d565b5050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561087a5760405162461bcd60e51b81526004016104fd90613226565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108ac6123c4565b6001600160a01b0316146108d25760405162461bcd60e51b81526004016104fd90613272565b6108db816123f2565b604080516000808252602082019092526108f79183919061241d565b50565b6002600154141561091d5760405162461bcd60e51b81526004016104fd90613339565b600260015560008061092f8484611802565b91509150816109505760405162461bcd60e51b81526004016104fd9061339b565b60008160800151600481111561097657634e487b7160e01b600052602160045260246000fd5b14806109a557506004816080015160048111156109a357634e487b7160e01b600052602160045260246000fd5b145b6109c15760405162461bcd60e51b81526004016104fd906132be565b80516109cc906117bb565b15610a9d57805160a08201516040516331a9108f60e11b8152600481019190915233916001600160a01b031690636352211e9060240160206040518083038186803b158015610a1a57600080fd5b505afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a529190612e2f565b6001600160a01b031614610a985760405162461bcd60e51b815260206004820152600d60248201526c3737ba1037333a1037bbb732b960991b60448201526064016104fd565b610b70565b805160a0820151604051627eeac760e11b815233600482015260248101919091526000916001600160a01b03169062fdd58e9060440160206040518083038186803b158015610aeb57600080fd5b505afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b23919061306b565b11610b705760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420656e6f7567682062616c616e636520666f7220746f6b656e0000000060448201526064016104fd565b600084815261012d6020526040902080546003919085908110610ba357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360079092020101805460ff60a01b1916600160a01b836004811115610be457634e487b7160e01b600052602160045260246000fd5b0217905550600084815261012d60205260409020805433919085908110610c1b57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504261012d60008681526020019081526020016000208481548110610c8457634e487b7160e01b600052603260045260246000fd5b600091825260208220600791909102016006019190915561012f54604051636fcca69b60e01b81523360048201526001600160a01b0390911690636fcca69b9060240160206040518083038186803b158015610cdf57600080fd5b505afa158015610cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d179190613051565b61012f54835160405163eb61e37160e01b81526001600160a01b03918216600482015261ffff93909316935060009291169063eb61e37190602401604080518083038186803b158015610d6957600080fd5b505afa158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da19190612ff5565b60c0840151909150600090610db99084612710612561565b602083015160c0860151919250600091610dd99161ffff16612710612561565b9050600081838760c00151610dee919061346c565b610df8919061346c565b60608701519091506001600160a01b031615610e265760405162461bcd60e51b81526004016104fd90613370565b61012f548451604051634065da6360e01b81526001600160a01b039182166004820152911690634065da639084906024016000604051808303818588803b158015610e7057600080fd5b505af1158015610e84573d6000803e3d6000fd5b50505050506000610ea260016002866125619092919063ffffffff16565b61012f549091506000906001600160a01b0316610ebf838761346c565b604051600081818185875af1925050503d8060008114610efb576040519150601f19603f3d011682016040523d82523d6000602084013e610f00565b606091505b5050905080610f475760405162461bcd60e51b81526020600482015260136024820152721d1c985b9cd9995c881999594819985a5b1959606a1b60448201526064016104fd565b610130546040516001600160a01b03909116908390600081818185875af1925050503d8060008114610f95576040519150601f19603f3d011682016040523d82523d6000602084013e610f9a565b606091505b50508091505080610fed5760405162461bcd60e51b815260206004820152601a60248201527f7472616e73666572207374616b657220666565206661696c656400000000000060448201526064016104fd565b60405133908490600081818185875af1925050503d806000811461102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b505080915050806110855760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206661696c656420746f207468652073656c6c657200000060448201526064016104fd565b61012f54885160a08a015160405163dfa3d77360e01b81526001600160a01b039283166004820152602481019190915233604482015291169063dfa3d77390606401600060405180830381600087803b1580156110e157600080fd5b505af11580156110f5573d6000803e3d6000fd5b5050505050508551611106906117bb565b1561118657855160408088015160a08901519151632142170760e11b81523360048201526001600160a01b0391821660248201526044810192909252909116906342842e0e90606401600060405180830381600087803b15801561116957600080fd5b505af115801561117d573d6000803e3d6000fd5b50505050611211565b855160408088015160a0808a01519251637921219560e11b81523360048201526001600160a01b0392831660248201526044810193909352600160648401526084830152600060a48301529091169063f242432a9060c401600060405180830381600087803b1580156111f857600080fd5b505af115801561120c573d6000803e3d6000fd5b505050505b336001600160a01b031686604001516001600160a01b031687600001516001600160a01b03167f5baf657c7b7e41a57af631e88669703bf3ac18855181afcb5a4214eb759ccb738960a001518c8b60c001518c606001514260405161127a9594939291906133c4565b60405180910390a450506001805550505050505050565b600054610100900460ff16806112aa575060005460ff16155b6112c65760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156112e8576000805461ffff19166101011790555b61012f80546001600160a01b038086166001600160a01b031992831617909255610130805492851692909116919091179055611322612673565b61132a6126f6565b611332612754565b61133d6000336122d7565b6113677f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3336122d7565b80156107ae576000805461ff0019169055505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156113c65760405162461bcd60e51b81526004016104fd90613226565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166113f86123c4565b6001600160a01b03161461141e5760405162461bcd60e51b81526004016104fd90613272565b611427826123f2565b61082d8282600161241d565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6002600154141561149d5760405162461bcd60e51b81526004016104fd90613339565b60026001556000806114af8484611802565b91509150816114d05760405162461bcd60e51b81526004016104fd9061339b565b6000816080015160048111156114f657634e487b7160e01b600052602160045260246000fd5b1480611525575060048160800151600481111561152357634e487b7160e01b600052602160045260246000fd5b145b6115415760405162461bcd60e51b81526004016104fd906132be565b61156b7f5620a1113a72b02a617976b3f6b15600dd7a8b3a916a9ca01e23119d989a0543336117d7565b6115bd5760408101516001600160a01b031633146115bd5760405162461bcd60e51b815260206004820152600f60248201526e34b731b7b93932b1ba10313abcb2b960891b60448201526064016104fd565b600084815261012d60205260409020805460029190859081106115f057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360079092020101805460ff60a01b1916600160a01b83600481111561163157634e487b7160e01b600052602160045260246000fd5b0217905550600084815261012d6020526040902080544291908590811061166857634e487b7160e01b600052603260045260246000fd5b600091825260209091206006600790920201015560608101516001600160a01b0316156116a75760405162461bcd60e51b81526004016104fd90613370565b600081604001516001600160a01b03168260c0015160405160006040518083038185875af1925050503d80600081146116fc576040519150601f19603f3d011682016040523d82523d6000602084013e611701565b606091505b50509050806117445760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064016104fd565b5080604001516001600160a01b031681600001516001600160a01b03167f351b639b6d624ba1056371b2f5ca1ee486a4e8a2d471bb8c5c86a0d2b07b66f58360a0015186426040516117a9939291909283526020830191909152604082015260600190565b60405180910390a35050600180555050565b60006104b86001600160a01b0383166380ac58cd60e01b61215b565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061180c612db7565b600084815261012d602052604081205461182a57600092505061197f565b600085815261012d6020526040812080548690811061185957634e487b7160e01b600052603260045260246000fd5b60009182526020909120600790910201546001600160a01b03161461187c575060015b600085815261012d602052604090208054829190869081106118ae57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805161010081018252600790930290910180546001600160a01b0390811684526001820154811694840194909452600281015484169183019190915260038101549283166060830152918290608083019060ff600160a01b90910416600481111561193657634e487b7160e01b600052602160045260246000fd5b600481111561195557634e487b7160e01b600052602160045260246000fd5b81526020016004820154815260200160058201548152602001600682015481525050905092509250505b9250929050565b81611990816104be565b8061199f575061199f816117bb565b6119de5760405162461bcd60e51b815260206004820152601060248201526f756e737570706f72746564207479706560801b60448201526064016104fd565b34600010611a1f5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016104fd565b6000611a2b8484611433565b33600090815261013160209081526040808320848452909152902054909150801580611acc57506001600083815261012d60205260409020611a6e60018461346c565b81548110611a8c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020160030160149054906101000a900460ff166004811115611aca57634e487b7160e01b600052602160045260246000fd5b145b80611b4c57506002600083815261012d60205260409020611aee60018461346c565b81548110611b0c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020160030160149054906101000a900460ff166004811115611b4a57634e487b7160e01b600052602160045260246000fd5b145b80611bcc57506003600083815261012d60205260409020611b6e60018461346c565b81548110611b8c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020160030160149054906101000a900460ff166004811115611bca57634e487b7160e01b600052602160045260246000fd5b145b15611d7357611bd9612db7565b6001600160a01b03868116825260a082018690523360408084019182523460c08501524260e085015260006080850181815287825261012d602090815292822080546001808201835591845292849020875160079094020180546001600160a01b031990811694881694909417815593870151908401805484169187169190911790559251600283018054831691861691909117905560608501516003830180549283169190951690811785559251859492939092916001600160a81b03191617600160a01b836004811115611cbf57634e487b7160e01b600052602160045260246000fd5b021790555060a0820151600482015560c0820151600582015560e090910151600690910155600083815261012d60208181526040808420543380865261013184528286208987528452919094208490559190529092506001600160a01b0387167f75c0438d819e74747983e37b4c4f2710c1954147f4f3968cea54493de87fe0b387611d4c60018761346c565b3460008760e00151604051611d659594939291906133c4565b60405180910390a350612000565b600082815261012d60205260408120611d8d60018461346c565b81548110611dab57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805161010081018252600790930290910180546001600160a01b03908116845260018201548116948401949094526002810154841691830191909152600381015492831660608301529091608083019060ff600160a01b909104166004811115611e3257634e487b7160e01b600052602160045260246000fd5b6004811115611e5157634e487b7160e01b600052602160045260246000fd5b815260200160048201548152602001600582015481526020016006820154815250509050348160c001818151611e879190613421565b9052504260e082015260046080820152600083815261012d602052604090208190611eb360018561346c565b81548110611ed157634e487b7160e01b600052603260045260246000fd5b600091825260209182902083516007929092020180546001600160a01b03199081166001600160a01b03938416178255928401516001820180548516918416919091179055604084015160028201805485169184169190911790556060840151600382018054948516919093169081178355608085015191939192916001600160a81b03191617600160a01b836004811115611f7d57634e487b7160e01b600052602160045260246000fd5b021790555060a0820151600482015560c0820151600582015560e090910151600690910155336001600160a01b0387167f9107738576b2d517b039e430cc8f03066a90bd1049d09fe1332019ae3baafee987611fda60018761346c565b60c086015160e0870151604051611ff6949392916000916133c4565b60405180910390a3505b5050505050565b6000828152609760205260409020600101546120238133612273565b6107ae838361235d565b6060600061203b8484611433565b905061012d6000828152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561214e57600084815260209081902060408051610100810182526007860290920180546001600160a01b039081168452600182015481169484019490945260028101548416918301919091526003810154928316606083015290916080830190600160a01b900460ff1660048111156120fe57634e487b7160e01b600052602160045260246000fd5b600481111561211d57634e487b7160e01b600052602160045260246000fd5b8152602001600482015481526020016005820154815260200160068201548152505081526020019060010190612071565b5050505091505092915050565b6000612166836127b3565b8015612177575061217783836127e6565b9392505050565b60038101805460ff60a01b198116600160a01b179091556001820180546001600160a01b031916331790554260068301556000906001600160a01b0316156121d85760405162461bcd60e51b81526004016104fd90613370565b600282015460058301546040516001600160a01b0390921691600081818185875af1925050503d806000811461222a576040519150601f19603f3d011682016040523d82523d6000602084013e61222f565b606091505b50909150508061082d5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064016104fd565b61227d82826117d7565b61082d57612295816001600160a01b031660146128cf565b6122a08360206128cf565b6040516020016122b1929190613118565b60408051601f198184030181529082905262461bcd60e51b82526104fd916004016131f3565b6122e182826117d7565b61082d5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff191660011790556123193390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61236782826117d7565b1561082d5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e361082d8133612273565b60006124276123c4565b905061243284612ab1565b60008351118061243f5750815b156124505761244e8484612b56565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff1661200057805460ff191660011781556040516001600160a01b03831660248201526124cf90869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b179052612b56565b50805460ff191681556124e06123c4565b6001600160a01b0316826001600160a01b0316146125585760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b60648201526084016104fd565b61200085612c41565b60008082116125a55760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b60448201526064016104fd565b836125b257506000612177565b60006125be848661344d565b9050836125cb8683613439565b14156125e3576125db8382613439565b915050612177565b60006125ef8487613439565b905060006125fd85886134ca565b9050600061260b8688613439565b9050600061261987896134ca565b90506126666126328861262c8685612c81565b90612c8d565b61266061263f8686612c81565b61266061264c8987612c81565b6126608d61265a8c8b612c81565b90612c81565b90612c99565b9998505050505050505050565b600054610100900460ff168061268c575060005460ff16155b6126a85760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156126ca576000805461ffff19166101011790555b6126d2612ca5565b6126da612ca5565b6126e2612ca5565b80156108f7576000805461ff001916905550565b600054610100900460ff168061270f575060005460ff16155b61272b5760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156126d2576000805461ffff19166101011790556126da612ca5565b600054610100900460ff168061276d575060005460ff16155b6127895760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156127ab576000805461ffff19166101011790555b6126e2612d0f565b60006127c6826301ffc9a760e01b6127e6565b80156104b857506127df826001600160e01b03196127e6565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b179052905160009190829081906001600160a01b038716906175309061284d9086906130fc565b6000604051808303818686fa925050503d8060008114612889576040519150601f19603f3d011682016040523d82523d6000602084013e61288e565b606091505b50915091506020815110156128a957600093505050506104b8565b8180156128c55750808060200190518101906128c59190612f50565b9695505050505050565b606060006128de83600261344d565b6128e9906002613421565b67ffffffffffffffff81111561290f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612939576020820181803683370190505b509050600360fc1b8160008151811061296257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061299f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006129c384600261344d565b6129ce906001613421565b90505b6001811115612a62576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612a1057634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110612a3457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93612a5b816134b3565b90506129d1565b5083156121775760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104fd565b803b612b155760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016104fd565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b612bb55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016104fd565b600080846001600160a01b031684604051612bd091906130fc565b600060405180830381855af49150503d8060008114612c0b576040519150601f19603f3d011682016040523d82523d6000602084013e612c10565b606091505b5091509150612c38828260405180606001604052806027815260200161353660279139612d7e565b95945050505050565b612c4a81612ab1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000612177828461344d565b60006121778284613439565b60006121778284613421565b600054610100900460ff1680612cbe575060005460ff16155b612cda5760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156126e2576000805461ffff191661010117905580156108f7576000805461ff001916905550565b600054610100900460ff1680612d28575060005460ff16155b612d445760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff16158015612d66576000805461ffff19166101011790555b6001805580156108f7576000805461ff001916905550565b60608315612d8d575081612177565b825115612d9d5782518084602001fd5b8160405162461bcd60e51b81526004016104fd91906131f3565b60408051610100810182526000808252602082018190529181018290526060810182905290608082019081526020016000815260200160008152602001600081525090565b805161ffff81168114612e0e57600080fd5b919050565b600060208284031215612e24578081fd5b813561217781613520565b600060208284031215612e40578081fd5b815161217781613520565b60008060408385031215612e5d578081fd5b8235612e6881613520565b91506020830135612e7881613520565b809150509250929050565b60008060408385031215612e95578182fd5b8235612ea081613520565b915060208381013567ffffffffffffffff80821115612ebd578384fd5b818601915086601f830112612ed0578384fd5b813581811115612ee257612ee261350a565b612ef4601f8201601f191685016133f0565b91508082528784828501011115612f09578485fd5b8084840185840137810190920192909252919491935090915050565b60008060408385031215612f37578182fd5b8235612f4281613520565b946020939093013593505050565b600060208284031215612f61578081fd5b81518015158114612177578182fd5b600060208284031215612f81578081fd5b5035919050565b60008060408385031215612f9a578182fd5b823591506020830135612e7881613520565b60008060408385031215612fbe578182fd5b50508035926020909101359150565b600060208284031215612fde578081fd5b81356001600160e01b031981168114612177578182fd5b600060408284031215613006578081fd5b6040516040810181811067ffffffffffffffff821117156130295761302961350a565b604052825161303781613520565b815261304560208401612dfc565b60208201529392505050565b600060208284031215613062578081fd5b61217782612dfc565b60006020828403121561307c578081fd5b5051919050565b60018060a01b03808251168352806020830151166020840152806040830151166040840152806060830151166060840152506080810151600581106130d857634e487b7160e01b600052602160045260246000fd5b608083015260a0818101519083015260c0808201519083015260e090810151910152565b6000825161310e818460208701613483565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613150816017850160208801613483565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613181816028840160208801613483565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b818110156131d0576131bc838551613083565b9284019261010092909201916001016131a9565b50909695505050505050565b821515815261012081016121776020830184613083565b6020815260008251806020840152613212816040850160208701613483565b601f01601f19169190910160400192915050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252601390820152721bd999995c881a5cc81b9bdd081bdc195b9959606a1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526011908201527006e6f7420737570706f727420637263323607c1b604082015260600190565b6020808252600f908201526e1bd999995c881b9bdd08195e1a5cdd608a1b604082015260600190565b948552602085019390935260408401919091526001600160a01b03166060830152608082015260a00190565b604051601f8201601f1916810167ffffffffffffffff811182821017156134195761341961350a565b604052919050565b60008219821115613434576134346134de565b500190565b600082613448576134486134f4565b500490565b6000816000190483118215151615613467576134676134de565b500290565b60008282101561347e5761347e6134de565b500390565b60005b8381101561349e578181015183820152602001613486565b838111156134ad576000848401525b50505050565b6000816134c2576134c26134de565b506000190190565b6000826134d9576134d96134f4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108f757600080fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206aa76afaffdb87d5369e6eac4dd4e7bbae954ffe72871eb6597fd97ca939f95f64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101405760003560e01c8063616f8863116100b6578063a96508ee1161006f578063a96508ee146103aa578063b2a4706e146103d8578063d547741f146103eb578063e0966dad1461040b578063ea98a95014610426578063f72c0d8b1461045357600080fd5b8063616f8863146102cd57806361f33525146102ed57806385290fa11461030d57806391d14854146103415780639b8cfe5214610361578063a217fddf1461039557600080fd5b806336568abe1161010857806336568abe1461021a5780633659cfe61461023a5780633e314b5a1461025a578063485cc9551461027a5780634f1ef2861461029a57806360750a4f146102ad57600080fd5b806301ffc9a71461014557806304811f5a1461017a578063248a9ca31461019a578063254a2ccc146101d85780632f2ff15d146101fa575b600080fd5b34801561015157600080fd5b50610165610160366004612fcd565b610487565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b50610165610195366004612e13565b6104be565b3480156101a657600080fd5b506101ca6101b5366004612f70565b60009081526097602052604090206001015490565b604051908152602001610171565b3480156101e457600080fd5b506101f86101f3366004612fac565b6104da565b005b34801561020657600080fd5b506101f8610215366004612f88565b610788565b34801561022657600080fd5b506101f8610235366004612f88565b6107b3565b34801561024657600080fd5b506101f8610255366004612e13565b610831565b34801561026657600080fd5b506101f8610275366004612fac565b6108fa565b34801561028657600080fd5b506101f8610295366004612e4b565b611291565b6101f86102a8366004612e83565b61137d565b3480156102b957600080fd5b506101ca6102c8366004612f25565b611433565b3480156102d957600080fd5b506101f86102e8366004612fac565b61147a565b3480156102f957600080fd5b50610165610308366004612e13565b6117bb565b34801561031957600080fd5b506101ca7f5620a1113a72b02a617976b3f6b15600dd7a8b3a916a9ca01e23119d989a054381565b34801561034d57600080fd5b5061016561035c366004612f88565b6117d7565b34801561036d57600080fd5b5061037c636cdb3d1360e11b81565b6040516001600160e01b03199091168152602001610171565b3480156103a157600080fd5b506101ca600081565b3480156103b657600080fd5b506103ca6103c5366004612fac565b611802565b6040516101719291906131dc565b6101f86103e6366004612f25565b611986565b3480156103f757600080fd5b506101f8610406366004612f88565b612007565b34801561041757600080fd5b5061037c6380ac58cd60e01b81565b34801561043257600080fd5b50610446610441366004612f25565b61202d565b604051610171919061318d565b34801561045f57600080fd5b506101ca7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b03198216637965db0b60e01b14806104b857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006104b86001600160a01b038316636cdb3d1360e11b61215b565b600260015414156105065760405162461bcd60e51b81526004016104fd90613339565b60405180910390fd5b60026001556000806105188484611802565b91509150816105395760405162461bcd60e51b81526004016104fd9061339b565b8051610544906117bb565b1561061557805160a08201516040516331a9108f60e11b8152600481019190915233916001600160a01b031690636352211e9060240160206040518083038186803b15801561059257600080fd5b505afa1580156105a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190612e2f565b6001600160a01b0316146106105760405162461bcd60e51b815260206004820152600d60248201526c3737ba1037333a1037bbb732b960991b60448201526064016104fd565b610655565b60405162461bcd60e51b815260206004820152601560248201527473686f756c646e27742072656a656374203131353560581b60448201526064016104fd565b60008160800151600481111561067b57634e487b7160e01b600052602160045260246000fd5b14806106aa57506004816080015160048111156106a857634e487b7160e01b600052602160045260246000fd5b145b6106c65760405162461bcd60e51b81526004016104fd906132be565b600084815261012d60205260409020805461070d9190859081106106fa57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020161217e565b336001600160a01b031681604001516001600160a01b031682600001516001600160a01b03167fce3b06a03e443e1cbea4f292cb2900c5be35ae90ed73fdbed88610b6ce3d5d868460a00151878660c001518760600151426040516107769594939291906133c4565b60405180910390a45050600180555050565b6000828152609760205260409020600101546107a48133612273565b6107ae83836122d7565b505050565b6001600160a01b03811633146108235760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016104fd565b61082d828261235d565b5050565b306001600160a01b037f000000000000000000000000dc025d776b7c437e4ad533a488212d96a5ce9e4016141561087a5760405162461bcd60e51b81526004016104fd90613226565b7f000000000000000000000000dc025d776b7c437e4ad533a488212d96a5ce9e406001600160a01b03166108ac6123c4565b6001600160a01b0316146108d25760405162461bcd60e51b81526004016104fd90613272565b6108db816123f2565b604080516000808252602082019092526108f79183919061241d565b50565b6002600154141561091d5760405162461bcd60e51b81526004016104fd90613339565b600260015560008061092f8484611802565b91509150816109505760405162461bcd60e51b81526004016104fd9061339b565b60008160800151600481111561097657634e487b7160e01b600052602160045260246000fd5b14806109a557506004816080015160048111156109a357634e487b7160e01b600052602160045260246000fd5b145b6109c15760405162461bcd60e51b81526004016104fd906132be565b80516109cc906117bb565b15610a9d57805160a08201516040516331a9108f60e11b8152600481019190915233916001600160a01b031690636352211e9060240160206040518083038186803b158015610a1a57600080fd5b505afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a529190612e2f565b6001600160a01b031614610a985760405162461bcd60e51b815260206004820152600d60248201526c3737ba1037333a1037bbb732b960991b60448201526064016104fd565b610b70565b805160a0820151604051627eeac760e11b815233600482015260248101919091526000916001600160a01b03169062fdd58e9060440160206040518083038186803b158015610aeb57600080fd5b505afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b23919061306b565b11610b705760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420656e6f7567682062616c616e636520666f7220746f6b656e0000000060448201526064016104fd565b600084815261012d6020526040902080546003919085908110610ba357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360079092020101805460ff60a01b1916600160a01b836004811115610be457634e487b7160e01b600052602160045260246000fd5b0217905550600084815261012d60205260409020805433919085908110610c1b57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504261012d60008681526020019081526020016000208481548110610c8457634e487b7160e01b600052603260045260246000fd5b600091825260208220600791909102016006019190915561012f54604051636fcca69b60e01b81523360048201526001600160a01b0390911690636fcca69b9060240160206040518083038186803b158015610cdf57600080fd5b505afa158015610cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d179190613051565b61012f54835160405163eb61e37160e01b81526001600160a01b03918216600482015261ffff93909316935060009291169063eb61e37190602401604080518083038186803b158015610d6957600080fd5b505afa158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da19190612ff5565b60c0840151909150600090610db99084612710612561565b602083015160c0860151919250600091610dd99161ffff16612710612561565b9050600081838760c00151610dee919061346c565b610df8919061346c565b60608701519091506001600160a01b031615610e265760405162461bcd60e51b81526004016104fd90613370565b61012f548451604051634065da6360e01b81526001600160a01b039182166004820152911690634065da639084906024016000604051808303818588803b158015610e7057600080fd5b505af1158015610e84573d6000803e3d6000fd5b50505050506000610ea260016002866125619092919063ffffffff16565b61012f549091506000906001600160a01b0316610ebf838761346c565b604051600081818185875af1925050503d8060008114610efb576040519150601f19603f3d011682016040523d82523d6000602084013e610f00565b606091505b5050905080610f475760405162461bcd60e51b81526020600482015260136024820152721d1c985b9cd9995c881999594819985a5b1959606a1b60448201526064016104fd565b610130546040516001600160a01b03909116908390600081818185875af1925050503d8060008114610f95576040519150601f19603f3d011682016040523d82523d6000602084013e610f9a565b606091505b50508091505080610fed5760405162461bcd60e51b815260206004820152601a60248201527f7472616e73666572207374616b657220666565206661696c656400000000000060448201526064016104fd565b60405133908490600081818185875af1925050503d806000811461102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b505080915050806110855760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206661696c656420746f207468652073656c6c657200000060448201526064016104fd565b61012f54885160a08a015160405163dfa3d77360e01b81526001600160a01b039283166004820152602481019190915233604482015291169063dfa3d77390606401600060405180830381600087803b1580156110e157600080fd5b505af11580156110f5573d6000803e3d6000fd5b5050505050508551611106906117bb565b1561118657855160408088015160a08901519151632142170760e11b81523360048201526001600160a01b0391821660248201526044810192909252909116906342842e0e90606401600060405180830381600087803b15801561116957600080fd5b505af115801561117d573d6000803e3d6000fd5b50505050611211565b855160408088015160a0808a01519251637921219560e11b81523360048201526001600160a01b0392831660248201526044810193909352600160648401526084830152600060a48301529091169063f242432a9060c401600060405180830381600087803b1580156111f857600080fd5b505af115801561120c573d6000803e3d6000fd5b505050505b336001600160a01b031686604001516001600160a01b031687600001516001600160a01b03167f5baf657c7b7e41a57af631e88669703bf3ac18855181afcb5a4214eb759ccb738960a001518c8b60c001518c606001514260405161127a9594939291906133c4565b60405180910390a450506001805550505050505050565b600054610100900460ff16806112aa575060005460ff16155b6112c65760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156112e8576000805461ffff19166101011790555b61012f80546001600160a01b038086166001600160a01b031992831617909255610130805492851692909116919091179055611322612673565b61132a6126f6565b611332612754565b61133d6000336122d7565b6113677f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3336122d7565b80156107ae576000805461ff0019169055505050565b306001600160a01b037f000000000000000000000000dc025d776b7c437e4ad533a488212d96a5ce9e401614156113c65760405162461bcd60e51b81526004016104fd90613226565b7f000000000000000000000000dc025d776b7c437e4ad533a488212d96a5ce9e406001600160a01b03166113f86123c4565b6001600160a01b03161461141e5760405162461bcd60e51b81526004016104fd90613272565b611427826123f2565b61082d8282600161241d565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6002600154141561149d5760405162461bcd60e51b81526004016104fd90613339565b60026001556000806114af8484611802565b91509150816114d05760405162461bcd60e51b81526004016104fd9061339b565b6000816080015160048111156114f657634e487b7160e01b600052602160045260246000fd5b1480611525575060048160800151600481111561152357634e487b7160e01b600052602160045260246000fd5b145b6115415760405162461bcd60e51b81526004016104fd906132be565b61156b7f5620a1113a72b02a617976b3f6b15600dd7a8b3a916a9ca01e23119d989a0543336117d7565b6115bd5760408101516001600160a01b031633146115bd5760405162461bcd60e51b815260206004820152600f60248201526e34b731b7b93932b1ba10313abcb2b960891b60448201526064016104fd565b600084815261012d60205260409020805460029190859081106115f057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360079092020101805460ff60a01b1916600160a01b83600481111561163157634e487b7160e01b600052602160045260246000fd5b0217905550600084815261012d6020526040902080544291908590811061166857634e487b7160e01b600052603260045260246000fd5b600091825260209091206006600790920201015560608101516001600160a01b0316156116a75760405162461bcd60e51b81526004016104fd90613370565b600081604001516001600160a01b03168260c0015160405160006040518083038185875af1925050503d80600081146116fc576040519150601f19603f3d011682016040523d82523d6000602084013e611701565b606091505b50509050806117445760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064016104fd565b5080604001516001600160a01b031681600001516001600160a01b03167f351b639b6d624ba1056371b2f5ca1ee486a4e8a2d471bb8c5c86a0d2b07b66f58360a0015186426040516117a9939291909283526020830191909152604082015260600190565b60405180910390a35050600180555050565b60006104b86001600160a01b0383166380ac58cd60e01b61215b565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061180c612db7565b600084815261012d602052604081205461182a57600092505061197f565b600085815261012d6020526040812080548690811061185957634e487b7160e01b600052603260045260246000fd5b60009182526020909120600790910201546001600160a01b03161461187c575060015b600085815261012d602052604090208054829190869081106118ae57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805161010081018252600790930290910180546001600160a01b0390811684526001820154811694840194909452600281015484169183019190915260038101549283166060830152918290608083019060ff600160a01b90910416600481111561193657634e487b7160e01b600052602160045260246000fd5b600481111561195557634e487b7160e01b600052602160045260246000fd5b81526020016004820154815260200160058201548152602001600682015481525050905092509250505b9250929050565b81611990816104be565b8061199f575061199f816117bb565b6119de5760405162461bcd60e51b815260206004820152601060248201526f756e737570706f72746564207479706560801b60448201526064016104fd565b34600010611a1f5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016104fd565b6000611a2b8484611433565b33600090815261013160209081526040808320848452909152902054909150801580611acc57506001600083815261012d60205260409020611a6e60018461346c565b81548110611a8c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020160030160149054906101000a900460ff166004811115611aca57634e487b7160e01b600052602160045260246000fd5b145b80611b4c57506002600083815261012d60205260409020611aee60018461346c565b81548110611b0c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020160030160149054906101000a900460ff166004811115611b4a57634e487b7160e01b600052602160045260246000fd5b145b80611bcc57506003600083815261012d60205260409020611b6e60018461346c565b81548110611b8c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906007020160030160149054906101000a900460ff166004811115611bca57634e487b7160e01b600052602160045260246000fd5b145b15611d7357611bd9612db7565b6001600160a01b03868116825260a082018690523360408084019182523460c08501524260e085015260006080850181815287825261012d602090815292822080546001808201835591845292849020875160079094020180546001600160a01b031990811694881694909417815593870151908401805484169187169190911790559251600283018054831691861691909117905560608501516003830180549283169190951690811785559251859492939092916001600160a81b03191617600160a01b836004811115611cbf57634e487b7160e01b600052602160045260246000fd5b021790555060a0820151600482015560c0820151600582015560e090910151600690910155600083815261012d60208181526040808420543380865261013184528286208987528452919094208490559190529092506001600160a01b0387167f75c0438d819e74747983e37b4c4f2710c1954147f4f3968cea54493de87fe0b387611d4c60018761346c565b3460008760e00151604051611d659594939291906133c4565b60405180910390a350612000565b600082815261012d60205260408120611d8d60018461346c565b81548110611dab57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805161010081018252600790930290910180546001600160a01b03908116845260018201548116948401949094526002810154841691830191909152600381015492831660608301529091608083019060ff600160a01b909104166004811115611e3257634e487b7160e01b600052602160045260246000fd5b6004811115611e5157634e487b7160e01b600052602160045260246000fd5b815260200160048201548152602001600582015481526020016006820154815250509050348160c001818151611e879190613421565b9052504260e082015260046080820152600083815261012d602052604090208190611eb360018561346c565b81548110611ed157634e487b7160e01b600052603260045260246000fd5b600091825260209182902083516007929092020180546001600160a01b03199081166001600160a01b03938416178255928401516001820180548516918416919091179055604084015160028201805485169184169190911790556060840151600382018054948516919093169081178355608085015191939192916001600160a81b03191617600160a01b836004811115611f7d57634e487b7160e01b600052602160045260246000fd5b021790555060a0820151600482015560c0820151600582015560e090910151600690910155336001600160a01b0387167f9107738576b2d517b039e430cc8f03066a90bd1049d09fe1332019ae3baafee987611fda60018761346c565b60c086015160e0870151604051611ff6949392916000916133c4565b60405180910390a3505b5050505050565b6000828152609760205260409020600101546120238133612273565b6107ae838361235d565b6060600061203b8484611433565b905061012d6000828152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561214e57600084815260209081902060408051610100810182526007860290920180546001600160a01b039081168452600182015481169484019490945260028101548416918301919091526003810154928316606083015290916080830190600160a01b900460ff1660048111156120fe57634e487b7160e01b600052602160045260246000fd5b600481111561211d57634e487b7160e01b600052602160045260246000fd5b8152602001600482015481526020016005820154815260200160068201548152505081526020019060010190612071565b5050505091505092915050565b6000612166836127b3565b8015612177575061217783836127e6565b9392505050565b60038101805460ff60a01b198116600160a01b179091556001820180546001600160a01b031916331790554260068301556000906001600160a01b0316156121d85760405162461bcd60e51b81526004016104fd90613370565b600282015460058301546040516001600160a01b0390921691600081818185875af1925050503d806000811461222a576040519150601f19603f3d011682016040523d82523d6000602084013e61222f565b606091505b50909150508061082d5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064016104fd565b61227d82826117d7565b61082d57612295816001600160a01b031660146128cf565b6122a08360206128cf565b6040516020016122b1929190613118565b60408051601f198184030181529082905262461bcd60e51b82526104fd916004016131f3565b6122e182826117d7565b61082d5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff191660011790556123193390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61236782826117d7565b1561082d5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e361082d8133612273565b60006124276123c4565b905061243284612ab1565b60008351118061243f5750815b156124505761244e8484612b56565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff1661200057805460ff191660011781556040516001600160a01b03831660248201526124cf90869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b179052612b56565b50805460ff191681556124e06123c4565b6001600160a01b0316826001600160a01b0316146125585760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b60648201526084016104fd565b61200085612c41565b60008082116125a55760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b60448201526064016104fd565b836125b257506000612177565b60006125be848661344d565b9050836125cb8683613439565b14156125e3576125db8382613439565b915050612177565b60006125ef8487613439565b905060006125fd85886134ca565b9050600061260b8688613439565b9050600061261987896134ca565b90506126666126328861262c8685612c81565b90612c8d565b61266061263f8686612c81565b61266061264c8987612c81565b6126608d61265a8c8b612c81565b90612c81565b90612c99565b9998505050505050505050565b600054610100900460ff168061268c575060005460ff16155b6126a85760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156126ca576000805461ffff19166101011790555b6126d2612ca5565b6126da612ca5565b6126e2612ca5565b80156108f7576000805461ff001916905550565b600054610100900460ff168061270f575060005460ff16155b61272b5760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156126d2576000805461ffff19166101011790556126da612ca5565b600054610100900460ff168061276d575060005460ff16155b6127895760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156127ab576000805461ffff19166101011790555b6126e2612d0f565b60006127c6826301ffc9a760e01b6127e6565b80156104b857506127df826001600160e01b03196127e6565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b179052905160009190829081906001600160a01b038716906175309061284d9086906130fc565b6000604051808303818686fa925050503d8060008114612889576040519150601f19603f3d011682016040523d82523d6000602084013e61288e565b606091505b50915091506020815110156128a957600093505050506104b8565b8180156128c55750808060200190518101906128c59190612f50565b9695505050505050565b606060006128de83600261344d565b6128e9906002613421565b67ffffffffffffffff81111561290f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612939576020820181803683370190505b509050600360fc1b8160008151811061296257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061299f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006129c384600261344d565b6129ce906001613421565b90505b6001811115612a62576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612a1057634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110612a3457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93612a5b816134b3565b90506129d1565b5083156121775760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104fd565b803b612b155760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016104fd565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b612bb55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016104fd565b600080846001600160a01b031684604051612bd091906130fc565b600060405180830381855af49150503d8060008114612c0b576040519150601f19603f3d011682016040523d82523d6000602084013e612c10565b606091505b5091509150612c38828260405180606001604052806027815260200161353660279139612d7e565b95945050505050565b612c4a81612ab1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000612177828461344d565b60006121778284613439565b60006121778284613421565b600054610100900460ff1680612cbe575060005460ff16155b612cda5760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff161580156126e2576000805461ffff191661010117905580156108f7576000805461ff001916905550565b600054610100900460ff1680612d28575060005460ff16155b612d445760405162461bcd60e51b81526004016104fd906132eb565b600054610100900460ff16158015612d66576000805461ffff19166101011790555b6001805580156108f7576000805461ff001916905550565b60608315612d8d575081612177565b825115612d9d5782518084602001fd5b8160405162461bcd60e51b81526004016104fd91906131f3565b60408051610100810182526000808252602082018190529181018290526060810182905290608082019081526020016000815260200160008152602001600081525090565b805161ffff81168114612e0e57600080fd5b919050565b600060208284031215612e24578081fd5b813561217781613520565b600060208284031215612e40578081fd5b815161217781613520565b60008060408385031215612e5d578081fd5b8235612e6881613520565b91506020830135612e7881613520565b809150509250929050565b60008060408385031215612e95578182fd5b8235612ea081613520565b915060208381013567ffffffffffffffff80821115612ebd578384fd5b818601915086601f830112612ed0578384fd5b813581811115612ee257612ee261350a565b612ef4601f8201601f191685016133f0565b91508082528784828501011115612f09578485fd5b8084840185840137810190920192909252919491935090915050565b60008060408385031215612f37578182fd5b8235612f4281613520565b946020939093013593505050565b600060208284031215612f61578081fd5b81518015158114612177578182fd5b600060208284031215612f81578081fd5b5035919050565b60008060408385031215612f9a578182fd5b823591506020830135612e7881613520565b60008060408385031215612fbe578182fd5b50508035926020909101359150565b600060208284031215612fde578081fd5b81356001600160e01b031981168114612177578182fd5b600060408284031215613006578081fd5b6040516040810181811067ffffffffffffffff821117156130295761302961350a565b604052825161303781613520565b815261304560208401612dfc565b60208201529392505050565b600060208284031215613062578081fd5b61217782612dfc565b60006020828403121561307c578081fd5b5051919050565b60018060a01b03808251168352806020830151166020840152806040830151166040840152806060830151166060840152506080810151600581106130d857634e487b7160e01b600052602160045260246000fd5b608083015260a0818101519083015260c0808201519083015260e090810151910152565b6000825161310e818460208701613483565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613150816017850160208801613483565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613181816028840160208801613483565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b818110156131d0576131bc838551613083565b9284019261010092909201916001016131a9565b50909695505050505050565b821515815261012081016121776020830184613083565b6020815260008251806020840152613212816040850160208701613483565b601f01601f19169190910160400192915050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252601390820152721bd999995c881a5cc81b9bdd081bdc195b9959606a1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526011908201527006e6f7420737570706f727420637263323607c1b604082015260600190565b6020808252600f908201526e1bd999995c881b9bdd08195e1a5cdd608a1b604082015260600190565b948552602085019390935260408401919091526001600160a01b03166060830152608082015260a00190565b604051601f8201601f1916810167ffffffffffffffff811182821017156134195761341961350a565b604052919050565b60008219821115613434576134346134de565b500190565b600082613448576134486134f4565b500490565b6000816000190483118215151615613467576134676134de565b500290565b60008282101561347e5761347e6134de565b500390565b60005b8381101561349e578181015183820152602001613486565b838111156134ad576000848401525b50505050565b6000816134c2576134c26134de565b506000190190565b6000826134d9576134d96134f4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108f757600080fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206aa76afaffdb87d5369e6eac4dd4e7bbae954ffe72871eb6597fd97ca939f95f64736f6c63430008040033
Deployed ByteCode Sourcemap
65595:11218:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14143:215;;;;;;;;;;-1:-1:-1;14143:215:0;;;;;:::i;:::-;;:::i;:::-;;;9936:14:1;;9929:22;9911:41;;9899:2;9884:18;14143:215:0;;;;;;;;68667:117;;;;;;;;;;-1:-1:-1;68667:117:0;;;;;:::i;:::-;;:::i;15587:123::-;;;;;;;;;;-1:-1:-1;15587:123:0;;;;;:::i;:::-;15653:7;15680:12;;;:6;:12;;;;;:22;;;;15587:123;;;;10436:25:1;;;10424:2;10409:18;15587:123:0;10391:76:1;75138:730:0;;;;;;;;;;-1:-1:-1;75138:730:0;;;;;:::i;:::-;;:::i;:::-;;15972:147;;;;;;;;;;-1:-1:-1;15972:147:0;;;;;:::i;:::-;;:::i;17020:218::-;;;;;;;;;;-1:-1:-1;17020:218:0;;;;;:::i;:::-;;:::i;42746:202::-;;;;;;;;;;-1:-1:-1;42746:202:0;;;;;:::i;:::-;;:::i;72266:2856::-;;;;;;;;;;-1:-1:-1;72266:2856:0;;;;;:::i;:::-;;:::i;67307:397::-;;;;;;;;;;-1:-1:-1;67307:397:0;;;;;:::i;:::-;;:::i;43207:227::-;;;;;;:::i;:::-;;:::i;67819:148::-;;;;;;;;;;-1:-1:-1;67819:148:0;;;;;:::i;:::-;;:::i;71251:1007::-;;;;;;;;;;-1:-1:-1;71251:1007:0;;;;;:::i;:::-;;:::i;68541:115::-;;;;;;;;;;-1:-1:-1;68541:115:0;;;;;:::i;:::-;;:::i;66994:60::-;;;;;;;;;;;;67031:23;66994:60;;14450:139;;;;;;;;;;-1:-1:-1;14450:139:0;;;;;:::i;:::-;;:::i;66638:64::-;;;;;;;;;;;;-1:-1:-1;;;66638:64:0;;;;;-1:-1:-1;;;;;;10634:33:1;;;10616:52;;10604:2;10589:18;66638:64:0;10571:103:1;13530:49:0;;;;;;;;;;-1:-1:-1;13530:49:0;13575:4;13530:49;;68154:379;;;;;;;;;;-1:-1:-1;68154:379:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;69730:1513::-;;;;;;:::i;:::-;;:::i;16364:149::-;;;;;;;;;;-1:-1:-1;16364:149:0;;;;;:::i;:::-;;:::i;66709:62::-;;;;;;;;;;;;-1:-1:-1;;;66709:62:0;;67975:171;;;;;;;;;;-1:-1:-1;67975:171:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66921:66::-;;;;;;;;;;;;66961:26;66921:66;;14143:215;14228:4;-1:-1:-1;;;;;;14252:58:0;;-1:-1:-1;;;14252:58:0;;:98;;-1:-1:-1;;;;;;;;;;11117:51:0;;;14314:36;14245:105;14143:215;-1:-1:-1;;14143:215:0:o;68667:117::-;68717:4;68740:36;-1:-1:-1;;;;;68740:22:0;;-1:-1:-1;;;68740:22:0;:36::i;75138:730::-;21040:1;21805:7;;:19;;21797:63;;;;-1:-1:-1;;;21797:63:0;;;;;;;:::i;:::-;;;;;;;;;21040:1;21938:7;:18;75227:12:::1;::::0;75264:28:::1;75273:5:::0;75280:11;75264:8:::1;:28::i;:::-;75226:66;;;;75311:7;75303:35;;;;-1:-1:-1::0;;;75303:35:0::1;;;;;;;:::i;:::-;75361:10:::0;;75355:17:::1;::::0;:5:::1;:17::i;:::-;75351:192;;;75405:10:::0;;75425:9:::1;::::0;::::1;::::0;75397:38:::1;::::0;-1:-1:-1;;;75397:38:0;;::::1;::::0;::::1;10436:25:1::0;;;;75439:10:0::1;::::0;-1:-1:-1;;;;;75397:27:0::1;::::0;::::1;::::0;10409:18:1;;75397:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;75397:52:0::1;;75389:78;;;::::0;-1:-1:-1;;;75389:78:0;;11980:2:1;75389:78:0::1;::::0;::::1;11962:21:1::0;12019:2;11999:18;;;11992:30;-1:-1:-1;;;12038:18:1;;;12031:43;12091:18;;75389:78:0::1;11952:163:1::0;75389:78:0::1;75351:192;;;75500:31;::::0;-1:-1:-1;;;75500:31:0;;11630:2:1;75500:31:0::1;::::0;::::1;11612:21:1::0;11669:2;11649:18;;;11642:30;-1:-1:-1;;;11688:18:1;;;11681:51;11749:18;;75500:31:0::1;11602:171:1::0;75351:192:0::1;75580:14;75563:6;:13;;;:31;;;;;;-1:-1:-1::0;;;75563:31:0::1;;;;;;;;;;:66;;;-1:-1:-1::0;75615:14:0::1;75598:6;:13;;;:31;;;;;;-1:-1:-1::0;;;75598:31:0::1;;;;;;;;;;75563:66;75555:98;;;;-1:-1:-1::0;;;75555:98:0::1;;;;;;;:::i;:::-;75689:13;::::0;;;:6:::1;:13;::::0;;;;:26;;75674:42:::1;::::0;75689:13;75703:11;;75689:26;::::1;;;-1:-1:-1::0;;;75689:26:0::1;;;;;;;;;;;;;;;;;;;75674:14;:42::i;:::-;75796:10;-1:-1:-1::0;;;;;75732:127:0::1;75782:6;:12;;;-1:-1:-1::0;;;;;75732:127:0::1;75746:6;:10;;;-1:-1:-1::0;;;;;75732:127:0::1;;75758:6;:9;;;75769:11;75808:6;:13;;;75823:6;:18;;;75843:15;75732:127;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;20996:1:0;22117:22;;-1:-1:-1;;75138:730:0:o;15972:147::-;15653:7;15680:12;;;:6;:12;;;;;:22;;;14021:30;14032:4;6616:10;14021;:30::i;:::-;16086:25:::1;16097:4;16103:7;16086:10;:25::i;:::-;15972:147:::0;;;:::o;17020:218::-;-1:-1:-1;;;;;17116:23:0;;6616:10;17116:23;17108:83;;;;-1:-1:-1;;;17108:83:0;;19337:2:1;17108:83:0;;;19319:21:1;19376:2;19356:18;;;19349:30;19415:34;19395:18;;;19388:62;-1:-1:-1;;;19466:18:1;;;19459:45;19521:19;;17108:83:0;19309:237:1;17108:83:0;17204:26;17216:4;17222:7;17204:11;:26::i;:::-;17020:218;;:::o;42746:202::-;42375:4;-1:-1:-1;;;;;42384:6:0;42367:23;;;42359:80;;;;-1:-1:-1;;;42359:80:0;;;;;;;:::i;:::-;42482:6;-1:-1:-1;;;;;42458:30:0;:20;:18;:20::i;:::-;-1:-1:-1;;;;;42458:30:0;;42450:87;;;;-1:-1:-1;;;42450:87:0;;;;;;;:::i;:::-;42830:36:::1;42848:17;42830;:36::i;:::-;42920:12;::::0;;42930:1:::1;42920:12:::0;;;::::1;::::0;::::1;::::0;;;42877:63:::1;::::0;42901:17;;42920:12;42877:23:::1;:63::i;:::-;42746:202:::0;:::o;72266:2856::-;21040:1;21805:7;;:19;;21797:63;;;;-1:-1:-1;;;21797:63:0;;;;;;;:::i;:::-;21040:1;21938:7;:18;72357:12:::1;::::0;72394:28:::1;72403:5:::0;72410:11;72394:8:::1;:28::i;:::-;72356:66;;;;72441:7;72433:35;;;;-1:-1:-1::0;;;72433:35:0::1;;;;;;;:::i;:::-;72506:14;72489:6;:13;;;:31;;;;;;-1:-1:-1::0;;;72489:31:0::1;;;;;;;;;;:66;;;-1:-1:-1::0;72541:14:0::1;72524:6;:13;;;:31;;;;;;-1:-1:-1::0;;;72524:31:0::1;;;;;;;;;;72489:66;72481:98;;;;-1:-1:-1::0;;;72481:98:0::1;;;;;;;:::i;:::-;72600:10:::0;;72594:17:::1;::::0;:5:::1;:17::i;:::-;72590:260;;;72644:10:::0;;72664:9:::1;::::0;::::1;::::0;72636:38:::1;::::0;-1:-1:-1;;;72636:38:0;;::::1;::::0;::::1;10436:25:1::0;;;;72678:10:0::1;::::0;-1:-1:-1;;;;;72636:27:0::1;::::0;::::1;::::0;10409:18:1;;72636:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72636:52:0::1;;72628:78;;;::::0;-1:-1:-1;;;72628:78:0;;11980:2:1;72628:78:0::1;::::0;::::1;11962:21:1::0;12019:2;11999:18;;;11992:30;-1:-1:-1;;;12038:18:1;;;12031:43;12091:18;;72628:78:0::1;11952:163:1::0;72628:78:0::1;72590:260;;;72756:10:::0;;72790:9:::1;::::0;::::1;::::0;72747:53:::1;::::0;-1:-1:-1;;;72747:53:0;;72778:10:::1;72747:53;::::0;::::1;8579:51:1::0;8646:18;;;8639:34;;;;72803:1:0::1;::::0;-1:-1:-1;;;;;72747:30:0::1;::::0;::::1;::::0;8552:18:1;;72747:53:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;72739:99;;;::::0;-1:-1:-1;;;72739:99:0;;16535:2:1;72739:99:0::1;::::0;::::1;16517:21:1::0;16574:2;16554:18;;;16547:30;16613;16593:18;;;16586:58;16661:18;;72739:99:0::1;16507:178:1::0;72739:99:0::1;72871:13;::::0;;;:6:::1;:13;::::0;;;;:26;;72907:15:::1;::::0;72871:13;72885:11;;72871:26;::::1;;;-1:-1:-1::0;;;72871:26:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;:33:::1;:26;::::0;;::::1;;:33;:51:::0;;-1:-1:-1;;;;72871:51:0::1;-1:-1:-1::0;;;72871:51:0;::::1;::::0;::::1;;;;-1:-1:-1::0;;;72871:51:0::1;;;;;;;;;;;::::0;;-1:-1:-1;72934:13:0::1;::::0;;;:6:::1;:13;::::0;;;;:26;;72970:10:::1;::::0;72934:13;72948:11;;72934:26;::::1;;;-1:-1:-1::0;;;72934:26:0::1;;;;;;;;;;;;;;;;;;;:33;;;:46;;;;;-1:-1:-1::0;;;;;72934:46:0::1;;;;;-1:-1:-1::0;;;;;72934:46:0::1;;;;;;73026:15;72992:6;:13;72999:5;72992:13;;;;;;;;;;;73006:11;72992:26;;;;;;-1:-1:-1::0;;;72992:26:0::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;:31;;:49:::0;;;;73068:14:::1;::::0;:30:::1;::::0;-1:-1:-1;;;73068:30:0;;73087:10:::1;73068:30;::::0;::::1;7320:51:1::0;-1:-1:-1;;;;;73068:14:0;;::::1;::::0;:18:::1;::::0;7293::1;;73068:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73134:14;::::0;73160:10;;73134:37:::1;::::0;-1:-1:-1;;;73134:37:0;;-1:-1:-1;;;;;7338:32:1;;;73134:37:0::1;::::0;::::1;7320:51:1::0;73054:44:0::1;::::0;;;::::1;::::0;-1:-1:-1;73109:22:0::1;::::0;73134:14;::::1;::::0;:25:::1;::::0;7293:18:1;;73134:37:0::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73204:13;::::0;::::1;::::0;73109:62;;-1:-1:-1;73184:17:0::1;::::0;73204:32:::1;::::0;73225:3;66626:5:::1;73204:20;:32::i;:::-;73293:15;::::0;::::1;::::0;73272:13:::1;::::0;::::1;::::0;73184:52;;-1:-1:-1;73248:21:0::1;::::0;73272:44:::1;::::0;::::1;;66626:5;73272:20;:44::i;:::-;73248:68;;73328:14;73373:13;73361:9;73345:6;:13;;;:25;;;;:::i;:::-;:41;;;;:::i;:::-;73403:18;::::0;::::1;::::0;73328:58;;-1:-1:-1;;;;;;73403:32:0::1;::::0;73399:1213:::1;;73452:27;;-1:-1:-1::0;;;73452:27:0::1;;;;;;;:::i;73399:1213::-;73978:14;::::0;74027:16;;73978:66:::1;::::0;-1:-1:-1;;;73978:66:0;;-1:-1:-1;;;;;7338:32:1;;;73978:66:0::1;::::0;::::1;7320:51:1::0;73978:14:0;::::1;::::0;:26:::1;::::0;74012:13;;7293:18:1;;73978:66:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;74073:17;74093:22;74110:1;74113;74093:9;:16;;:22;;;;;:::i;:::-;74154:14;::::0;74073:42;;-1:-1:-1;74130:9:0::1;::::0;-1:-1:-1;;;;;74154:14:0::1;74183:21;74073:42:::0;74183:9;:21:::1;:::i;:::-;74145:64;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74129:80;;;74232:4;74224:36;;;::::0;-1:-1:-1;;;74224:36:0;;16892:2:1;74224:36:0::1;::::0;::::1;16874:21:1::0;16931:2;16911:18;;;16904:30;-1:-1:-1;;;16950:18:1;;;16943:49;17009:18;;74224:36:0::1;16864:169:1::0;74224:36:0::1;74289:13;::::0;74288:42:::1;::::0;-1:-1:-1;;;;;74289:13:0;;::::1;::::0;74316:9;;74288:42:::1;::::0;;;74316:9;74289:13;74288:42:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74277:53;;;;;74353:4;74345:43;;;::::0;-1:-1:-1;;;74345:43:0;;12322:2:1;74345:43:0::1;::::0;::::1;12304:21:1::0;12361:2;12341:18;;;12334:30;12400:28;12380:18;;;12373:56;12446:18;;74345:43:0::1;12294:176:1::0;74345:43:0::1;74417;::::0;74425:10:::1;::::0;74449:6;;74417:43:::1;::::0;;;74449:6;74425:10;74417:43:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74406:54;;;;;74483:4;74475:46;;;::::0;-1:-1:-1;;;74475:46:0;;17584:2:1;74475:46:0::1;::::0;::::1;17566:21:1::0;17623:2;17603:18;;;17596:30;17662:31;17642:18;;;17635:59;17711:18;;74475:46:0::1;17556:179:1::0;74475:46:0::1;74538:14;::::0;74566:10;;74578:9:::1;::::0;::::1;::::0;74538:62:::1;::::0;-1:-1:-1;;;74538:62:0;;-1:-1:-1;;;;;8942:15:1;;;74538:62:0::1;::::0;::::1;8924:34:1::0;8974:18;;;8967:34;;;;74589:10:0::1;9017:18:1::0;;;9010:43;74538:14:0;::::1;::::0;:27:::1;::::0;8859:18:1;;74538:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;73399:1213;;74659:10:::0;;74653:17:::1;::::0;:5:::1;:17::i;:::-;74649:237;;;74695:10:::0;;74736:12:::1;::::0;;::::1;::::0;74750:9:::1;::::0;::::1;::::0;74687:73;;-1:-1:-1;;;74687:73:0;;74724:10:::1;74687:73;::::0;::::1;7622:34:1::0;-1:-1:-1;;;;;7692:15:1;;;7672:18;;;7665:43;7724:18;;;7717:34;;;;74687:36:0;;::::1;::::0;::::1;::::0;7557:18:1;;74687:73:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;74649:237;;;74802:10:::0;;74843:12:::1;::::0;;::::1;::::0;74857:9:::1;::::0;;::::1;::::0;74793:81;;-1:-1:-1;;;74793:81:0;;74831:10:::1;74793:81;::::0;::::1;8103:34:1::0;-1:-1:-1;;;;;8173:15:1;;;8153:18;;;8146:43;8205:18;;;8198:34;;;;74868:1:0::1;8248:18:1::0;;;8241:34;8291:19;;;8284:32;74802:10:0::1;8332:19:1::0;;;8325:33;74793:37:0;;::::1;::::0;::::1;::::0;8375:19:1;;74793:81:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;74649:237;75050:10;-1:-1:-1::0;;;;;74986:127:0::1;75036:6;:12;;;-1:-1:-1::0;;;;;74986:127:0::1;75000:6;:10;;;-1:-1:-1::0;;;;;74986:127:0::1;;75012:6;:9;;;75023:11;75062:6;:13;;;75077:6;:18;;;75097:15;74986:127;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;20996:1:0;22117:22;;-1:-1:-1;;;;;;;72266:2856:0:o;67307:397::-;5277:13;;;;;;;;:30;;-1:-1:-1;5295:12:0;;;;5294:13;5277:30;5269:89;;;;-1:-1:-1;;;5269:89:0;;;;;;;:::i;:::-;5371:19;5394:13;;;;;;5393:14;5418:101;;;;5453:13;:20;;-1:-1:-1;;5488:19:0;;;;;5418:101;67415:14:::1;:32:::0;;-1:-1:-1;;;;;67415:32:0;;::::1;-1:-1:-1::0;;;;;;67415:32:0;;::::1;;::::0;;;67459:13:::1;:30:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;67501:22:::1;:20;:22::i;:::-;67534:24;:22;:24::i;:::-;67569;:22;:24::i;:::-;67606:42;13575:4;67637:10;67606;:42::i;:::-;67659:37;66961:26;67685:10;67659;:37::i;:::-;5549:14:::0;5545:68;;;5596:5;5580:21;;-1:-1:-1;;5580:21:0;;;67307:397;;;:::o;43207:227::-;42375:4;-1:-1:-1;;;;;42384:6:0;42367:23;;;42359:80;;;;-1:-1:-1;;;42359:80:0;;;;;;;:::i;:::-;42482:6;-1:-1:-1;;;;;42458:30:0;:20;:18;:20::i;:::-;-1:-1:-1;;;;;42458:30:0;;42450:87;;;;-1:-1:-1;;;42450:87:0;;;;;;;:::i;:::-;43325:36:::1;43343:17;43325;:36::i;:::-;43372:54;43396:17;43415:4;43421;43372:23;:54::i;67819:148::-:0;67928:30;;-1:-1:-1;;5772:2:1;5768:15;;;5764:53;67928:30:0;;;5752:66:1;5834:12;;;5827:28;;;67891:7:0;;5871:12:1;;67928:30:0;;;;;;;;;;;;67918:41;;;;;;67911:48;;67819:148;;;;:::o;71251:1007::-;21040:1;21805:7;;:19;;21797:63;;;;-1:-1:-1;;;21797:63:0;;;;;;;:::i;:::-;21040:1;21938:7;:18;71341:12:::1;::::0;71378:28:::1;71387:5:::0;71394:11;71378:8:::1;:28::i;:::-;71340:66;;;;71425:7;71417:35;;;;-1:-1:-1::0;;;71417:35:0::1;;;;;;;:::i;:::-;71488:14;71471:6;:13;;;:31;;;;;;-1:-1:-1::0;;;71471:31:0::1;;;;;;;;;;:66;;;-1:-1:-1::0;71523:14:0::1;71506:6;:13;;;:31;;;;;;-1:-1:-1::0;;;71506:31:0::1;;;;;;;;;;71471:66;71463:98;;;;-1:-1:-1::0;;;71463:98:0::1;;;;;;;:::i;:::-;71579:31;67031:23;71599:10;71579:7;:31::i;:::-;71574:119;;71635:12;::::0;::::1;::::0;-1:-1:-1;;;;;71635:26:0::1;71651:10;71635:26;71627:54;;;::::0;-1:-1:-1;;;71627:54:0;;15784:2:1;71627:54:0::1;::::0;::::1;15766:21:1::0;15823:2;15803:18;;;15796:30;-1:-1:-1;;;15842:18:1;;;15835:45;15897:18;;71627:54:0::1;15756:165:1::0;71627:54:0::1;71705:13;::::0;;;:6:::1;:13;::::0;;;;:26;;71741:16:::1;::::0;71705:13;71719:11;;71705:26;::::1;;;-1:-1:-1::0;;;71705:26:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;:33:::1;:26;::::0;;::::1;;:33;:52:::0;;-1:-1:-1;;;;71705:52:0::1;-1:-1:-1::0;;;71705:52:0;::::1;::::0;::::1;;;;-1:-1:-1::0;;;71705:52:0::1;;;;;;;;;;;::::0;;-1:-1:-1;71768:13:0::1;::::0;;;:6:::1;:13;::::0;;;;:26;;71802:15:::1;::::0;71768:13;71782:11;;71768:26;::::1;;;-1:-1:-1::0;;;71768:26:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;:31:::1;:26;::::0;;::::1;;:31;:49:::0;71834:18:::1;::::0;::::1;::::0;-1:-1:-1;;;;;71834:32:0::1;::::0;71830:319:::1;;71883:27;;-1:-1:-1::0;;;71883:27:0::1;;;;;;;:::i;71830:319::-;72025:9;72048:6;:12;;;-1:-1:-1::0;;;;;72040:26:0::1;72073:6;:13;;;72040:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72024:67;;;72113:4;72105:32;;;::::0;-1:-1:-1;;;72105:32:0;;17240:2:1;72105:32:0::1;::::0;::::1;17222:21:1::0;17279:2;17259:18;;;17252:30;-1:-1:-1;;;17298:18:1;;;17291:45;17353:18;;72105:32:0::1;17212:165:1::0;72105:32:0::1;71830:319;72219:6;:12;;;-1:-1:-1::0;;;;;72167:82:0::1;72182:6;:10;;;-1:-1:-1::0;;;;;72167:82:0::1;;72194:6;:9;;;72205:11;72233:15;72167:82;;;;;;;19935:25:1::0;;;19991:2;19976:18;;19969:34;;;;20034:2;20019:18;;20012:34;19923:2;19908:18;;19890:162;72167:82:0::1;;;;;;;;-1:-1:-1::0;;20996:1:0;22117:22;;-1:-1:-1;;71251:1007:0:o;68541:115::-;68590:4;68613:35;-1:-1:-1;;;;;68613:22:0;;-1:-1:-1;;;68613:22:0;:35::i;14450:139::-;14528:4;14552:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14552:29:0;;;;;;;;;;;;;;;14450:139::o;68154:379::-;68228:4;68234:18;;:::i;:::-;68265:12;68294:13;;;:6;:13;;;;;:20;68290:79;;68344:5;68336:21;;;;;68290:79;68425:1;68383:13;;;:6;:13;;;;;:26;;68397:11;;68383:26;;;;-1:-1:-1;;;68383:26:0;;;;;;;;;;;;;;;;;;;;;;:30;-1:-1:-1;;;;;68383:30:0;:44;68379:92;;-1:-1:-1;68455:4:0;68379:92;68498:13;;;;:6;:13;;;;;:26;;68489:7;;68498:13;68512:11;;68498:26;;;;-1:-1:-1;;;68498:26:0;;;;;;;;;;;;;;;;;;68481:44;;;;;;;;68498:26;;;;;;;68481:44;;-1:-1:-1;;;;;68481:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68498:26;;;68481:44;;;;;-1:-1:-1;;;68481:44:0;;;;;;;;;;-1:-1:-1;;;68481:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;68481:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68154:379;;;;;;:::o;69730:1513::-;69801:4;67231:12;67238:4;67231:6;:12::i;:::-;:27;;;;67247:11;67253:4;67247:5;:11::i;:::-;67223:56;;;;-1:-1:-1;;;67223:56:0;;17942:2:1;67223:56:0;;;17924:21:1;17981:2;17961:18;;;17954:30;-1:-1:-1;;;18000:18:1;;;17993:46;18056:18;;67223:56:0;17914:166:1;67223:56:0;69830:9:::1;69826:1;:13;69818:40;;;::::0;-1:-1:-1;;;69818:40:0;;13506:2:1;69818:40:0::1;::::0;::::1;13488:21:1::0;13545:2;13525:18;;;13518:30;-1:-1:-1;;;13564:18:1;;;13557:44;13618:18;;69818:40:0::1;13478:164:1::0;69818:40:0::1;69871:12;69886:23;69899:4;69905:3;69886:12;:23::i;:::-;70003:10;69968:18;69989:25:::0;;;:13:::1;:25;::::0;;;;;;;:31;;;;;;;;;69871:38;;-1:-1:-1;70037:15:0;;;:87:::1;;-1:-1:-1::0;70109:15:0::1;70070:12;::::0;;;:6:::1;:12;::::0;;;;70083:14:::1;70096:1;70083:10:::0;:14:::1;:::i;:::-;70070:28;;;;;;-1:-1:-1::0;;;70070:28:0::1;;;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;:54;;;;;;-1:-1:-1::0;;;70070:54:0::1;;;;;;;;;;70037:87;:160;;;-1:-1:-1::0;70181:16:0::1;70142:12;::::0;;;:6:::1;:12;::::0;;;;70155:14:::1;70168:1;70155:10:::0;:14:::1;:::i;:::-;70142:28;;;;;;-1:-1:-1::0;;;70142:28:0::1;;;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;:55;;;;;;-1:-1:-1::0;;;70142:55:0::1;;;;;;;;;;70037:160;:231;;;-1:-1:-1::0;70253:15:0::1;70214:12;::::0;;;:6:::1;:12;::::0;;;;70227:14:::1;70240:1;70227:10:::0;:14:::1;:::i;:::-;70214:28;;;;;;-1:-1:-1::0;;;70214:28:0::1;;;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;:54;;;;;;-1:-1:-1::0;;;70214:54:0::1;;;;;;;;;;70037:231;70033:1203;;;70285:19;;:::i;:::-;-1:-1:-1::0;;;;;70319:17:0;;::::1;::::0;;70351:9:::1;::::0;::::1;:15:::0;;;70396:10:::1;70381:12;::::0;;::::1;:25:::0;;;70437:9:::1;70421:13;::::0;::::1;:25:::0;70475:15:::1;70461:11;::::0;::::1;:29:::0;-1:-1:-1;70505:13:0::1;::::0;::::1;:30:::0;;;70552:12;;;:6:::1;-1:-1:-1::0;70552:12:0;;;;;;:25;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;70552:25:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;70552:25:0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;70319:17;;70552:25;;;;;-1:-1:-1;;;;;;70552:25:0;;-1:-1:-1;;;70552:25:0;::::1;::::0;::::1;;;;-1:-1:-1::0;;;70552:25:0::1;;;;;;;;;;;::::0;;-1:-1:-1;70552:25:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;70626:12:0;;;:6:::1;:12;::::0;;;;;;;:19;70606:10:::1;70592:25:::0;;;:13:::1;:25:::0;;;;;:31;;;;;;;;;:53;;;70673:12;;;70626:19;;-1:-1:-1;;;;;;70713:84:0;::::1;;70729:3:::0;70734:14:::1;70747:1;70626:19:::0;70734:14:::1;:::i;:::-;70762:9;70781:1;70785:6;:11;;;70713:84;;;;;;;;;;:::i;:::-;;;;;;;;70033:1203;;;;70830:19;70852:12:::0;;;:6:::1;:12;::::0;;;;70865:14:::1;70878:1;70865:10:::0;:14:::1;:::i;:::-;70852:28;;;;;;-1:-1:-1::0;;;70852:28:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;70830:50:::1;::::0;;::::1;::::0;::::1;::::0;;70852:28:::1;::::0;;::::1;::::0;;::::1;70830:50:::0;;-1:-1:-1;;;;;70830:50:0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;::::1;-1:-1:-1::0;;;70830:50:0;;::::1;;;::::0;::::1;;;;-1:-1:-1::0;;;70830:50:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;70830:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;70960:9;70943:6;:13;;:26;;;;;;;:::i;:::-;::::0;;-1:-1:-1;70998:15:0::1;70984:11;::::0;::::1;:29:::0;71044:14:::1;71028:13;::::0;::::1;:30:::0;-1:-1:-1;71075:12:0;;;:6:::1;:12;::::0;;;;70984:11;;71088:14:::1;71101:1;71088:10:::0;:14:::1;:::i;:::-;71075:28;;;;;;-1:-1:-1::0;;;71075:28:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;:37;;:28:::1;::::0;;;::::1;;:37:::0;;-1:-1:-1;;;;;;71075:37:0;;::::1;-1:-1:-1::0;;;;;71075:37:0;;::::1;;::::0;;;;::::1;::::0;-1:-1:-1;71075:37:0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;:28;;:37;;;-1:-1:-1;;;;;;71075:37:0;;-1:-1:-1;;;71075:37:0;::::1;::::0;::::1;;;;-1:-1:-1::0;;;71075:37:0::1;;;;;;;;;;;::::0;;-1:-1:-1;71075:37:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;71173:10:::1;-1:-1:-1::0;;;;;71133:91:0;::::1;;71152:3:::0;71157:14:::1;71170:1;71157:10:::0;:14:::1;:::i;:::-;71185:13;::::0;::::1;::::0;71212:11:::1;::::0;::::1;::::0;71133:91:::1;::::0;::::1;::::0;;;71185:13;71208:1:::1;::::0;71133:91:::1;:::i;:::-;;;;;;;;70033:1203;;67290:1;;69730:1513:::0;;;:::o;16364:149::-;15653:7;15680:12;;;:6;:12;;;;;:22;;;14021:30;14032:4;6616:10;14021;:30::i;:::-;16479:26:::1;16491:4;16497:7;16479:11;:26::i;67975:171::-:0;68041:14;68068:12;68083:23;68096:4;68102:3;68083:12;:23::i;:::-;68068:38;;68126:6;:12;68133:4;68126:12;;;;;;;;;;;68119:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68119:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68119:19:0;;;;;;;;;;-1:-1:-1;;;68119:19:0;;;;;;;;;;;;;;;-1:-1:-1;;;68119:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67975:171;;;;:::o;58216:277::-;58303:4;58412:23;58427:7;58412:14;:23::i;:::-;:73;;;;;58439:46;58464:7;58473:11;58439:24;:46::i;:::-;58405:80;58216:277;-1:-1:-1;;;58216:277:0:o;75876:541::-;75941:13;;;:31;;-1:-1:-1;;;;75941:31:0;;-1:-1:-1;;;75941:31:0;;;;-1:-1:-1;75983:13:0;;:26;;-1:-1:-1;;;;;;75983:26:0;75999:10;75983:26;;;76034:15;76020:11;;;:29;-1:-1:-1;;;;;;;76094:18:0;:32;76090:275;;76143:27;;-1:-1:-1;;;76143:27:0;;;;;;;:::i;76090:275::-;76310:12;;;;76335:13;;;;76302:51;;-1:-1:-1;;;;;76310:12:0;;;;76302:51;;;;76335:13;76310:12;76302:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76291:62:0;;-1:-1:-1;;76385:4:0;76377:32;;;;-1:-1:-1;;;76377:32:0;;17240:2:1;76377:32:0;;;17222:21:1;17279:2;17259:18;;;17252:30;-1:-1:-1;;;17298:18:1;;;17291:45;17353:18;;76377:32:0;17212:165:1;14879:519:0;14960:22;14968:4;14974:7;14960;:22::i;:::-;14955:436;;15148:52;15187:7;-1:-1:-1;;;;;15148:52:0;15197:2;15148:30;:52::i;:::-;15273:49;15312:4;15319:2;15273:30;:49::i;:::-;15053:292;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15053:292:0;;;;;;;;;;-1:-1:-1;;;14999:380:0;;;;;;;:::i;18521:238::-;18605:22;18613:4;18619:7;18605;:22::i;:::-;18600:152;;18644:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18644:29:0;;;;;;;;;:36;;-1:-1:-1;;18644:36:0;18676:4;18644:36;;;18727:12;6616:10;;6536:98;18727:12;-1:-1:-1;;;;;18700:40:0;18718:7;-1:-1:-1;;;;;18700:40:0;18712:4;18700:40;;;;;;;;;;18521:238;;:::o;18891:239::-;18975:22;18983:4;18989:7;18975;:22::i;:::-;18971:152;;;19046:5;19014:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19014:29:0;;;;;;;;;;:37;;-1:-1:-1;;19014:37:0;;;19071:40;6616:10;;19014:12;;19071:40;;19046:5;19071:40;18891:239;;:::o;34043:153::-;33762:66;34123:65;-1:-1:-1;;;;;34123:65:0;;34043:153::o;67712:99::-;66961:26;14021:30;66961:26;6616:10;14021;:30::i;35461:1268::-;35610:25;35638:20;:18;:20::i;:::-;35610:48;;35714:37;35733:17;35714:18;:37::i;:::-;35780:1;35766:4;:11;:15;:28;;;;35785:9;35766:28;35762:107;;;35811:46;35833:17;35852:4;35811:21;:46::i;:::-;;35762:107;33414:66;36072:21;;;;36067:655;;36187:28;;-1:-1:-1;;36187:28:0;36211:4;36187:28;;;36306:64;;-1:-1:-1;;;;;7338:32:1;;36306:64:0;;;7320:51:1;36230:155:0;;36270:17;;7293:18:1;;36306:64:0;;;-1:-1:-1;;36306:64:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36306:64:0;-1:-1:-1;;;36306:64:0;;;36230:21;:155::i;:::-;-1:-1:-1;36400:29:0;;-1:-1:-1;;36400:29:0;;;36518:20;:18;:20::i;:::-;-1:-1:-1;;;;;36497:41:0;:17;-1:-1:-1;;;;;36497:41:0;;36489:101;;;;-1:-1:-1;;;36489:101:0;;12677:2:1;36489:101:0;;;12659:21:1;12716:2;12696:18;;;12689:30;12755:34;12735:18;;;12728:62;-1:-1:-1;;;12806:18:1;;;12799:45;12861:19;;36489:101:0;12649:237:1;36489:101:0;36681:29;36692:17;36681:10;:29::i;64052:669::-;64124:7;64156:1;64152;:5;64144:34;;;;-1:-1:-1;;;64144:34:0;;15025:2:1;64144:34:0;;;15007:21:1;15064:2;15044:18;;;15037:30;-1:-1:-1;;;15083:18:1;;;15076:46;15139:18;;64144:34:0;14997:166:1;64144:34:0;64195:6;64191:20;;-1:-1:-1;64210:1:0;64203:8;;64191:20;64222:10;64235:5;64239:1;64235;:5;:::i;:::-;64222:18;-1:-1:-1;64265:1:0;64255:6;64260:1;64222:18;64255:6;:::i;:::-;:11;64251:107;;;64340:6;64345:1;64340:2;:6;:::i;:::-;64333:13;;;;;64251:107;64430:9;64442:5;64446:1;64442;:5;:::i;:::-;64430:17;-1:-1:-1;64458:9:0;64470:5;64474:1;64470;:5;:::i;:::-;64458:17;-1:-1:-1;64565:9:0;64577:5;64581:1;64577;:5;:::i;:::-;64565:17;-1:-1:-1;64593:9:0;64605:5;64609:1;64605;:5;:::i;:::-;64593:17;-1:-1:-1;64647:66:0;64697:15;64710:1;64697:8;:1;64593:17;64697:5;:8::i;:::-;:12;;:15::i;:::-;64647:45;64683:8;:1;64689;64683:5;:8::i;:::-;64647:31;64669:8;:1;64675;64669:5;:8::i;:::-;64648:15;64661:1;64648:8;:1;64654;64648:5;:8::i;:::-;:12;;:15::i;:::-;64647:21;;:31::i;:66::-;64640:73;64052:669;-1:-1:-1;;;;;;;;;64052:669:0:o;13113:177::-;5277:13;;;;;;;;:30;;-1:-1:-1;5295:12:0;;;;5294:13;5277:30;5269:89;;;;-1:-1:-1;;;5269:89:0;;;;;;;:::i;:::-;5371:19;5394:13;;;;;;5393:14;5418:101;;;;5453:13;:20;;-1:-1:-1;;5488:19:0;;;;;5418:101;13177:26:::1;:24;:26::i;:::-;13214:25;:23;:25::i;:::-;13250:32;:30;:32::i;:::-;5549:14:::0;5545:68;;;5596:5;5580:21;;-1:-1:-1;;5580:21:0;;;13113:177;:::o;41433:152::-;5277:13;;;;;;;;:30;;-1:-1:-1;5295:12:0;;;;5294:13;5277:30;5269:89;;;;-1:-1:-1;;;5269:89:0;;;;;;;:::i;:::-;5371:19;5394:13;;;;;;5393:14;5418:101;;;;5453:13;:20;;-1:-1:-1;;5488:19:0;;;;;41499:33:::1;:31;:33::i;21082:108::-:0;5277:13;;;;;;;;:30;;-1:-1:-1;5295:12:0;;;;5294:13;5277:30;5269:89;;;;-1:-1:-1;;;5269:89:0;;;;;;;:::i;:::-;5371:19;5394:13;;;;;;5393:14;5418:101;;;;5453:13;:20;;-1:-1:-1;;5488:19:0;;;;;5418:101;21148:34:::1;:32;:34::i;57573:417::-:0;57637:4;57848:60;57873:7;-1:-1:-1;;;57848:24:0;:60::i;:::-;:134;;;;-1:-1:-1;57926:56:0;57951:7;-1:-1:-1;;;;;;57926:24:0;:56::i;:::-;57925:57;57828:154;57573:417;-1:-1:-1;;57573:417:0:o;61177:414::-;61316:71;;;-1:-1:-1;;;;;;10634:33:1;;61316:71:0;;;;10616:52:1;;;;61316:71:0;;;;;;;;;;10589:18:1;;;;61316:71:0;;;;;;;-1:-1:-1;;;;;61316:71:0;-1:-1:-1;;;61316:71:0;;;61436:45;;61270:4;;61316:71;61270:4;;;;-1:-1:-1;;;;;61436:18:0;;;61460:5;;61436:45;;61316:71;;61436:45;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61398:83;;;;61512:2;61496:6;:13;:18;61492:36;;;61523:5;61516:12;;;;;;;61492:36;61546:7;:37;;;;;61568:6;61557:26;;;;;;;;;;;;:::i;:::-;61539:44;61177:414;-1:-1:-1;;;;;;61177:414:0:o;8490:451::-;8565:13;8591:19;8623:10;8627:6;8623:1;:10;:::i;:::-;:14;;8636:1;8623:14;:::i;:::-;8613:25;;;;;;-1:-1:-1;;;8613:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8613:25:0;;8591:47;;-1:-1:-1;;;8649:6:0;8656:1;8649:9;;;;;;-1:-1:-1;;;8649:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;8649:15:0;;;;;;;;;-1:-1:-1;;;8675:6:0;8682:1;8675:9;;;;;;-1:-1:-1;;;8675:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;8675:15:0;;;;;;;;-1:-1:-1;8706:9:0;8718:10;8722:6;8718:1;:10;:::i;:::-;:14;;8731:1;8718:14;:::i;:::-;8706:26;;8701:135;8738:1;8734;:5;8701:135;;;-1:-1:-1;;;8786:5:0;8794:3;8786:11;8773:25;;;;;-1:-1:-1;;;8773:25:0;;;;;;;;;;;;8761:6;8768:1;8761:9;;;;;;-1:-1:-1;;;8761:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;8761:37:0;;;;;;;;-1:-1:-1;8823:1:0;8813:11;;;;;8741:3;;;:::i;:::-;;;8701:135;;;-1:-1:-1;8854:10:0;;8846:55;;;;-1:-1:-1;;;8846:55:0;;11269:2:1;8846:55:0;;;11251:21:1;;;11288:18;;;11281:30;11347:34;11327:18;;;11320:62;11399:18;;8846:55:0;11241:182:1;34292:284:0;23911:20;;34366:106;;;;-1:-1:-1;;;34366:106:0;;15370:2:1;34366:106:0;;;15352:21:1;15409:2;15389:18;;;15382:30;15448:34;15428:18;;;15421:62;-1:-1:-1;;;15499:18:1;;;15492:43;15552:19;;34366:106:0;15342:235:1;34366:106:0;33762:66;34483:85;;-1:-1:-1;;;;;;34483:85:0;-1:-1:-1;;;;;34483:85:0;;;;;;;;;;34292:284::o;39998:461::-;40081:12;23911:20;;40106:88;;;;-1:-1:-1;;;40106:88:0;;16128:2:1;40106:88:0;;;16110:21:1;16167:2;16147:18;;;16140:30;16206:34;16186:18;;;16179:62;-1:-1:-1;;;16257:18:1;;;16250:36;16303:19;;40106:88:0;16100:228:1;40106:88:0;40268:12;40282:23;40309:6;-1:-1:-1;;;;;40309:19:0;40329:4;40309:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40267:67;;;;40352:99;40388:7;40397:10;40352:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;40345:106;39998:461;-1:-1:-1;;;;;39998:461:0:o;34689:155::-;34756:37;34775:17;34756:18;:37::i;:::-;34809:27;;-1:-1:-1;;;;;34809:27:0;;;;;;;;34689:155;:::o;62670:98::-;62728:7;62755:5;62759:1;62755;:5;:::i;63069:98::-;63127:7;63154:5;63158:1;63154;:5;:::i;61932:98::-;61990:7;62017:5;62021:1;62017;:5;:::i;6465:65::-;5277:13;;;;;;;;:30;;-1:-1:-1;5295:12:0;;;;5294:13;5277:30;5269:89;;;;-1:-1:-1;;;5269:89:0;;;;;;;:::i;:::-;5371:19;5394:13;;;;;;5393:14;5418:101;;;;5453:13;:20;;-1:-1:-1;;5488:19:0;;;;;5545:68;;;;5596:5;5580:21;;-1:-1:-1;;5580:21:0;;;6465:65;:::o;21198:106::-;5277:13;;;;;;;;:30;;-1:-1:-1;5295:12:0;;;;5294:13;5277:30;5269:89;;;;-1:-1:-1;;;5269:89:0;;;;;;;:::i;:::-;5371:19;5394:13;;;;;;5393:14;5418:101;;;;5453:13;:20;;-1:-1:-1;;5488:19:0;;;;;5418:101;20996:1:::1;21274:22:::0;;5545:68;;;;5596:5;5580:21;;-1:-1:-1;;5580:21:0;;;21198:106;:::o;29223:712::-;29373:12;29402:7;29398:530;;;-1:-1:-1;29433:10:0;29426:17;;29398:530;29547:17;;:21;29543:374;;29745:10;29739:17;29806:15;29793:10;29789:2;29785:19;29778:44;29693:148;29888:12;29881:20;;-1:-1:-1;;;29881:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:163:1:-;92:13;;145:6;134:18;;124:29;;114:2;;167:1;164;157:12;114:2;73:104;;;:::o;182:257::-;241:6;294:2;282:9;273:7;269:23;265:32;262:2;;;315:6;307;300:22;262:2;359:9;346:23;378:31;403:5;378:31;:::i;444:261::-;514:6;567:2;555:9;546:7;542:23;538:32;535:2;;;588:6;580;573:22;535:2;625:9;619:16;644:31;669:5;644:31;:::i;710:414::-;794:6;802;855:2;843:9;834:7;830:23;826:32;823:2;;;876:6;868;861:22;823:2;920:9;907:23;939:31;964:5;939:31;:::i;:::-;989:5;-1:-1:-1;1046:2:1;1031:18;;1018:32;1059:33;1018:32;1059:33;:::i;:::-;1111:7;1101:17;;;813:311;;;;;:::o;1129:943::-;1206:6;1214;1267:2;1255:9;1246:7;1242:23;1238:32;1235:2;;;1288:6;1280;1273:22;1235:2;1332:9;1319:23;1351:31;1376:5;1351:31;:::i;:::-;1401:5;-1:-1:-1;1425:2:1;1463:18;;;1450:32;1501:18;1531:14;;;1528:2;;;1563:6;1555;1548:22;1528:2;1606:6;1595:9;1591:22;1581:32;;1651:7;1644:4;1640:2;1636:13;1632:27;1622:2;;1678:6;1670;1663:22;1622:2;1719;1706:16;1741:2;1737;1734:10;1731:2;;;1747:18;;:::i;:::-;1789:53;1832:2;1813:13;;-1:-1:-1;;1809:27:1;1805:36;;1789:53;:::i;:::-;1776:66;;1865:2;1858:5;1851:17;1905:7;1900:2;1895;1891;1887:11;1883:20;1880:33;1877:2;;;1931:6;1923;1916:22;1877:2;1991;1986;1982;1978:11;1973:2;1966:5;1962:14;1949:45;2014:14;;2010:23;;;2003:39;;;;1225:847;;2018:5;;-1:-1:-1;1225:847:1;;-1:-1:-1;;1225:847:1:o;2077:325::-;2145:6;2153;2206:2;2194:9;2185:7;2181:23;2177:32;2174:2;;;2227:6;2219;2212:22;2174:2;2271:9;2258:23;2290:31;2315:5;2290:31;:::i;:::-;2340:5;2392:2;2377:18;;;;2364:32;;-1:-1:-1;;;2164:238:1:o;2407:297::-;2474:6;2527:2;2515:9;2506:7;2502:23;2498:32;2495:2;;;2548:6;2540;2533:22;2495:2;2585:9;2579:16;2638:5;2631:13;2624:21;2617:5;2614:32;2604:2;;2665:6;2657;2650:22;2709:190;2768:6;2821:2;2809:9;2800:7;2796:23;2792:32;2789:2;;;2842:6;2834;2827:22;2789:2;-1:-1:-1;2870:23:1;;2779:120;-1:-1:-1;2779:120:1:o;2904:325::-;2972:6;2980;3033:2;3021:9;3012:7;3008:23;3004:32;3001:2;;;3054:6;3046;3039:22;3001:2;3095:9;3082:23;3072:33;;3155:2;3144:9;3140:18;3127:32;3168:31;3193:5;3168:31;:::i;3234:258::-;3302:6;3310;3363:2;3351:9;3342:7;3338:23;3334:32;3331:2;;;3384:6;3376;3369:22;3331:2;-1:-1:-1;;3412:23:1;;;3482:2;3467:18;;;3454:32;;-1:-1:-1;3321:171:1:o;3497:306::-;3555:6;3608:2;3596:9;3587:7;3583:23;3579:32;3576:2;;;3629:6;3621;3614:22;3576:2;3660:23;;-1:-1:-1;;;;;;3712:32:1;;3702:43;;3692:2;;3764:6;3756;3749:22;3808:601;3903:6;3956:2;3944:9;3935:7;3931:23;3927:32;3924:2;;;3977:6;3969;3962:22;3924:2;4015;4009:9;4057:2;4049:6;4045:15;4126:6;4114:10;4111:22;4090:18;4078:10;4075:34;4072:62;4069:2;;;4137:18;;:::i;:::-;4173:2;4166:22;4210:16;;4235:31;4210:16;4235:31;:::i;:::-;4275:21;;4329:48;4373:2;4358:18;;4329:48;:::i;:::-;4324:2;4312:15;;4305:73;4316:6;3914:495;-1:-1:-1;;;3914:495:1:o;4414:216::-;4483:6;4536:2;4524:9;4515:7;4511:23;4507:32;4504:2;;;4557:6;4549;4542:22;4504:2;4585:39;4614:9;4585:39;:::i;4635:194::-;4705:6;4758:2;4746:9;4737:7;4733:23;4729:32;4726:2;;;4779:6;4771;4764:22;4726:2;-1:-1:-1;4807:16:1;;4716:113;-1:-1:-1;4716:113:1:o;4834:756::-;4920:1;4916;4911:3;4907:11;4903:19;4961:2;4953:5;4947:12;4943:21;4938:3;4931:34;5026:2;5018:4;5011:5;5007:16;5001:23;4997:32;4990:4;4985:3;4981:14;4974:56;5091:2;5083:4;5076:5;5072:16;5066:23;5062:32;5055:4;5050:3;5046:14;5039:56;5156:2;5148:4;5141:5;5137:16;5131:23;5127:32;5120:4;5115:3;5111:14;5104:56;;5206:4;5199:5;5195:16;5189:23;5248:1;5234:12;5231:19;5221:2;;5293:10;5288:3;5284:20;5281:1;5274:31;5328:4;5325:1;5318:15;5356:4;5353:1;5346:15;5221:2;5396:4;5387:14;;5380:36;5465:4;5454:16;;;5448:23;5432:14;;;5425:47;5521:4;5510:16;;;5504:23;5488:14;;;5481:47;5577:4;5566:16;;;5560:23;5544:14;;5537:47;4883:707::o;5894:274::-;6023:3;6061:6;6055:13;6077:53;6123:6;6118:3;6111:4;6103:6;6099:17;6077:53;:::i;:::-;6146:16;;;;;6031:137;-1:-1:-1;;6031:137:1:o;6383:786::-;6794:25;6789:3;6782:38;6764:3;6849:6;6843:13;6865:62;6920:6;6915:2;6910:3;6906:12;6899:4;6891:6;6887:17;6865:62;:::i;:::-;-1:-1:-1;;;6986:2:1;6946:16;;;6978:11;;;6971:40;7036:13;;7058:63;7036:13;7107:2;7099:11;;7092:4;7080:17;;7058:63;:::i;:::-;7141:17;7160:2;7137:26;;6772:397;-1:-1:-1;;;;6772:397:1:o;9064:702::-;9281:2;9333:21;;;9403:13;;9306:18;;;9425:22;;;9252:4;;9281:2;9504:15;;;;9478:2;9463:18;;;9252:4;9550:190;9564:6;9561:1;9558:13;9550:190;;;9613:43;9652:3;9643:6;9637:13;9613:43;:::i;:::-;9715:15;;;;9685:6;9676:16;;;;;9586:1;9579:9;9550:190;;;-1:-1:-1;9757:3:1;;9261:505;-1:-1:-1;;;;;;9261:505:1:o;9963:322::-;10203:14;;10196:22;10178:41;;10165:3;10150:19;;10228:51;10275:2;10260:18;;10252:6;10228:51;:::i;10679:383::-;10828:2;10817:9;10810:21;10791:4;10860:6;10854:13;10903:6;10898:2;10887:9;10883:18;10876:34;10919:66;10978:6;10973:2;10962:9;10958:18;10953:2;10945:6;10941:15;10919:66;:::i;:::-;11046:2;11025:15;-1:-1:-1;;11021:29:1;11006:45;;;;11053:2;11002:54;;10800:262;-1:-1:-1;;10800:262:1:o;12891:408::-;13093:2;13075:21;;;13132:2;13112:18;;;13105:30;13171:34;13166:2;13151:18;;13144:62;-1:-1:-1;;;13237:2:1;13222:18;;13215:42;13289:3;13274:19;;13065:234::o;13647:408::-;13849:2;13831:21;;;13888:2;13868:18;;;13861:30;13927:34;13922:2;13907:18;;13900:62;-1:-1:-1;;;13993:2:1;13978:18;;13971:42;14045:3;14030:19;;13821:234::o;14060:343::-;14262:2;14244:21;;;14301:2;14281:18;;;14274:30;-1:-1:-1;;;14335:2:1;14320:18;;14313:49;14394:2;14379:18;;14234:169::o;14408:410::-;14610:2;14592:21;;;14649:2;14629:18;;;14622:30;14688:34;14683:2;14668:18;;14661:62;-1:-1:-1;;;14754:2:1;14739:18;;14732:44;14808:3;14793:19;;14582:236::o;18085:355::-;18287:2;18269:21;;;18326:2;18306:18;;;18299:30;18365:33;18360:2;18345:18;;18338:61;18431:2;18416:18;;18259:181::o;18445:341::-;18647:2;18629:21;;;18686:2;18666:18;;;18659:30;-1:-1:-1;;;18720:2:1;18705:18;;18698:47;18777:2;18762:18;;18619:167::o;18791:339::-;18993:2;18975:21;;;19032:2;19012:18;;;19005:30;-1:-1:-1;;;19066:2:1;19051:18;;19044:45;19121:2;19106:18;;18965:165::o;20057:489::-;20316:25;;;20372:2;20357:18;;20350:34;;;;20415:2;20400:18;;20393:34;;;;-1:-1:-1;;;;;20463:32:1;20458:2;20443:18;;20436:60;20527:3;20512:19;;20505:35;20303:3;20288:19;;20270:276::o;20551:275::-;20622:2;20616:9;20687:2;20668:13;;-1:-1:-1;;20664:27:1;20652:40;;20722:18;20707:34;;20743:22;;;20704:62;20701:2;;;20769:18;;:::i;:::-;20805:2;20798:22;20596:230;;-1:-1:-1;20596:230:1:o;20831:128::-;20871:3;20902:1;20898:6;20895:1;20892:13;20889:2;;;20908:18;;:::i;:::-;-1:-1:-1;20944:9:1;;20879:80::o;20964:120::-;21004:1;21030;21020:2;;21035:18;;:::i;:::-;-1:-1:-1;21069:9:1;;21010:74::o;21089:168::-;21129:7;21195:1;21191;21187:6;21183:14;21180:1;21177:21;21172:1;21165:9;21158:17;21154:45;21151:2;;;21202:18;;:::i;:::-;-1:-1:-1;21242:9:1;;21141:116::o;21262:125::-;21302:4;21330:1;21327;21324:8;21321:2;;;21335:18;;:::i;:::-;-1:-1:-1;21372:9:1;;21311:76::o;21392:258::-;21464:1;21474:113;21488:6;21485:1;21482:13;21474:113;;;21564:11;;;21558:18;21545:11;;;21538:39;21510:2;21503:10;21474:113;;;21605:6;21602:1;21599:13;21596:2;;;21640:1;21631:6;21626:3;21622:16;21615:27;21596:2;;21445:205;;;:::o;21655:136::-;21694:3;21722:5;21712:2;;21731:18;;:::i;:::-;-1:-1:-1;;;21767:18:1;;21702:89::o;21796:112::-;21828:1;21854;21844:2;;21859:18;;:::i;:::-;-1:-1:-1;21893:9:1;;21834:74::o;21913:127::-;21974:10;21969:3;21965:20;21962:1;21955:31;22005:4;22002:1;21995:15;22029:4;22026:1;22019:15;22045:127;22106:10;22101:3;22097:20;22094:1;22087:31;22137:4;22134:1;22127:15;22161:4;22158:1;22151:15;22177:127;22238:10;22233:3;22229:20;22226:1;22219:31;22269:4;22266:1;22259:15;22293:4;22290:1;22283:15;22309:131;-1:-1:-1;;;;;22384:31:1;;22374:42;;22364:2;;22430:1;22427;22420:12
Swarm Source
ipfs://6aa76afaffdb87d5369e6eac4dd4e7bbae954ffe72871eb6597fd97ca939f95f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.