Source Code
Latest 25 from a total of 41 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Distribute Rewar... | 14829782 | 1382 days ago | IN | 0 ETH | 0.00404307 | ||||
| Distribute Rewar... | 14783539 | 1389 days ago | IN | 0 ETH | 0.00240235 | ||||
| Distribute Rewar... | 14750396 | 1394 days ago | IN | 0 ETH | 0.00470655 | ||||
| Distribute Rewar... | 14723415 | 1399 days ago | IN | 0 ETH | 0.00697368 | ||||
| Distribute Rewar... | 14673083 | 1407 days ago | IN | 0 ETH | 0.00574342 | ||||
| Distribute Rewar... | 14635449 | 1413 days ago | IN | 0 ETH | 0.01439251 | ||||
| Distribute Rewar... | 14584970 | 1421 days ago | IN | 0 ETH | 0.0066201 | ||||
| Distribute Rewar... | 14564272 | 1424 days ago | IN | 0 ETH | 0.00615569 | ||||
| Distribute Rewar... | 14540945 | 1427 days ago | IN | 0 ETH | 0.00538306 | ||||
| Distribute Rewar... | 14519426 | 1431 days ago | IN | 0 ETH | 0.00849317 | ||||
| Distribute Rewar... | 14481637 | 1437 days ago | IN | 0 ETH | 0.00572322 | ||||
| Distribute Rewar... | 14455768 | 1441 days ago | IN | 0 ETH | 0.00587517 | ||||
| Distribute Rewar... | 14423701 | 1446 days ago | IN | 0 ETH | 0.00422349 | ||||
| Distribute Rewar... | 14400933 | 1449 days ago | IN | 0 ETH | 0.00600753 | ||||
| Distribute Rewar... | 14367271 | 1454 days ago | IN | 0 ETH | 0.00391945 | ||||
| Distribute Rewar... | 14339978 | 1459 days ago | IN | 0 ETH | 0.00399639 | ||||
| Distribute Rewar... | 14317444 | 1462 days ago | IN | 0 ETH | 0.00929206 | ||||
| Distribute Rewar... | 14294910 | 1466 days ago | IN | 0 ETH | 0.00663609 | ||||
| Distribute Rewar... | 14294909 | 1466 days ago | IN | 0 ETH | 0.00719562 | ||||
| Distribute Rewar... | 14268993 | 1470 days ago | IN | 0 ETH | 0.0082791 | ||||
| Distribute Rewar... | 14232967 | 1475 days ago | IN | 0 ETH | 0.0135111 | ||||
| Distribute Rewar... | 14217995 | 1478 days ago | IN | 0 ETH | 0.0135716 | ||||
| Distribute Rewar... | 14204596 | 1480 days ago | IN | 0 ETH | 0.01141629 | ||||
| Distribute Rewar... | 14185518 | 1483 days ago | IN | 0 ETH | 0.0113196 | ||||
| Distribute Rewar... | 14169943 | 1485 days ago | IN | 0 ETH | 0.00799647 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LiquidityMiningManager
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-01-30
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol
// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
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/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/IAccessControl.sol
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
// File: @openzeppelin/contracts/access/AccessControl.sol
// OpenZeppelin Contracts v4.4.1 (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 AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view 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 ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view 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());
}
}
}
// File: @openzeppelin/contracts/access/IAccessControlEnumerable.sol
// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
*/
interface IAccessControlEnumerable is IAccessControl {
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}
// File: @openzeppelin/contracts/access/AccessControlEnumerable.sol
// OpenZeppelin Contracts v4.4.1 (access/AccessControlEnumerable.sol)
pragma solidity ^0.8.0;
/**
* @dev Extension of {AccessControl} that allows enumerating the members of each role.
*/
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
using EnumerableSet for EnumerableSet.AddressSet;
mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
return _roleMembers[role].at(index);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
return _roleMembers[role].length();
}
/**
* @dev Overload {_grantRole} to track enumerable memberships
*/
function _grantRole(bytes32 role, address account) internal virtual override {
super._grantRole(role, account);
_roleMembers[role].add(account);
}
/**
* @dev Overload {_revokeRole} to track enumerable memberships
*/
function _revokeRole(bytes32 role, address account) internal virtual override {
super._revokeRole(role, account);
_roleMembers[role].remove(account);
}
}
// File: contracts/interfaces/IBasePool.sol
pragma solidity 0.8.7;
interface IBasePool {
function distributeRewards(uint256 _amount) external;
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(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/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.1 (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/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/base/TokenSaver.sol
pragma solidity 0.8.7;
contract TokenSaver is AccessControlEnumerable {
using SafeERC20 for IERC20;
bytes32 public constant TOKEN_SAVER_ROLE = keccak256("TOKEN_SAVER_ROLE");
event TokenSaved(address indexed by, address indexed receiver, address indexed token, uint256 amount);
modifier onlyTokenSaver() {
require(hasRole(TOKEN_SAVER_ROLE, _msgSender()), "TokenSaver.onlyTokenSaver: permission denied");
_;
}
constructor() {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
}
function saveToken(address _token, address _receiver, uint256 _amount) external onlyTokenSaver {
IERC20(_token).safeTransfer(_receiver, _amount);
emit TokenSaved(_msgSender(), _receiver, _token, _amount);
}
}
// File: contracts/LiquidityMiningManager.sol
pragma solidity 0.8.7;
contract LiquidityMiningManager is TokenSaver {
using SafeERC20 for IERC20;
bytes32 public constant GOV_ROLE = keccak256("GOV_ROLE");
bytes32 public constant REWARD_DISTRIBUTOR_ROLE = keccak256("REWARD_DISTRIBUTOR_ROLE");
uint256 public MAX_POOL_COUNT = 10;
IERC20 immutable public reward;
address immutable public rewardSource;
uint256 public rewardPerSecond; //total reward amount per second
uint256 public lastDistribution; //when rewards were last pushed
uint256 public totalWeight;
mapping(address => bool) public poolAdded;
Pool[] public pools;
struct Pool {
IBasePool poolContract;
uint256 weight;
}
modifier onlyGov {
require(hasRole(GOV_ROLE, _msgSender()), "LiquidityMiningManager.onlyGov: permission denied");
_;
}
modifier onlyRewardDistributor {
require(hasRole(REWARD_DISTRIBUTOR_ROLE, _msgSender()), "LiquidityMiningManager.onlyRewardDistributor: permission denied");
_;
}
event PoolAdded(address indexed pool, uint256 weight);
event PoolRemoved(uint256 indexed poolId, address indexed pool);
event WeightAdjusted(uint256 indexed poolId, address indexed pool, uint256 newWeight);
event RewardsPerSecondSet(uint256 rewardsPerSecond);
event RewardsDistributed(address _from, uint256 indexed _amount);
constructor(address _reward, address _rewardSource) {
require(_reward != address(0), "LiquidityMiningManager.constructor: reward token must be set");
require(_rewardSource != address(0), "LiquidityMiningManager.constructor: rewardSource token must be set");
reward = IERC20(_reward);
rewardSource = _rewardSource;
}
function addPool(address _poolContract, uint256 _weight) external onlyGov {
distributeRewards();
require(_poolContract != address(0), "LiquidityMiningManager.addPool: pool contract must be set");
require(!poolAdded[_poolContract], "LiquidityMiningManager.addPool: Pool already added");
require(pools.length < MAX_POOL_COUNT, "LiquidityMiningManager.addPool: Max amount of pools reached");
// add pool
pools.push(Pool({
poolContract: IBasePool(_poolContract),
weight: _weight
}));
poolAdded[_poolContract] = true;
// increase totalWeight
totalWeight += _weight;
// Approve max token amount
reward.safeApprove(_poolContract, type(uint256).max);
emit PoolAdded(_poolContract, _weight);
}
function removePool(uint256 _poolId) external onlyGov {
require(_poolId < pools.length, "LiquidityMiningManager.removePool: Pool does not exist");
distributeRewards();
address poolAddress = address(pools[_poolId].poolContract);
// decrease totalWeight
totalWeight -= pools[_poolId].weight;
// remove pool
pools[_poolId] = pools[pools.length - 1];
pools.pop();
poolAdded[poolAddress] = false;
emit PoolRemoved(_poolId, poolAddress);
}
function adjustWeight(uint256 _poolId, uint256 _newWeight) external onlyGov {
require(_poolId < pools.length, "LiquidityMiningManager.adjustWeight: Pool does not exist");
distributeRewards();
Pool storage pool = pools[_poolId];
totalWeight -= pool.weight;
totalWeight += _newWeight;
pool.weight = _newWeight;
emit WeightAdjusted(_poolId, address(pool.poolContract), _newWeight);
}
function setRewardPerSecond(uint256 _rewardPerSecond) external onlyGov {
distributeRewards();
rewardPerSecond = _rewardPerSecond;
emit RewardsPerSecondSet(_rewardPerSecond);
}
function distributeRewards() public onlyRewardDistributor {
uint256 timePassed = block.timestamp - lastDistribution;
uint256 totalRewardAmount = rewardPerSecond * timePassed;
lastDistribution = block.timestamp;
// return if pool length == 0
if(pools.length == 0) {
return;
}
// return if accrued rewards == 0
if(totalRewardAmount == 0) {
return;
}
reward.safeTransferFrom(rewardSource, address(this), totalRewardAmount);
for(uint256 i = 0; i < pools.length; i ++) {
Pool memory pool = pools[i];
uint256 poolRewardAmount = totalRewardAmount * pool.weight / totalWeight;
// Ignore tx failing to prevent a single pool from halting reward distribution
address(pool.poolContract).call(abi.encodeWithSelector(pool.poolContract.distributeRewards.selector, poolRewardAmount));
}
uint256 leftOverReward = reward.balanceOf(address(this));
// send back excess but ignore dust
if(leftOverReward > 1) {
reward.safeTransfer(rewardSource, leftOverReward);
}
emit RewardsDistributed(_msgSender(), totalRewardAmount);
}
function getPools() external view returns(Pool[] memory result) {
return pools;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_reward","type":"address"},{"internalType":"address","name":"_rewardSource","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"pool","type":"address"}],"name":"PoolRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"RewardsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardsPerSecond","type":"uint256"}],"name":"RewardsPerSecondSet","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":"by","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenSaved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"newWeight","type":"uint256"}],"name":"WeightAdjusted","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOV_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_POOL_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_DISTRIBUTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_SAVER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolContract","type":"address"},{"internalType":"uint256","name":"_weight","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_newWeight","type":"uint256"}],"name":"adjustWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPools","outputs":[{"components":[{"internalType":"contract IBasePool","name":"poolContract","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"internalType":"struct LiquidityMiningManager.Pool[]","name":"result","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":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"lastDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"contract IBasePool","name":"poolContract","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"removePool","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":[],"name":"reward","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardSource","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"saveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"setRewardPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c0604052600a6002553480156200001657600080fd5b5060405162003f1238038062003f1283398181016040528101906200003c919062000469565b620000606000801b62000054620001bc60201b60201c565b620001c460201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620000d3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000ca9062000520565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000146576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200013d90620004fe565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050506200066a565b600033905090565b620001d68282620001da60201b60201c565b5050565b620001f182826200022260201b620017ca1760201c565b6200021d81600160008581526020019081526020016000206200031360201b620018aa1790919060201c565b505050565b6200023482826200034b60201b60201c565b6200030f57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002b4620001bc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000343836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620003b560201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620003c983836200042f60201b60201c565b6200042457826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000429565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081519050620004638162000650565b92915050565b6000806040838503121562000483576200048262000587565b5b6000620004938582860162000452565b9250506020620004a68582860162000452565b9150509250929050565b6000620004bf60428362000542565b9150620004cc826200058c565b606082019050919050565b6000620004e6603c8362000542565b9150620004f38262000601565b604082019050919050565b600060208201905081810360008301526200051981620004b0565b9050919050565b600060208201905081810360008301526200053b81620004d7565b9050919050565b600082825260208201905092915050565b6000620005608262000567565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b7f4c69717569646974794d696e696e674d616e616765722e636f6e73747275637460008201527f6f723a20726577617264536f7572636520746f6b656e206d757374206265207360208201527f6574000000000000000000000000000000000000000000000000000000000000604082015250565b7f4c69717569646974794d696e696e674d616e616765722e636f6e73747275637460008201527f6f723a2072657761726420746f6b656e206d7573742062652073657400000000602082015250565b6200065b8162000553565b81146200066757600080fd5b50565b60805160601c60a05160601c613852620006c060003960008181610c9801528181610f7601526112100152600081816105af0152818161091801528181610cbb01528181610ebf0152610f9801526138526000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80639010d07c116100f9578063a717639c11610097578063b9c849b611610071578063b9c849b61461049b578063ca15c873146104b7578063d3b91d84146104e7578063d547741f14610517576101a9565b8063a717639c1461042e578063ac4afa381461044c578063b536818a1461047d576101a9565b80639afdb2c2116100d35780639afdb2c2146103ba5780639cfbc002146103d6578063a217fddf146103f4578063a38dcbd014610412576101a9565b80639010d07c1461033c57806391d148541461036c57806396c82e571461039c576101a9565b806336568abe11610166578063673a2a1f11610140578063673a2a1f146102d85780636f4a2cd0146102f657806376175b06146103005780638f10369a1461031e576101a9565b806336568abe146102825780635a8c2e261461029e57806366da5815146102bc576101a9565b806301ffc9a7146101ae578063228cb733146101de578063248a9ca3146101fc5780632f2ff15d1461022c57806332a9caba1461024857806332e4bb0a14610264575b600080fd5b6101c860048036038101906101c3919061271c565b610533565b6040516101d59190612ce2565b60405180910390f35b6101e66105ad565b6040516101f39190612d41565b60405180910390f35b6102166004803603810190610211919061266f565b6105d1565b6040516102239190612cfd565b60405180910390f35b6102466004803603810190610241919061269c565b6105f0565b005b610262600480360381019061025d9190612602565b610619565b005b61026c6109ae565b6040516102799190612cfd565b60405180910390f35b61029c6004803603810190610297919061269c565b6109d2565b005b6102a6610a55565b6040516102b39190612f3e565b60405180910390f35b6102d660048036038101906102d19190612749565b610a5b565b005b6102e0610b14565b6040516102ed9190612cc0565b60405180910390f35b6102fe610bd3565b005b610308611022565b6040516103159190612cfd565b60405180910390f35b610326611046565b6040516103339190612f3e565b60405180910390f35b610356600480360381019061035191906126dc565b61104c565b6040516103639190612c1c565b60405180910390f35b6103866004803603810190610381919061269c565b61107b565b6040516103939190612ce2565b60405180910390f35b6103a46110e5565b6040516103b19190612f3e565b60405180910390f35b6103d460048036038101906103cf91906125af565b6110eb565b005b6103de61120e565b6040516103eb9190612c1c565b60405180910390f35b6103fc611232565b6040516104099190612cfd565b60405180910390f35b61042c60048036038101906104279190612749565b611239565b005b610436611543565b6040516104439190612f3e565b60405180910390f35b61046660048036038101906104619190612749565b611549565b604051610474929190612d18565b60405180910390f35b61048561159d565b6040516104929190612cfd565b60405180910390f35b6104b560048036038101906104b091906127a3565b6115c1565b005b6104d160048036038101906104cc919061266f565b61175d565b6040516104de9190612f3e565b60405180910390f35b61050160048036038101906104fc9190612582565b611781565b60405161050e9190612ce2565b60405180910390f35b610531600480360381019061052c919061269c565b6117a1565b005b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a657506105a5826118da565b5b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000838152602001908152602001600020600101549050919050565b6105f9826105d1565b61060a81610605611954565b61195c565b61061483836119f9565b505050565b61064a7f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba610645611954565b61107b565b610689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068090612e3e565b60405180910390fd5b610691610bd3565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f890612e1e565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561078e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078590612e5e565b60405180910390fd5b600254600780549050106107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612ebe565b60405180910390fd5b600760405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600560008282546108ea9190612fcf565b9250508190555061095c827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611a2d9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f0c98febfffcec480c66a977e13f14bafdb5199ea9603591a0715b0cabe0c3ae2826040516109a29190612f3e565b60405180910390a25050565b7fb814ff4a26ea3ec5cd1fa579daad86324826254265f3acfec78303a19845b44981565b6109da611954565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e90612f1e565b60405180910390fd5b610a518282611b8b565b5050565b60025481565b610a8c7f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba610a87611954565b61107b565b610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac290612e3e565b60405180910390fd5b610ad3610bd3565b806003819055507fa779fa0f0a75020027d18183bb38fa4a9abeea71bb307e00ac7f5410527967ab81604051610b099190612f3e565b60405180910390a150565b60606007805480602002602001604051908101604052809291908181526020016000905b82821015610bca57838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190610b38565b50505050905090565b610c047fb814ff4a26ea3ec5cd1fa579daad86324826254265f3acfec78303a19845b449610bff611954565b61107b565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90612dbe565b60405180910390fd5b600060045442610c5391906130b0565b9050600081600354610c659190613056565b90504260048190555060006007805490501415610c83575050611020565b6000811415610c93575050611020565b610d007f000000000000000000000000000000000000000000000000000000000000000030837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611bbf909392919063ffffffff16565b60005b600780549050811015610eba57600060078281548110610d2657610d256132dd565b5b90600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505090506000600554826020015185610db69190613056565b610dc09190613025565b9050816000015173ffffffffffffffffffffffffffffffffffffffff166359974e3860e01b82604051602401610df69190612f3e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e609190612bcb565b6000604051808303816000865af19150503d8060008114610e9d576040519150601f19603f3d011682016040523d82523d6000602084013e610ea2565b606091505b50505050508080610eb290613207565b915050610d03565b5060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f169190612c1c565b60206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f669190612776565b90506001811115610fdd57610fdc7f0000000000000000000000000000000000000000000000000000000000000000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611c489092919063ffffffff16565b5b817fdf29796aad820e4bb192f3a8d631b76519bcd2cbe77cc85af20e9df53cece086611007611954565b6040516110149190612c1c565b60405180910390a25050505b565b7fd9d917c4034cff8a8c5fa1e40f9fbaf906b827c33ae3ab1fcabbb616cb8ef24d81565b60035481565b60006110738260016000868152602001908152602001600020611cce90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60055481565b61111c7fd9d917c4034cff8a8c5fa1e40f9fbaf906b827c33ae3ab1fcabbb616cb8ef24d611117611954565b61107b565b61115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290612dfe565b60405180910390fd5b61118682828573ffffffffffffffffffffffffffffffffffffffff16611c489092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166111bc611954565b73ffffffffffffffffffffffffffffffffffffffff167f30d87cec6b4c56cede1018725d1e6d9304e2f7ee6d25b004b7e2183f793f26bc846040516112019190612f3e565b60405180910390a4505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000801b81565b61126a7f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba611265611954565b61107b565b6112a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a090612e3e565b60405180910390fd5b60078054905081106112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790612e7e565b60405180910390fd5b6112f8610bd3565b60006007828154811061130e5761130d6132dd565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060078281548110611356576113556132dd565b5b9060005260206000209060020201600101546005600082825461137991906130b0565b925050819055506007600160078054905061139491906130b0565b815481106113a5576113a46132dd565b5b9060005260206000209060020201600783815481106113c7576113c66132dd565b5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018201548160010155905050600780548061145b5761145a6132ae565b5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160009055505090556000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff16827f18e9d3644c306f9be50ade92ee325ee173812431fa971a0b8d46f9eb7073960160405160405180910390a35050565b60045481565b6007818154811061155957600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b7f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba81565b6115f27f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba6115ed611954565b61107b565b611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890612e3e565b60405180910390fd5b6007805490508210611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f90612d9e565b60405180910390fd5b611680610bd3565b600060078381548110611696576116956132dd565b5b906000526020600020906002020190508060010154600560008282546116bc91906130b0565b9250508190555081600560008282546116d59190612fcf565b925050819055508181600101819055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16837f4bd857a398c0fb71cc804d86dac2b437d1e5ca0b8a3161ec9638515c5d1997c2846040516117509190612f3e565b60405180910390a3505050565b600061177a60016000848152602001908152602001600020611ce8565b9050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b6117aa826105d1565b6117bb816117b6611954565b61195c565b6117c58383611b8b565b505050565b6117d4828261107b565b6118a657600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061184b611954565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006118d2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611cfd565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061194d575061194c82611d6d565b5b9050919050565b600033905090565b611966828261107b565b6119f55761198b8173ffffffffffffffffffffffffffffffffffffffff166014611dd7565b6119998360001c6020611dd7565b6040516020016119aa929190612be2565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ec9190612d5c565b60405180910390fd5b5050565b611a0382826117ca565b611a2881600160008581526020019081526020016000206118aa90919063ffffffff16565b505050565b6000811480611ac6575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401611a74929190612c37565b60206040518083038186803b158015611a8c57600080fd5b505afa158015611aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac49190612776565b145b611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90612efe565b60405180910390fd5b611b868363095ea7b360e01b8484604051602401611b24929190612c97565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612013565b505050565b611b9582826120da565b611bba81600160008581526020019081526020016000206121bb90919063ffffffff16565b505050565b611c42846323b872dd60e01b858585604051602401611be093929190612c60565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612013565b50505050565b611cc98363a9059cbb60e01b8484604051602401611c67929190612c97565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612013565b505050565b6000611cdd83600001836121eb565b60001c905092915050565b6000611cf682600001612216565b9050919050565b6000611d098383612227565b611d62578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611d67565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060006002836002611dea9190613056565b611df49190612fcf565b67ffffffffffffffff811115611e0d57611e0c61330c565b5b6040519080825280601f01601f191660200182016040528015611e3f5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611e7757611e766132dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611edb57611eda6132dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611f1b9190613056565b611f259190612fcf565b90505b6001811115611fc5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611f6757611f666132dd565b5b1a60f81b828281518110611f7e57611f7d6132dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611fbe906131dd565b9050611f28565b5060008414612009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200090612d7e565b60405180910390fd5b8091505092915050565b6000612075826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661224a9092919063ffffffff16565b90506000815111156120d557808060200190518101906120959190612642565b6120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb90612ede565b60405180910390fd5b5b505050565b6120e4828261107b565b156121b757600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061215c611954565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006121e3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612262565b905092915050565b6000826000018281548110612203576122026132dd565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60606122598484600085612376565b90509392505050565b6000808360010160008481526020019081526020016000205490506000811461236a57600060018261229491906130b0565b90506000600186600001805490506122ac91906130b0565b905081811461231b5760008660000182815481106122cd576122cc6132dd565b5b90600052602060002001549050808760000184815481106122f1576122f06132dd565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061232f5761232e6132ae565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612370565b60009150505b92915050565b6060824710156123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290612dde565b60405180910390fd5b6123c48561248a565b612403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fa90612e9e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161242c9190612bcb565b60006040518083038185875af1925050503d8060008114612469576040519150601f19603f3d011682016040523d82523d6000602084013e61246e565b606091505b509150915061247e82828661249d565b92505050949350505050565b600080823b905060008111915050919050565b606083156124ad578290506124fd565b6000835111156124c05782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f49190612d5c565b60405180910390fd5b9392505050565b600081359050612513816137a9565b92915050565b600081519050612528816137c0565b92915050565b60008135905061253d816137d7565b92915050565b600081359050612552816137ee565b92915050565b60008135905061256781613805565b92915050565b60008151905061257c81613805565b92915050565b6000602082840312156125985761259761333b565b5b60006125a684828501612504565b91505092915050565b6000806000606084860312156125c8576125c761333b565b5b60006125d686828701612504565b93505060206125e786828701612504565b92505060406125f886828701612558565b9150509250925092565b600080604083850312156126195761261861333b565b5b600061262785828601612504565b925050602061263885828601612558565b9150509250929050565b6000602082840312156126585761265761333b565b5b600061266684828501612519565b91505092915050565b6000602082840312156126855761268461333b565b5b60006126938482850161252e565b91505092915050565b600080604083850312156126b3576126b261333b565b5b60006126c18582860161252e565b92505060206126d285828601612504565b9150509250929050565b600080604083850312156126f3576126f261333b565b5b60006127018582860161252e565b925050602061271285828601612558565b9150509250929050565b6000602082840312156127325761273161333b565b5b600061274084828501612543565b91505092915050565b60006020828403121561275f5761275e61333b565b5b600061276d84828501612558565b91505092915050565b60006020828403121561278c5761278b61333b565b5b600061279a8482850161256d565b91505092915050565b600080604083850312156127ba576127b961333b565b5b60006127c885828601612558565b92505060206127d985828601612558565b9150509250929050565b60006127ef8383612b7e565b60408301905092915050565b612804816130e4565b82525050565b600061281582612f69565b61281f8185612f97565b935061282a83612f59565b8060005b8381101561285b57815161284288826127e3565b975061284d83612f8a565b92505060018101905061282e565b5085935050505092915050565b612871816130f6565b82525050565b61288081613102565b82525050565b600061289182612f74565b61289b8185612fa8565b93506128ab8185602086016131aa565b80840191505092915050565b6128c081613162565b82525050565b6128cf81613162565b82525050565b6128de81613174565b82525050565b60006128ef82612f7f565b6128f98185612fb3565b93506129098185602086016131aa565b61291281613340565b840191505092915050565b600061292882612f7f565b6129328185612fc4565b93506129428185602086016131aa565b80840191505092915050565b600061295b602083612fb3565b915061296682613351565b602082019050919050565b600061297e603883612fb3565b91506129898261337a565b604082019050919050565b60006129a1603f83612fb3565b91506129ac826133c9565b604082019050919050565b60006129c4602683612fb3565b91506129cf82613418565b604082019050919050565b60006129e7602c83612fb3565b91506129f282613467565b604082019050919050565b6000612a0a603983612fb3565b9150612a15826134b6565b604082019050919050565b6000612a2d603183612fb3565b9150612a3882613505565b604082019050919050565b6000612a50603283612fb3565b9150612a5b82613554565b604082019050919050565b6000612a73603683612fb3565b9150612a7e826135a3565b604082019050919050565b6000612a96601d83612fb3565b9150612aa1826135f2565b602082019050919050565b6000612ab9603b83612fb3565b9150612ac48261361b565b604082019050919050565b6000612adc601783612fc4565b9150612ae78261366a565b601782019050919050565b6000612aff602a83612fb3565b9150612b0a82613693565b604082019050919050565b6000612b22603683612fb3565b9150612b2d826136e2565b604082019050919050565b6000612b45601183612fc4565b9150612b5082613731565b601182019050919050565b6000612b68602f83612fb3565b9150612b738261375a565b604082019050919050565b604082016000820151612b9460008501826128b7565b506020820151612ba76020850182612bad565b50505050565b612bb681613158565b82525050565b612bc581613158565b82525050565b6000612bd78284612886565b915081905092915050565b6000612bed82612acf565b9150612bf9828561291d565b9150612c0482612b38565b9150612c10828461291d565b91508190509392505050565b6000602082019050612c3160008301846127fb565b92915050565b6000604082019050612c4c60008301856127fb565b612c5960208301846127fb565b9392505050565b6000606082019050612c7560008301866127fb565b612c8260208301856127fb565b612c8f6040830184612bbc565b949350505050565b6000604082019050612cac60008301856127fb565b612cb96020830184612bbc565b9392505050565b60006020820190508181036000830152612cda818461280a565b905092915050565b6000602082019050612cf76000830184612868565b92915050565b6000602082019050612d126000830184612877565b92915050565b6000604082019050612d2d60008301856128c6565b612d3a6020830184612bbc565b9392505050565b6000602082019050612d5660008301846128d5565b92915050565b60006020820190508181036000830152612d7681846128e4565b905092915050565b60006020820190508181036000830152612d978161294e565b9050919050565b60006020820190508181036000830152612db781612971565b9050919050565b60006020820190508181036000830152612dd781612994565b9050919050565b60006020820190508181036000830152612df7816129b7565b9050919050565b60006020820190508181036000830152612e17816129da565b9050919050565b60006020820190508181036000830152612e37816129fd565b9050919050565b60006020820190508181036000830152612e5781612a20565b9050919050565b60006020820190508181036000830152612e7781612a43565b9050919050565b60006020820190508181036000830152612e9781612a66565b9050919050565b60006020820190508181036000830152612eb781612a89565b9050919050565b60006020820190508181036000830152612ed781612aac565b9050919050565b60006020820190508181036000830152612ef781612af2565b9050919050565b60006020820190508181036000830152612f1781612b15565b9050919050565b60006020820190508181036000830152612f3781612b5b565b9050919050565b6000602082019050612f536000830184612bbc565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612fda82613158565b9150612fe583613158565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561301a57613019613250565b5b828201905092915050565b600061303082613158565b915061303b83613158565b92508261304b5761304a61327f565b5b828204905092915050565b600061306182613158565b915061306c83613158565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130a5576130a4613250565b5b828202905092915050565b60006130bb82613158565b91506130c683613158565b9250828210156130d9576130d8613250565b5b828203905092915050565b60006130ef82613138565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061316d82613186565b9050919050565b600061317f82613186565b9050919050565b600061319182613198565b9050919050565b60006131a382613138565b9050919050565b60005b838110156131c85780820151818401526020810190506131ad565b838111156131d7576000848401525b50505050565b60006131e882613158565b915060008214156131fc576131fb613250565b5b600182039050919050565b600061321282613158565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561324557613244613250565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4c69717569646974794d696e696e674d616e616765722e61646a75737457656960008201527f6768743a20506f6f6c20646f6573206e6f742065786973740000000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e6f6e6c79526577617260008201527f644469737472696275746f723a207065726d697373696f6e2064656e69656400602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e53617665722e6f6e6c79546f6b656e53617665723a207065726d6960008201527f7373696f6e2064656e6965640000000000000000000000000000000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e616464506f6f6c3a2060008201527f706f6f6c20636f6e7472616374206d7573742062652073657400000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e6f6e6c79476f763a2060008201527f7065726d697373696f6e2064656e696564000000000000000000000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e616464506f6f6c3a2060008201527f506f6f6c20616c72656164792061646465640000000000000000000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e72656d6f7665506f6f60008201527f6c3a20506f6f6c20646f6573206e6f7420657869737400000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4c69717569646974794d696e696e674d616e616765722e616464506f6f6c3a2060008201527f4d617820616d6f756e74206f6620706f6f6c7320726561636865640000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6137b2816130e4565b81146137bd57600080fd5b50565b6137c9816130f6565b81146137d457600080fd5b50565b6137e081613102565b81146137eb57600080fd5b50565b6137f78161310c565b811461380257600080fd5b50565b61380e81613158565b811461381957600080fd5b5056fea26469706673582212201d477c665c085341ec6e40c80e4dce13d9aef011fc3a5c9b1193cb26944b621964736f6c63430008070033000000000000000000000000dac657ffd44a3b9d8aba8749830bf14beb66ff2d000000000000000000000000639752551071049d77766c69416591663a1f8211
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80639010d07c116100f9578063a717639c11610097578063b9c849b611610071578063b9c849b61461049b578063ca15c873146104b7578063d3b91d84146104e7578063d547741f14610517576101a9565b8063a717639c1461042e578063ac4afa381461044c578063b536818a1461047d576101a9565b80639afdb2c2116100d35780639afdb2c2146103ba5780639cfbc002146103d6578063a217fddf146103f4578063a38dcbd014610412576101a9565b80639010d07c1461033c57806391d148541461036c57806396c82e571461039c576101a9565b806336568abe11610166578063673a2a1f11610140578063673a2a1f146102d85780636f4a2cd0146102f657806376175b06146103005780638f10369a1461031e576101a9565b806336568abe146102825780635a8c2e261461029e57806366da5815146102bc576101a9565b806301ffc9a7146101ae578063228cb733146101de578063248a9ca3146101fc5780632f2ff15d1461022c57806332a9caba1461024857806332e4bb0a14610264575b600080fd5b6101c860048036038101906101c3919061271c565b610533565b6040516101d59190612ce2565b60405180910390f35b6101e66105ad565b6040516101f39190612d41565b60405180910390f35b6102166004803603810190610211919061266f565b6105d1565b6040516102239190612cfd565b60405180910390f35b6102466004803603810190610241919061269c565b6105f0565b005b610262600480360381019061025d9190612602565b610619565b005b61026c6109ae565b6040516102799190612cfd565b60405180910390f35b61029c6004803603810190610297919061269c565b6109d2565b005b6102a6610a55565b6040516102b39190612f3e565b60405180910390f35b6102d660048036038101906102d19190612749565b610a5b565b005b6102e0610b14565b6040516102ed9190612cc0565b60405180910390f35b6102fe610bd3565b005b610308611022565b6040516103159190612cfd565b60405180910390f35b610326611046565b6040516103339190612f3e565b60405180910390f35b610356600480360381019061035191906126dc565b61104c565b6040516103639190612c1c565b60405180910390f35b6103866004803603810190610381919061269c565b61107b565b6040516103939190612ce2565b60405180910390f35b6103a46110e5565b6040516103b19190612f3e565b60405180910390f35b6103d460048036038101906103cf91906125af565b6110eb565b005b6103de61120e565b6040516103eb9190612c1c565b60405180910390f35b6103fc611232565b6040516104099190612cfd565b60405180910390f35b61042c60048036038101906104279190612749565b611239565b005b610436611543565b6040516104439190612f3e565b60405180910390f35b61046660048036038101906104619190612749565b611549565b604051610474929190612d18565b60405180910390f35b61048561159d565b6040516104929190612cfd565b60405180910390f35b6104b560048036038101906104b091906127a3565b6115c1565b005b6104d160048036038101906104cc919061266f565b61175d565b6040516104de9190612f3e565b60405180910390f35b61050160048036038101906104fc9190612582565b611781565b60405161050e9190612ce2565b60405180910390f35b610531600480360381019061052c919061269c565b6117a1565b005b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a657506105a5826118da565b5b9050919050565b7f000000000000000000000000dac657ffd44a3b9d8aba8749830bf14beb66ff2d81565b6000806000838152602001908152602001600020600101549050919050565b6105f9826105d1565b61060a81610605611954565b61195c565b61061483836119f9565b505050565b61064a7f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba610645611954565b61107b565b610689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068090612e3e565b60405180910390fd5b610691610bd3565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f890612e1e565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561078e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078590612e5e565b60405180910390fd5b600254600780549050106107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612ebe565b60405180910390fd5b600760405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600560008282546108ea9190612fcf565b9250508190555061095c827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000dac657ffd44a3b9d8aba8749830bf14beb66ff2d73ffffffffffffffffffffffffffffffffffffffff16611a2d9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f0c98febfffcec480c66a977e13f14bafdb5199ea9603591a0715b0cabe0c3ae2826040516109a29190612f3e565b60405180910390a25050565b7fb814ff4a26ea3ec5cd1fa579daad86324826254265f3acfec78303a19845b44981565b6109da611954565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e90612f1e565b60405180910390fd5b610a518282611b8b565b5050565b60025481565b610a8c7f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba610a87611954565b61107b565b610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac290612e3e565b60405180910390fd5b610ad3610bd3565b806003819055507fa779fa0f0a75020027d18183bb38fa4a9abeea71bb307e00ac7f5410527967ab81604051610b099190612f3e565b60405180910390a150565b60606007805480602002602001604051908101604052809291908181526020016000905b82821015610bca57838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190610b38565b50505050905090565b610c047fb814ff4a26ea3ec5cd1fa579daad86324826254265f3acfec78303a19845b449610bff611954565b61107b565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90612dbe565b60405180910390fd5b600060045442610c5391906130b0565b9050600081600354610c659190613056565b90504260048190555060006007805490501415610c83575050611020565b6000811415610c93575050611020565b610d007f000000000000000000000000639752551071049d77766c69416591663a1f821130837f000000000000000000000000dac657ffd44a3b9d8aba8749830bf14beb66ff2d73ffffffffffffffffffffffffffffffffffffffff16611bbf909392919063ffffffff16565b60005b600780549050811015610eba57600060078281548110610d2657610d256132dd565b5b90600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505090506000600554826020015185610db69190613056565b610dc09190613025565b9050816000015173ffffffffffffffffffffffffffffffffffffffff166359974e3860e01b82604051602401610df69190612f3e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e609190612bcb565b6000604051808303816000865af19150503d8060008114610e9d576040519150601f19603f3d011682016040523d82523d6000602084013e610ea2565b606091505b50505050508080610eb290613207565b915050610d03565b5060007f000000000000000000000000dac657ffd44a3b9d8aba8749830bf14beb66ff2d73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f169190612c1c565b60206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f669190612776565b90506001811115610fdd57610fdc7f000000000000000000000000639752551071049d77766c69416591663a1f8211827f000000000000000000000000dac657ffd44a3b9d8aba8749830bf14beb66ff2d73ffffffffffffffffffffffffffffffffffffffff16611c489092919063ffffffff16565b5b817fdf29796aad820e4bb192f3a8d631b76519bcd2cbe77cc85af20e9df53cece086611007611954565b6040516110149190612c1c565b60405180910390a25050505b565b7fd9d917c4034cff8a8c5fa1e40f9fbaf906b827c33ae3ab1fcabbb616cb8ef24d81565b60035481565b60006110738260016000868152602001908152602001600020611cce90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60055481565b61111c7fd9d917c4034cff8a8c5fa1e40f9fbaf906b827c33ae3ab1fcabbb616cb8ef24d611117611954565b61107b565b61115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290612dfe565b60405180910390fd5b61118682828573ffffffffffffffffffffffffffffffffffffffff16611c489092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166111bc611954565b73ffffffffffffffffffffffffffffffffffffffff167f30d87cec6b4c56cede1018725d1e6d9304e2f7ee6d25b004b7e2183f793f26bc846040516112019190612f3e565b60405180910390a4505050565b7f000000000000000000000000639752551071049d77766c69416591663a1f821181565b6000801b81565b61126a7f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba611265611954565b61107b565b6112a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a090612e3e565b60405180910390fd5b60078054905081106112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790612e7e565b60405180910390fd5b6112f8610bd3565b60006007828154811061130e5761130d6132dd565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060078281548110611356576113556132dd565b5b9060005260206000209060020201600101546005600082825461137991906130b0565b925050819055506007600160078054905061139491906130b0565b815481106113a5576113a46132dd565b5b9060005260206000209060020201600783815481106113c7576113c66132dd565b5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018201548160010155905050600780548061145b5761145a6132ae565b5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160009055505090556000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff16827f18e9d3644c306f9be50ade92ee325ee173812431fa971a0b8d46f9eb7073960160405160405180910390a35050565b60045481565b6007818154811061155957600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b7f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba81565b6115f27f0603f2636f0ca34ae3ea5a23bb826e2bd2ffd59fb1c01edc1ba10fba2899d1ba6115ed611954565b61107b565b611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890612e3e565b60405180910390fd5b6007805490508210611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f90612d9e565b60405180910390fd5b611680610bd3565b600060078381548110611696576116956132dd565b5b906000526020600020906002020190508060010154600560008282546116bc91906130b0565b9250508190555081600560008282546116d59190612fcf565b925050819055508181600101819055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16837f4bd857a398c0fb71cc804d86dac2b437d1e5ca0b8a3161ec9638515c5d1997c2846040516117509190612f3e565b60405180910390a3505050565b600061177a60016000848152602001908152602001600020611ce8565b9050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b6117aa826105d1565b6117bb816117b6611954565b61195c565b6117c58383611b8b565b505050565b6117d4828261107b565b6118a657600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061184b611954565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006118d2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611cfd565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061194d575061194c82611d6d565b5b9050919050565b600033905090565b611966828261107b565b6119f55761198b8173ffffffffffffffffffffffffffffffffffffffff166014611dd7565b6119998360001c6020611dd7565b6040516020016119aa929190612be2565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ec9190612d5c565b60405180910390fd5b5050565b611a0382826117ca565b611a2881600160008581526020019081526020016000206118aa90919063ffffffff16565b505050565b6000811480611ac6575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401611a74929190612c37565b60206040518083038186803b158015611a8c57600080fd5b505afa158015611aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac49190612776565b145b611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90612efe565b60405180910390fd5b611b868363095ea7b360e01b8484604051602401611b24929190612c97565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612013565b505050565b611b9582826120da565b611bba81600160008581526020019081526020016000206121bb90919063ffffffff16565b505050565b611c42846323b872dd60e01b858585604051602401611be093929190612c60565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612013565b50505050565b611cc98363a9059cbb60e01b8484604051602401611c67929190612c97565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612013565b505050565b6000611cdd83600001836121eb565b60001c905092915050565b6000611cf682600001612216565b9050919050565b6000611d098383612227565b611d62578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611d67565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060006002836002611dea9190613056565b611df49190612fcf565b67ffffffffffffffff811115611e0d57611e0c61330c565b5b6040519080825280601f01601f191660200182016040528015611e3f5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611e7757611e766132dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611edb57611eda6132dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611f1b9190613056565b611f259190612fcf565b90505b6001811115611fc5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611f6757611f666132dd565b5b1a60f81b828281518110611f7e57611f7d6132dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611fbe906131dd565b9050611f28565b5060008414612009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200090612d7e565b60405180910390fd5b8091505092915050565b6000612075826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661224a9092919063ffffffff16565b90506000815111156120d557808060200190518101906120959190612642565b6120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb90612ede565b60405180910390fd5b5b505050565b6120e4828261107b565b156121b757600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061215c611954565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006121e3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612262565b905092915050565b6000826000018281548110612203576122026132dd565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60606122598484600085612376565b90509392505050565b6000808360010160008481526020019081526020016000205490506000811461236a57600060018261229491906130b0565b90506000600186600001805490506122ac91906130b0565b905081811461231b5760008660000182815481106122cd576122cc6132dd565b5b90600052602060002001549050808760000184815481106122f1576122f06132dd565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061232f5761232e6132ae565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612370565b60009150505b92915050565b6060824710156123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290612dde565b60405180910390fd5b6123c48561248a565b612403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fa90612e9e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161242c9190612bcb565b60006040518083038185875af1925050503d8060008114612469576040519150601f19603f3d011682016040523d82523d6000602084013e61246e565b606091505b509150915061247e82828661249d565b92505050949350505050565b600080823b905060008111915050919050565b606083156124ad578290506124fd565b6000835111156124c05782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f49190612d5c565b60405180910390fd5b9392505050565b600081359050612513816137a9565b92915050565b600081519050612528816137c0565b92915050565b60008135905061253d816137d7565b92915050565b600081359050612552816137ee565b92915050565b60008135905061256781613805565b92915050565b60008151905061257c81613805565b92915050565b6000602082840312156125985761259761333b565b5b60006125a684828501612504565b91505092915050565b6000806000606084860312156125c8576125c761333b565b5b60006125d686828701612504565b93505060206125e786828701612504565b92505060406125f886828701612558565b9150509250925092565b600080604083850312156126195761261861333b565b5b600061262785828601612504565b925050602061263885828601612558565b9150509250929050565b6000602082840312156126585761265761333b565b5b600061266684828501612519565b91505092915050565b6000602082840312156126855761268461333b565b5b60006126938482850161252e565b91505092915050565b600080604083850312156126b3576126b261333b565b5b60006126c18582860161252e565b92505060206126d285828601612504565b9150509250929050565b600080604083850312156126f3576126f261333b565b5b60006127018582860161252e565b925050602061271285828601612558565b9150509250929050565b6000602082840312156127325761273161333b565b5b600061274084828501612543565b91505092915050565b60006020828403121561275f5761275e61333b565b5b600061276d84828501612558565b91505092915050565b60006020828403121561278c5761278b61333b565b5b600061279a8482850161256d565b91505092915050565b600080604083850312156127ba576127b961333b565b5b60006127c885828601612558565b92505060206127d985828601612558565b9150509250929050565b60006127ef8383612b7e565b60408301905092915050565b612804816130e4565b82525050565b600061281582612f69565b61281f8185612f97565b935061282a83612f59565b8060005b8381101561285b57815161284288826127e3565b975061284d83612f8a565b92505060018101905061282e565b5085935050505092915050565b612871816130f6565b82525050565b61288081613102565b82525050565b600061289182612f74565b61289b8185612fa8565b93506128ab8185602086016131aa565b80840191505092915050565b6128c081613162565b82525050565b6128cf81613162565b82525050565b6128de81613174565b82525050565b60006128ef82612f7f565b6128f98185612fb3565b93506129098185602086016131aa565b61291281613340565b840191505092915050565b600061292882612f7f565b6129328185612fc4565b93506129428185602086016131aa565b80840191505092915050565b600061295b602083612fb3565b915061296682613351565b602082019050919050565b600061297e603883612fb3565b91506129898261337a565b604082019050919050565b60006129a1603f83612fb3565b91506129ac826133c9565b604082019050919050565b60006129c4602683612fb3565b91506129cf82613418565b604082019050919050565b60006129e7602c83612fb3565b91506129f282613467565b604082019050919050565b6000612a0a603983612fb3565b9150612a15826134b6565b604082019050919050565b6000612a2d603183612fb3565b9150612a3882613505565b604082019050919050565b6000612a50603283612fb3565b9150612a5b82613554565b604082019050919050565b6000612a73603683612fb3565b9150612a7e826135a3565b604082019050919050565b6000612a96601d83612fb3565b9150612aa1826135f2565b602082019050919050565b6000612ab9603b83612fb3565b9150612ac48261361b565b604082019050919050565b6000612adc601783612fc4565b9150612ae78261366a565b601782019050919050565b6000612aff602a83612fb3565b9150612b0a82613693565b604082019050919050565b6000612b22603683612fb3565b9150612b2d826136e2565b604082019050919050565b6000612b45601183612fc4565b9150612b5082613731565b601182019050919050565b6000612b68602f83612fb3565b9150612b738261375a565b604082019050919050565b604082016000820151612b9460008501826128b7565b506020820151612ba76020850182612bad565b50505050565b612bb681613158565b82525050565b612bc581613158565b82525050565b6000612bd78284612886565b915081905092915050565b6000612bed82612acf565b9150612bf9828561291d565b9150612c0482612b38565b9150612c10828461291d565b91508190509392505050565b6000602082019050612c3160008301846127fb565b92915050565b6000604082019050612c4c60008301856127fb565b612c5960208301846127fb565b9392505050565b6000606082019050612c7560008301866127fb565b612c8260208301856127fb565b612c8f6040830184612bbc565b949350505050565b6000604082019050612cac60008301856127fb565b612cb96020830184612bbc565b9392505050565b60006020820190508181036000830152612cda818461280a565b905092915050565b6000602082019050612cf76000830184612868565b92915050565b6000602082019050612d126000830184612877565b92915050565b6000604082019050612d2d60008301856128c6565b612d3a6020830184612bbc565b9392505050565b6000602082019050612d5660008301846128d5565b92915050565b60006020820190508181036000830152612d7681846128e4565b905092915050565b60006020820190508181036000830152612d978161294e565b9050919050565b60006020820190508181036000830152612db781612971565b9050919050565b60006020820190508181036000830152612dd781612994565b9050919050565b60006020820190508181036000830152612df7816129b7565b9050919050565b60006020820190508181036000830152612e17816129da565b9050919050565b60006020820190508181036000830152612e37816129fd565b9050919050565b60006020820190508181036000830152612e5781612a20565b9050919050565b60006020820190508181036000830152612e7781612a43565b9050919050565b60006020820190508181036000830152612e9781612a66565b9050919050565b60006020820190508181036000830152612eb781612a89565b9050919050565b60006020820190508181036000830152612ed781612aac565b9050919050565b60006020820190508181036000830152612ef781612af2565b9050919050565b60006020820190508181036000830152612f1781612b15565b9050919050565b60006020820190508181036000830152612f3781612b5b565b9050919050565b6000602082019050612f536000830184612bbc565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612fda82613158565b9150612fe583613158565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561301a57613019613250565b5b828201905092915050565b600061303082613158565b915061303b83613158565b92508261304b5761304a61327f565b5b828204905092915050565b600061306182613158565b915061306c83613158565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130a5576130a4613250565b5b828202905092915050565b60006130bb82613158565b91506130c683613158565b9250828210156130d9576130d8613250565b5b828203905092915050565b60006130ef82613138565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061316d82613186565b9050919050565b600061317f82613186565b9050919050565b600061319182613198565b9050919050565b60006131a382613138565b9050919050565b60005b838110156131c85780820151818401526020810190506131ad565b838111156131d7576000848401525b50505050565b60006131e882613158565b915060008214156131fc576131fb613250565b5b600182039050919050565b600061321282613158565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561324557613244613250565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4c69717569646974794d696e696e674d616e616765722e61646a75737457656960008201527f6768743a20506f6f6c20646f6573206e6f742065786973740000000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e6f6e6c79526577617260008201527f644469737472696275746f723a207065726d697373696f6e2064656e69656400602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e53617665722e6f6e6c79546f6b656e53617665723a207065726d6960008201527f7373696f6e2064656e6965640000000000000000000000000000000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e616464506f6f6c3a2060008201527f706f6f6c20636f6e7472616374206d7573742062652073657400000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e6f6e6c79476f763a2060008201527f7065726d697373696f6e2064656e696564000000000000000000000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e616464506f6f6c3a2060008201527f506f6f6c20616c72656164792061646465640000000000000000000000000000602082015250565b7f4c69717569646974794d696e696e674d616e616765722e72656d6f7665506f6f60008201527f6c3a20506f6f6c20646f6573206e6f7420657869737400000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4c69717569646974794d696e696e674d616e616765722e616464506f6f6c3a2060008201527f4d617820616d6f756e74206f6620706f6f6c7320726561636865640000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6137b2816130e4565b81146137bd57600080fd5b50565b6137c9816130f6565b81146137d457600080fd5b50565b6137e081613102565b81146137eb57600080fd5b50565b6137f78161310c565b811461380257600080fd5b50565b61380e81613158565b811461381957600080fd5b5056fea26469706673582212201d477c665c085341ec6e40c80e4dce13d9aef011fc3a5c9b1193cb26944b621964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dac657ffd44a3b9d8aba8749830bf14beb66ff2d000000000000000000000000639752551071049d77766c69416591663a1f8211
-----Decoded View---------------
Arg [0] : _reward (address): 0xdaC657ffD44a3B9d8aba8749830Bf14BEB66fF2D
Arg [1] : _rewardSource (address): 0x639752551071049d77766c69416591663a1F8211
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000dac657ffd44a3b9d8aba8749830bf14beb66ff2d
Arg [1] : 000000000000000000000000639752551071049d77766c69416591663a1f8211
Deployed Bytecode Sourcemap
47911:5217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29983:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48198:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24599:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24984:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49674:846;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48062:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26032:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48155:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51540:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53030:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51757:1265;;;:::i;:::-;;47153:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48279:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30796:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23484:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48419:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47590:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48235:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22575:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50528:542;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48349:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48502:19;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;47999:56;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51078:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31115:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48454:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25376:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29983:214;30068:4;30107:42;30092:57;;;:11;:57;;;;:97;;;;30153:36;30177:11;30153:23;:36::i;:::-;30092:97;30085:104;;29983:214;;;:::o;48198:30::-;;;:::o;24599:123::-;24665:7;24692:6;:12;24699:4;24692:12;;;;;;;;;;;:22;;;24685:29;;24599:123;;;:::o;24984:147::-;25067:18;25080:4;25067:12;:18::i;:::-;23066:30;23077:4;23083:12;:10;:12::i;:::-;23066:10;:30::i;:::-;25098:25:::1;25109:4;25115:7;25098:10;:25::i;:::-;24984:147:::0;;;:::o;49674:846::-;48652:31;48034:21;48670:12;:10;:12::i;:::-;48652:7;:31::i;:::-;48644:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;49759:19:::1;:17;:19::i;:::-;49822:1;49797:27;;:13;:27;;;;49789:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;49906:9;:24;49916:13;49906:24;;;;;;;;;;;;;;;;;;;;;;;;;49905:25;49897:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;50019:14;;50004:5;:12;;;;:29;49996:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;50129:5;50140:100;;;;;;;;50184:13;50140:100;;;;;;50221:7;50140:100;;::::0;50129:112:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50279:4;50252:9;:24;50262:13;50252:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;50352:7;50337:11;;:22;;;;;;;:::i;:::-;;;;;;;;50409:52;50428:13;50443:17;50409:6;:18;;;;:52;;;;;:::i;:::-;50489:13;50479:33;;;50504:7;50479:33;;;;;;:::i;:::-;;;;;;;;49674:846:::0;;:::o;48062:86::-;48112:36;48062:86;:::o;26032:218::-;26139:12;:10;:12::i;:::-;26128:23;;:7;:23;;;26120:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;26216:26;26228:4;26234:7;26216:11;:26::i;:::-;26032:218;;:::o;48155:34::-;;;;:::o;51540:209::-;48652:31;48034:21;48670:12;:10;:12::i;:::-;48652:7;:31::i;:::-;48644:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;51622:19:::1;:17;:19::i;:::-;51670:16;51652:15;:34;;;;51704:37;51724:16;51704:37;;;;;;:::i;:::-;;;;;;;;51540:209:::0;:::o;53030:95::-;53072:20;53112:5;53105:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53030:95;:::o;51757:1265::-;48815:46;48112:36;48848:12;:10;:12::i;:::-;48815:7;:46::i;:::-;48807:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;51826:18:::1;51865:16;;51847:15;:34;;;;:::i;:::-;51826:55;;51892:25;51938:10;51920:15;;:28;;;;:::i;:::-;51892:56;;51978:15;51959:16;:34;;;;52064:1;52048:5;:12;;;;:17;52045:55;;;52082:7;;;;52045:55;52179:1;52158:17;:22;52155:60;;;52197:7;;;;52155:60;52227:71;52251:12;52273:4;52280:17;52227:6;:23;;;;:71;;;;;;:::i;:::-;52315:9;52311:410;52334:5;:12;;;;52330:1;:16;52311:410;;;52369:16;52388:5;52394:1;52388:8;;;;;;;;:::i;:::-;;;;;;;;;;;;52369:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;52411:24;52472:11;;52458:4;:11;;;52438:17;:31;;;;:::i;:::-;:45;;;;:::i;:::-;52411:72;;52598:4;:17;;;52590:31;;52645:44;;;52691:16;52622:86;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52590:119;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52354:367;;52348:4;;;;;:::i;:::-;;;;52311:410;;;;52733:22;52758:6;:16;;;52783:4;52758:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52733:56;;52867:1;52850:14;:18;52847:99;;;52885:49;52905:12;52919:14;52885:6;:19;;;;:49;;;;;:::i;:::-;52847:99;52996:17;52963:51;52982:12;:10;:12::i;:::-;52963:51;;;;;;:::i;:::-;;;;;;;;51815:1207;;;48940:1;51757:1265::o:0;47153:72::-;47196:29;47153:72;:::o;48279:30::-;;;;:::o;30796:145::-;30878:7;30905:28;30927:5;30905:12;:18;30918:4;30905:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;30898:35;;30796:145;;;;:::o;23484:139::-;23562:4;23586:6;:12;23593:4;23586:12;;;;;;;;;;;:20;;:29;23607:7;23586:29;;;;;;;;;;;;;;;;;;;;;;;;;23579:36;;23484:139;;;;:::o;48419:26::-;;;;:::o;47590:229::-;47389:39;47196:29;47415:12;:10;:12::i;:::-;47389:7;:39::i;:::-;47381:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;47696:47:::1;47724:9;47735:7;47703:6;47696:27;;;;:47;;;;;:::i;:::-;47795:6;47759:52;;47784:9;47759:52;;47770:12;:10;:12::i;:::-;47759:52;;;47803:7;47759:52;;;;;;:::i;:::-;;;;;;;;47590:229:::0;;;:::o;48235:37::-;;;:::o;22575:49::-;22620:4;22575:49;;;:::o;50528:542::-;48652:31;48034:21;48670:12;:10;:12::i;:::-;48652:7;:31::i;:::-;48644:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;50611:5:::1;:12;;;;50601:7;:22;50593:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;50693:19;:17;:19::i;:::-;50723;50753:5;50759:7;50753:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:27;;;;;;;;;;;;50723:58;;50842:5;50848:7;50842:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;;50827:11;;:36;;;;;;;:::i;:::-;;;;;;;;50925:5;50946:1;50931:5;:12;;;;:16;;;;:::i;:::-;50925:23;;;;;;;;:::i;:::-;;;;;;;;;;;;50908:5;50914:7;50908:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50959:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;51006:5;50981:9;:22;50991:11;50981:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;51050:11;51029:33;;51041:7;51029:33;;;;;;;;;;50582:488;50528:542:::0;:::o;48349:31::-;;;;:::o;48502:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47999:56::-;48034:21;47999:56;:::o;51078:454::-;48652:31;48034:21;48670:12;:10;:12::i;:::-;48652:7;:31::i;:::-;48644:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;51183:5:::1;:12;;;;51173:7;:22;51165:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;51267:19;:17;:19::i;:::-;51297:17;51317:5;51323:7;51317:14;;;;;;;;:::i;:::-;;;;;;;;;;;;51297:34;;51359:4;:11;;;51344;;:26;;;;;;;:::i;:::-;;;;;;;;51396:10;51381:11;;:25;;;;;;;:::i;:::-;;;;;;;;51433:10;51419:4;:11;;:24;;;;51493:4;:17;;;;;;;;;;;;51461:63;;51476:7;51461:63;51513:10;51461:63;;;;;;:::i;:::-;;;;;;;;51154:378;51078:454:::0;;:::o;31115:134::-;31187:7;31214:27;:12;:18;31227:4;31214:18;;;;;;;;;;;:25;:27::i;:::-;31207:34;;31115:134;;;:::o;48454:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;25376:149::-;25460:18;25473:4;25460:12;:18::i;:::-;23066:30;23077:4;23083:12;:10;:12::i;:::-;23066:10;:30::i;:::-;25491:26:::1;25503:4;25509:7;25491:11;:26::i;:::-;25376:149:::0;;;:::o;27533:238::-;27617:22;27625:4;27631:7;27617;:22::i;:::-;27612:152;;27688:4;27656:6;:12;27663:4;27656:12;;;;;;;;;;;:20;;:29;27677:7;27656:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;27739:12;:10;:12::i;:::-;27712:40;;27730:7;27712:40;;27724:4;27712:40;;;;;;;;;;27612:152;27533:238;;:::o;7903:152::-;7973:4;7997:50;8002:3;:10;;8038:5;8022:23;;8014:32;;7997:4;:50::i;:::-;7990:57;;7903:152;;;;:::o;23188:204::-;23273:4;23312:32;23297:47;;;:11;:47;;;;:87;;;;23348:36;23372:11;23348:23;:36::i;:::-;23297:87;23290:94;;23188:204;;;:::o;17357:98::-;17410:7;17437:10;17430:17;;17357:98;:::o;23913:497::-;23994:22;24002:4;24008:7;23994;:22::i;:::-;23989:414;;24182:41;24210:7;24182:41;;24220:2;24182:19;:41::i;:::-;24296:38;24324:4;24316:13;;24331:2;24296:19;:38::i;:::-;24087:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24033:358;;;;;;;;;;;:::i;:::-;;;;;;;;23989:414;23913:497;;:::o;31342:169::-;31430:31;31447:4;31453:7;31430:16;:31::i;:::-;31472;31495:7;31472:12;:18;31485:4;31472:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;31342:169;;:::o;44428:616::-;44801:1;44792:5;:10;44791:62;;;;44851:1;44808:5;:15;;;44832:4;44839:7;44808:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;44791:62;44769:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;44946:90;44966:5;44996:22;;;45020:7;45029:5;44973:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44946:19;:90::i;:::-;44428:616;;;:::o;31605:174::-;31694:32;31712:4;31718:7;31694:17;:32::i;:::-;31737:34;31763:7;31737:12;:18;31750:4;31737:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;31605:174;;:::o;43911:248::-;44055:96;44075:5;44105:27;;;44134:4;44140:2;44144:5;44082:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44055:19;:96::i;:::-;43911:248;;;;:::o;43692:211::-;43809:86;43829:5;43859:23;;;43884:2;43888:5;43836:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43809:19;:86::i;:::-;43692:211;;;:::o;9199:158::-;9273:7;9324:22;9328:3;:10;;9340:5;9324:3;:22::i;:::-;9316:31;;9293:56;;9199:158;;;;:::o;8728:117::-;8791:7;8818:19;8826:3;:10;;8818:7;:19::i;:::-;8811:26;;8728:117;;;:::o;1818:414::-;1881:4;1903:21;1913:3;1918:5;1903:9;:21::i;:::-;1898:327;;1941:3;:11;;1958:5;1941:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2124:3;:11;;:18;;;;2102:3;:12;;:19;2115:5;2102:19;;;;;;;;;;;:40;;;;2164:4;2157:11;;;;1898:327;2208:5;2201:12;;1818:414;;;;;:::o;14390:157::-;14475:4;14514:25;14499:40;;;:11;:40;;;;14492:47;;14390:157;;;:::o;16220:451::-;16295:13;16321:19;16366:1;16357:6;16353:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16343:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16321:47;;16379:15;:6;16386:1;16379:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16405;:6;16412:1;16405:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16436:9;16461:1;16452:6;16448:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16436:26;;16431:135;16468:1;16464;:5;16431:135;;;16503:12;16524:3;16516:5;:11;16503:25;;;;;;;:::i;:::-;;;;;16491:6;16498:1;16491:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;16553:1;16543:11;;;;;16471:3;;;;:::i;:::-;;;16431:135;;;;16593:1;16584:5;:10;16576:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;16656:6;16642:21;;;16220:451;;;;:::o;46265:716::-;46689:23;46715:69;46743:4;46715:69;;;;;;;;;;;;;;;;;46723:5;46715:27;;;;:69;;;;;:::i;:::-;46689:95;;46819:1;46799:10;:17;:21;46795:179;;;46896:10;46885:30;;;;;;;;;;;;:::i;:::-;46877:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;46795:179;46335:646;46265:716;;:::o;27903:239::-;27987:22;27995:4;28001:7;27987;:22::i;:::-;27983:152;;;28058:5;28026:6;:12;28033:4;28026:12;;;;;;;;;;;:20;;:29;28047:7;28026:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;28110:12;:10;:12::i;:::-;28083:40;;28101:7;28083:40;;28095:4;28083:40;;;;;;;;;;27983:152;27903:239;;:::o;8231:158::-;8304:4;8328:53;8336:3;:10;;8372:5;8356:23;;8348:32;;8328:7;:53::i;:::-;8321:60;;8231:158;;;;:::o;4592:120::-;4659:7;4686:3;:11;;4698:5;4686:18;;;;;;;;:::i;:::-;;;;;;;;;;4679:25;;4592:120;;;;:::o;4129:109::-;4185:7;4212:3;:11;;:18;;;;4205:25;;4129:109;;;:::o;3914:129::-;3987:4;4034:1;4011:3;:12;;:19;4024:5;4011:19;;;;;;;;;;;;:24;;4004:31;;3914:129;;;;:::o;35574:229::-;35711:12;35743:52;35765:6;35773:4;35779:1;35782:12;35743:21;:52::i;:::-;35736:59;;35574:229;;;;;:::o;2408:1420::-;2474:4;2592:18;2613:3;:12;;:19;2626:5;2613:19;;;;;;;;;;;;2592:40;;2663:1;2649:10;:15;2645:1176;;3024:21;3061:1;3048:10;:14;;;;:::i;:::-;3024:38;;3077:17;3118:1;3097:3;:11;;:18;;;;:22;;;;:::i;:::-;3077:42;;3153:13;3140:9;:26;3136:405;;3187:17;3207:3;:11;;3219:9;3207:22;;;;;;;;:::i;:::-;;;;;;;;;;3187:42;;3361:9;3332:3;:11;;3344:13;3332:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3472:10;3446:3;:12;;:23;3459:9;3446:23;;;;;;;;;;;:36;;;;3168:373;3136:405;3622:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3717:3;:12;;:19;3730:5;3717:19;;;;;;;;;;;3710:26;;;3760:4;3753:11;;;;;;;2645:1176;3804:5;3797:12;;;2408:1420;;;;;:::o;36694:510::-;36864:12;36922:5;36897:21;:30;;36889:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36989:18;37000:6;36989:10;:18::i;:::-;36981:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;37055:12;37069:23;37096:6;:11;;37115:5;37122:4;37096:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37054:73;;;;37145:51;37162:7;37171:10;37183:12;37145:16;:51::i;:::-;37138:58;;;;36694:510;;;;;;:::o;32768:387::-;32828:4;33036:12;33103:7;33091:20;33083:28;;33146:1;33139:4;:8;33132:15;;;32768:387;;;:::o;39380:712::-;39530:12;39559:7;39555:530;;;39590:10;39583:17;;;;39555:530;39724:1;39704:10;:17;:21;39700:374;;;39902:10;39896:17;39963:15;39950:10;39946:2;39942:19;39935:44;39700:374;40045:12;40038:20;;;;;;;;;;;:::i;:::-;;;;;;;;39380:712;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:137::-;206:5;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;152:137;;;;:::o;295:139::-;341:5;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;295:139;;;;:::o;440:137::-;485:5;523:6;510:20;501:29;;539:32;565:5;539:32;:::i;:::-;440:137;;;;:::o;583:139::-;629:5;667:6;654:20;645:29;;683:33;710:5;683:33;:::i;:::-;583:139;;;;:::o;728:143::-;785:5;816:6;810:13;801:22;;832:33;859:5;832:33;:::i;:::-;728:143;;;;:::o;877:329::-;936:6;985:2;973:9;964:7;960:23;956:32;953:119;;;991:79;;:::i;:::-;953:119;1111:1;1136:53;1181:7;1172:6;1161:9;1157:22;1136:53;:::i;:::-;1126:63;;1082:117;877:329;;;;:::o;1212:619::-;1289:6;1297;1305;1354:2;1342:9;1333:7;1329:23;1325:32;1322:119;;;1360:79;;:::i;:::-;1322:119;1480:1;1505:53;1550:7;1541:6;1530:9;1526:22;1505:53;:::i;:::-;1495:63;;1451:117;1607:2;1633:53;1678:7;1669:6;1658:9;1654:22;1633:53;:::i;:::-;1623:63;;1578:118;1735:2;1761:53;1806:7;1797:6;1786:9;1782:22;1761:53;:::i;:::-;1751:63;;1706:118;1212:619;;;;;:::o;1837:474::-;1905:6;1913;1962:2;1950:9;1941:7;1937:23;1933:32;1930:119;;;1968:79;;:::i;:::-;1930:119;2088:1;2113:53;2158:7;2149:6;2138:9;2134:22;2113:53;:::i;:::-;2103:63;;2059:117;2215:2;2241:53;2286:7;2277:6;2266:9;2262:22;2241:53;:::i;:::-;2231:63;;2186:118;1837:474;;;;;:::o;2317:345::-;2384:6;2433:2;2421:9;2412:7;2408:23;2404:32;2401:119;;;2439:79;;:::i;:::-;2401:119;2559:1;2584:61;2637:7;2628:6;2617:9;2613:22;2584:61;:::i;:::-;2574:71;;2530:125;2317:345;;;;:::o;2668:329::-;2727:6;2776:2;2764:9;2755:7;2751:23;2747:32;2744:119;;;2782:79;;:::i;:::-;2744:119;2902:1;2927:53;2972:7;2963:6;2952:9;2948:22;2927:53;:::i;:::-;2917:63;;2873:117;2668:329;;;;:::o;3003:474::-;3071:6;3079;3128:2;3116:9;3107:7;3103:23;3099:32;3096:119;;;3134:79;;:::i;:::-;3096:119;3254:1;3279:53;3324:7;3315:6;3304:9;3300:22;3279:53;:::i;:::-;3269:63;;3225:117;3381:2;3407:53;3452:7;3443:6;3432:9;3428:22;3407:53;:::i;:::-;3397:63;;3352:118;3003:474;;;;;:::o;3483:::-;3551:6;3559;3608:2;3596:9;3587:7;3583:23;3579:32;3576:119;;;3614:79;;:::i;:::-;3576:119;3734:1;3759:53;3804:7;3795:6;3784:9;3780:22;3759:53;:::i;:::-;3749:63;;3705:117;3861:2;3887:53;3932:7;3923:6;3912:9;3908:22;3887:53;:::i;:::-;3877:63;;3832:118;3483:474;;;;;:::o;3963:327::-;4021:6;4070:2;4058:9;4049:7;4045:23;4041:32;4038:119;;;4076:79;;:::i;:::-;4038:119;4196:1;4221:52;4265:7;4256:6;4245:9;4241:22;4221:52;:::i;:::-;4211:62;;4167:116;3963:327;;;;:::o;4296:329::-;4355:6;4404:2;4392:9;4383:7;4379:23;4375:32;4372:119;;;4410:79;;:::i;:::-;4372:119;4530:1;4555:53;4600:7;4591:6;4580:9;4576:22;4555:53;:::i;:::-;4545:63;;4501:117;4296:329;;;;:::o;4631:351::-;4701:6;4750:2;4738:9;4729:7;4725:23;4721:32;4718:119;;;4756:79;;:::i;:::-;4718:119;4876:1;4901:64;4957:7;4948:6;4937:9;4933:22;4901:64;:::i;:::-;4891:74;;4847:128;4631:351;;;;:::o;4988:474::-;5056:6;5064;5113:2;5101:9;5092:7;5088:23;5084:32;5081:119;;;5119:79;;:::i;:::-;5081:119;5239:1;5264:53;5309:7;5300:6;5289:9;5285:22;5264:53;:::i;:::-;5254:63;;5210:117;5366:2;5392:53;5437:7;5428:6;5417:9;5413:22;5392:53;:::i;:::-;5382:63;;5337:118;4988:474;;;;;:::o;5468:267::-;5581:10;5602:90;5688:3;5680:6;5602:90;:::i;:::-;5724:4;5719:3;5715:14;5701:28;;5468:267;;;;:::o;5741:118::-;5828:24;5846:5;5828:24;:::i;:::-;5823:3;5816:37;5741:118;;:::o;5949:908::-;6112:3;6141:76;6211:5;6141:76;:::i;:::-;6233:108;6334:6;6329:3;6233:108;:::i;:::-;6226:115;;6365:78;6437:5;6365:78;:::i;:::-;6466:7;6497:1;6482:350;6507:6;6504:1;6501:13;6482:350;;;6583:6;6577:13;6610:107;6713:3;6698:13;6610:107;:::i;:::-;6603:114;;6740:82;6815:6;6740:82;:::i;:::-;6730:92;;6542:290;6529:1;6526;6522:9;6517:14;;6482:350;;;6486:14;6848:3;6841:10;;6117:740;;;5949:908;;;;:::o;6863:109::-;6944:21;6959:5;6944:21;:::i;:::-;6939:3;6932:34;6863:109;;:::o;6978:118::-;7065:24;7083:5;7065:24;:::i;:::-;7060:3;7053:37;6978:118;;:::o;7102:373::-;7206:3;7234:38;7266:5;7234:38;:::i;:::-;7288:88;7369:6;7364:3;7288:88;:::i;:::-;7281:95;;7385:52;7430:6;7425:3;7418:4;7411:5;7407:16;7385:52;:::i;:::-;7462:6;7457:3;7453:16;7446:23;;7210:265;7102:373;;;;:::o;7481:157::-;7576:55;7625:5;7576:55;:::i;:::-;7571:3;7564:68;7481:157;;:::o;7644:167::-;7749:55;7798:5;7749:55;:::i;:::-;7744:3;7737:68;7644:167;;:::o;7817:161::-;7919:52;7965:5;7919:52;:::i;:::-;7914:3;7907:65;7817:161;;:::o;7984:364::-;8072:3;8100:39;8133:5;8100:39;:::i;:::-;8155:71;8219:6;8214:3;8155:71;:::i;:::-;8148:78;;8235:52;8280:6;8275:3;8268:4;8261:5;8257:16;8235:52;:::i;:::-;8312:29;8334:6;8312:29;:::i;:::-;8307:3;8303:39;8296:46;;8076:272;7984:364;;;;:::o;8354:377::-;8460:3;8488:39;8521:5;8488:39;:::i;:::-;8543:89;8625:6;8620:3;8543:89;:::i;:::-;8536:96;;8641:52;8686:6;8681:3;8674:4;8667:5;8663:16;8641:52;:::i;:::-;8718:6;8713:3;8709:16;8702:23;;8464:267;8354:377;;;;:::o;8737:366::-;8879:3;8900:67;8964:2;8959:3;8900:67;:::i;:::-;8893:74;;8976:93;9065:3;8976:93;:::i;:::-;9094:2;9089:3;9085:12;9078:19;;8737:366;;;:::o;9109:::-;9251:3;9272:67;9336:2;9331:3;9272:67;:::i;:::-;9265:74;;9348:93;9437:3;9348:93;:::i;:::-;9466:2;9461:3;9457:12;9450:19;;9109:366;;;:::o;9481:::-;9623:3;9644:67;9708:2;9703:3;9644:67;:::i;:::-;9637:74;;9720:93;9809:3;9720:93;:::i;:::-;9838:2;9833:3;9829:12;9822:19;;9481:366;;;:::o;9853:::-;9995:3;10016:67;10080:2;10075:3;10016:67;:::i;:::-;10009:74;;10092:93;10181:3;10092:93;:::i;:::-;10210:2;10205:3;10201:12;10194:19;;9853:366;;;:::o;10225:::-;10367:3;10388:67;10452:2;10447:3;10388:67;:::i;:::-;10381:74;;10464:93;10553:3;10464:93;:::i;:::-;10582:2;10577:3;10573:12;10566:19;;10225:366;;;:::o;10597:::-;10739:3;10760:67;10824:2;10819:3;10760:67;:::i;:::-;10753:74;;10836:93;10925:3;10836:93;:::i;:::-;10954:2;10949:3;10945:12;10938:19;;10597:366;;;:::o;10969:::-;11111:3;11132:67;11196:2;11191:3;11132:67;:::i;:::-;11125:74;;11208:93;11297:3;11208:93;:::i;:::-;11326:2;11321:3;11317:12;11310:19;;10969:366;;;:::o;11341:::-;11483:3;11504:67;11568:2;11563:3;11504:67;:::i;:::-;11497:74;;11580:93;11669:3;11580:93;:::i;:::-;11698:2;11693:3;11689:12;11682:19;;11341:366;;;:::o;11713:::-;11855:3;11876:67;11940:2;11935:3;11876:67;:::i;:::-;11869:74;;11952:93;12041:3;11952:93;:::i;:::-;12070:2;12065:3;12061:12;12054:19;;11713:366;;;:::o;12085:::-;12227:3;12248:67;12312:2;12307:3;12248:67;:::i;:::-;12241:74;;12324:93;12413:3;12324:93;:::i;:::-;12442:2;12437:3;12433:12;12426:19;;12085:366;;;:::o;12457:::-;12599:3;12620:67;12684:2;12679:3;12620:67;:::i;:::-;12613:74;;12696:93;12785:3;12696:93;:::i;:::-;12814:2;12809:3;12805:12;12798:19;;12457:366;;;:::o;12829:402::-;12989:3;13010:85;13092:2;13087:3;13010:85;:::i;:::-;13003:92;;13104:93;13193:3;13104:93;:::i;:::-;13222:2;13217:3;13213:12;13206:19;;12829:402;;;:::o;13237:366::-;13379:3;13400:67;13464:2;13459:3;13400:67;:::i;:::-;13393:74;;13476:93;13565:3;13476:93;:::i;:::-;13594:2;13589:3;13585:12;13578:19;;13237:366;;;:::o;13609:::-;13751:3;13772:67;13836:2;13831:3;13772:67;:::i;:::-;13765:74;;13848:93;13937:3;13848:93;:::i;:::-;13966:2;13961:3;13957:12;13950:19;;13609:366;;;:::o;13981:402::-;14141:3;14162:85;14244:2;14239:3;14162:85;:::i;:::-;14155:92;;14256:93;14345:3;14256:93;:::i;:::-;14374:2;14369:3;14365:12;14358:19;;13981:402;;;:::o;14389:366::-;14531:3;14552:67;14616:2;14611:3;14552:67;:::i;:::-;14545:74;;14628:93;14717:3;14628:93;:::i;:::-;14746:2;14741:3;14737:12;14730:19;;14389:366;;;:::o;14841:519::-;14972:4;14967:3;14963:14;15067:4;15060:5;15056:16;15050:23;15086:81;15161:4;15156:3;15152:14;15138:12;15086:81;:::i;:::-;14987:190;15261:4;15254:5;15250:16;15244:23;15280:63;15337:4;15332:3;15328:14;15314:12;15280:63;:::i;:::-;15187:166;14941:419;14841:519;;:::o;15366:108::-;15443:24;15461:5;15443:24;:::i;:::-;15438:3;15431:37;15366:108;;:::o;15480:118::-;15567:24;15585:5;15567:24;:::i;:::-;15562:3;15555:37;15480:118;;:::o;15604:271::-;15734:3;15756:93;15845:3;15836:6;15756:93;:::i;:::-;15749:100;;15866:3;15859:10;;15604:271;;;;:::o;15881:967::-;16263:3;16285:148;16429:3;16285:148;:::i;:::-;16278:155;;16450:95;16541:3;16532:6;16450:95;:::i;:::-;16443:102;;16562:148;16706:3;16562:148;:::i;:::-;16555:155;;16727:95;16818:3;16809:6;16727:95;:::i;:::-;16720:102;;16839:3;16832:10;;15881:967;;;;;:::o;16854:222::-;16947:4;16985:2;16974:9;16970:18;16962:26;;16998:71;17066:1;17055:9;17051:17;17042:6;16998:71;:::i;:::-;16854:222;;;;:::o;17082:332::-;17203:4;17241:2;17230:9;17226:18;17218:26;;17254:71;17322:1;17311:9;17307:17;17298:6;17254:71;:::i;:::-;17335:72;17403:2;17392:9;17388:18;17379:6;17335:72;:::i;:::-;17082:332;;;;;:::o;17420:442::-;17569:4;17607:2;17596:9;17592:18;17584:26;;17620:71;17688:1;17677:9;17673:17;17664:6;17620:71;:::i;:::-;17701:72;17769:2;17758:9;17754:18;17745:6;17701:72;:::i;:::-;17783;17851:2;17840:9;17836:18;17827:6;17783:72;:::i;:::-;17420:442;;;;;;:::o;17868:332::-;17989:4;18027:2;18016:9;18012:18;18004:26;;18040:71;18108:1;18097:9;18093:17;18084:6;18040:71;:::i;:::-;18121:72;18189:2;18178:9;18174:18;18165:6;18121:72;:::i;:::-;17868:332;;;;;:::o;18206:461::-;18393:4;18431:2;18420:9;18416:18;18408:26;;18480:9;18474:4;18470:20;18466:1;18455:9;18451:17;18444:47;18508:152;18655:4;18646:6;18508:152;:::i;:::-;18500:160;;18206:461;;;;:::o;18673:210::-;18760:4;18798:2;18787:9;18783:18;18775:26;;18811:65;18873:1;18862:9;18858:17;18849:6;18811:65;:::i;:::-;18673:210;;;;:::o;18889:222::-;18982:4;19020:2;19009:9;19005:18;18997:26;;19033:71;19101:1;19090:9;19086:17;19077:6;19033:71;:::i;:::-;18889:222;;;;:::o;19117:368::-;19256:4;19294:2;19283:9;19279:18;19271:26;;19307:89;19393:1;19382:9;19378:17;19369:6;19307:89;:::i;:::-;19406:72;19474:2;19463:9;19459:18;19450:6;19406:72;:::i;:::-;19117:368;;;;;:::o;19491:252::-;19599:4;19637:2;19626:9;19622:18;19614:26;;19650:86;19733:1;19722:9;19718:17;19709:6;19650:86;:::i;:::-;19491:252;;;;:::o;19749:313::-;19862:4;19900:2;19889:9;19885:18;19877:26;;19949:9;19943:4;19939:20;19935:1;19924:9;19920:17;19913:47;19977:78;20050:4;20041:6;19977:78;:::i;:::-;19969:86;;19749:313;;;;:::o;20068:419::-;20234:4;20272:2;20261:9;20257:18;20249:26;;20321:9;20315:4;20311:20;20307:1;20296:9;20292:17;20285:47;20349:131;20475:4;20349:131;:::i;:::-;20341:139;;20068:419;;;:::o;20493:::-;20659:4;20697:2;20686:9;20682:18;20674:26;;20746:9;20740:4;20736:20;20732:1;20721:9;20717:17;20710:47;20774:131;20900:4;20774:131;:::i;:::-;20766:139;;20493:419;;;:::o;20918:::-;21084:4;21122:2;21111:9;21107:18;21099:26;;21171:9;21165:4;21161:20;21157:1;21146:9;21142:17;21135:47;21199:131;21325:4;21199:131;:::i;:::-;21191:139;;20918:419;;;:::o;21343:::-;21509:4;21547:2;21536:9;21532:18;21524:26;;21596:9;21590:4;21586:20;21582:1;21571:9;21567:17;21560:47;21624:131;21750:4;21624:131;:::i;:::-;21616:139;;21343:419;;;:::o;21768:::-;21934:4;21972:2;21961:9;21957:18;21949:26;;22021:9;22015:4;22011:20;22007:1;21996:9;21992:17;21985:47;22049:131;22175:4;22049:131;:::i;:::-;22041:139;;21768:419;;;:::o;22193:::-;22359:4;22397:2;22386:9;22382:18;22374:26;;22446:9;22440:4;22436:20;22432:1;22421:9;22417:17;22410:47;22474:131;22600:4;22474:131;:::i;:::-;22466:139;;22193:419;;;:::o;22618:::-;22784:4;22822:2;22811:9;22807:18;22799:26;;22871:9;22865:4;22861:20;22857:1;22846:9;22842:17;22835:47;22899:131;23025:4;22899:131;:::i;:::-;22891:139;;22618:419;;;:::o;23043:::-;23209:4;23247:2;23236:9;23232:18;23224:26;;23296:9;23290:4;23286:20;23282:1;23271:9;23267:17;23260:47;23324:131;23450:4;23324:131;:::i;:::-;23316:139;;23043:419;;;:::o;23468:::-;23634:4;23672:2;23661:9;23657:18;23649:26;;23721:9;23715:4;23711:20;23707:1;23696:9;23692:17;23685:47;23749:131;23875:4;23749:131;:::i;:::-;23741:139;;23468:419;;;:::o;23893:::-;24059:4;24097:2;24086:9;24082:18;24074:26;;24146:9;24140:4;24136:20;24132:1;24121:9;24117:17;24110:47;24174:131;24300:4;24174:131;:::i;:::-;24166:139;;23893:419;;;:::o;24318:::-;24484:4;24522:2;24511:9;24507:18;24499:26;;24571:9;24565:4;24561:20;24557:1;24546:9;24542:17;24535:47;24599:131;24725:4;24599:131;:::i;:::-;24591:139;;24318:419;;;:::o;24743:::-;24909:4;24947:2;24936:9;24932:18;24924:26;;24996:9;24990:4;24986:20;24982:1;24971:9;24967:17;24960:47;25024:131;25150:4;25024:131;:::i;:::-;25016:139;;24743:419;;;:::o;25168:::-;25334:4;25372:2;25361:9;25357:18;25349:26;;25421:9;25415:4;25411:20;25407:1;25396:9;25392:17;25385:47;25449:131;25575:4;25449:131;:::i;:::-;25441:139;;25168:419;;;:::o;25593:::-;25759:4;25797:2;25786:9;25782:18;25774:26;;25846:9;25840:4;25836:20;25832:1;25821:9;25817:17;25810:47;25874:131;26000:4;25874:131;:::i;:::-;25866:139;;25593:419;;;:::o;26018:222::-;26111:4;26149:2;26138:9;26134:18;26126:26;;26162:71;26230:1;26219:9;26215:17;26206:6;26162:71;:::i;:::-;26018:222;;;;:::o;26327:154::-;26416:4;26439:3;26431:11;;26469:4;26464:3;26460:14;26452:22;;26327:154;;;:::o;26487:136::-;26576:6;26610:5;26604:12;26594:22;;26487:136;;;:::o;26629:98::-;26680:6;26714:5;26708:12;26698:22;;26629:98;;;:::o;26733:99::-;26785:6;26819:5;26813:12;26803:22;;26733:99;;;:::o;26838:135::-;26930:4;26962;26957:3;26953:14;26945:22;;26838:135;;;:::o;26979:206::-;27100:11;27134:6;27129:3;27122:19;27174:4;27169:3;27165:14;27150:29;;26979:206;;;;:::o;27191:147::-;27292:11;27329:3;27314:18;;27191:147;;;;:::o;27344:169::-;27428:11;27462:6;27457:3;27450:19;27502:4;27497:3;27493:14;27478:29;;27344:169;;;;:::o;27519:148::-;27621:11;27658:3;27643:18;;27519:148;;;;:::o;27673:305::-;27713:3;27732:20;27750:1;27732:20;:::i;:::-;27727:25;;27766:20;27784:1;27766:20;:::i;:::-;27761:25;;27920:1;27852:66;27848:74;27845:1;27842:81;27839:107;;;27926:18;;:::i;:::-;27839:107;27970:1;27967;27963:9;27956:16;;27673:305;;;;:::o;27984:185::-;28024:1;28041:20;28059:1;28041:20;:::i;:::-;28036:25;;28075:20;28093:1;28075:20;:::i;:::-;28070:25;;28114:1;28104:35;;28119:18;;:::i;:::-;28104:35;28161:1;28158;28154:9;28149:14;;27984:185;;;;:::o;28175:348::-;28215:7;28238:20;28256:1;28238:20;:::i;:::-;28233:25;;28272:20;28290:1;28272:20;:::i;:::-;28267:25;;28460:1;28392:66;28388:74;28385:1;28382:81;28377:1;28370:9;28363:17;28359:105;28356:131;;;28467:18;;:::i;:::-;28356:131;28515:1;28512;28508:9;28497:20;;28175:348;;;;:::o;28529:191::-;28569:4;28589:20;28607:1;28589:20;:::i;:::-;28584:25;;28623:20;28641:1;28623:20;:::i;:::-;28618:25;;28662:1;28659;28656:8;28653:34;;;28667:18;;:::i;:::-;28653:34;28712:1;28709;28705:9;28697:17;;28529:191;;;;:::o;28726:96::-;28763:7;28792:24;28810:5;28792:24;:::i;:::-;28781:35;;28726:96;;;:::o;28828:90::-;28862:7;28905:5;28898:13;28891:21;28880:32;;28828:90;;;:::o;28924:77::-;28961:7;28990:5;28979:16;;28924:77;;;:::o;29007:149::-;29043:7;29083:66;29076:5;29072:78;29061:89;;29007:149;;;:::o;29162:126::-;29199:7;29239:42;29232:5;29228:54;29217:65;;29162:126;;;:::o;29294:77::-;29331:7;29360:5;29349:16;;29294:77;;;:::o;29377:144::-;29445:9;29478:37;29509:5;29478:37;:::i;:::-;29465:50;;29377:144;;;:::o;29527:141::-;29592:9;29625:37;29656:5;29625:37;:::i;:::-;29612:50;;29527:141;;;:::o;29674:126::-;29724:9;29757:37;29788:5;29757:37;:::i;:::-;29744:50;;29674:126;;;:::o;29806:113::-;29856:9;29889:24;29907:5;29889:24;:::i;:::-;29876:37;;29806:113;;;:::o;29925:307::-;29993:1;30003:113;30017:6;30014:1;30011:13;30003:113;;;30102:1;30097:3;30093:11;30087:18;30083:1;30078:3;30074:11;30067:39;30039:2;30036:1;30032:10;30027:15;;30003:113;;;30134:6;30131:1;30128:13;30125:101;;;30214:1;30205:6;30200:3;30196:16;30189:27;30125:101;29974:258;29925:307;;;:::o;30238:171::-;30277:3;30300:24;30318:5;30300:24;:::i;:::-;30291:33;;30346:4;30339:5;30336:15;30333:41;;;30354:18;;:::i;:::-;30333:41;30401:1;30394:5;30390:13;30383:20;;30238:171;;;:::o;30415:233::-;30454:3;30477:24;30495:5;30477:24;:::i;:::-;30468:33;;30523:66;30516:5;30513:77;30510:103;;;30593:18;;:::i;:::-;30510:103;30640:1;30633:5;30629:13;30622:20;;30415:233;;;:::o;30654:180::-;30702:77;30699:1;30692:88;30799:4;30796:1;30789:15;30823:4;30820:1;30813:15;30840:180;30888:77;30885:1;30878:88;30985:4;30982:1;30975:15;31009:4;31006:1;30999:15;31026:180;31074:77;31071:1;31064:88;31171:4;31168:1;31161:15;31195:4;31192:1;31185:15;31212:180;31260:77;31257:1;31250:88;31357:4;31354:1;31347:15;31381:4;31378:1;31371:15;31398:180;31446:77;31443:1;31436:88;31543:4;31540:1;31533:15;31567:4;31564:1;31557:15;31707:117;31816:1;31813;31806:12;31830:102;31871:6;31922:2;31918:7;31913:2;31906:5;31902:14;31898:28;31888:38;;31830:102;;;:::o;31938:182::-;32078:34;32074:1;32066:6;32062:14;32055:58;31938:182;:::o;32126:243::-;32266:34;32262:1;32254:6;32250:14;32243:58;32335:26;32330:2;32322:6;32318:15;32311:51;32126:243;:::o;32375:250::-;32515:34;32511:1;32503:6;32499:14;32492:58;32584:33;32579:2;32571:6;32567:15;32560:58;32375:250;:::o;32631:225::-;32771:34;32767:1;32759:6;32755:14;32748:58;32840:8;32835:2;32827:6;32823:15;32816:33;32631:225;:::o;32862:231::-;33002:34;32998:1;32990:6;32986:14;32979:58;33071:14;33066:2;33058:6;33054:15;33047:39;32862:231;:::o;33099:244::-;33239:34;33235:1;33227:6;33223:14;33216:58;33308:27;33303:2;33295:6;33291:15;33284:52;33099:244;:::o;33349:236::-;33489:34;33485:1;33477:6;33473:14;33466:58;33558:19;33553:2;33545:6;33541:15;33534:44;33349:236;:::o;33591:237::-;33731:34;33727:1;33719:6;33715:14;33708:58;33800:20;33795:2;33787:6;33783:15;33776:45;33591:237;:::o;33834:241::-;33974:34;33970:1;33962:6;33958:14;33951:58;34043:24;34038:2;34030:6;34026:15;34019:49;33834:241;:::o;34081:179::-;34221:31;34217:1;34209:6;34205:14;34198:55;34081:179;:::o;34266:246::-;34406:34;34402:1;34394:6;34390:14;34383:58;34475:29;34470:2;34462:6;34458:15;34451:54;34266:246;:::o;34518:173::-;34658:25;34654:1;34646:6;34642:14;34635:49;34518:173;:::o;34697:229::-;34837:34;34833:1;34825:6;34821:14;34814:58;34906:12;34901:2;34893:6;34889:15;34882:37;34697:229;:::o;34932:241::-;35072:34;35068:1;35060:6;35056:14;35049:58;35141:24;35136:2;35128:6;35124:15;35117:49;34932:241;:::o;35179:167::-;35319:19;35315:1;35307:6;35303:14;35296:43;35179:167;:::o;35352:234::-;35492:34;35488:1;35480:6;35476:14;35469:58;35561:17;35556:2;35548:6;35544:15;35537:42;35352:234;:::o;35592:122::-;35665:24;35683:5;35665:24;:::i;:::-;35658:5;35655:35;35645:63;;35704:1;35701;35694:12;35645:63;35592:122;:::o;35720:116::-;35790:21;35805:5;35790:21;:::i;:::-;35783:5;35780:32;35770:60;;35826:1;35823;35816:12;35770:60;35720:116;:::o;35842:122::-;35915:24;35933:5;35915:24;:::i;:::-;35908:5;35905:35;35895:63;;35954:1;35951;35944:12;35895:63;35842:122;:::o;35970:120::-;36042:23;36059:5;36042:23;:::i;:::-;36035:5;36032:34;36022:62;;36080:1;36077;36070:12;36022:62;35970:120;:::o;36096:122::-;36169:24;36187:5;36169:24;:::i;:::-;36162:5;36159:35;36149:63;;36208:1;36205;36198:12;36149:63;36096:122;:::o
Swarm Source
ipfs://1d477c665c085341ec6e40c80e4dce13d9aef011fc3a5c9b1193cb26944b6219
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.