Source Code
Latest 25 from a total of 116 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Un Stake | 1924092 | 1224 days ago | IN | 0 GLMR | 0.00633735 | ||||
| Un Stake | 1924071 | 1224 days ago | IN | 0 GLMR | 0.0078058 | ||||
| Un Stake | 1924064 | 1224 days ago | IN | 0 GLMR | 0.00792288 | ||||
| Create Process | 1923932 | 1224 days ago | IN | 0 GLMR | 0.00718549 | ||||
| Validate Termina... | 1922790 | 1225 days ago | IN | 0 GLMR | 0.01396538 | ||||
| Validate Termina... | 1922789 | 1225 days ago | IN | 0 GLMR | 0.00807653 | ||||
| Validate Termina... | 1922787 | 1225 days ago | IN | 0 GLMR | 0.00882497 | ||||
| Validate Termina... | 1922785 | 1225 days ago | IN | 0 GLMR | 0.00578809 | ||||
| Validate Termina... | 1922783 | 1225 days ago | IN | 0 GLMR | 0.01107964 | ||||
| Validate Termina... | 1922779 | 1225 days ago | IN | 0 GLMR | 0.01111506 | ||||
| Start Terminatio... | 1922777 | 1225 days ago | IN | 0 GLMR | 0.00989483 | ||||
| Declare Action | 1922766 | 1225 days ago | IN | 0 GLMR | 0.00333362 | ||||
| Declare Action | 1922765 | 1225 days ago | IN | 0 GLMR | 0.00343643 | ||||
| Transfer | 1922731 | 1225 days ago | IN | 10 GLMR | 0.00487707 | ||||
| Set Process Cost | 1922716 | 1225 days ago | IN | 0 GLMR | 0.01902417 | ||||
| Set Process Cost | 1922714 | 1225 days ago | IN | 0 GLMR | 0.01563892 | ||||
| Create Process | 1922712 | 1225 days ago | IN | 0 GLMR | 0.03531927 | ||||
| Set Process Cost | 1902596 | 1228 days ago | IN | 0 GLMR | 0.01899876 | ||||
| Set Process Cost | 1902594 | 1228 days ago | IN | 0 GLMR | 0.01552276 | ||||
| Create Process | 1902592 | 1228 days ago | IN | 0 GLMR | 0.03942351 | ||||
| Validate Termina... | 1882245 | 1230 days ago | IN | 0 GLMR | 0.01436105 | ||||
| Validate Termina... | 1882243 | 1230 days ago | IN | 0 GLMR | 0.00877415 | ||||
| Start Terminatio... | 1882241 | 1230 days ago | IN | 0 GLMR | 0.01023362 | ||||
| Declare Action | 1882230 | 1230 days ago | IN | 0 GLMR | 0.00333362 | ||||
| Declare Action | 1882228 | 1230 days ago | IN | 0 GLMR | 0.00343367 |
Latest 24 internal transactions
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 1922790 | 1225 days ago | 0.017 GLMR | ||||
| 1922790 | 1225 days ago | 0.0018 GLMR | ||||
| 1922790 | 1225 days ago | 0.0012 GLMR | ||||
| 1922731 | 1225 days ago | 9.98 GLMR | ||||
| 1882245 | 1230 days ago | 0.0784 GLMR | ||||
| 1882245 | 1230 days ago | 0.011025 GLMR | ||||
| 1882245 | 1230 days ago | 0.003675 GLMR | ||||
| 1882191 | 1230 days ago | 48.902 GLMR | ||||
| 1880762 | 1231 days ago | 0.048 GLMR | ||||
| 1880762 | 1231 days ago | 0.0054 GLMR | ||||
| 1880762 | 1231 days ago | 0.0036 GLMR | ||||
| 1880692 | 1231 days ago | 29.94 GLMR | ||||
| 1880415 | 1231 days ago | 0.016 GLMR | ||||
| 1880415 | 1231 days ago | 0.0012 GLMR | ||||
| 1880415 | 1231 days ago | 0.0018 GLMR | ||||
| 1880360 | 1231 days ago | 9.98 GLMR | ||||
| 1880272 | 1231 days ago | 0.048 GLMR | ||||
| 1880272 | 1231 days ago | 0.00675 GLMR | ||||
| 1880272 | 1231 days ago | 0.00225 GLMR | ||||
| 1880216 | 1231 days ago | 29.94 GLMR | ||||
| 1879985 | 1231 days ago | 24.95 GLMR | ||||
| 1879534 | 1231 days ago | 0.998 GLMR | ||||
| 1879372 | 1231 days ago | 29.94 GLMR | ||||
| 1824333 | 1239 days ago | 29.94 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
YandaExtendedProtocolV2
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-09-06 */ // Sources flattened with hardhat v2.10.2 https://hardhat.org // File @openzeppelin/contracts/access/[email protected] // 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/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // 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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // 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/[email protected] // 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/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(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 virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File contracts/YandaExtendedProtocolV2.sol // SPDX-License-Identifier: GNU GPLv3 pragma solidity ^0.8.3; contract YandaExtendedProtocolV2 is AccessControl{ using SafeMath for uint256; uint internal TIME_FRAME_SIZE; uint internal VALIDATORS_PERC; uint internal BROKER_PERC; uint internal FEE_NOMINATOR; uint internal FEE_DENOMINATOR; uint internal _penaltyPerc; uint internal _lockingPeriod; uint256 internal _totalStaked; IERC20 internal _tokenContract; enum State { AWAITING_COST, AWAITING_TRANSFER, AWAITING_TERMINATION, AWAITING_VALIDATION, COMPLETED } struct Process { State state; uint256 cost; uint256 costConf; address payable deposit; address payable depositConf; uint256 fee; address service; bytes32 productId; string productData; uint256 startBlock; address[] validatorsList; address firstValidator; bool firstResult; address secondValidator; bool secondResult; } struct Service { address[] validators; uint validationPerc; uint commissionPerc; uint validatorVersion; } struct Stake { uint256 amount; uint256 unlockingBlock; } mapping(address => mapping(bytes32 => Process)) internal _processes; mapping(address => bytes32) internal _depositingProducts; mapping(address => Service) internal _services; mapping(address => uint256) internal _stakesByValidators; mapping(address => address[]) internal _validatorStakers; mapping(address => mapping(address => Stake)) internal _stakes; event Deposit( address indexed customer, address indexed service, bytes32 indexed productId, uint256 weiAmount ); event Action( address indexed customer, address indexed service, bytes32 indexed productId, string data ); event Terminate( address indexed customer, address indexed service, bytes32 indexed productId, address[] validatorsList ); event Complete( address indexed customer, address indexed service, bytes32 indexed productId, bool success ); event CostRequest( address indexed customer, address indexed service, bytes32 indexed productId, address[] validatorsList, string data ); event CostResponse( address indexed customer, address indexed service, bytes32 indexed productId, uint cost ); event Staked( address indexed staker, address indexed validator, uint256 amount, uint256 unlockingBlock ); event UnStaked( address indexed staker, address indexed validator, uint256 amount ); modifier onlyService() { require(_services[msg.sender].validators.length > 0, "Only service can call this method"); _; } constructor(uint penaltyPerc, uint lockingPeriod, address token) { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _penaltyPerc = penaltyPerc; _lockingPeriod = lockingPeriod; _tokenContract = IERC20(token); VALIDATORS_PERC = 15; BROKER_PERC = 80; FEE_NOMINATOR = 2; FEE_DENOMINATOR = 1000; TIME_FRAME_SIZE = 4; } function _containsAddress(address[] memory array, address search) internal pure returns(bool) { for(uint x=0; x < array.length; x++) { if (array[x] == search) { return true; } } return false; } function setDefaultPerc(uint vPerc, uint bPerc) external onlyRole(DEFAULT_ADMIN_ROLE) { VALIDATORS_PERC = vPerc; BROKER_PERC = bPerc; } function setProtocolFee(uint nominator, uint denominator) external onlyRole(DEFAULT_ADMIN_ROLE) { FEE_NOMINATOR = nominator; FEE_DENOMINATOR = denominator; } function setValidationTimeFrame(uint blocks) external onlyRole(DEFAULT_ADMIN_ROLE) { TIME_FRAME_SIZE = blocks; } function getValidationTimeFrame() external view returns(uint) { return TIME_FRAME_SIZE; } function getStakingTokenAddr() external view returns(address) { return address(_tokenContract); } receive() external payable { address sender = _msgSender(); Process storage process = _processes[sender][_depositingProducts[sender]]; require(process.state == State.AWAITING_TRANSFER, "You don't have a deposit awaiting process, please create it first"); require(process.cost == msg.value, "Deposit amount doesn't match with the requested deposit"); // Transfer main payment from customer to the broker(subtracting the fee) process.deposit.transfer(msg.value.sub(process.fee)); // Update process state and emit an event process.state = State.AWAITING_TERMINATION; emit Deposit(sender, process.service, process.productId, msg.value); } function addService(address service, address[] memory vList) external onlyRole(DEFAULT_ADMIN_ROLE) { require(vList.length > 2, "Validators minimum quantity is 3"); _services[service] = Service({validators: vList, validationPerc: VALIDATORS_PERC, commissionPerc: BROKER_PERC, validatorVersion: 1}); } function setServicePerc(address service, uint vPerc, uint bPerc) external onlyRole(DEFAULT_ADMIN_ROLE) { Service storage instance = _services[service]; instance.validationPerc = vPerc; instance.commissionPerc = bPerc; } function setValidators(address[] memory vList) external onlyService { _services[msg.sender].validators = vList; } function getValidatorVer(address service) external view returns(uint) { return _services[service].validatorVersion; } function setValidatorVer(uint vVer) external onlyService { _services[msg.sender].validatorVersion = vVer; } function getPenaltyPerc() external view returns(uint) { return _penaltyPerc; } function setPenaltyPerc(uint newPenaltyPerc) external onlyRole(DEFAULT_ADMIN_ROLE) { _penaltyPerc = newPenaltyPerc; } function getLockingPeriod() external view returns(uint256) { return _lockingPeriod; } function setLockingPeriod(uint256 newLockingPeriod) external onlyRole(DEFAULT_ADMIN_ROLE) { _lockingPeriod = newLockingPeriod; } function inTimeFrame(address[] memory list, address search, uint256 startBlock, uint intSize) internal view returns(bool) { for(uint x=0; x < list.length; x++) { if(list[x] == search) { return ( (x * intSize) <= (block.number - startBlock) && (block.number - startBlock) < (x * intSize + intSize) ); } } return false; } function random() internal view returns(uint256) { // Temp solution with fake random // TODO resolve with real randomness return uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp))); } function _randValidatorsList(address service, address exclude1, address exclude2) internal view returns(address[] memory) { uint256 localTotalStaked = _totalStaked - _stakesByValidators[exclude1] - _stakesByValidators[exclude2]; uint256 index = 0; uint resultLength = _services[service].validators.length; if (exclude1 != address(0)) { resultLength -= 1; } if (exclude2 != address(0)) { resultLength -= 1; } address[] memory result = new address[](resultLength); for(uint x=0; x < result.length; x++) { index = random() % localTotalStaked; for(uint y=0; y < _services[service].validators.length; y++) { if (_services[service].validators[y] != exclude1 && _services[service].validators[y] != exclude2) { if (_containsAddress(result, _services[service].validators[y]) == false) { if (index <= _stakesByValidators[_services[service].validators[y]]) { result[x] = _services[service].validators[y]; localTotalStaked -= _stakesByValidators[_services[service].validators[y]]; break; } index -= _stakesByValidators[_services[service].validators[y]]; } } } } return result; } function createProcess(address service, bytes32 productId, string memory data) public { require(_services[service].validationPerc > 0, 'Requested service address not found'); require(_processes[msg.sender][productId].service == address(0), 'Process with specified productId already exist'); _processes[msg.sender][productId] = Process({state: State.AWAITING_COST,cost: 0,costConf: 0, deposit: payable(address(0)), depositConf: payable(address(0)), fee: 0,service: service,productId: productId,productData: data,startBlock: block.number,validatorsList: _randValidatorsList(service, address(0), address(0)),firstValidator: address(0),firstResult: false,secondValidator: address(0),secondResult: false}); emit CostRequest(msg.sender, service, productId, _processes[msg.sender][productId].validatorsList, data); if(_depositingProducts[msg.sender].length > 0) { if(_processes[msg.sender][_depositingProducts[msg.sender]].state == State.AWAITING_TRANSFER) { delete _processes[msg.sender][_depositingProducts[msg.sender]]; } } _depositingProducts[msg.sender] = productId; } function _rewardLoop(address validator, uint256 reward) internal returns(uint256) { uint256 transfersSum = 0; for (uint256 i = 0; i < _validatorStakers[validator].length; i++) { address staker = _validatorStakers[validator][i]; // Calc reward share according to the staked amount uint256 transferAmount = reward.mul(_stakes[staker][validator].amount.mul(100).div(_stakesByValidators[validator])).div(100); // Transfer reward to the staker payable(staker).transfer(transferAmount); transfersSum += transferAmount; } return transfersSum; } function _bonusLoop(address validator, uint256 bonus) internal returns(uint256) { uint256 transfersSum = 0; for (uint256 i = 0; i < _validatorStakers[validator].length; i++) { address staker = _validatorStakers[validator][i]; // Calc bonus share according to the staked amount uint256 transferAmount = bonus.mul(_stakes[staker][validator].amount.mul(100).div(_stakesByValidators[validator])).div(100); // Increase stake with bonus _stakes[staker][validator].amount = _stakes[staker][validator].amount.add(transferAmount); transfersSum += transferAmount; } return transfersSum; } function _rewardStakers(address firstValidator, address secondValidator, uint256 rewardAmount) internal returns(uint256) { uint256 firstReward = rewardAmount.mul(_stakesByValidators[firstValidator].mul(100).div(_stakesByValidators[firstValidator].add(_stakesByValidators[secondValidator]))).div(100); uint256 secondReward = rewardAmount - firstReward; uint256 firstRewardTsSum = _rewardLoop(firstValidator, firstReward); uint256 secondRewardTsSum = _rewardLoop(secondValidator, secondReward); return firstRewardTsSum + secondRewardTsSum; } function _rewardBonus(address firstValidator, address secondValidator, uint256 bonus) internal { uint256 firstBonus = bonus.mul(_stakesByValidators[firstValidator].mul(100).div(_stakesByValidators[firstValidator].add(_stakesByValidators[secondValidator]))).div(100); uint256 secondBonus = bonus - firstBonus; uint256 firstBonusTsSum = _bonusLoop(firstValidator, firstBonus); uint256 secondBonusTsSum = _bonusLoop(secondValidator, secondBonus); _stakesByValidators[firstValidator] += firstBonusTsSum; _stakesByValidators[secondValidator] += secondBonusTsSum; } function _makePayouts(address customer, bytes32 productId, bool needRefund, uint256 bonus) internal { Process storage process = _processes[customer][productId]; uint256 reward_amount = process.fee.mul(_services[process.service].validationPerc).div(100); uint256 transfers_sum = _rewardStakers(process.firstValidator, process.secondValidator, reward_amount); if(bonus > 0) { _rewardBonus(process.firstValidator, process.secondValidator, bonus); } if(needRefund == false) { uint256 commission_amount = process.fee.mul(_services[process.service].commissionPerc).div(100); payable(process.service).transfer(commission_amount); } else { payable(customer).transfer(process.fee - transfers_sum); } } function _penalizeLoop(address validator, uint256 penalty) internal returns(uint256) { uint256 transfersSum = 0; for (uint256 i = 0; i < _validatorStakers[validator].length; i++) { address staker = _validatorStakers[validator][i]; uint256 transferAmount = penalty.mul(_stakes[staker][validator].amount.mul(100).div(_stakesByValidators[validator])).div(100); _stakes[staker][validator].amount = _stakes[staker][validator].amount - transferAmount; transfersSum += transferAmount; } return transfersSum; } function setProcessCost(address customer, bytes32 productId, uint256 cost, address payable deposit) external { require(_stakesByValidators[msg.sender] > 0, "Only validator with stakes can call this method"); Process storage process = _processes[customer][productId]; require(_containsAddress(_services[process.service].validators, msg.sender), "Your address is not whitelisted in the product service settings"); require(process.state == State.AWAITING_COST, "Cost is already set, check the state"); require( inTimeFrame( process.validatorsList, msg.sender, process.startBlock, TIME_FRAME_SIZE ), "Cannot accept validation, you are out of time" ); if(process.firstValidator == address(0)) { process.firstValidator = msg.sender; process.cost = cost; process.deposit = deposit; process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, process.firstValidator, address(0)); emit CostRequest(customer, process.service, productId, process.validatorsList, process.productData); } else if(process.secondValidator == address(0)) { process.secondValidator = msg.sender; process.costConf = cost; process.depositConf = deposit; if(process.cost == process.costConf && process.deposit == process.depositConf) { process.fee = cost.mul(FEE_NOMINATOR).div(FEE_DENOMINATOR); process.state = State.AWAITING_TRANSFER; emit CostResponse(customer, process.service, productId, cost); } else { process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, process.firstValidator, process.secondValidator); emit CostRequest(customer, process.service, productId, process.validatorsList, process.productData); } } else { if(process.cost == cost && process.deposit == deposit) { process.secondValidator = msg.sender; process.costConf = cost; process.depositConf = deposit; } else { process.firstValidator = msg.sender; process.cost = cost; process.deposit = deposit; } process.cost = cost; process.fee = cost.mul(FEE_NOMINATOR).div(FEE_DENOMINATOR); process.state = State.AWAITING_TRANSFER; emit CostResponse(customer, process.service, productId, cost); } } function declareAction(address customer, bytes32 productId, string calldata data) external onlyService { emit Action(customer, msg.sender, productId, data); } function startTermination(address customer, bytes32 productId) external { require((_services[msg.sender].validationPerc > 0) || (msg.sender == customer), "Only service or product customer can call this method"); Process storage process = _processes[customer][productId]; require(process.state == State.AWAITING_TERMINATION, "Cannot start termination, check the state"); process.state = State.AWAITING_VALIDATION; process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, address(0), address(0)); process.firstValidator = address(0); process.firstResult = false; process.secondValidator = address(0); process.secondResult = false; emit Terminate(customer, msg.sender, productId, process.validatorsList); } function validateTermination(address customer, bytes32 productId, bool result) external { require(_stakesByValidators[msg.sender] > 0, "Only validator with stakes can call this method"); Process storage process = _processes[customer][productId]; require(_containsAddress(_services[process.service].validators, msg.sender), "Your address is not whitelisted in the product service settings"); require(process.state == State.AWAITING_VALIDATION, "Cannot accept validation, check the state"); require( inTimeFrame( process.validatorsList, msg.sender, process.startBlock, TIME_FRAME_SIZE ), "Cannot accept validation, you are out of time" ); if(process.firstValidator == address(0)) { process.firstValidator = msg.sender; process.firstResult = result; process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, process.firstValidator, address(0)); emit Terminate(customer, process.service, productId, process.validatorsList); } else if(process.secondValidator == address(0)) { process.secondValidator = msg.sender; process.secondResult = result; if(process.firstResult == process.secondResult) { _makePayouts(customer, productId, !process.firstResult, 0); process.state = State.COMPLETED; emit Complete(customer, process.service, productId, process.firstResult); } else { process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, process.firstValidator, process.secondValidator); emit Terminate(customer, process.service, productId, process.validatorsList); } } else { if(process.firstResult == result) { uint256 penalty = _stakesByValidators[process.secondValidator].mul(_penaltyPerc).div(100); uint256 appliedPenalty = _penalizeLoop(process.secondValidator, penalty); process.secondValidator = msg.sender; process.secondResult = result; _makePayouts(customer, productId, !process.firstResult, appliedPenalty); } else { uint256 penalty = _stakesByValidators[process.firstValidator].mul(_penaltyPerc).div(100); uint256 appliedPenalty = _penalizeLoop(process.firstValidator, penalty); process.firstValidator = msg.sender; process.firstResult = result; _makePayouts(customer, productId, !process.firstResult, appliedPenalty); } process.state = State.COMPLETED; emit Complete(customer, process.service, productId, process.firstResult); } } function getProcess(address customer, bytes32 productId) external view returns(Process memory) { return _processes[customer][productId]; } function stake(address validator, uint256 amount) external { require(validator != address(0), "Validator address cannot be 0"); require(amount > 0, "Cannot stake 0"); bool success = _tokenContract.transferFrom(msg.sender, address(this), amount); if(success) { _totalStaked = _totalStaked.add(amount); bool alreadyStaked = false; if (_stakes[msg.sender][validator].amount > 0) { alreadyStaked = true; } _stakes[msg.sender][validator].amount = _stakes[msg.sender][validator].amount.add(amount); _stakes[msg.sender][validator].unlockingBlock = block.number + _lockingPeriod; _stakesByValidators[validator] = _stakesByValidators[validator].add(amount); if (alreadyStaked == false && _containsAddress(_validatorStakers[validator], msg.sender) == false) { _validatorStakers[validator].push(msg.sender); } emit Staked(msg.sender, validator, amount, _stakes[msg.sender][validator].unlockingBlock); } else { revert("Wasn't able to transfer your token"); } } function unStake(address validator, uint256 amount) external { require(amount > 0, "Cannot unstake 0"); require(_stakes[msg.sender][validator].amount >= amount, "Your balance is lower than the amount of tokens you want to unstake"); // Check locking period require(_stakes[msg.sender][validator].unlockingBlock <= block.number, "The locking period didn't pass, you cannot unstake"); // This will transfer the amount of token from contract to the sender balance bool success = _tokenContract.transfer(msg.sender, amount); if(success) { _totalStaked -= amount; _stakes[msg.sender][validator].amount = _stakes[msg.sender][validator].amount - amount; _stakesByValidators[validator] = _stakesByValidators[validator] - amount; emit UnStaked(msg.sender, validator, amount); } else { revert("Wasn't able to execute transfer of your tokens"); } } function stakeOf(address staker, address validator) external view returns (Stake memory) { return _stakes[staker][validator]; } function totalStaked() external view returns (uint256) { return _totalStaked; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"penaltyPerc","type":"uint256"},{"internalType":"uint256","name":"lockingPeriod","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"data","type":"string"}],"name":"Action","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"Complete","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address[]","name":"validatorsList","type":"address[]"},{"indexed":false,"internalType":"string","name":"data","type":"string"}],"name":"CostRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"}],"name":"CostResponse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"Deposit","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":"staker","type":"address"},{"indexed":true,"internalType":"address","name":"validator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockingBlock","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address[]","name":"validatorsList","type":"address[]"}],"name":"Terminate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"address","name":"validator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnStaked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"address[]","name":"vList","type":"address[]"}],"name":"addService","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"string","name":"data","type":"string"}],"name":"createProcess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"string","name":"data","type":"string"}],"name":"declareAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLockingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"}],"name":"getProcess","outputs":[{"components":[{"internalType":"enum YandaExtendedProtocolV2.State","name":"state","type":"uint8"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"costConf","type":"uint256"},{"internalType":"address payable","name":"deposit","type":"address"},{"internalType":"address payable","name":"depositConf","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"service","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"string","name":"productData","type":"string"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"address[]","name":"validatorsList","type":"address[]"},{"internalType":"address","name":"firstValidator","type":"address"},{"internalType":"bool","name":"firstResult","type":"bool"},{"internalType":"address","name":"secondValidator","type":"address"},{"internalType":"bool","name":"secondResult","type":"bool"}],"internalType":"struct YandaExtendedProtocolV2.Process","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingTokenAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getValidationTimeFrame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"}],"name":"getValidatorVer","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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vPerc","type":"uint256"},{"internalType":"uint256","name":"bPerc","type":"uint256"}],"name":"setDefaultPerc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLockingPeriod","type":"uint256"}],"name":"setLockingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"setPenaltyPerc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"address payable","name":"deposit","type":"address"}],"name":"setProcessCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nominator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"vPerc","type":"uint256"},{"internalType":"uint256","name":"bPerc","type":"uint256"}],"name":"setServicePerc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"setValidationTimeFrame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vVer","type":"uint256"}],"name":"setValidatorVer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"vList","type":"address[]"}],"name":"setValidators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"validator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"validator","type":"address"}],"name":"stakeOf","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockingBlock","type":"uint256"}],"internalType":"struct YandaExtendedProtocolV2.Stake","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"}],"name":"startTermination","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":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"validator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"bool","name":"result","type":"bool"}],"name":"validateTermination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620046ca380380620046ca83398101604081905262000034916200012a565b6200004160003362000089565b600692909255600755600980546001600160a01b0319166001600160a01b03909216919091179055600f6002908155605060035560049081556103e860055560015562000170565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000126576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620000e53390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000806000606084860312156200013f578283fd5b83516020850151604086015191945092506001600160a01b038116811462000165578182fd5b809150509250925092565b61454a80620001806000396000f3fe6080604052600436106101dc5760003560e01c806384f3ca4111610102578063adc9772e11610095578063e9b8738711610064578063e9b87387146107f5578063ef4604a914610822578063fd09b15f14610842578063fd6d2dcf14610862576103e9565b8063adc9772e14610711578063ce4cb87614610731578063d547741f146107b5578063d9393814146107d5576103e9565b806391d14854116100d157806391d14854146106785780639300c926146106bc5780639e7455eb146106dc578063a217fddf146106fc576103e9565b806384f3ca41146105fb5780638670fdd91461062357806389bf146a1461063857806389f1898314610658576103e9565b80632f2ff15d1161017a578063402fbbd811610149578063402fbbd81461059c57806363de06f8146105b1578063787ef242146105d1578063817b1cd2146105e6576103e9565b80632f2ff15d1461051c5780633293025c1461053c57806336568abe1461055c57806338f8f5281461057c576103e9565b80630e53e633116101b65780630e53e6331461048c578063240de277146104ac578063248a9ca3146104cc57806326b321d1146104fc576103e9565b806301ffc9a7146103ee57806304f32b5d146104235780630cb395db14610445576103e9565b366103e957336000818152600a60209081526040808320600b83528184205484529091529020805460019060ff16600481111561022957634e487b7160e01b600052602160045260246000fd5b146102c75760405162461bcd60e51b815260206004820152604160248201527f596f7520646f6e277420686176652061206465706f736974206177616974696e60448201527f672070726f636573732c20706c6561736520637265617465206974206669727360648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b348160010154146103405760405162461bcd60e51b815260206004820152603760248201527f4465706f73697420616d6f756e7420646f65736e2774206d617463682077697460448201527f682074686520726571756573746564206465706f73697400000000000000000060648201526084016102be565b600381015460058201546001600160a01b03909116906108fc90610365903490610882565b6040518115909202916000818181858888f1935050505015801561038d573d6000803e3d6000fd5b50805460ff19166002178155600781015460068201546040513481526001600160a01b03918216918516907f1f0f1dee49a1720a0d98e3a0575a04dd9f143ff5e29555c3085471c1c70eed5b9060200160405180910390a45050005b600080fd5b3480156103fa57600080fd5b5061040e610409366004613f47565b610897565b60405190151581526020015b60405180910390f35b34801561042f57600080fd5b5061044361043e366004613d0f565b61092e565b005b34801561045157600080fd5b5061047e610460366004613c01565b6001600160a01b03166000908152600c602052604090206003015490565b60405190815260200161041a565b34801561049857600080fd5b506104436104a7366004613ca3565b6109e8565b3480156104b857600080fd5b506104436104c7366004613f87565b610bdb565b3480156104d857600080fd5b5061047e6104e7366004613f0b565b60009081526020819052604090206001015490565b34801561050857600080fd5b50610443610517366004613f0b565b610bf2565b34801561052857600080fd5b50610443610537366004613f23565b610c03565b34801561054857600080fd5b50610443610557366004613f0b565b610c2d565b34801561056857600080fd5b50610443610577366004613f23565b610c3e565b34801561058857600080fd5b50610443610597366004613d93565b610cca565b3480156105a857600080fd5b5060075461047e565b3480156105bd57600080fd5b506104436105cc366004613f0b565b61115c565b3480156105dd57600080fd5b5060015461047e565b3480156105f257600080fd5b5060085461047e565b34801561060757600080fd5b506009546040516001600160a01b03909116815260200161041a565b34801561062f57600080fd5b5060065461047e565b34801561064457600080fd5b50610443610653366004613cce565b6111d7565b34801561066457600080fd5b50610443610673366004613f0b565b611856565b34801561068457600080fd5b5061040e610693366004613f23565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156106c857600080fd5b506104436106d7366004613ebc565b611867565b3480156106e857600080fd5b506104436106f7366004613e3f565b6118ed565b34801561070857600080fd5b5061047e600081565b34801561071d57600080fd5b5061044361072c366004613ca3565b611ede565b34801561073d57600080fd5b5061079a61074c366004613c1d565b604080518082018252600080825260209182018190526001600160a01b039485168152600f825282812093909416845291825291829020825180840190935280548352600101549082015290565b6040805182518152602092830151928101929092520161041a565b3480156107c157600080fd5b506104436107d0366004613f23565b6122b1565b3480156107e157600080fd5b506104436107f0366004613ca3565b6122d6565b34801561080157600080fd5b50610815610810366004613ca3565b612671565b60405161041a9190614234565b34801561082e57600080fd5b5061044361083d366004613e88565b6128fa565b34801561084e57600080fd5b5061044361085d366004613c55565b61292d565b34801561086e57600080fd5b5061044361087d366004613f87565b612a02565b600061088e82846143eb565b90505b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061089157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610891565b336000908152600c60205260409020546109945760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920736572766963652063616e2063616c6c2074686973206d6574686f6044820152601960fa1b60648201526084016102be565b82336001600160a01b0316856001600160a01b03167fb67fab32200b6a6d186136689c0b4c4072ae0bd5dd17b98fb8105d1b9747939985856040516109da9291906141f2565b60405180910390a450505050565b336000908152600c6020526040902060010154151580610a105750336001600160a01b038316145b610a825760405162461bcd60e51b815260206004820152603560248201527f4f6e6c792073657276696365206f722070726f6475637420637573746f6d657260448201527f2063616e2063616c6c2074686973206d6574686f64000000000000000000000060648201526084016102be565b6001600160a01b0382166000908152600a6020908152604080832084845290915290206002815460ff166004811115610acb57634e487b7160e01b600052602160045260246000fd5b14610b2a5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207374617274207465726d696e6174696f6e2c20636865636b2060448201526874686520737461746560b81b60648201526084016102be565b805460ff191660031781554360098201556006810154610b55906001600160a01b0316600080612a19565b8051610b6b91600a840191602090910190613a3d565b50600b810180546001600160a81b0319908116909155600c820180549091169055604051829033906001600160a01b038616907f2ec6ff0a3927bfb55544f85fb0e2367f025ffb0b469ec8276385f8e569e0376e90610bce90600a8701906140f5565b60405180910390a4505050565b6000610be681612e55565b50600491909155600555565b6000610bfd81612e55565b50600755565b600082815260208190526040902060010154610c1e81612e55565b610c288383612e62565b505050565b6000610c3881612e55565b50600655565b6001600160a01b0381163314610cbc5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016102be565b610cc68282612f00565b5050565b6001600160a01b0383166000908152600c6020526040902060010154610d585760405162461bcd60e51b815260206004820152602360248201527f52657175657374656420736572766963652061646472657373206e6f7420666f60448201527f756e64000000000000000000000000000000000000000000000000000000000060648201526084016102be565b336000908152600a602090815260408083208584529091529020600601546001600160a01b031615610df25760405162461bcd60e51b815260206004820152602e60248201527f50726f636573732077697468207370656369666965642070726f64756374496460448201527f20616c726561647920657869737400000000000000000000000000000000000060648201526084016102be565b604080516101e081019091528060008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001846001600160a01b03168152602001838152602001828152602001438152602001610e6885600080612a19565b8152600060208083018290526040808401839052606084018390526080909301829052338252600a815282822086835290522081518154829060ff19166001836004811115610ec757634e487b7160e01b600052602160045260246000fd5b021790555060208281015160018301556040830151600283015560608301516003830180546001600160a01b039283166001600160a01b031991821617909155608085015160048501805491841691831691909117905560a0850151600585015560c085015160068501805491909316911617905560e083015160078301556101008301518051610f5e9260088501920190613aa2565b5061012082015160098201556101408201518051610f8691600a840191602090910190613a3d565b50610160820151600b820180546101808501511515600160a01b9081026001600160a81b03199283166001600160a01b0395861617179092556101a0850151600c90940180546101c0909601511515909202941692821692909217929092179055336000818152600a602081815260408084208885529091529182902091518694881693927fde23c39256eb8276bf5f5a3b3654613cb6dc5d9a36e408f3ad61e531217b0d899261103b929101908790614108565b60405180910390a4336000908152600a60209081526040808320600b835281842054845290915290205460019060ff16600481111561108a57634e487b7160e01b600052602160045260246000fd5b141561114857336000908152600a60209081526040808320600b83528184205484529091528120805460ff1916815560018101829055600281018290556003810180546001600160a01b031990811690915560048201805482169055600582018390556006820180549091169055600781018290559061110d6008830182613b16565b6009820160009055600a820160006111259190613b52565b50600b810180546001600160a81b0319908116909155600c909101805490911690555b50336000908152600b602052604090205550565b336000908152600c60205260409020546111c25760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920736572766963652063616e2063616c6c2074686973206d6574686f6044820152601960fa1b60648201526084016102be565b336000908152600c6020526040902060030155565b336000908152600d60205260409020546112595760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792076616c696461746f722077697468207374616b65732063616e206360448201527f616c6c2074686973206d6574686f64000000000000000000000000000000000060648201526084016102be565b6001600160a01b038084166000908152600a60209081526040808320868452825280832060068101549094168352600c82529182902080548351818402810184019094528084526112e993928301828280156112de57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112c0575b505050505033612f7f565b61135b5760405162461bcd60e51b815260206004820152603f60248201527f596f75722061646472657373206973206e6f742077686974656c69737465642060448201527f696e207468652070726f6475637420736572766963652073657474696e67730060648201526084016102be565b6003815460ff16600481111561138157634e487b7160e01b600052602160045260246000fd5b146113e05760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74206163636570742076616c69646174696f6e2c20636865636b2060448201526874686520737461746560b81b60648201526084016102be565b61144e81600a0180548060200260200160405190810160405280929190818152602001828054801561143b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161141d575b5050505050338360090154600154612ff3565b6114b05760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74206163636570742076616c69646174696f6e2c20796f7520617260448201526c65206f7574206f662074696d6560981b60648201526084016102be565b600b8101546001600160a01b031661157a57600b810180546001600160a81b0319163360ff60a01b191617600160a01b841515021790819055436009830155600682015461150c916001600160a01b0391821691166000612a19565b805161152291600a840191602090910190613a3d565b50600681015460405184916001600160a01b0390811691908716907f2ec6ff0a3927bfb55544f85fb0e2367f025ffb0b469ec8276385f8e569e0376e9061156d90600a8701906140f5565b60405180910390a4611850565b600c8101546001600160a01b031661169557600c810180546001600160a81b0319163360ff60a01b191617600160a01b84151581029190911791829055600b8301549181900460ff9081161515919092049190911615151415611662576115f6848483600b0160149054906101000a900460ff161560006130a7565b8054600460ff199091161781556006810154600b82015460408051600160a01b90920460ff16151582525185926001600160a01b0390811692908816917f5c2cc6518d5891ba2f9c21f49d712982ba12450a2a8adeb21e4a41f85a995b709181900360200190a4611690565b4360098201556006810154600b820154600c83015461150c926001600160a01b039081169281169116612a19565b611850565b600b81015460ff600160a01b909104161515821515141561175557600654600c8201546001600160a01b03166000908152600d602052604081205490916116e9916064916116e39190613213565b9061321f565b600c830154909150600090611707906001600160a01b03168361322b565b600c840180546001600160a81b0319163360ff60a01b191617600160a01b871515810291909117909155600b85015491925061174e918891889160ff9190041615846130a7565b50506117eb565b600654600b8201546001600160a01b03166000908152600d60205260408120549091611788916064916116e39190613213565b600b8301549091506000906117a6906001600160a01b03168361322b565b600b840180546001600160a81b0319163360ff60a01b191617600160a01b871515810291909117918290559192506117e8918891889160ff91041615846130a7565b50505b8054600460ff199091161781556006810154600b820154604051600160a01b90910460ff161515815284916001600160a01b0390811691908716907f5c2cc6518d5891ba2f9c21f49d712982ba12450a2a8adeb21e4a41f85a995b70906020016109da565b50505050565b600061186181612e55565b50600155565b336000908152600c60205260409020546118cd5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920736572766963652063616e2063616c6c2074686973206d6574686f6044820152601960fa1b60648201526084016102be565b336000908152600c602090815260409091208251610cc692840190613a3d565b336000908152600d602052604090205461196f5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792076616c696461746f722077697468207374616b65732063616e206360448201527f616c6c2074686973206d6574686f64000000000000000000000000000000000060648201526084016102be565b6001600160a01b038085166000908152600a60209081526040808320878452825280832060068101549094168352600c82529182902080548351818402810184019094528084526119fd93928301828280156112de576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116112c057505050505033612f7f565b611a6f5760405162461bcd60e51b815260206004820152603f60248201527f596f75722061646472657373206973206e6f742077686974656c69737465642060448201527f696e207468652070726f6475637420736572766963652073657474696e67730060648201526084016102be565b6000815460ff166004811115611a9557634e487b7160e01b600052602160045260246000fd5b14611b075760405162461bcd60e51b8152602060048201526024808201527f436f737420697320616c7265616479207365742c20636865636b20746865207360448201527f746174650000000000000000000000000000000000000000000000000000000060648201526084016102be565b611b7381600a0180548060200260200160405190810160405280929190818152602001828054801561143b576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161141d575050505050338360090154600154612ff3565b611bd55760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74206163636570742076616c69646174696f6e2c20796f7520617260448201526c65206f7574206f662074696d6560981b60648201526084016102be565b600b8101546001600160a01b0316611cab57600b810180546001600160a01b031990811633908117909255600183018590556003830180546001600160a01b03868116919093161790554360098401556006830154611c38929116906000612a19565b8051611c4e91600a840191602090910190613a3d565b50600681015460405185916001600160a01b0390811691908816907fde23c39256eb8276bf5f5a3b3654613cb6dc5d9a36e408f3ad61e531217b0d8990611c9e90600a8701906008880190614136565b60405180910390a4611ed7565b600c8101546001600160a01b0316611dca57600c81018054336001600160a01b031991821617909155600282018490556004820180549091166001600160a01b038416179055600181015483148015611d185750600481015460038201546001600160a01b039081169116145b15611d9757611d386005546116e36004548661321390919063ffffffff16565b6005820155805460ff19166001178155600681015460405184815285916001600160a01b0390811691908816907f9829c39553001f6f75967caf0b4a8a903f5332af8a010a6b7e8532b7ed023f519060200160405180910390a4611dc5565b4360098201556006810154600b820154600c830154611c38926001600160a01b039081169281169116612a19565b611ed7565b828160010154148015611dec575060038101546001600160a01b038381169116145b15611e2a57600c81018054336001600160a01b031991821617909155600282018490556004820180549091166001600160a01b038416179055611e5f565b600b81018054336001600160a01b031991821617909155600182018490556003820180549091166001600160a01b0384161790555b60018101839055600554600454611e7c91906116e3908690613213565b6005820155805460ff19166001178155600681015460405184815285916001600160a01b0390811691908816907f9829c39553001f6f75967caf0b4a8a903f5332af8a010a6b7e8532b7ed023f519060200160405180910390a45b5050505050565b6001600160a01b038216611f345760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220616464726573732063616e6e6f74206265203000000060448201526064016102be565b60008111611f845760405162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b65203000000000000000000000000000000000000060448201526064016102be565b6009546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526000916001600160a01b0316906323b872dd90606401602060405180830381600087803b158015611ff057600080fd5b505af1158015612004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120289190613eef565b905080156122435760085461203d908361336a565b600855336000908152600f602090815260408083206001600160a01b03871684529091528120541561206d575060015b336000908152600f602090815260408083206001600160a01b038816845290915290205461209b908461336a565b336000908152600f602090815260408083206001600160a01b03891684529091529020556007546120cc90436143a0565b336000908152600f602090815260408083206001600160a01b0389168452825280832060010193909355600d90522054612106908461336a565b6001600160a01b0385166000908152600d60205260409020558015801561219e57506001600160a01b0384166000908152600e6020908152604091829020805483518184028101840190945280845261219c93928301828280156112de576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116112c057505050505033612f7f565b155b156121dc576001600160a01b0384166000908152600e602090815260408220805460018101825590835291200180546001600160a01b031916331790555b336000818152600f602090815260408083206001600160a01b03891680855290835292819020600101548151888152928301529192917f6c86f3fd5118b3aa8bb4f389a617046de0a3d3d477de1a1673d227f802f616dc910160405180910390a350610c28565b60405162461bcd60e51b815260206004820152602260248201527f5761736e27742061626c6520746f207472616e7366657220796f757220746f6b60448201527f656e00000000000000000000000000000000000000000000000000000000000060648201526084016102be565b6000828152602081905260409020600101546122cc81612e55565b610c288383612f00565b600081116123265760405162461bcd60e51b815260206004820152601060248201527f43616e6e6f7420756e7374616b6520300000000000000000000000000000000060448201526064016102be565b336000908152600f602090815260408083206001600160a01b03861684529091529020548111156123e55760405162461bcd60e51b815260206004820152604360248201527f596f75722062616c616e6365206973206c6f776572207468616e20746865206160448201527f6d6f756e74206f6620746f6b656e7320796f752077616e7420746f20756e737460648201527f616b650000000000000000000000000000000000000000000000000000000000608482015260a4016102be565b336000908152600f602090815260408083206001600160a01b03861684529091529020600101544310156124815760405162461bcd60e51b815260206004820152603260248201527f546865206c6f636b696e6720706572696f64206469646e277420706173732c2060448201527f796f752063616e6e6f7420756e7374616b65000000000000000000000000000060648201526084016102be565b6009546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390526000916001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156124e757600080fd5b505af11580156124fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251f9190613eef565b9050801561260357816008600082825461253991906143eb565b9091555050336000908152600f602090815260408083206001600160a01b038716845290915290205461256d9083906143eb565b336000908152600f602090815260408083206001600160a01b0388168452825280832093909355600d905220546125a59083906143eb565b6001600160a01b0384166000818152600d60205260409081902092909255905133907f8a3c16627a0e7a870a5d5cd0121ca5d80e2efd0ec7198a11644f1a516ac37093906125f69086815260200190565b60405180910390a3610c28565b60405162461bcd60e51b815260206004820152602e60248201527f5761736e27742061626c6520746f2065786563757465207472616e736665722060448201527f6f6620796f757220746f6b656e7300000000000000000000000000000000000060648201526084016102be565b604080516101e080820183526000808352602080840182905283850182905260608085018390526080850183905260a0850183905260c0850183905260e0850183905261010085018190526101208501839052610140850152610160840182905261018084018290526101a084018290526101c084018290526001600160a01b0387168252600a815284822086835290528390208351918201909352825491929091829060ff16600481111561273757634e487b7160e01b600052602160045260246000fd5b600481111561275657634e487b7160e01b600052602160045260246000fd5b8152600182015460208201526002820154604082015260038201546001600160a01b039081166060830152600483015481166080830152600583015460a083015260068301541660c0820152600782015460e0820152600882018054610100909201916127c290614445565b80601f01602080910402602001604051908101604052809291908181526020018280546127ee90614445565b801561283b5780601f106128105761010080835404028352916020019161283b565b820191906000526020600020905b81548152906001019060200180831161281e57829003601f168201915b5050505050815260200160098201548152602001600a82018054806020026020016040519081016040528092919081815260200182805480156128a757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612889575b5050509183525050600b8201546001600160a01b03808216602084015260ff600160a01b92839004811615156040850152600c909401549081166060840152049091161515608090910152905092915050565b600061290581612e55565b506001600160a01b039092166000908152600c60205260409020600181019190915560020155565b600061293881612e55565b60028251116129895760405162461bcd60e51b815260206004820181905260248201527f56616c696461746f7273206d696e696d756d207175616e74697479206973203360448201526064016102be565b6040805160808101825283815260025460208083019190915260035482840152600160608301526001600160a01b0386166000908152600c82529290922081518051929391926129dc9284920190613a3d565b506020820151600182015560408201516002820155606090910151600390910155505050565b6000612a0d81612e55565b50600291909155600355565b6001600160a01b038082166000908152600d602052604080822054928516825281205460085460609391612a4c916143eb565b612a5691906143eb565b6001600160a01b038087166000908152600c60205260408120549293509190861615612a8a57612a876001826143eb565b90505b6001600160a01b03851615612aa757612aa46001826143eb565b90505b60008167ffffffffffffffff811115612ad057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612af9578160200160208202803683370190505b50905060005b8151811015612e495784612b11613376565b612b1b919061449b565b935060005b6001600160a01b038a166000908152600c6020526040902054811015612e36576001600160a01b038a81166000908152600c602052604090208054918b169183908110612b7d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614801590612bf057506001600160a01b038a81166000908152600c602052604090208054918a169183908110612bd857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b15612e24576001600160a01b038a166000908152600c602052604090208054612c4d91859184908110612c3357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316612f7f565b612e24576001600160a01b038a166000908152600c602052604081208054600d92919084908110612c8e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548511612db5576001600160a01b038a166000908152600c60205260409020805482908110612cf157634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316838381518110612d2f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152908b166000908152600c909152604081208054600d92919084908110612d7f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054612dae90876143eb565b9550612e36565b6001600160a01b038a166000908152600c602052604081208054600d92919084908110612df257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054612e2190866143eb565b94505b80612e2e81614480565b915050612b20565b5080612e4181614480565b915050612aff565b50979650505050505050565b612e5f81336133b2565b50565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610cc6576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055612ebc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610cc6576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000805b8351811015612fe957826001600160a01b0316848281518110612fb657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415612fd7576001915050610891565b80612fe181614480565b915050612f83565b5060009392505050565b6000805b855181101561309957846001600160a01b031686828151811061302a57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614156130875761304b84436143eb565b61305584836143cc565b1115801561307f57508261306981836143cc565b61307391906143a0565b61307d85436143eb565b105b91505061309f565b8061309181614480565b915050612ff7565b50600090505b949350505050565b6001600160a01b038085166000908152600a60209081526040808320878452825280832060068101549094168352600c90915281206001015460058301546130f5916064916116e391613213565b600b830154600c84015491925060009161311c916001600160a01b03908116911684613430565b9050831561314557600b830154600c840154613145916001600160a01b039081169116866134dc565b846131c35760068301546001600160a01b03166000908152600c6020526040812060020154600585015461317f916064916116e391613213565b60068501546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156131bc573d6000803e3d6000fd5b505061320a565b866001600160a01b03166108fc8285600501546131e091906143eb565b6040518115909202916000818181858888f19350505050158015613208573d6000803e3d6000fd5b505b50505050505050565b600061088e82846143cc565b600061088e82846143b8565b600080805b6001600160a01b0385166000908152600e6020526040902054811015613362576001600160a01b0385166000908152600e6020526040812080548390811061328857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600d845260408086205492909316808652600f85528386209186529352908320549193506132e7916064916116e3916132e09190839085613213565b8990613213565b6001600160a01b038084166000908152600f60209081526040808320938c168352929052205490915061331b9082906143eb565b6001600160a01b038084166000908152600f60209081526040808320938c168352929052205561334b81856143a0565b93505050808061335a90614480565b915050613230565b509392505050565b600061088e82846143a0565b60004442604051602001613394929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905090565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610cc6576133ee816001600160a01b031660146135d7565b6133f98360206135d7565b60405160200161340a929190614074565b60408051601f198184030181529082905262461bcd60e51b82526102be91600401614221565b6001600160a01b038083166000908152600d60205260408082205492861682528120549091829161349a916064916116e3916134939161346f9161336a565b6001600160a01b038a166000908152600d60205260409020546116e3906064613213565b8690613213565b905060006134a882856143eb565b905060006134b687846137fe565b905060006134c487846137fe565b90506134d081836143a0565b98975050505050505050565b6001600160a01b038083166000908152600d60205260408082205492861682528120549091613545916064916116e39161353e9161351a919061336a565b6001600160a01b0389166000908152600d60205260409020546116e3906064613213565b8590613213565b9050600061355382846143eb565b90506000613561868461390e565b9050600061356f868461390e565b6001600160a01b0388166000908152600d602052604081208054929350849290919061359c9084906143a0565b90915550506001600160a01b0386166000908152600d6020526040812080548392906135c99084906143a0565b909155505050505050505050565b606060006135e68360026143cc565b6135f19060026143a0565b67ffffffffffffffff81111561361757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613641576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061368657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106136df57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006137038460026143cc565b61370e9060016143a0565b90505b60018111156137af577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061375d57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061378157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936137a88161442e565b9050613711565b50831561088e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016102be565b600080805b6001600160a01b0385166000908152600e6020526040902054811015613362576001600160a01b0385166000908152600e6020526040812080548390811061385b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600d845260408086205492909316808652600f85528386209186529352908320549193506138b3916064916116e3916132e09190839085613213565b6040519091506001600160a01b0383169082156108fc029083906000818181858888f193505050501580156138ec573d6000803e3d6000fd5b506138f781856143a0565b93505050808061390690614480565b915050613803565b600080805b6001600160a01b0385166000908152600e6020526040902054811015613362576001600160a01b0385166000908152600e6020526040812080548390811061396b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600d845260408086205492909316808652600f85528386209186529352908320549193506139c3916064916116e3916132e09190839085613213565b6001600160a01b038084166000908152600f60209081526040808320938c16835292905220549091506139f6908261336a565b6001600160a01b038084166000908152600f60209081526040808320938c1683529290522055613a2681856143a0565b935050508080613a3590614480565b915050613913565b828054828255906000526020600020908101928215613a92579160200282015b82811115613a9257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613a5d565b50613a9e929150613b6c565b5090565b828054613aae90614445565b90600052602060002090601f016020900481019282613ad05760008555613a92565b82601f10613ae957805160ff1916838001178555613a92565b82800160010185558215613a92579182015b82811115613a92578251825591602001919060010190613afb565b508054613b2290614445565b6000825580601f10613b345750612e5f565b601f016020900490600052602060002090810190612e5f9190613b6c565b5080546000825590600052602060002090810190612e5f91905b5b80821115613a9e5760008155600101613b6d565b600082601f830112613b91578081fd5b8135602067ffffffffffffffff821115613bad57613bad6144db565b8160051b613bbc82820161436f565b838152828101908684018388018501891015613bd6578687fd5b8693505b85841015612e49578035613bed816144f1565b835260019390930192918401918401613bda565b600060208284031215613c12578081fd5b813561088e816144f1565b60008060408385031215613c2f578081fd5b8235613c3a816144f1565b91506020830135613c4a816144f1565b809150509250929050565b60008060408385031215613c67578182fd5b8235613c72816144f1565b9150602083013567ffffffffffffffff811115613c8d578182fd5b613c9985828601613b81565b9150509250929050565b60008060408385031215613cb5578182fd5b8235613cc0816144f1565b946020939093013593505050565b600080600060608486031215613ce2578081fd5b8335613ced816144f1565b9250602084013591506040840135613d0481614506565b809150509250925092565b60008060008060608587031215613d24578081fd5b8435613d2f816144f1565b935060208501359250604085013567ffffffffffffffff80821115613d52578283fd5b818701915087601f830112613d65578283fd5b813581811115613d73578384fd5b886020828501011115613d84578384fd5b95989497505060200194505050565b600080600060608486031215613da7578283fd5b8335613db2816144f1565b92506020848101359250604085013567ffffffffffffffff80821115613dd6578384fd5b818701915087601f830112613de9578384fd5b813581811115613dfb57613dfb6144db565b613e0d601f8201601f1916850161436f565b91508082528884828501011115613e22578485fd5b808484018584013784848284010152508093505050509250925092565b60008060008060808587031215613e54578384fd5b8435613e5f816144f1565b935060208501359250604085013591506060850135613e7d816144f1565b939692955090935050565b600080600060608486031215613e9c578283fd5b8335613ea7816144f1565b95602085013595506040909401359392505050565b600060208284031215613ecd578081fd5b813567ffffffffffffffff811115613ee3578182fd5b61309f84828501613b81565b600060208284031215613f00578081fd5b815161088e81614506565b600060208284031215613f1c578081fd5b5035919050565b60008060408385031215613f35578182fd5b823591506020830135613c4a816144f1565b600060208284031215613f58578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461088e578182fd5b60008060408385031215613f99578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015613fe05781516001600160a01b031687529582019590820190600101613fbb565b509495945050505050565b6000815480845260208085019450838352808320835b83811015613fe05781546001600160a01b031687529582019560019182019101614001565b6005811061404457634e487b7160e01b600052602160045260246000fd5b9052565b60008151808452614060816020860160208601614402565b601f01601f19169290920160200192915050565b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000825283516140ac816017850160208801614402565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516140e9816028840160208801614402565b01602801949350505050565b60006020825261088e6020830184613feb565b60006040825261411b6040830185613feb565b828103602084015261412d8185614048565b95945050505050565b6000604082526141496040830185613feb565b60208382038185015282855484600182811c91508083168061416c57607f831692505b85831081141561418a57634e487b7160e01b88526022600452602488fd5b8287526020870196508080156141a757600181146141b8576141e2565b60ff198516885286880195506141e2565b60008b815260209020895b858110156141dc5781548a8201529084019088016141c3565b89019650505b50939a9950505050505050505050565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b60006020825261088e6020830184614048565b600060208252614248602083018451614026565b6020830151604083015260408301516060830152606083015161427660808401826001600160a01b03169052565b5060808301516001600160a01b03811660a08401525060a083015160c083015260c08301516142b060e08401826001600160a01b03169052565b5060e0830151610100838101919091528301516101e06101208085018290526142dd610200860184614048565b9250808601519050610140818187015280870151915050610160601f19868503018187015261430c8483613fa8565b93508087015191505061018061432c818701836001600160a01b03169052565b86015190506101a06143418682018315159052565b86015190506101c061435d868201836001600160a01b03169052565b90950151151593019290925250919050565b604051601f8201601f1916810167ffffffffffffffff81118282101715614398576143986144db565b604052919050565b600082198211156143b3576143b36144af565b500190565b6000826143c7576143c76144c5565b500490565b60008160001904831182151516156143e6576143e66144af565b500290565b6000828210156143fd576143fd6144af565b500390565b60005b8381101561441d578181015183820152602001614405565b838111156118505750506000910152565b60008161443d5761443d6144af565b506000190190565b600181811c9082168061445957607f821691505b6020821081141561447a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614494576144946144af565b5060010190565b6000826144aa576144aa6144c5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612e5f57600080fd5b8015158114612e5f57600080fdfea2646970667358221220a460cbe3a634f27668286ab9e8ec3cff8e4fa2a8e5a3e3d16aaca087fe16fda364736f6c63430008030033000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000005100000000000000000000000000d5582d46f20f08cd6133acecde1456df635ccdcc
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c806384f3ca4111610102578063adc9772e11610095578063e9b8738711610064578063e9b87387146107f5578063ef4604a914610822578063fd09b15f14610842578063fd6d2dcf14610862576103e9565b8063adc9772e14610711578063ce4cb87614610731578063d547741f146107b5578063d9393814146107d5576103e9565b806391d14854116100d157806391d14854146106785780639300c926146106bc5780639e7455eb146106dc578063a217fddf146106fc576103e9565b806384f3ca41146105fb5780638670fdd91461062357806389bf146a1461063857806389f1898314610658576103e9565b80632f2ff15d1161017a578063402fbbd811610149578063402fbbd81461059c57806363de06f8146105b1578063787ef242146105d1578063817b1cd2146105e6576103e9565b80632f2ff15d1461051c5780633293025c1461053c57806336568abe1461055c57806338f8f5281461057c576103e9565b80630e53e633116101b65780630e53e6331461048c578063240de277146104ac578063248a9ca3146104cc57806326b321d1146104fc576103e9565b806301ffc9a7146103ee57806304f32b5d146104235780630cb395db14610445576103e9565b366103e957336000818152600a60209081526040808320600b83528184205484529091529020805460019060ff16600481111561022957634e487b7160e01b600052602160045260246000fd5b146102c75760405162461bcd60e51b815260206004820152604160248201527f596f7520646f6e277420686176652061206465706f736974206177616974696e60448201527f672070726f636573732c20706c6561736520637265617465206974206669727360648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b348160010154146103405760405162461bcd60e51b815260206004820152603760248201527f4465706f73697420616d6f756e7420646f65736e2774206d617463682077697460448201527f682074686520726571756573746564206465706f73697400000000000000000060648201526084016102be565b600381015460058201546001600160a01b03909116906108fc90610365903490610882565b6040518115909202916000818181858888f1935050505015801561038d573d6000803e3d6000fd5b50805460ff19166002178155600781015460068201546040513481526001600160a01b03918216918516907f1f0f1dee49a1720a0d98e3a0575a04dd9f143ff5e29555c3085471c1c70eed5b9060200160405180910390a45050005b600080fd5b3480156103fa57600080fd5b5061040e610409366004613f47565b610897565b60405190151581526020015b60405180910390f35b34801561042f57600080fd5b5061044361043e366004613d0f565b61092e565b005b34801561045157600080fd5b5061047e610460366004613c01565b6001600160a01b03166000908152600c602052604090206003015490565b60405190815260200161041a565b34801561049857600080fd5b506104436104a7366004613ca3565b6109e8565b3480156104b857600080fd5b506104436104c7366004613f87565b610bdb565b3480156104d857600080fd5b5061047e6104e7366004613f0b565b60009081526020819052604090206001015490565b34801561050857600080fd5b50610443610517366004613f0b565b610bf2565b34801561052857600080fd5b50610443610537366004613f23565b610c03565b34801561054857600080fd5b50610443610557366004613f0b565b610c2d565b34801561056857600080fd5b50610443610577366004613f23565b610c3e565b34801561058857600080fd5b50610443610597366004613d93565b610cca565b3480156105a857600080fd5b5060075461047e565b3480156105bd57600080fd5b506104436105cc366004613f0b565b61115c565b3480156105dd57600080fd5b5060015461047e565b3480156105f257600080fd5b5060085461047e565b34801561060757600080fd5b506009546040516001600160a01b03909116815260200161041a565b34801561062f57600080fd5b5060065461047e565b34801561064457600080fd5b50610443610653366004613cce565b6111d7565b34801561066457600080fd5b50610443610673366004613f0b565b611856565b34801561068457600080fd5b5061040e610693366004613f23565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156106c857600080fd5b506104436106d7366004613ebc565b611867565b3480156106e857600080fd5b506104436106f7366004613e3f565b6118ed565b34801561070857600080fd5b5061047e600081565b34801561071d57600080fd5b5061044361072c366004613ca3565b611ede565b34801561073d57600080fd5b5061079a61074c366004613c1d565b604080518082018252600080825260209182018190526001600160a01b039485168152600f825282812093909416845291825291829020825180840190935280548352600101549082015290565b6040805182518152602092830151928101929092520161041a565b3480156107c157600080fd5b506104436107d0366004613f23565b6122b1565b3480156107e157600080fd5b506104436107f0366004613ca3565b6122d6565b34801561080157600080fd5b50610815610810366004613ca3565b612671565b60405161041a9190614234565b34801561082e57600080fd5b5061044361083d366004613e88565b6128fa565b34801561084e57600080fd5b5061044361085d366004613c55565b61292d565b34801561086e57600080fd5b5061044361087d366004613f87565b612a02565b600061088e82846143eb565b90505b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061089157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610891565b336000908152600c60205260409020546109945760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920736572766963652063616e2063616c6c2074686973206d6574686f6044820152601960fa1b60648201526084016102be565b82336001600160a01b0316856001600160a01b03167fb67fab32200b6a6d186136689c0b4c4072ae0bd5dd17b98fb8105d1b9747939985856040516109da9291906141f2565b60405180910390a450505050565b336000908152600c6020526040902060010154151580610a105750336001600160a01b038316145b610a825760405162461bcd60e51b815260206004820152603560248201527f4f6e6c792073657276696365206f722070726f6475637420637573746f6d657260448201527f2063616e2063616c6c2074686973206d6574686f64000000000000000000000060648201526084016102be565b6001600160a01b0382166000908152600a6020908152604080832084845290915290206002815460ff166004811115610acb57634e487b7160e01b600052602160045260246000fd5b14610b2a5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207374617274207465726d696e6174696f6e2c20636865636b2060448201526874686520737461746560b81b60648201526084016102be565b805460ff191660031781554360098201556006810154610b55906001600160a01b0316600080612a19565b8051610b6b91600a840191602090910190613a3d565b50600b810180546001600160a81b0319908116909155600c820180549091169055604051829033906001600160a01b038616907f2ec6ff0a3927bfb55544f85fb0e2367f025ffb0b469ec8276385f8e569e0376e90610bce90600a8701906140f5565b60405180910390a4505050565b6000610be681612e55565b50600491909155600555565b6000610bfd81612e55565b50600755565b600082815260208190526040902060010154610c1e81612e55565b610c288383612e62565b505050565b6000610c3881612e55565b50600655565b6001600160a01b0381163314610cbc5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016102be565b610cc68282612f00565b5050565b6001600160a01b0383166000908152600c6020526040902060010154610d585760405162461bcd60e51b815260206004820152602360248201527f52657175657374656420736572766963652061646472657373206e6f7420666f60448201527f756e64000000000000000000000000000000000000000000000000000000000060648201526084016102be565b336000908152600a602090815260408083208584529091529020600601546001600160a01b031615610df25760405162461bcd60e51b815260206004820152602e60248201527f50726f636573732077697468207370656369666965642070726f64756374496460448201527f20616c726561647920657869737400000000000000000000000000000000000060648201526084016102be565b604080516101e081019091528060008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001846001600160a01b03168152602001838152602001828152602001438152602001610e6885600080612a19565b8152600060208083018290526040808401839052606084018390526080909301829052338252600a815282822086835290522081518154829060ff19166001836004811115610ec757634e487b7160e01b600052602160045260246000fd5b021790555060208281015160018301556040830151600283015560608301516003830180546001600160a01b039283166001600160a01b031991821617909155608085015160048501805491841691831691909117905560a0850151600585015560c085015160068501805491909316911617905560e083015160078301556101008301518051610f5e9260088501920190613aa2565b5061012082015160098201556101408201518051610f8691600a840191602090910190613a3d565b50610160820151600b820180546101808501511515600160a01b9081026001600160a81b03199283166001600160a01b0395861617179092556101a0850151600c90940180546101c0909601511515909202941692821692909217929092179055336000818152600a602081815260408084208885529091529182902091518694881693927fde23c39256eb8276bf5f5a3b3654613cb6dc5d9a36e408f3ad61e531217b0d899261103b929101908790614108565b60405180910390a4336000908152600a60209081526040808320600b835281842054845290915290205460019060ff16600481111561108a57634e487b7160e01b600052602160045260246000fd5b141561114857336000908152600a60209081526040808320600b83528184205484529091528120805460ff1916815560018101829055600281018290556003810180546001600160a01b031990811690915560048201805482169055600582018390556006820180549091169055600781018290559061110d6008830182613b16565b6009820160009055600a820160006111259190613b52565b50600b810180546001600160a81b0319908116909155600c909101805490911690555b50336000908152600b602052604090205550565b336000908152600c60205260409020546111c25760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920736572766963652063616e2063616c6c2074686973206d6574686f6044820152601960fa1b60648201526084016102be565b336000908152600c6020526040902060030155565b336000908152600d60205260409020546112595760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792076616c696461746f722077697468207374616b65732063616e206360448201527f616c6c2074686973206d6574686f64000000000000000000000000000000000060648201526084016102be565b6001600160a01b038084166000908152600a60209081526040808320868452825280832060068101549094168352600c82529182902080548351818402810184019094528084526112e993928301828280156112de57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112c0575b505050505033612f7f565b61135b5760405162461bcd60e51b815260206004820152603f60248201527f596f75722061646472657373206973206e6f742077686974656c69737465642060448201527f696e207468652070726f6475637420736572766963652073657474696e67730060648201526084016102be565b6003815460ff16600481111561138157634e487b7160e01b600052602160045260246000fd5b146113e05760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74206163636570742076616c69646174696f6e2c20636865636b2060448201526874686520737461746560b81b60648201526084016102be565b61144e81600a0180548060200260200160405190810160405280929190818152602001828054801561143b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161141d575b5050505050338360090154600154612ff3565b6114b05760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74206163636570742076616c69646174696f6e2c20796f7520617260448201526c65206f7574206f662074696d6560981b60648201526084016102be565b600b8101546001600160a01b031661157a57600b810180546001600160a81b0319163360ff60a01b191617600160a01b841515021790819055436009830155600682015461150c916001600160a01b0391821691166000612a19565b805161152291600a840191602090910190613a3d565b50600681015460405184916001600160a01b0390811691908716907f2ec6ff0a3927bfb55544f85fb0e2367f025ffb0b469ec8276385f8e569e0376e9061156d90600a8701906140f5565b60405180910390a4611850565b600c8101546001600160a01b031661169557600c810180546001600160a81b0319163360ff60a01b191617600160a01b84151581029190911791829055600b8301549181900460ff9081161515919092049190911615151415611662576115f6848483600b0160149054906101000a900460ff161560006130a7565b8054600460ff199091161781556006810154600b82015460408051600160a01b90920460ff16151582525185926001600160a01b0390811692908816917f5c2cc6518d5891ba2f9c21f49d712982ba12450a2a8adeb21e4a41f85a995b709181900360200190a4611690565b4360098201556006810154600b820154600c83015461150c926001600160a01b039081169281169116612a19565b611850565b600b81015460ff600160a01b909104161515821515141561175557600654600c8201546001600160a01b03166000908152600d602052604081205490916116e9916064916116e39190613213565b9061321f565b600c830154909150600090611707906001600160a01b03168361322b565b600c840180546001600160a81b0319163360ff60a01b191617600160a01b871515810291909117909155600b85015491925061174e918891889160ff9190041615846130a7565b50506117eb565b600654600b8201546001600160a01b03166000908152600d60205260408120549091611788916064916116e39190613213565b600b8301549091506000906117a6906001600160a01b03168361322b565b600b840180546001600160a81b0319163360ff60a01b191617600160a01b871515810291909117918290559192506117e8918891889160ff91041615846130a7565b50505b8054600460ff199091161781556006810154600b820154604051600160a01b90910460ff161515815284916001600160a01b0390811691908716907f5c2cc6518d5891ba2f9c21f49d712982ba12450a2a8adeb21e4a41f85a995b70906020016109da565b50505050565b600061186181612e55565b50600155565b336000908152600c60205260409020546118cd5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920736572766963652063616e2063616c6c2074686973206d6574686f6044820152601960fa1b60648201526084016102be565b336000908152600c602090815260409091208251610cc692840190613a3d565b336000908152600d602052604090205461196f5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792076616c696461746f722077697468207374616b65732063616e206360448201527f616c6c2074686973206d6574686f64000000000000000000000000000000000060648201526084016102be565b6001600160a01b038085166000908152600a60209081526040808320878452825280832060068101549094168352600c82529182902080548351818402810184019094528084526119fd93928301828280156112de576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116112c057505050505033612f7f565b611a6f5760405162461bcd60e51b815260206004820152603f60248201527f596f75722061646472657373206973206e6f742077686974656c69737465642060448201527f696e207468652070726f6475637420736572766963652073657474696e67730060648201526084016102be565b6000815460ff166004811115611a9557634e487b7160e01b600052602160045260246000fd5b14611b075760405162461bcd60e51b8152602060048201526024808201527f436f737420697320616c7265616479207365742c20636865636b20746865207360448201527f746174650000000000000000000000000000000000000000000000000000000060648201526084016102be565b611b7381600a0180548060200260200160405190810160405280929190818152602001828054801561143b576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161141d575050505050338360090154600154612ff3565b611bd55760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74206163636570742076616c69646174696f6e2c20796f7520617260448201526c65206f7574206f662074696d6560981b60648201526084016102be565b600b8101546001600160a01b0316611cab57600b810180546001600160a01b031990811633908117909255600183018590556003830180546001600160a01b03868116919093161790554360098401556006830154611c38929116906000612a19565b8051611c4e91600a840191602090910190613a3d565b50600681015460405185916001600160a01b0390811691908816907fde23c39256eb8276bf5f5a3b3654613cb6dc5d9a36e408f3ad61e531217b0d8990611c9e90600a8701906008880190614136565b60405180910390a4611ed7565b600c8101546001600160a01b0316611dca57600c81018054336001600160a01b031991821617909155600282018490556004820180549091166001600160a01b038416179055600181015483148015611d185750600481015460038201546001600160a01b039081169116145b15611d9757611d386005546116e36004548661321390919063ffffffff16565b6005820155805460ff19166001178155600681015460405184815285916001600160a01b0390811691908816907f9829c39553001f6f75967caf0b4a8a903f5332af8a010a6b7e8532b7ed023f519060200160405180910390a4611dc5565b4360098201556006810154600b820154600c830154611c38926001600160a01b039081169281169116612a19565b611ed7565b828160010154148015611dec575060038101546001600160a01b038381169116145b15611e2a57600c81018054336001600160a01b031991821617909155600282018490556004820180549091166001600160a01b038416179055611e5f565b600b81018054336001600160a01b031991821617909155600182018490556003820180549091166001600160a01b0384161790555b60018101839055600554600454611e7c91906116e3908690613213565b6005820155805460ff19166001178155600681015460405184815285916001600160a01b0390811691908816907f9829c39553001f6f75967caf0b4a8a903f5332af8a010a6b7e8532b7ed023f519060200160405180910390a45b5050505050565b6001600160a01b038216611f345760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220616464726573732063616e6e6f74206265203000000060448201526064016102be565b60008111611f845760405162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b65203000000000000000000000000000000000000060448201526064016102be565b6009546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526000916001600160a01b0316906323b872dd90606401602060405180830381600087803b158015611ff057600080fd5b505af1158015612004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120289190613eef565b905080156122435760085461203d908361336a565b600855336000908152600f602090815260408083206001600160a01b03871684529091528120541561206d575060015b336000908152600f602090815260408083206001600160a01b038816845290915290205461209b908461336a565b336000908152600f602090815260408083206001600160a01b03891684529091529020556007546120cc90436143a0565b336000908152600f602090815260408083206001600160a01b0389168452825280832060010193909355600d90522054612106908461336a565b6001600160a01b0385166000908152600d60205260409020558015801561219e57506001600160a01b0384166000908152600e6020908152604091829020805483518184028101840190945280845261219c93928301828280156112de576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116112c057505050505033612f7f565b155b156121dc576001600160a01b0384166000908152600e602090815260408220805460018101825590835291200180546001600160a01b031916331790555b336000818152600f602090815260408083206001600160a01b03891680855290835292819020600101548151888152928301529192917f6c86f3fd5118b3aa8bb4f389a617046de0a3d3d477de1a1673d227f802f616dc910160405180910390a350610c28565b60405162461bcd60e51b815260206004820152602260248201527f5761736e27742061626c6520746f207472616e7366657220796f757220746f6b60448201527f656e00000000000000000000000000000000000000000000000000000000000060648201526084016102be565b6000828152602081905260409020600101546122cc81612e55565b610c288383612f00565b600081116123265760405162461bcd60e51b815260206004820152601060248201527f43616e6e6f7420756e7374616b6520300000000000000000000000000000000060448201526064016102be565b336000908152600f602090815260408083206001600160a01b03861684529091529020548111156123e55760405162461bcd60e51b815260206004820152604360248201527f596f75722062616c616e6365206973206c6f776572207468616e20746865206160448201527f6d6f756e74206f6620746f6b656e7320796f752077616e7420746f20756e737460648201527f616b650000000000000000000000000000000000000000000000000000000000608482015260a4016102be565b336000908152600f602090815260408083206001600160a01b03861684529091529020600101544310156124815760405162461bcd60e51b815260206004820152603260248201527f546865206c6f636b696e6720706572696f64206469646e277420706173732c2060448201527f796f752063616e6e6f7420756e7374616b65000000000000000000000000000060648201526084016102be565b6009546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390526000916001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156124e757600080fd5b505af11580156124fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251f9190613eef565b9050801561260357816008600082825461253991906143eb565b9091555050336000908152600f602090815260408083206001600160a01b038716845290915290205461256d9083906143eb565b336000908152600f602090815260408083206001600160a01b0388168452825280832093909355600d905220546125a59083906143eb565b6001600160a01b0384166000818152600d60205260409081902092909255905133907f8a3c16627a0e7a870a5d5cd0121ca5d80e2efd0ec7198a11644f1a516ac37093906125f69086815260200190565b60405180910390a3610c28565b60405162461bcd60e51b815260206004820152602e60248201527f5761736e27742061626c6520746f2065786563757465207472616e736665722060448201527f6f6620796f757220746f6b656e7300000000000000000000000000000000000060648201526084016102be565b604080516101e080820183526000808352602080840182905283850182905260608085018390526080850183905260a0850183905260c0850183905260e0850183905261010085018190526101208501839052610140850152610160840182905261018084018290526101a084018290526101c084018290526001600160a01b0387168252600a815284822086835290528390208351918201909352825491929091829060ff16600481111561273757634e487b7160e01b600052602160045260246000fd5b600481111561275657634e487b7160e01b600052602160045260246000fd5b8152600182015460208201526002820154604082015260038201546001600160a01b039081166060830152600483015481166080830152600583015460a083015260068301541660c0820152600782015460e0820152600882018054610100909201916127c290614445565b80601f01602080910402602001604051908101604052809291908181526020018280546127ee90614445565b801561283b5780601f106128105761010080835404028352916020019161283b565b820191906000526020600020905b81548152906001019060200180831161281e57829003601f168201915b5050505050815260200160098201548152602001600a82018054806020026020016040519081016040528092919081815260200182805480156128a757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612889575b5050509183525050600b8201546001600160a01b03808216602084015260ff600160a01b92839004811615156040850152600c909401549081166060840152049091161515608090910152905092915050565b600061290581612e55565b506001600160a01b039092166000908152600c60205260409020600181019190915560020155565b600061293881612e55565b60028251116129895760405162461bcd60e51b815260206004820181905260248201527f56616c696461746f7273206d696e696d756d207175616e74697479206973203360448201526064016102be565b6040805160808101825283815260025460208083019190915260035482840152600160608301526001600160a01b0386166000908152600c82529290922081518051929391926129dc9284920190613a3d565b506020820151600182015560408201516002820155606090910151600390910155505050565b6000612a0d81612e55565b50600291909155600355565b6001600160a01b038082166000908152600d602052604080822054928516825281205460085460609391612a4c916143eb565b612a5691906143eb565b6001600160a01b038087166000908152600c60205260408120549293509190861615612a8a57612a876001826143eb565b90505b6001600160a01b03851615612aa757612aa46001826143eb565b90505b60008167ffffffffffffffff811115612ad057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612af9578160200160208202803683370190505b50905060005b8151811015612e495784612b11613376565b612b1b919061449b565b935060005b6001600160a01b038a166000908152600c6020526040902054811015612e36576001600160a01b038a81166000908152600c602052604090208054918b169183908110612b7d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614801590612bf057506001600160a01b038a81166000908152600c602052604090208054918a169183908110612bd857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b15612e24576001600160a01b038a166000908152600c602052604090208054612c4d91859184908110612c3357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316612f7f565b612e24576001600160a01b038a166000908152600c602052604081208054600d92919084908110612c8e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548511612db5576001600160a01b038a166000908152600c60205260409020805482908110612cf157634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316838381518110612d2f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152908b166000908152600c909152604081208054600d92919084908110612d7f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054612dae90876143eb565b9550612e36565b6001600160a01b038a166000908152600c602052604081208054600d92919084908110612df257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054612e2190866143eb565b94505b80612e2e81614480565b915050612b20565b5080612e4181614480565b915050612aff565b50979650505050505050565b612e5f81336133b2565b50565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610cc6576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055612ebc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610cc6576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000805b8351811015612fe957826001600160a01b0316848281518110612fb657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415612fd7576001915050610891565b80612fe181614480565b915050612f83565b5060009392505050565b6000805b855181101561309957846001600160a01b031686828151811061302a57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614156130875761304b84436143eb565b61305584836143cc565b1115801561307f57508261306981836143cc565b61307391906143a0565b61307d85436143eb565b105b91505061309f565b8061309181614480565b915050612ff7565b50600090505b949350505050565b6001600160a01b038085166000908152600a60209081526040808320878452825280832060068101549094168352600c90915281206001015460058301546130f5916064916116e391613213565b600b830154600c84015491925060009161311c916001600160a01b03908116911684613430565b9050831561314557600b830154600c840154613145916001600160a01b039081169116866134dc565b846131c35760068301546001600160a01b03166000908152600c6020526040812060020154600585015461317f916064916116e391613213565b60068501546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156131bc573d6000803e3d6000fd5b505061320a565b866001600160a01b03166108fc8285600501546131e091906143eb565b6040518115909202916000818181858888f19350505050158015613208573d6000803e3d6000fd5b505b50505050505050565b600061088e82846143cc565b600061088e82846143b8565b600080805b6001600160a01b0385166000908152600e6020526040902054811015613362576001600160a01b0385166000908152600e6020526040812080548390811061328857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600d845260408086205492909316808652600f85528386209186529352908320549193506132e7916064916116e3916132e09190839085613213565b8990613213565b6001600160a01b038084166000908152600f60209081526040808320938c168352929052205490915061331b9082906143eb565b6001600160a01b038084166000908152600f60209081526040808320938c168352929052205561334b81856143a0565b93505050808061335a90614480565b915050613230565b509392505050565b600061088e82846143a0565b60004442604051602001613394929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905090565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610cc6576133ee816001600160a01b031660146135d7565b6133f98360206135d7565b60405160200161340a929190614074565b60408051601f198184030181529082905262461bcd60e51b82526102be91600401614221565b6001600160a01b038083166000908152600d60205260408082205492861682528120549091829161349a916064916116e3916134939161346f9161336a565b6001600160a01b038a166000908152600d60205260409020546116e3906064613213565b8690613213565b905060006134a882856143eb565b905060006134b687846137fe565b905060006134c487846137fe565b90506134d081836143a0565b98975050505050505050565b6001600160a01b038083166000908152600d60205260408082205492861682528120549091613545916064916116e39161353e9161351a919061336a565b6001600160a01b0389166000908152600d60205260409020546116e3906064613213565b8590613213565b9050600061355382846143eb565b90506000613561868461390e565b9050600061356f868461390e565b6001600160a01b0388166000908152600d602052604081208054929350849290919061359c9084906143a0565b90915550506001600160a01b0386166000908152600d6020526040812080548392906135c99084906143a0565b909155505050505050505050565b606060006135e68360026143cc565b6135f19060026143a0565b67ffffffffffffffff81111561361757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613641576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061368657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106136df57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006137038460026143cc565b61370e9060016143a0565b90505b60018111156137af577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061375d57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061378157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936137a88161442e565b9050613711565b50831561088e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016102be565b600080805b6001600160a01b0385166000908152600e6020526040902054811015613362576001600160a01b0385166000908152600e6020526040812080548390811061385b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600d845260408086205492909316808652600f85528386209186529352908320549193506138b3916064916116e3916132e09190839085613213565b6040519091506001600160a01b0383169082156108fc029083906000818181858888f193505050501580156138ec573d6000803e3d6000fd5b506138f781856143a0565b93505050808061390690614480565b915050613803565b600080805b6001600160a01b0385166000908152600e6020526040902054811015613362576001600160a01b0385166000908152600e6020526040812080548390811061396b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600d845260408086205492909316808652600f85528386209186529352908320549193506139c3916064916116e3916132e09190839085613213565b6001600160a01b038084166000908152600f60209081526040808320938c16835292905220549091506139f6908261336a565b6001600160a01b038084166000908152600f60209081526040808320938c1683529290522055613a2681856143a0565b935050508080613a3590614480565b915050613913565b828054828255906000526020600020908101928215613a92579160200282015b82811115613a9257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613a5d565b50613a9e929150613b6c565b5090565b828054613aae90614445565b90600052602060002090601f016020900481019282613ad05760008555613a92565b82601f10613ae957805160ff1916838001178555613a92565b82800160010185558215613a92579182015b82811115613a92578251825591602001919060010190613afb565b508054613b2290614445565b6000825580601f10613b345750612e5f565b601f016020900490600052602060002090810190612e5f9190613b6c565b5080546000825590600052602060002090810190612e5f91905b5b80821115613a9e5760008155600101613b6d565b600082601f830112613b91578081fd5b8135602067ffffffffffffffff821115613bad57613bad6144db565b8160051b613bbc82820161436f565b838152828101908684018388018501891015613bd6578687fd5b8693505b85841015612e49578035613bed816144f1565b835260019390930192918401918401613bda565b600060208284031215613c12578081fd5b813561088e816144f1565b60008060408385031215613c2f578081fd5b8235613c3a816144f1565b91506020830135613c4a816144f1565b809150509250929050565b60008060408385031215613c67578182fd5b8235613c72816144f1565b9150602083013567ffffffffffffffff811115613c8d578182fd5b613c9985828601613b81565b9150509250929050565b60008060408385031215613cb5578182fd5b8235613cc0816144f1565b946020939093013593505050565b600080600060608486031215613ce2578081fd5b8335613ced816144f1565b9250602084013591506040840135613d0481614506565b809150509250925092565b60008060008060608587031215613d24578081fd5b8435613d2f816144f1565b935060208501359250604085013567ffffffffffffffff80821115613d52578283fd5b818701915087601f830112613d65578283fd5b813581811115613d73578384fd5b886020828501011115613d84578384fd5b95989497505060200194505050565b600080600060608486031215613da7578283fd5b8335613db2816144f1565b92506020848101359250604085013567ffffffffffffffff80821115613dd6578384fd5b818701915087601f830112613de9578384fd5b813581811115613dfb57613dfb6144db565b613e0d601f8201601f1916850161436f565b91508082528884828501011115613e22578485fd5b808484018584013784848284010152508093505050509250925092565b60008060008060808587031215613e54578384fd5b8435613e5f816144f1565b935060208501359250604085013591506060850135613e7d816144f1565b939692955090935050565b600080600060608486031215613e9c578283fd5b8335613ea7816144f1565b95602085013595506040909401359392505050565b600060208284031215613ecd578081fd5b813567ffffffffffffffff811115613ee3578182fd5b61309f84828501613b81565b600060208284031215613f00578081fd5b815161088e81614506565b600060208284031215613f1c578081fd5b5035919050565b60008060408385031215613f35578182fd5b823591506020830135613c4a816144f1565b600060208284031215613f58578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461088e578182fd5b60008060408385031215613f99578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015613fe05781516001600160a01b031687529582019590820190600101613fbb565b509495945050505050565b6000815480845260208085019450838352808320835b83811015613fe05781546001600160a01b031687529582019560019182019101614001565b6005811061404457634e487b7160e01b600052602160045260246000fd5b9052565b60008151808452614060816020860160208601614402565b601f01601f19169290920160200192915050565b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000825283516140ac816017850160208801614402565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516140e9816028840160208801614402565b01602801949350505050565b60006020825261088e6020830184613feb565b60006040825261411b6040830185613feb565b828103602084015261412d8185614048565b95945050505050565b6000604082526141496040830185613feb565b60208382038185015282855484600182811c91508083168061416c57607f831692505b85831081141561418a57634e487b7160e01b88526022600452602488fd5b8287526020870196508080156141a757600181146141b8576141e2565b60ff198516885286880195506141e2565b60008b815260209020895b858110156141dc5781548a8201529084019088016141c3565b89019650505b50939a9950505050505050505050565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b60006020825261088e6020830184614048565b600060208252614248602083018451614026565b6020830151604083015260408301516060830152606083015161427660808401826001600160a01b03169052565b5060808301516001600160a01b03811660a08401525060a083015160c083015260c08301516142b060e08401826001600160a01b03169052565b5060e0830151610100838101919091528301516101e06101208085018290526142dd610200860184614048565b9250808601519050610140818187015280870151915050610160601f19868503018187015261430c8483613fa8565b93508087015191505061018061432c818701836001600160a01b03169052565b86015190506101a06143418682018315159052565b86015190506101c061435d868201836001600160a01b03169052565b90950151151593019290925250919050565b604051601f8201601f1916810167ffffffffffffffff81118282101715614398576143986144db565b604052919050565b600082198211156143b3576143b36144af565b500190565b6000826143c7576143c76144c5565b500490565b60008160001904831182151516156143e6576143e66144af565b500290565b6000828210156143fd576143fd6144af565b500390565b60005b8381101561441d578181015183820152602001614405565b838111156118505750506000910152565b60008161443d5761443d6144af565b506000190190565b600181811c9082168061445957607f821691505b6020821081141561447a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614494576144946144af565b5060010190565b6000826144aa576144aa6144c5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612e5f57600080fd5b8015158114612e5f57600080fdfea2646970667358221220a460cbe3a634f27668286ab9e8ec3cff8e4fa2a8e5a3e3d16aaca087fe16fda364736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000005100000000000000000000000000d5582d46f20f08cd6133acecde1456df635ccdcc
-----Decoded View---------------
Arg [0] : penaltyPerc (uint256): 10
Arg [1] : lockingPeriod (uint256): 20736
Arg [2] : token (address): 0xd5582D46F20f08CD6133aceCdE1456DF635cCdcC
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000005100
Arg [2] : 000000000000000000000000d5582d46f20f08cd6133acecde1456df635ccdcc
Deployed Bytecode Sourcemap
26784:23442:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3875:10;31244:14;31310:18;;;:10;:18;;;;;;;;31329:19;:27;;;;;;31310:47;;;;;;;31376:13;;31393:23;;31376:13;;:40;;;;;;-1:-1:-1;;;31376:40:0;;;;;;;;;;31368:118;;;;-1:-1:-1;;;31368:118:0;;21035:2:1;31368:118:0;;;21017:21:1;21074:2;21054:18;;;21047:30;21113:34;21093:18;;;21086:62;21184:34;21164:18;;;21157:62;21256:3;21235:19;;;21228:32;21277:19;;31368:118:0;;;;;;;;;31521:9;31505:7;:12;;;:25;31497:93;;;;-1:-1:-1;;;31497:93:0;;17392:2:1;31497:93:0;;;17374:21:1;17431:2;17411:18;;;17404:30;17470:34;17450:18;;;17443:62;17541:25;17521:18;;;17514:53;17584:19;;31497:93:0;17364:245:1;31497:93:0;31684:15;;;;31723:11;;;;-1:-1:-1;;;;;31684:15:0;;;;:52;;31709:26;;:9;;:13;:26::i;:::-;31684:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31800:42:0;;-1:-1:-1;;31800:42:0;31816:26;31800:42;;;31891:17;;;;31874:15;;;;31858:62;;31910:9;14245:25:1;;-1:-1:-1;;;;;31874:15:0;;;;31858:62;;;;;14233:2:1;14218:18;31858:62:0;;;;;;;31206:722;;26784:23442;;;;;11049:204;;;;;;;;;;-1:-1:-1;11049:204:0;;;;;:::i;:::-;;:::i;:::-;;;14072:14:1;;14065:22;14047:41;;14035:2;14020:18;11049:204:0;;;;;;;;43607:172;;;;;;;;;;-1:-1:-1;43607:172:0;;;;;:::i;:::-;;:::i;:::-;;32660:131;;;;;;;;;;-1:-1:-1;32660:131:0;;;;;:::i;:::-;-1:-1:-1;;;;;32748:18:0;32724:4;32748:18;;;:9;:18;;;;;:35;;;;32660:131;;;;14245:25:1;;;14233:2;14218:18;32660:131:0;14200:76:1;43787:849:0;;;;;;;;;;-1:-1:-1;43787:849:0;;;;;:::i;:::-;;:::i;30654:180::-;;;;;;;;;;-1:-1:-1;30654:180:0;;;;;:::i;:::-;;:::i;12885:131::-;;;;;;;;;;-1:-1:-1;12885:131:0;;;;;:::i;:::-;12959:7;12986:12;;;;;;;;;;:22;;;;12885:131;33274:142;;;;;;;;;;-1:-1:-1;33274:142:0;;;;;:::i;:::-;;:::i;13326:147::-;;;;;;;;;;-1:-1:-1;13326:147:0;;;;;:::i;:::-;;:::i;33028:131::-;;;;;;;;;;-1:-1:-1;33028:131:0;;;;;:::i;:::-;;:::i;14470:218::-;;;;;;;;;;-1:-1:-1;14470:218:0;;;;;:::i;:::-;;:::i;35612:1181::-;;;;;;;;;;-1:-1:-1;35612:1181:0;;;;;:::i;:::-;;:::i;33167:99::-;;;;;;;;;;-1:-1:-1;33244:14:0;;33167:99;;32799:121;;;;;;;;;;-1:-1:-1;32799:121:0;;;;;:::i;:::-;;:::i;30976:103::-;;;;;;;;;;-1:-1:-1;31056:15:0;;30976:103;;50130:93;;;;;;;;;;-1:-1:-1;50203:12:0;;50130:93;;31087:111;;;;;;;;;;-1:-1:-1;31175:14:0;;31087:111;;-1:-1:-1;;;;;31175:14:0;;;10924:74:1;;10912:2;10897:18;31087:111:0;10879:125:1;32928:92:0;;;;;;;;;;-1:-1:-1;33000:12:0;;32928:92;;44644:2979;;;;;;;;;;-1:-1:-1;44644:2979:0;;;;;:::i;:::-;;:::i;30842:126::-;;;;;;;;;;-1:-1:-1;30842:126:0;;;;;:::i;:::-;;:::i;11345:147::-;;;;;;;;;;-1:-1:-1;11345:147:0;;;;;:::i;:::-;11431:4;11455:12;;;;;;;;;;;-1:-1:-1;;;;;11455:29:0;;;;;;;;;;;;;;;11345:147;32525:127;;;;;;;;;;-1:-1:-1;32525:127:0;;;;;:::i;:::-;;:::i;40841:2758::-;;;;;;;;;;-1:-1:-1;40841:2758:0;;;;;:::i;:::-;;:::i;10450:49::-;;;;;;;;;;-1:-1:-1;10450:49:0;10495:4;10450:49;;47791:1186;;;;;;;;;;-1:-1:-1;47791:1186:0;;;;;:::i;:::-;;:::i;49981:141::-;;;;;;;;;;-1:-1:-1;49981:141:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;50088:15:0;;;;;:7;:15;;;;;:26;;;;;;;;;;;;;50081:33;;;;;;;;;;;;;;;;;;;;49981:141;;;;;26059:13:1;;26041:32;;26129:4;26117:17;;;26111:24;26089:20;;;26082:54;;;;26014:18;49981:141:0;25996:146:1;13766:149:0;;;;;;;;;;-1:-1:-1;13766:149:0;;;;;:::i;:::-;;:::i;48985:988::-;;;;;;;;;;-1:-1:-1;48985:988:0;;;;;:::i;:::-;;:::i;47631:152::-;;;;;;;;;;-1:-1:-1;47631:152:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32266:251::-;;;;;;;;;;-1:-1:-1;32266:251:0;;;;;:::i;:::-;;:::i;31936:322::-;;;;;;;;;;-1:-1:-1;31936:322:0;;;;;:::i;:::-;;:::i;30488:158::-;;;;;;;;;;-1:-1:-1;30488:158:0;;;;;:::i;:::-;;:::i;19994:98::-;20052:7;20079:5;20083:1;20079;:5;:::i;:::-;20072:12;;19994:98;;;;;:::o;11049:204::-;11134:4;11158:47;;;11173:32;11158:47;;:87;;-1:-1:-1;8428:25:0;8413:40;;;;11209:36;8304:157;43607:172;29707:10;29739:1;29697:21;;;:9;:21;;;;;:39;29689:89;;;;-1:-1:-1;;;29689:89:0;;21509:2:1;29689:89:0;;;21491:21:1;21548:2;21528:18;;;21521:30;21587:34;21567:18;;;21560:62;-1:-1:-1;;;21638:18:1;;;21631:31;21679:19;;29689:89:0;21481:223:1;29689:89:0;43755:9:::1;43743:10;-1:-1:-1::0;;;;;43726:45:0::1;43733:8;-1:-1:-1::0;;;;;43726:45:0::1;;43766:4;;43726:45;;;;;;;:::i;:::-;;;;;;;;43607:172:::0;;;;:::o;43787:849::-;43889:10;43918:1;43879:21;;;:9;:21;;;;;:36;;;:40;;;43878:70;;-1:-1:-1;43925:10:0;-1:-1:-1;;;;;43925:22:0;;;43878:70;43870:136;;;;-1:-1:-1;;;43870:136:0;;18177:2:1;43870:136:0;;;18159:21:1;18216:2;18196:18;;;18189:30;18255:34;18235:18;;;18228:62;18326:23;18306:18;;;18299:51;18367:19;;43870:136:0;18149:243:1;43870:136:0;-1:-1:-1;;;;;44043:20:0;;44017:23;44043:20;;;:10;:20;;;;;;;;:31;;;;;;;;44110:26;44093:13;;;;:43;;;;;;-1:-1:-1;;;44093:43:0;;;;;;;;;;44085:97;;;;-1:-1:-1;;;44085:97:0;;22314:2:1;44085:97:0;;;22296:21:1;22353:2;22333:18;;;22326:30;22392:34;22372:18;;;22365:62;-1:-1:-1;;;22443:18:1;;;22436:39;22492:19;;44085:97:0;22286:231:1;44085:97:0;44195:41;;-1:-1:-1;;44195:41:0;44211:25;44195:41;;;44268:12;44247:18;;;:33;44336:15;;;;44316:60;;-1:-1:-1;;;;;44336:15:0;-1:-1:-1;;44316:19:0;:60::i;:::-;44291:85;;;;:22;;;;:85;;;;;;:::i;:::-;-1:-1:-1;44387:22:0;;;:35;;-1:-1:-1;;;;;;44433:27:0;;;;;;44471:23;;;:36;;44518:28;;;;;44562:66;;44594:9;;44582:10;;-1:-1:-1;;;;;44562:66:0;;;;;;;44605:22;;;;44562:66;:::i;:::-;;;;;;;;43787:849;;;:::o;30654:180::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;30761:13:0::1;:25:::0;;;;30797:15:::1;:29:::0;30654:180::o;33274:142::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;33375:14:0::1;:33:::0;33274:142::o;13326:147::-;12959:7;12986:12;;;;;;;;;;:22;;;10941:16;10952:4;10941:10;:16::i;:::-;13440:25:::1;13451:4;13457:7;13440:10;:25::i;:::-;13326:147:::0;;;:::o;33028:131::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;33122:12:0::1;:29:::0;33028:131::o;14470:218::-;-1:-1:-1;;;;;14566:23:0;;3875:10;14566:23;14558:83;;;;-1:-1:-1;;;14558:83:0;;23200:2:1;14558:83:0;;;23182:21:1;23239:2;23219:18;;;23212:30;23278:34;23258:18;;;23251:62;23349:17;23329:18;;;23322:45;23384:19;;14558:83:0;23172:237:1;14558:83:0;14654:26;14666:4;14672:7;14654:11;:26::i;:::-;14470:218;;:::o;35612:1181::-;-1:-1:-1;;;;;35717:18:0;;35753:1;35717:18;;;:9;:18;;;;;:33;;;35709:85;;;;-1:-1:-1;;;35709:85:0;;15106:2:1;35709:85:0;;;15088:21:1;15145:2;15125:18;;;15118:30;15184:34;15164:18;;;15157:62;15255:5;15235:18;;;15228:33;15278:19;;35709:85:0;15078:225:1;35709:85:0;35824:10;35866:1;35813:22;;;:10;:22;;;;;;;;:33;;;;;;;;:41;;;-1:-1:-1;;;;;35813:41:0;:55;35805:114;;;;-1:-1:-1;;;35805:114:0;;23616:2:1;35805:114:0;;;23598:21:1;23655:2;23635:18;;;23628:30;23694:34;23674:18;;;23667:62;23765:16;23745:18;;;23738:44;23799:19;;35805:114:0;23588:236:1;35805:114:0;35968:373;;;;;;;;;;-1:-1:-1;35968:373:0;;;;36010:1;35968:373;;;;36022:1;35968:373;;;;36050:1;-1:-1:-1;;;;;35968:373:0;;;;;36084:1;-1:-1:-1;;;;;35968:373:0;;;;;36094:1;35968:373;;;;36105:7;-1:-1:-1;;;;;35968:373:0;;;;;36124:9;35968:373;;;;36147:4;35968:373;;;;36164:12;35968:373;;;;36193:52;36213:7;36230:1;36242;36193:19;:52::i;:::-;35968:373;;36270:1;35968:373;;;;;;;;;;;;;;;;;;;;;;;;;;;35943:10;35932:22;;:10;:22;;;;;:33;;;;;;:409;;;;:33;;-1:-1:-1;;35932:409:0;35968:373;35932:409;;;;;;;-1:-1:-1;;;35932:409:0;;;;;;;;;;;;;-1:-1:-1;35932:409:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35932:409:0;;;-1:-1:-1;;;;;;35932:409:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;35932:409:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;35932:409:0;;;;;;;;;;;;;;;-1:-1:-1;;;35932:409:0;;;-1:-1:-1;;;;;;35932:409:0;;;-1:-1:-1;;;;;35932:409:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36369:10;35932:409;36401:22;;;:10;:22;;;;;;;;:33;;;;;;;;;;36357:99;;36390:9;;36357:99;;;36369:10;36357:99;;;;36401:48;;;36451:4;;36357:99;:::i;:::-;;;;;;;;36492:10;36513:1;36472:31;;;36534:10;36472:31;36534:22;;;;;;;36472:19;36557:31;;;;;;36534:55;;;;;;;:61;36599:23;;36534:61;;:88;;;;;;-1:-1:-1;;;36534:88:0;;;;;;;;;;36531:190;;;36661:10;36650:22;;;;:10;:22;;;;;;;;36673:19;:31;;;;;;36650:55;;;;;;;36643:62;;-1:-1:-1;;36643:62:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36643:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36650:55;36643:62;;;;36650:22;36643:62;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36643:62:0;;;;;-1:-1:-1;;;;;;36643:62:0;;;;;;;;;;;;;;;;;36531:190;-1:-1:-1;36762:10:0;36742:31;;;;:19;:31;;;;;:43;-1:-1:-1;35612:1181:0:o;32799:121::-;29707:10;29739:1;29697:21;;;:9;:21;;;;;:39;29689:89;;;;-1:-1:-1;;;29689:89:0;;21509:2:1;29689:89:0;;;21491:21:1;21548:2;21528:18;;;21521:30;21587:34;21567:18;;;21560:62;-1:-1:-1;;;21638:18:1;;;21631:31;21679:19;;29689:89:0;21481:223:1;29689:89:0;32877:10:::1;32867:21;::::0;;;:9:::1;:21;::::0;;;;:38:::1;;:45:::0;32799:121::o;44644:2979::-;44771:10;44785:1;44751:31;;;:19;:31;;;;;;44743:95;;;;-1:-1:-1;;;44743:95:0;;18944:2:1;44743:95:0;;;18926:21:1;18983:2;18963:18;;;18956:30;19022:34;19002:18;;;18995:62;19093:17;19073:18;;;19066:45;19128:19;;44743:95:0;18916:237:1;44743:95:0;-1:-1:-1;;;;;44875:20:0;;;44849:23;44875:20;;;:10;:20;;;;;;;;:31;;;;;;;;44952:15;;;;;;;44942:26;;:9;:26;;;;;;44925:67;;;;;;;;;;;;;;;;;;;;;;44942:26;44925:67;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44925:67:0;;;;;;;;;;;;;;;;;;;;;44981:10;44925:16;:67::i;:::-;44917:143;;;;-1:-1:-1;;;44917:143:0;;19774:2:1;44917:143:0;;;19756:21:1;19813:2;19793:18;;;19786:30;19852:34;19832:18;;;19825:62;19923:33;19903:18;;;19896:61;19974:19;;44917:143:0;19746:253:1;44917:143:0;45096:25;45079:13;;;;:42;;;;;;-1:-1:-1;;;45079:42:0;;;;;;;;;;45071:96;;;;-1:-1:-1;;;45071:96:0;;20625:2:1;45071:96:0;;;20607:21:1;20664:2;20644:18;;;20637:30;20703:34;20683:18;;;20676:62;-1:-1:-1;;;20754:18:1;;;20747:39;20803:19;;45071:96:0;20597:231:1;45071:96:0;45200:167;45230:7;:22;;45200:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45200:167:0;;;;;;;;;;;;;;;;;;;;;45271:10;45300:7;:18;;;45337:15;;45200:11;:167::i;:::-;45178:262;;;;-1:-1:-1;;;45178:262:0;;19360:2:1;45178:262:0;;;19342:21:1;19399:2;19379:18;;;19372:30;19438:34;19418:18;;;19411:62;-1:-1:-1;;;19489:18:1;;;19482:43;19542:19;;45178:262:0;19332:235:1;45178:262:0;45456:22;;;;-1:-1:-1;;;;;45456:22:0;45453:2163;;45509:22;;;:35;;-1:-1:-1;;;;;;45559:28:0;45534:10;-1:-1:-1;;;;45559:28:0;;-1:-1:-1;;;45559:28:0;;;;;;;;;45623:12;45602:18;;;:33;45695:15;;;;45675:72;;-1:-1:-1;;;;;45695:15:0;;;;45712:22;-1:-1:-1;45675:19:0;:72::i;:::-;45650:97;;;;:22;;;;:97;;;;;;:::i;:::-;-1:-1:-1;45787:15:0;;;;45767:71;;45804:9;;-1:-1:-1;;;;;45787:15:0;;;;45767:71;;;;;;;;45815:22;;;;45767:71;:::i;:::-;;;;;;;;45453:2163;;;45859:23;;;;-1:-1:-1;;;;;45859:23:0;45856:1760;;45913:23;;;:36;;-1:-1:-1;;;;;;45964:29:0;45939:10;-1:-1:-1;;;;45964:29:0;;-1:-1:-1;;;45964:29:0;;;;;;;;;;;;;46011:19;;;;46034:20;;;;45964:29;46034:20;;;46011:43;;:19;;;;;;;;:43;;;46008:580;;;46075:58;46088:8;46098:9;46110:7;:19;;;;;;;;;;;;46109:20;46131:1;46075:12;:58::i;:::-;46152:31;;46168:15;-1:-1:-1;;46152:31:0;;;;;;46226:15;;;;46254:19;;;;46207:67;;;-1:-1:-1;;;46254:19:0;;;;;14072:14:1;14065:22;14047:41;;46207:67:0;46243:9;;-1:-1:-1;;;;;46226:15:0;;;;46207:67;;;;;;;;;14035:2:1;46207:67:0;;;46008:580;;;46336:12;46315:18;;;:33;46412:15;;;;46429:22;;;;46453:23;;;;46392:85;;-1:-1:-1;;;;;46412:15:0;;;;46429:22;;;46453:23;46392:19;:85::i;46008:580::-;45856:1760;;;46623:19;;;;;-1:-1:-1;;;46623:19:0;;;;:29;;;;;;46620:852;;;46740:12;;46711:23;;;;-1:-1:-1;;;;;46711:23:0;46673:15;46691:44;;;:19;:44;;;;;;46673:15;;46691:71;;46758:3;;46691:62;;:44;:48;:62::i;:::-;:66;;:71::i;:::-;46820:23;;;;46673:89;;-1:-1:-1;46781:22:0;;46806:47;;-1:-1:-1;;;;;46820:23:0;46673:89;46806:13;:47::i;:::-;46872:23;;;:36;;-1:-1:-1;;;;;;46927:29:0;46898:10;-1:-1:-1;;;;46927:29:0;;-1:-1:-1;;;46927:29:0;;;;;;;;;;;;47010:19;;;;46781:72;;-1:-1:-1;46975:71:0;;46988:8;;46998:9;;46927:29;47010:19;;;;47009:20;46781:72;46975:12;:71::i;:::-;46620:852;;;;;47153:12;;47125:22;;;;-1:-1:-1;;;;;47125:22:0;47087:15;47105:43;;;:19;:43;;;;;;47087:15;;47105:70;;47171:3;;47105:61;;:43;:47;:61::i;:70::-;47233:22;;;;47087:88;;-1:-1:-1;47194:22:0;;47219:46;;-1:-1:-1;;;;;47233:22:0;47087:88;47219:13;:46::i;:::-;47284:22;;;:35;;-1:-1:-1;;;;;;47338:28:0;47309:10;-1:-1:-1;;;;47338:28:0;;-1:-1:-1;;;47338:28:0;;;;;;;;;;;;;47194:71;;-1:-1:-1;47385:71:0;;47398:8;;47408:9;;47338:28;47420:19;;;47419:20;47194:71;47385:12;:71::i;:::-;46620:852;;;47486:31;;47502:15;-1:-1:-1;;47486:31:0;;;;;;47556:15;;;;47584:19;;;;47537:67;;-1:-1:-1;;;47584:19:0;;;;;14072:14:1;14065:22;14047:41;;47573:9:0;;-1:-1:-1;;;;;47556:15:0;;;;47537:67;;;;;;14035:2:1;14020:18;47537:67:0;14002:92:1;45856:1760:0;44644:2979;;;;:::o;30842:126::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;30936:15:0::1;:24:::0;30842:126::o;32525:127::-;29707:10;29739:1;29697:21;;;:9;:21;;;;;:39;29689:89;;;;-1:-1:-1;;;29689:89:0;;21509:2:1;29689:89:0;;;21491:21:1;21548:2;21528:18;;;21521:30;21587:34;21567:18;;;21560:62;-1:-1:-1;;;21638:18:1;;;21631:31;21679:19;;29689:89:0;21481:223:1;29689:89:0;32614:10:::1;32604:21;::::0;;;:9:::1;:21;::::0;;;;;;;:40;;::::1;::::0;;::::1;::::0;::::1;:::i;40841:2758::-:0;40989:10;41003:1;40969:31;;;:19;:31;;;;;;40961:95;;;;-1:-1:-1;;;40961:95:0;;18944:2:1;40961:95:0;;;18926:21:1;18983:2;18963:18;;;18956:30;19022:34;19002:18;;;18995:62;19093:17;19073:18;;;19066:45;19128:19;;40961:95:0;18916:237:1;40961:95:0;-1:-1:-1;;;;;41093:20:0;;;41067:23;41093:20;;;:10;:20;;;;;;;;:31;;;;;;;;41170:15;;;;;;;41160:26;;:9;:26;;;;;;41143:67;;;;;;;;;;;;;;;;;;;;;;41160:26;41143:67;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41143:67:0;;;;;;;;;;;;;;;;;;;;41199:10;41143:16;:67::i;:::-;41135:143;;;;-1:-1:-1;;;41135:143:0;;19774:2:1;41135:143:0;;;19756:21:1;19813:2;19793:18;;;19786:30;19852:34;19832:18;;;19825:62;19923:33;19903:18;;;19896:61;19974:19;;41135:143:0;19746:253:1;41135:143:0;41314:19;41297:13;;;;:36;;;;;;-1:-1:-1;;;41297:36:0;;;;;;;;;;41289:85;;;;-1:-1:-1;;;41289:85:0;;16987:2:1;41289:85:0;;;16969:21:1;17026:2;17006:18;;;16999:30;17065:34;17045:18;;;17038:62;17136:6;17116:18;;;17109:34;17160:19;;41289:85:0;16959:226:1;41289:85:0;41407:167;41437:7;:22;;41407:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41407:167:0;;;;;;;;;;;;;;;;;;;;41478:10;41507:7;:18;;;41544:15;;41407:11;:167::i;:::-;41385:262;;;;-1:-1:-1;;;41385:262:0;;19360:2:1;41385:262:0;;;19342:21:1;19399:2;19379:18;;;19372:30;19438:34;19418:18;;;19411:62;-1:-1:-1;;;19489:18:1;;;19482:43;19542:19;;41385:262:0;19332:235:1;41385:262:0;41663:22;;;;-1:-1:-1;;;;;41663:22:0;41660:1932;;41716:22;;;:35;;-1:-1:-1;;;;;;41716:35:0;;;41741:10;41716:35;;;;;;;41766:12;;:19;;;41800:15;;;:25;;-1:-1:-1;;;;;41800:25:0;;;;;;;;;;41861:12;41840:18;;;:33;41933:15;;;;41913:72;;41933:15;;;41716:22;41913:19;:72::i;:::-;41888:97;;;;:22;;;;:97;;;;;;:::i;:::-;-1:-1:-1;42027:15:0;;;;42005:94;;42044:9;;-1:-1:-1;;;;;42027:15:0;;;;42005:94;;;;;;;;42055:22;;;;42079:19;;;;42005:94;:::i;:::-;;;;;;;;41660:1932;;;42120:23;;;;-1:-1:-1;;;;;42120:23:0;42117:1475;;42174:23;;;:36;;42200:10;-1:-1:-1;;;;;;42174:36:0;;;;;;;42225:16;;;:23;;;42263:19;;;:29;;;;;-1:-1:-1;;;;;42263:29:0;;;;;-1:-1:-1;42310:12:0;;;:32;;:74;;;;-1:-1:-1;42365:19:0;;;;42346:15;;;;-1:-1:-1;;;;;42346:15:0;;;42365:19;;42346:38;42310:74;42307:631;;;42419:44;42447:15;;42419:23;42428:13;;42419:4;:8;;:23;;;;:::i;:44::-;42405:11;;;:58;42482:39;;-1:-1:-1;;42482:39:0;42498:23;42482:39;;;42568:15;;;;42545:56;;14245:25:1;;;42585:9:0;;-1:-1:-1;;;;;42568:15:0;;;;42545:56;;;;;;14233:2:1;14218:18;42545:56:0;;;;;;;42307:631;;;42663:12;42642:18;;;:33;42739:15;;;;42756:22;;;;42780:23;;;;42719:85;;-1:-1:-1;;;;;42739:15:0;;;;42756:22;;;42780:23;42719:19;:85::i;42307:631::-;42117:1475;;;42989:4;42973:7;:12;;;:20;:50;;;;-1:-1:-1;42997:15:0;;;;-1:-1:-1;;;;;42997:26:0;;;:15;;:26;42973:50;42970:374;;;43044:23;;;:36;;43070:10;-1:-1:-1;;;;;;43044:36:0;;;;;;;43099:16;;;:23;;;43141:19;;;:29;;;;;-1:-1:-1;;;;;43141:29:0;;;;;42970:374;;;43211:22;;;:35;;43236:10;-1:-1:-1;;;;;;43211:35:0;;;;;;;-1:-1:-1;43265:12:0;;:19;;;43303:15;;;:25;;;;;-1:-1:-1;;;;;43303:25:0;;;;;42970:374;43358:12;;;:19;;;43434:15;;43415:13;;43406:44;;43434:15;43406:23;;43373:4;;43406:8;:23::i;:44::-;43392:11;;;:58;43465:39;;-1:-1:-1;;43465:39:0;43481:23;43465:39;;;43547:15;;;;43524:56;;14245:25:1;;;43564:9:0;;-1:-1:-1;;;;;43547:15:0;;;;43524:56;;;;;;14233:2:1;14218:18;43524:56:0;;;;;;;42117:1475;40841:2758;;;;;:::o;47791:1186::-;-1:-1:-1;;;;;47869:23:0;;47861:65;;;;-1:-1:-1;;;47861:65:0;;15871:2:1;47861:65:0;;;15853:21:1;15910:2;15890:18;;;15883:30;15949:31;15929:18;;;15922:59;15998:18;;47861:65:0;15843:179:1;47861:65:0;47954:1;47945:6;:10;47937:37;;;;-1:-1:-1;;;47937:37:0;;16229:2:1;47937:37:0;;;16211:21:1;16268:2;16248:18;;;16241:30;16307:16;16287:18;;;16280:44;16341:18;;47937:37:0;16201:164:1;47937:37:0;48002:14;;:62;;;;;48030:10;48002:62;;;11272:34:1;48050:4:0;11322:18:1;;;11315:43;11374:18;;;11367:34;;;47987:12:0;;-1:-1:-1;;;;;48002:14:0;;:27;;11184:18:1;;48002:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47987:77;;48078:7;48075:895;;;48117:12;;:24;;48134:6;48117:16;:24::i;:::-;48102:12;:39;48209:10;48156:18;48201:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;48201:30:0;;;;;;;;;:37;:41;48197:102;;-1:-1:-1;48279:4:0;48197:102;48361:10;48353:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;48353:30:0;;;;;;;;;:37;:49;;48395:6;48353:41;:49::i;:::-;48321:10;48313:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;48313:30:0;;;;;;;;;:89;48480:14;;48465:29;;:12;:29;:::i;:::-;48425:10;48417:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;48417:30:0;;;;;;;;;:45;;:77;;;;48542:19;:30;;;;:42;;48577:6;48542:34;:42::i;:::-;-1:-1:-1;;;;;48509:30:0;;;;;;:19;:30;;;;;:75;48603:22;;;;:93;;-1:-1:-1;;;;;;48646:28:0;;;;;;:17;:28;;;;;;;;;48629:58;;;;;;;;;;;;;;;;;;;;;;48646:28;48629:58;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48629:58:0;;;;;;;;;;;;;;;;;;;;48676:10;48629:16;:58::i;:::-;:67;48603:93;48599:179;;;-1:-1:-1;;;;;48717:28:0;;;;;;:17;:28;;;;;;;:45;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48717:45:0;48751:10;48717:45;;;48599:179;48804:10;48835:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;48797:84:0;;48835:30;;;;;;;;;;:45;;;48797:84;;26503:25:1;;;26544:18;;;26537:34;48797:84:0;;48804:10;48797:84;;26476:18:1;48797:84:0;;;;;;;48075:895;;;;48914:44;;-1:-1:-1;;;48914:44:0;;21911:2:1;48914:44:0;;;21893:21:1;21950:2;21930:18;;;21923:30;21989:34;21969:18;;;21962:62;22060:4;22040:18;;;22033:32;22082:19;;48914:44:0;21883:224:1;13766:149:0;12959:7;12986:12;;;;;;;;;;:22;;;10941:16;10952:4;10941:10;:16::i;:::-;13881:26:::1;13893:4;13899:7;13881:11;:26::i;48985:988::-:0;49074:1;49065:6;:10;49057:39;;;;-1:-1:-1;;;49057:39:0;;18599:2:1;49057:39:0;;;18581:21:1;18638:2;18618:18;;;18611:30;18677:18;18657;;;18650:46;18713:18;;49057:39:0;18571:166:1;49057:39:0;49123:10;49115:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;49115:30:0;;;;;;;;;:37;:47;-1:-1:-1;49115:47:0;49107:127;;;;-1:-1:-1;;;49107:127:0;;22724:2:1;49107:127:0;;;22706:21:1;22763:2;22743:18;;;22736:30;22802:34;22782:18;;;22775:62;22873:34;22853:18;;;22846:62;22945:5;22924:19;;;22917:34;22968:19;;49107:127:0;22696:297:1;49107:127:0;49294:10;49286:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;49286:30:0;;;;;;;;;:45;;;49335:12;-1:-1:-1;49286:61:0;49278:124;;;;-1:-1:-1;;;49278:124:0;;20206:2:1;49278:124:0;;;20188:21:1;20245:2;20225:18;;;20218:30;20284:34;20264:18;;;20257:62;20355:20;20335:18;;;20328:48;20393:19;;49278:124:0;20178:240:1;49278:124:0;49515:14;;:43;;;;;49539:10;49515:43;;;11586:74:1;11676:18;;;11669:34;;;49500:12:0;;-1:-1:-1;;;;;49515:14:0;;:23;;11559:18:1;;49515:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49500:58;;49572:7;49569:397;;;49612:6;49596:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;49681:10:0;49673:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;49673:30:0;;;;;;;;;:37;:46;;49713:6;;49673:46;:::i;:::-;49641:10;49633:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;49633:30:0;;;;;;;;;:86;;;;49767:19;:30;;;;:39;;49800:6;;49767:39;:::i;:::-;-1:-1:-1;;;;;49734:30:0;;;;;;:19;:30;;;;;;;:72;;;;49826:39;;49835:10;;49826:39;;;;49858:6;14245:25:1;;14233:2;14218:18;;14200:76;49826:39:0;;;;;;;;49569:397;;;49898:56;;-1:-1:-1;;;49898:56:0;;16572:2:1;49898:56:0;;;16554:21:1;16611:2;16591:18;;;16584:30;16650:34;16630:18;;;16623:62;16721:16;16701:18;;;16694:44;16755:19;;49898:56:0;16544:236:1;47631:152:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47744:20:0;;;;:10;:20;;;;;:31;;;;;;;;47737:38;;;;;;;;;;-1:-1:-1;;47737:38:0;;;;;;;;;;;;-1:-1:-1;;;47737:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;47737:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47737:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47737:38:0;;;;;;;;;;;;;;;;-1:-1:-1;;;47737:38:0;;;-1:-1:-1;;47737:38:0;;;;-1:-1:-1;;;;;47737:38:0;;;;;;;;-1:-1:-1;;;47737:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47631:152:0;;;;:::o;32266:251::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;;;;;;32407:18:0;;::::1;32380:24;32407:18:::0;;;:9:::1;:18;::::0;;;;32436:23:::1;::::0;::::1;:31:::0;;;;32478:23:::1;;:31:::0;32266:251::o;31936:322::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;32069:1:::1;32054:5;:12;:16;32046:61;;;::::0;-1:-1:-1;;;32046:61:0;;17816:2:1;32046:61:0::1;::::0;::::1;17798:21:1::0;;;17835:18;;;17828:30;17894:34;17874:18;;;17867:62;17946:18;;32046:61:0::1;17788:182:1::0;32046:61:0::1;32139:111;::::0;;::::1;::::0;::::1;::::0;;;;;32183:15:::1;::::0;32139:111:::1;::::0;;::::1;::::0;;;;32216:11:::1;::::0;32139:111;;;;32247:1:::1;32139:111:::0;;;;-1:-1:-1;;;;;32118:18:0;::::1;-1:-1:-1::0;32118:18:0;;;:9:::1;:18:::0;;;;;;:132;;;;32139:111;;32118:18;;:132:::1;::::0;:18;;:132:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;32118:132:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;31936:322:0:o;30488:158::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;30585:15:0::1;:23:::0;;;;30619:11:::1;:19:::0;30488:158::o;34129:1475::-;-1:-1:-1;;;;;34336:29:0;;;34262:24;34336:29;;;:19;:29;;;;;;;34304;;;;;;;;34289:12;;34233:16;;34336:29;34289:44;;;:::i;:::-;:76;;;;:::i;:::-;-1:-1:-1;;;;;34424:18:0;;;34376:13;34424:18;;;:9;:18;;;;;:36;34262:103;;-1:-1:-1;34376:13:0;34424:36;34475:22;;;34471:72;;34514:17;34530:1;34514:17;;:::i;:::-;;;34471:72;-1:-1:-1;;;;;34557:22:0;;;34553:72;;34596:17;34612:1;34596:17;;:::i;:::-;;;34553:72;34635:23;34675:12;34661:27;;;;;;-1:-1:-1;;;34661:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34661:27:0;;34635:53;;34705:6;34701:872;34719:6;:13;34715:1;:17;34701:872;;;34773:16;34762:8;:6;:8::i;:::-;:27;;;;:::i;:::-;34754:35;;34808:6;34804:758;-1:-1:-1;;;;;34822:18:0;;;;;;:9;:18;;;;;:36;34818:40;;34804:758;;;-1:-1:-1;;;;;34888:18:0;;;;;;;:9;:18;;;;;:32;;:44;;;;34918:1;;34888:32;;;;-1:-1:-1;;;34888:32:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34888:32:0;:44;;;;:92;;-1:-1:-1;;;;;;34936:18:0;;;;;;;:9;:18;;;;;:32;;:44;;;;34966:1;;34936:32;;;;-1:-1:-1;;;34936:32:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34936:32:0;:44;;34888:92;34884:663;;;-1:-1:-1;;;;;35034:18:0;;;;;;:9;:18;;;;;:32;;35009:58;;35026:6;;35064:1;;35034:32;;;;-1:-1:-1;;;35034:32:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35034:32:0;35009:16;:58::i;:::-;35005:523;;-1:-1:-1;;;;;35138:18:0;;35118:53;35138:18;;;:9;:18;;;;;:32;;35118:19;;:53;35138:18;35168:1;;35138:32;;;;-1:-1:-1;;;35138:32:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35138:32:0;35118:53;;;;;;;;;;;;;35109:62;;35105:311;;-1:-1:-1;;;;;35216:18:0;;;;;;:9;:18;;;;;:32;;35246:1;;35216:32;;;;-1:-1:-1;;;35216:32:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35216:32:0;35204:6;35211:1;35204:9;;;;;;-1:-1:-1;;;35204:9:0;;;;;;;;;-1:-1:-1;;;;;35204:44:0;;;:9;;;;;;;;;;:44;;;;35319:18;;;35299:53;35319:18;;;:9;:18;;;;;;:32;;35299:19;;:53;35319:18;35349:1;;35319:32;;;;-1:-1:-1;;;35319:32:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35319:32:0;35299:53;;;;;;;;;;;;;35279:73;;;;:::i;:::-;;;35383:5;;35105:311;-1:-1:-1;;;;;35471:18:0;;35451:53;35471:18;;;:9;:18;;;;;:32;;35451:19;;:53;35471:18;35501:1;;35471:32;;;;-1:-1:-1;;;35471:32:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35471:32:0;35451:53;;;;;;;;;;;;;35442:62;;;;:::i;:::-;;;35005:523;34860:3;;;;:::i;:::-;;;;34804:758;;;-1:-1:-1;34734:3:0;;;;:::i;:::-;;;;34701:872;;;-1:-1:-1;35590:6:0;34129:1475;-1:-1:-1;;;;;;;34129:1475:0:o;11796:105::-;11863:30;11874:4;3875:10;11863;:30::i;:::-;11796:105;:::o;16067:238::-;11431:4;11455:12;;;;;;;;;;;-1:-1:-1;;;;;11455:29:0;;;;;;;;;;;;16146:152;;16190:6;:12;;;;;;;;;;;-1:-1:-1;;;;;16190:29:0;;;;;;;;;:36;;-1:-1:-1;;16190:36:0;16222:4;16190:36;;;16273:12;3875:10;3795:98;;16273:12;-1:-1:-1;;;;;16246:40:0;16264:7;-1:-1:-1;;;;;16246:40:0;16258:4;16246:40;;;;;;;;;;16067:238;;:::o;16485:239::-;11431:4;11455:12;;;;;;;;;;;-1:-1:-1;;;;;11455:29:0;;;;;;;;;;;;16565:152;;;16640:5;16608:12;;;;;;;;;;;-1:-1:-1;;;;;16608:29:0;;;;;;;;;;:37;;-1:-1:-1;;16608:37:0;;;16665:40;3875:10;;16608:12;;16665:40;;16640:5;16665:40;16485:239;;:::o;30212:268::-;30300:4;;30317:133;30335:5;:12;30331:1;:16;30317:133;;;30385:6;-1:-1:-1;;;;;30373:18:0;:5;30379:1;30373:8;;;;;;-1:-1:-1;;;30373:8:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30373:18:0;;30369:70;;;30419:4;30412:11;;;;;30369:70;30349:3;;;;:::i;:::-;;;;30317:133;;;-1:-1:-1;30467:5:0;;30212:268;-1:-1:-1;;;30212:268:0:o;33424:454::-;33540:4;;33557:291;33575:4;:11;33571:1;:15;33557:291;;;33622:6;-1:-1:-1;;;;;33611:17:0;:4;33616:1;33611:7;;;;;;-1:-1:-1;;;33611:7:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33611:17:0;;33608:229;;;33697:25;33712:10;33697:12;:25;:::i;:::-;33680:11;33684:7;33680:1;:11;:::i;:::-;33679:44;;:123;;;;-1:-1:-1;33794:7:0;33780:11;33794:7;33780:1;:11;:::i;:::-;:21;;;;:::i;:::-;33750:25;33765:10;33750:12;:25;:::i;:::-;33749:53;33679:123;33649:172;;;;;33608:229;33588:3;;;;:::i;:::-;;;;33557:291;;;;33865:5;33858:12;;33424:454;;;;;;;:::o;39397:823::-;-1:-1:-1;;;;;39534:20:0;;;39508:23;39534:20;;;:10;:20;;;;;;;;:31;;;;;;;;39626:15;;;;;;;39616:26;;:9;:26;;;;;39626:15;39616:41;;39600:11;;;;:67;;39663:3;;39600:58;;:15;:58::i;:67::-;39717:22;;;;39741:23;;;;39576:91;;-1:-1:-1;39678:21:0;;39702:78;;-1:-1:-1;;;;;39717:22:0;;;;39741:23;39576:91;39702:14;:78::i;:::-;39678:102;-1:-1:-1;39794:9:0;;39791:109;;39833:22;;;;39857:23;;;;39820:68;;-1:-1:-1;;;;;39833:22:0;;;;39857:23;39882:5;39820:12;:68::i;:::-;39915:19;39912:301;;40005:15;;;;-1:-1:-1;;;;;40005:15:0;39951:25;39995:26;;;:9;:26;;;;;:41;;;39979:11;;;;:67;;40042:3;;39979:58;;:15;:58::i;:67::-;40069:15;;;;40061:52;;39951:95;;-1:-1:-1;;;;;;40069:15:0;;40061:52;;;;;39951:95;;40069:15;40061:52;40069:15;40061:52;39951:95;40069:15;40061:52;;;;;;;;;;;;;;;;;;;;;39912:301;;;;40154:8;-1:-1:-1;;;;;40146:26:0;:55;40187:13;40173:7;:11;;;:27;;;;:::i;:::-;40146:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39912:301;39397:823;;;;;;;:::o;20351:98::-;20409:7;20436:5;20440:1;20436;:5;:::i;20750:98::-;20808:7;20835:5;20839:1;20835;:5;:::i;40228:605::-;40304:7;;;40359:427;-1:-1:-1;;;;;40383:28:0;;;;;;:17;:28;;;;;:35;40379:39;;40359:427;;;-1:-1:-1;;;;;40457:28:0;;40440:14;40457:28;;;:17;:28;;;;;:31;;40486:1;;40457:31;;;;-1:-1:-1;;;40457:31:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40587:30:0;;;;;;:19;:30;;;;;;;40457:31;;;;40540:15;;;:7;:15;;;;;:26;;;;;;;;:33;40457:31;;-1:-1:-1;40528:100:0;;40624:3;;40528:91;;40540:78;;40587:30;40528:91;;40624:3;40540:37;:42::i;:78::-;40528:7;;:11;:91::i;:100::-;-1:-1:-1;;;;;40679:15:0;;;;;;;:7;:15;;;;;;;;:26;;;;;;;;;:33;40503:125;;-1:-1:-1;40679:50:0;;40503:125;;40679:50;:::i;:::-;-1:-1:-1;;;;;40643:15:0;;;;;;;:7;:15;;;;;;;;:26;;;;;;;;;:86;40744:30;40760:14;40744:30;;:::i;:::-;;;40359:427;;40420:3;;;;;:::i;:::-;;;;40359:427;;;-1:-1:-1;40813:12:0;40228:605;-1:-1:-1;;;40228:605:0:o;19613:98::-;19671:7;19698:5;19702:1;19698;:5;:::i;33886:235::-;33926:7;34077:16;34095:15;34060:51;;;;;;;;10683:19:1;;;10727:2;10718:12;;10711:28;10764:2;10755:12;;10673:100;34060:51:0;;;;;;;;;;;;;34050:62;;;;;;34042:71;;34035:78;;33886:235;:::o;12191:505::-;11431:4;11455:12;;;;;;;;;;;-1:-1:-1;;;;;11455:29:0;;;;;;;;;;;;12275:414;;12468:41;12496:7;-1:-1:-1;;;;;12468:41:0;12506:2;12468:19;:41::i;:::-;12582:38;12610:4;12617:2;12582:19;:38::i;:::-;12373:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12373:270:0;;;;;;;;;;-1:-1:-1;;;12319:358:0;;;;;;;:::i;38170:591::-;-1:-1:-1;;;;;38430:36:0;;;38282:7;38430:36;;;:19;:36;;;;;;;38390:35;;;;;;;;38282:7;;;;38324:154;;38474:3;;38324:145;;38341:127;;38390:77;;:39;:77::i;:::-;-1:-1:-1;;;;;38341:35:0;;;;;;:19;:35;;;;;;:44;;38381:3;38341:39;:44::i;:127::-;38324:12;;:16;:145::i;:154::-;38302:176;-1:-1:-1;38489:20:0;38512:26;38302:176;38512:12;:26;:::i;:::-;38489:49;;38549:24;38576:40;38588:14;38604:11;38576;:40::i;:::-;38549:67;;38627:25;38655:42;38667:15;38684:12;38655:11;:42::i;:::-;38627:70;-1:-1:-1;38717:36:0;38627:70;38717:16;:36;:::i;:::-;38710:43;38170:591;-1:-1:-1;;;;;;;;38170:591:0:o;38769:620::-;-1:-1:-1;;;;;38995:36:0;;;38875:18;38995:36;;;:19;:36;;;;;;;38955:35;;;;;;;;38875:18;;38896:147;;39039:3;;38896:138;;38906:127;;38955:77;;:35;:39;:77::i;:::-;-1:-1:-1;;;;;38906:35:0;;;;;;:19;:35;;;;;;:44;;38946:3;38906:39;:44::i;:127::-;38896:5;;:9;:138::i;:147::-;38875:168;-1:-1:-1;39054:19:0;39076:18;38875:168;39076:5;:18;:::i;:::-;39054:40;;39105:23;39131:38;39142:14;39158:10;39131;:38::i;:::-;39105:64;;39180:24;39207:40;39218:15;39235:11;39207:10;:40::i;:::-;-1:-1:-1;;;;;39260:35:0;;;;;;:19;:35;;;;;:54;;39180:67;;-1:-1:-1;39299:15:0;;39260:35;;;:54;;39299:15;;39260:54;:::i;:::-;;;;-1:-1:-1;;;;;;;39325:36:0;;;;;;:19;:36;;;;;:56;;39365:16;;39325:36;:56;;39365:16;;39325:56;:::i;:::-;;;;-1:-1:-1;;;;;;;;;38769:620:0:o;5746:451::-;5821:13;5847:19;5879:10;5883:6;5879:1;:10;:::i;:::-;:14;;5892:1;5879:14;:::i;:::-;5869:25;;;;;;-1:-1:-1;;;5869:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5869:25:0;;5847:47;;5905:15;:6;5912:1;5905:9;;;;;;-1:-1:-1;;;5905:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;5905:15:0;;;;;;;;;5931;:6;5938:1;5931:9;;;;;;-1:-1:-1;;;5931:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;5931:15:0;;;;;;;;-1:-1:-1;5962:9:0;5974:10;5978:6;5974:1;:10;:::i;:::-;:14;;5987:1;5974:14;:::i;:::-;5962:26;;5957:135;5994:1;5990;:5;5957:135;;;6029:12;6042:5;6050:3;6042:11;6029:25;;;;;-1:-1:-1;;;6029:25:0;;;;;;;;;;;;6017:6;6024:1;6017:9;;;;;;-1:-1:-1;;;6017:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;6017:37:0;;;;;;;;-1:-1:-1;6079:1:0;6069:11;;;;;5997:3;;;:::i;:::-;;;5957:135;;;-1:-1:-1;6110:10:0;;6102:55;;;;-1:-1:-1;;;6102:55:0;;15510:2:1;6102:55:0;;;15492:21:1;;;15529:18;;;15522:30;15588:34;15568:18;;;15561:62;15640:18;;6102:55:0;15482:182:1;36801:656:0;36874:7;;;36929:491;-1:-1:-1;;;;;36953:28:0;;;;;;:17;:28;;;;;:35;36949:39;;36929:491;;;-1:-1:-1;;;;;37027:28:0;;37010:14;37027:28;;;:17;:28;;;;;:31;;37056:1;;37027:31;;;;-1:-1:-1;;;37027:31:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37221:30:0;;;;;;:19;:30;;;;;;;37027:31;;;;37174:15;;;:7;:15;;;;;:26;;;;;;;;:33;37027:31;;-1:-1:-1;37163:99:0;;37258:3;;37163:90;;37174:78;;37221:30;37163:90;;37258:3;37174:37;:42::i;37163:99::-;37323:40;;37138:124;;-1:-1:-1;;;;;;37323:24:0;;;:40;;;;;37138:124;;37323:40;;;;37138:124;37323:24;:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37378:30:0;37394:14;37378:30;;:::i;:::-;;;36929:491;;36990:3;;;;;:::i;:::-;;;;36929:491;;37465:697;37536:7;;;37591:534;-1:-1:-1;;;;;37615:28:0;;;;;;:17;:28;;;;;:35;37611:39;;37591:534;;;-1:-1:-1;;;;;37689:28:0;;37672:14;37689:28;;;:17;:28;;;;;:31;;37718:1;;37689:31;;;;-1:-1:-1;;;37689:31:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37881:30:0;;;;;;:19;:30;;;;;;;37689:31;;;;37834:15;;;:7;:15;;;;;:26;;;;;;;;:33;37689:31;;-1:-1:-1;37824:98:0;;37918:3;;37824:89;;37834:78;;37881:30;37824:89;;37918:3;37834:37;:42::i;37824:98::-;-1:-1:-1;;;;;38015:15:0;;;;;;;:7;:15;;;;;;;;:26;;;;;;;;;:33;37799:123;;-1:-1:-1;38015:53:0;;37799:123;38015:37;:53::i;:::-;-1:-1:-1;;;;;37979:15:0;;;;;;;:7;:15;;;;;;;;:26;;;;;;;;;:89;38083:30;38099:14;38083:30;;:::i;:::-;;;37591:534;;37652:3;;;;;:::i;:::-;;;;37591:534;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:818:1;;121:3;114:4;106:6;102:17;98:27;88:2;;143:5;136;129:20;88:2;183:6;170:20;209:4;232:18;228:2;225:26;222:2;;;254:18;;:::i;:::-;300:2;297:1;293:10;323:28;347:2;343;339:11;323:28;:::i;:::-;385:15;;;416:12;;;;448:15;;;482;;;478:24;;475:33;-1:-1:-1;472:2:1;;;525:5;518;511:20;472:2;551:5;542:14;;565:238;579:2;576:1;573:9;565:238;;;650:3;637:17;667:31;692:5;667:31;:::i;:::-;711:18;;597:1;590:9;;;;;749:12;;;;781;;565:238;;837:257;;949:2;937:9;928:7;924:23;920:32;917:2;;;970:6;962;955:22;917:2;1014:9;1001:23;1033:31;1058:5;1033:31;:::i;1099:398::-;;;1228:2;1216:9;1207:7;1203:23;1199:32;1196:2;;;1249:6;1241;1234:22;1196:2;1293:9;1280:23;1312:31;1337:5;1312:31;:::i;:::-;1362:5;-1:-1:-1;1419:2:1;1404:18;;1391:32;1432:33;1391:32;1432:33;:::i;:::-;1484:7;1474:17;;;1186:311;;;;;:::o;1502:503::-;;;1656:2;1644:9;1635:7;1631:23;1627:32;1624:2;;;1677:6;1669;1662:22;1624:2;1721:9;1708:23;1740:31;1765:5;1740:31;:::i;:::-;1790:5;-1:-1:-1;1846:2:1;1831:18;;1818:32;1873:18;1862:30;;1859:2;;;1910:6;1902;1895:22;1859:2;1938:61;1991:7;1982:6;1971:9;1967:22;1938:61;:::i;:::-;1928:71;;;1614:391;;;;;:::o;2010:325::-;;;2139:2;2127:9;2118:7;2114:23;2110:32;2107:2;;;2160:6;2152;2145:22;2107:2;2204:9;2191:23;2223:31;2248:5;2223:31;:::i;:::-;2273:5;2325:2;2310:18;;;;2297:32;;-1:-1:-1;;;2097:238:1:o;2340:460::-;;;;2483:2;2471:9;2462:7;2458:23;2454:32;2451:2;;;2504:6;2496;2489:22;2451:2;2548:9;2535:23;2567:31;2592:5;2567:31;:::i;:::-;2617:5;-1:-1:-1;2669:2:1;2654:18;;2641:32;;-1:-1:-1;2725:2:1;2710:18;;2697:32;2738:30;2697:32;2738:30;:::i;:::-;2787:7;2777:17;;;2441:359;;;;;:::o;2805:845::-;;;;;2971:2;2959:9;2950:7;2946:23;2942:32;2939:2;;;2992:6;2984;2977:22;2939:2;3036:9;3023:23;3055:31;3080:5;3055:31;:::i;:::-;3105:5;-1:-1:-1;3157:2:1;3142:18;;3129:32;;-1:-1:-1;3212:2:1;3197:18;;3184:32;3235:18;3265:14;;;3262:2;;;3297:6;3289;3282:22;3262:2;3340:6;3329:9;3325:22;3315:32;;3385:7;3378:4;3374:2;3370:13;3366:27;3356:2;;3412:6;3404;3397:22;3356:2;3457;3444:16;3483:2;3475:6;3472:14;3469:2;;;3504:6;3496;3489:22;3469:2;3554:7;3549:2;3540:6;3536:2;3532:15;3528:24;3525:37;3522:2;;;3580:6;3572;3565:22;3522:2;2929:721;;;;-1:-1:-1;;3616:2:1;3608:11;;-1:-1:-1;;;2929:721:1:o;3655:1012::-;;;;3811:2;3799:9;3790:7;3786:23;3782:32;3779:2;;;3832:6;3824;3817:22;3779:2;3876:9;3863:23;3895:31;3920:5;3895:31;:::i;:::-;3945:5;-1:-1:-1;3969:2:1;4003:18;;;3990:32;;-1:-1:-1;4073:2:1;4058:18;;4045:32;4096:18;4126:14;;;4123:2;;;4158:6;4150;4143:22;4123:2;4201:6;4190:9;4186:22;4176:32;;4246:7;4239:4;4235:2;4231:13;4227:27;4217:2;;4273:6;4265;4258:22;4217:2;4314;4301:16;4336:2;4332;4329:10;4326:2;;;4342:18;;:::i;:::-;4384:53;4427:2;4408:13;;-1:-1:-1;;4404:27:1;4400:36;;4384:53;:::i;:::-;4371:66;;4460:2;4453:5;4446:17;4500:7;4495:2;4490;4486;4482:11;4478:20;4475:33;4472:2;;;4526:6;4518;4511:22;4472:2;4586;4581;4577;4573:11;4568:2;4561:5;4557:14;4544:45;4630:6;4625:2;4620;4613:5;4609:14;4605:23;4598:39;;4656:5;4646:15;;;;;3769:898;;;;;:::o;4672:543::-;;;;;4843:3;4831:9;4822:7;4818:23;4814:33;4811:2;;;4865:6;4857;4850:22;4811:2;4909:9;4896:23;4928:31;4953:5;4928:31;:::i;:::-;4978:5;-1:-1:-1;5030:2:1;5015:18;;5002:32;;-1:-1:-1;5081:2:1;5066:18;;5053:32;;-1:-1:-1;5137:2:1;5122:18;;5109:32;5150:33;5109:32;5150:33;:::i;:::-;4801:414;;;;-1:-1:-1;4801:414:1;;-1:-1:-1;;4801:414:1:o;5550:393::-;;;;5696:2;5684:9;5675:7;5671:23;5667:32;5664:2;;;5717:6;5709;5702:22;5664:2;5761:9;5748:23;5780:31;5805:5;5780:31;:::i;:::-;5830:5;5882:2;5867:18;;5854:32;;-1:-1:-1;5933:2:1;5918:18;;;5905:32;;5654:289;-1:-1:-1;;;5654:289:1:o;5948:368::-;;6085:2;6073:9;6064:7;6060:23;6056:32;6053:2;;;6106:6;6098;6091:22;6053:2;6151:9;6138:23;6184:18;6176:6;6173:30;6170:2;;;6221:6;6213;6206:22;6170:2;6249:61;6302:7;6293:6;6282:9;6278:22;6249:61;:::i;6321:255::-;;6441:2;6429:9;6420:7;6416:23;6412:32;6409:2;;;6462:6;6454;6447:22;6409:2;6499:9;6493:16;6518:28;6540:5;6518:28;:::i;6581:190::-;;6693:2;6681:9;6672:7;6668:23;6664:32;6661:2;;;6714:6;6706;6699:22;6661:2;-1:-1:-1;6742:23:1;;6651:120;-1:-1:-1;6651:120:1:o;6776:325::-;;;6905:2;6893:9;6884:7;6880:23;6876:32;6873:2;;;6926:6;6918;6911:22;6873:2;6967:9;6954:23;6944:33;;7027:2;7016:9;7012:18;6999:32;7040:31;7065:5;7040:31;:::i;7106:352::-;;7217:2;7205:9;7196:7;7192:23;7188:32;7185:2;;;7238:6;7230;7223:22;7185:2;7282:9;7269:23;7332:66;7325:5;7321:78;7314:5;7311:89;7301:2;;7419:6;7411;7404:22;7658:258;;;7787:2;7775:9;7766:7;7762:23;7758:32;7755:2;;;7808:6;7800;7793:22;7755:2;-1:-1:-1;;7836:23:1;;;7906:2;7891:18;;;7878:32;;-1:-1:-1;7745:171:1:o;8061:486::-;;8152:5;8146:12;8179:6;8174:3;8167:19;8205:4;8234:2;8229:3;8225:12;8218:19;;8271:2;8264:5;8260:14;8292:3;8304:218;8318:6;8315:1;8312:13;8304:218;;;8383:13;;-1:-1:-1;;;;;8379:62:1;8367:75;;8462:12;;;;8497:15;;;;8340:1;8333:9;8304:218;;;-1:-1:-1;8538:3:1;;8122:425;-1:-1:-1;;;;;8122:425:1:o;8552:524::-;;8651:5;8645:12;8678:6;8673:3;8666:19;8704:4;8733:2;8728:3;8724:12;8717:19;;8757:5;8752:3;8745:18;8801:2;8796:3;8786:18;8822:3;8834:217;8848:6;8845:1;8842:13;8834:217;;;8913:13;;-1:-1:-1;;;;;8909:62:1;8897:75;;8992:12;;;;9039:1;9027:14;;;;8863:9;8834:217;;9177:290;9254:1;9247:5;9244:12;9234:2;;-1:-1:-1;;;9287:1:1;9280:88;9391:4;9388:1;9381:15;9419:4;9416:1;9409:15;9234:2;9443:18;;9224:243::o;9472:258::-;;9552:5;9546:12;9579:6;9574:3;9567:19;9595:63;9651:6;9644:4;9639:3;9635:14;9628:4;9621:5;9617:16;9595:63;:::i;:::-;9712:2;9691:15;-1:-1:-1;;9687:29:1;9678:39;;;;9719:4;9674:50;;9522:208;-1:-1:-1;;9522:208:1:o;9735:786::-;;10146:25;10141:3;10134:38;10201:6;10195:13;10217:62;10272:6;10267:2;10262:3;10258:12;10251:4;10243:6;10239:17;10217:62;:::i;:::-;10343:19;10338:2;10298:16;;;10330:11;;;10323:40;10388:13;;10410:63;10388:13;10459:2;10451:11;;10444:4;10432:17;;10410:63;:::i;:::-;10493:17;10512:2;10489:26;;10124:397;-1:-1:-1;;;;10124:397:1:o;11714:266::-;;11890:2;11879:9;11872:21;11910:64;11970:2;11959:9;11955:18;11947:6;11910:64;:::i;11985:429::-;;12209:2;12198:9;12191:21;12235:64;12295:2;12284:9;12280:18;12272:6;12235:64;:::i;:::-;12347:9;12339:6;12335:22;12330:2;12319:9;12315:18;12308:50;12375:33;12401:6;12393;12375:33;:::i;:::-;12367:41;12181:233;-1:-1:-1;;;;;12181:233:1:o;12419:1483::-;;12640:2;12629:9;12622:21;12666:64;12726:2;12715:9;12711:18;12703:6;12666:64;:::i;:::-;12749:2;12799:9;12791:6;12787:22;12782:2;12771:9;12767:18;12760:50;12830:4;12866:6;12860:13;12896:4;12919:1;12947:9;12943:2;12939:18;12929:28;;13007:2;12996:9;12992:18;13029;13019:2;;13073:4;13065:6;13061:17;13051:27;;13019:2;13126;13118:6;13115:14;13095:18;13092:38;13089:2;;;-1:-1:-1;;;13160:4:1;13153:91;13267:4;13264:1;13257:15;13298:4;13292;13285:18;13089:2;27103:19;;;27155:4;27146:14;;13322:73;-1:-1:-1;13411:18:1;13438:100;;;;13552:1;13547:329;;;;13404:472;;13438:100;-1:-1:-1;;13471:24:1;;13459:37;;13516:12;;;;-1:-1:-1;13438:100:1;;13547:329;26862:138;26939:17;;;26989:4;26973:21;;13653:4;13670:165;13684:6;13681:1;13678:13;13670:165;;;13762:14;;13749:11;;;13742:35;13805:16;;;;13699:10;;13670:165;;;13855:11;;;-1:-1:-1;;13404:472:1;-1:-1:-1;13893:3:1;;12612:1290;-1:-1:-1;;;;;;;;;;12612:1290:1:o;14281:393::-;;14440:2;14429:9;14422:21;14479:6;14474:2;14463:9;14459:18;14452:34;14536:6;14528;14523:2;14512:9;14508:18;14495:48;14563:22;;;14587:2;14559:31;;;14552:45;;;;14658:2;14637:15;;;-1:-1:-1;;14633:29:1;14618:45;14614:54;;14412:262;-1:-1:-1;14412:262:1:o;14679:220::-;;14828:2;14817:9;14810:21;14848:45;14889:2;14878:9;14874:18;14866:6;14848:45;:::i;23829:2015::-;;24008:2;23997:9;23990:21;24020:56;24072:2;24061:9;24057:18;24048:6;24042:13;24020:56;:::i;:::-;24130:2;24122:6;24118:15;24112:22;24107:2;24096:9;24092:18;24085:50;24189:2;24181:6;24177:15;24171:22;24166:2;24155:9;24151:18;24144:50;24241:2;24233:6;24229:15;24223:22;24254:61;24310:3;24299:9;24295:19;24281:12;-1:-1:-1;;;;;7995:54:1;7983:67;;7973:83;24254:61;-1:-1:-1;24364:3:1;24352:16;;24346:23;-1:-1:-1;;;;;7995:54:1;;24436:3;24421:19;;7983:67;24378:63;24496:3;24488:6;24484:16;24478:23;24472:3;24461:9;24457:19;24450:52;24551:3;24543:6;24539:16;24533:23;24565:63;24623:3;24612:9;24608:19;24592:14;-1:-1:-1;;;;;7995:54:1;7983:67;;7973:83;24565:63;-1:-1:-1;24665:3:1;24653:16;;24647:23;24689:3;24708:18;;;24701:30;;;;24768:15;;24762:22;24803:6;24828:3;24847:18;;;24840:30;;;24893:54;24942:3;24927:19;;24762:22;24893:54;:::i;:::-;24879:68;;24984:2;24976:6;24972:15;24966:22;24956:32;;25007:3;25046:2;25041;25030:9;25026:18;25019:30;25098:2;25090:6;25086:15;25080:22;25058:44;;;25121:3;25192:2;25188:7;25176:9;25168:6;25164:22;25160:36;25155:2;25144:9;25140:18;25133:64;25220:52;25265:6;25249:14;25220:52;:::i;:::-;25206:66;;25321:2;25313:6;25309:15;25303:22;25281:44;;;25344:3;25356:62;25414:2;25403:9;25399:18;25383:14;-1:-1:-1;;;;;7995:54:1;7983:67;;7973:83;25356:62;25455:15;;25449:22;;-1:-1:-1;25490:3:1;25502:51;25534:18;;;25449:22;9151:13;9144:21;9132:34;;9122:50;25502:51;25590:15;;25584:22;;-1:-1:-1;25626:3:1;25638:63;25681:19;;;25584:22;-1:-1:-1;;;;;7995:54:1;7983:67;;7973:83;25638:63;25738:16;;;25732:23;9151:13;9144:21;25796:18;;9132:34;;;;-1:-1:-1;25832:6:1;;-1:-1:-1;23980:1864:1:o;26582:275::-;26653:2;26647:9;26718:2;26699:13;;-1:-1:-1;;26695:27:1;26683:40;;26753:18;26738:34;;26774:22;;;26735:62;26732:2;;;26800:18;;:::i;:::-;26836:2;26829:22;26627:230;;-1:-1:-1;26627:230:1:o;27171:128::-;;27242:1;27238:6;27235:1;27232:13;27229:2;;;27248:18;;:::i;:::-;-1:-1:-1;27284:9:1;;27219:80::o;27304:120::-;;27370:1;27360:2;;27375:18;;:::i;:::-;-1:-1:-1;27409:9:1;;27350:74::o;27429:168::-;;27535:1;27531;27527:6;27523:14;27520:1;27517:21;27512:1;27505:9;27498:17;27494:45;27491:2;;;27542:18;;:::i;:::-;-1:-1:-1;27582:9:1;;27481:116::o;27602:125::-;;27670:1;27667;27664:8;27661:2;;;27675:18;;:::i;:::-;-1:-1:-1;27712:9:1;;27651:76::o;27732:258::-;27804:1;27814:113;27828:6;27825:1;27822:13;27814:113;;;27904:11;;;27898:18;27885:11;;;27878:39;27850:2;27843:10;27814:113;;;27945:6;27942:1;27939:13;27936:2;;;-1:-1:-1;;27980:1:1;27962:16;;27955:27;27785:205::o;27995:136::-;;28062:5;28052:2;;28071:18;;:::i;:::-;-1:-1:-1;;;28107:18:1;;28042:89::o;28136:437::-;28215:1;28211:12;;;;28258;;;28279:2;;28333:4;28325:6;28321:17;28311:27;;28279:2;28386;28378:6;28375:14;28355:18;28352:38;28349:2;;;-1:-1:-1;;;28420:1:1;28413:88;28524:4;28521:1;28514:15;28552:4;28549:1;28542:15;28349:2;;28191:382;;;:::o;28578:135::-;;-1:-1:-1;;28638:17:1;;28635:2;;;28658:18;;:::i;:::-;-1:-1:-1;28705:1:1;28694:13;;28625:88::o;28718:112::-;;28776:1;28766:2;;28781:18;;:::i;:::-;-1:-1:-1;28815:9:1;;28756:74::o;28835:184::-;-1:-1:-1;;;28884:1:1;28877:88;28984:4;28981:1;28974:15;29008:4;29005:1;28998:15;29024:184;-1:-1:-1;;;29073:1:1;29066:88;29173:4;29170:1;29163:15;29197:4;29194:1;29187:15;29213:184;-1:-1:-1;;;29262:1:1;29255:88;29362:4;29359:1;29352:15;29386:4;29383:1;29376:15;29402:154;-1:-1:-1;;;;;29481:5:1;29477:54;29470:5;29467:65;29457:2;;29546:1;29543;29536:12;29561:118;29647:5;29640:13;29633:21;29626:5;29623:32;29613:2;;29669:1;29666;29659:12
Swarm Source
ipfs://a460cbe3a634f27668286ab9e8ec3cff8e4fa2a8e5a3e3d16aaca087fe16fda3
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Token Allocations
GLMR
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| GLMR | 100.00% | $0.019043 | 0.1839 | $0.003502 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.