Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
GabrielV3
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-25 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.18; pragma abicoder v2; // File: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // File: @openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // File: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File: @openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File: @openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) // 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 SafeMathUpgradeable { /** * @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-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20PermitUpgradeable { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using AddressUpgradeable for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20PermitUpgradeable token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token)); } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: contracts/GabrielV3.sol /// @title Archangel Reward Staking Pool V3 (GabrielV3) /// @notice Stake tokens to Earn Rewards. contract GabrielV3 is Initializable, UUPSUpgradeable, OwnableUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; using SafeMathUpgradeable for uint256; /* ========== STATE VARIABLES ========== */ mapping(address => mapping(uint256 => bool)) public inPool; address public sharks; uint256 public sPercent; address public whales; uint256 public wPercent; PoolInfo[] public poolInfo; mapping(uint256 => mapping(address => UserInfo)) public userInfo; /* ========== STRUCTS ========== */ struct ConstructorArgs { uint256 sPercent; uint256 wPercent; address sharks; address whales; } struct ExtraArgs { IERC20Upgradeable stakeToken; uint256 openTime; uint256 waitPeriod; uint256 lockDuration; uint256 maxStake; } struct PoolInfo { bool canStake; bool canHarvest; IERC20Upgradeable stakeToken; uint256 compounded; uint256 lockDuration; uint256 lockTime; uint256 maxStake; uint256 NORT; uint256 openTime; uint256 staked; uint256 unlockTime; uint256 unstaked; uint256 waitPeriod; address[] harvestList; address[] rewardTokens; address[] stakeList; uint256[] dynamicRewardsInPool; uint256[] staticRewardsInPool; } struct UserInfo { uint256 amount; bool harvested; uint256[] nonHarvestedRewards; } /* ========== EVENTS ========== */ event Harvest(uint256 pid, address user, uint256 amount); event RateUpdated(uint256 sharks, uint256 whales); event Stake(uint256 pid, address user, uint256 amount); event Unstake(uint256 pid, address user, uint256 amount); /* ========== CONSTRUCTOR ========== */ constructor() initializer { // solhint-disable-previous-line no-empty-blocks } function initialize( ConstructorArgs memory constructorArgs, ExtraArgs memory extraArgs, uint256 _NORT, address[] memory _rewardTokens, uint256[] memory _staticRewardsInPool ) public initializer { sPercent = constructorArgs.sPercent; wPercent = constructorArgs.wPercent; sharks = constructorArgs.sharks; whales = constructorArgs.whales; __Ownable_init(); __UUPSUpgradeable_init(); createPool(extraArgs, _NORT, _rewardTokens, _staticRewardsInPool); } /* ========== WRITE FUNCTIONS ========== */ function _changeNORT(uint256 _pid, uint256 _NORT) internal { PoolInfo storage pool = poolInfo[_pid]; address[] memory rewardTokens = new address[](_NORT); uint256[] memory staticRewardsInPool = new uint256[](_NORT); pool.NORT = _NORT; pool.rewardTokens = rewardTokens; pool.dynamicRewardsInPool = staticRewardsInPool; pool.staticRewardsInPool = staticRewardsInPool; } function changeNORT(uint256 _pid, uint256 _NORT) external onlyOwner { _changeNORT(_pid, _NORT); } function changeRewardTokens(uint256 _pid, address[] memory _rewardTokens) external onlyOwner { PoolInfo storage pool = poolInfo[_pid]; uint256 NORT = pool.NORT; require(_rewardTokens.length == NORT, "CRT: array length mismatch"); for (uint256 i; i < NORT; i++) { pool.rewardTokens[i] = _rewardTokens[i]; } } /** * @notice create a new pool * @param extraArgs ["stakeToken", openTime, waitPeriod, lockDuration] * @param _NORT specify the number of diffrent tokens the pool will give out as reward * @param _rewardTokens an array containing the addresses of the different reward tokens * @param _staticRewardsInPool an array of token balances for each unique reward token in the pool. */ function createPool(ExtraArgs memory extraArgs, uint256 _NORT, address[] memory _rewardTokens, uint256[] memory _staticRewardsInPool) public onlyOwner { require(_rewardTokens.length == _NORT && _rewardTokens.length == _staticRewardsInPool.length, "CP: array length mismatch"); address[] memory rewardTokens = new address[](_NORT); uint256[] memory staticRewardsInPool = new uint256[](_NORT); address[] memory emptyList; require( extraArgs.openTime > block.timestamp, "open time must be a future time" ); uint256 _lockTime = extraArgs.openTime.add(extraArgs.waitPeriod); uint256 _unlockTime = _lockTime.add(extraArgs.lockDuration); poolInfo.push( PoolInfo({ stakeToken: extraArgs.stakeToken, staked: 0, maxStake: extraArgs.maxStake, compounded: 0, unstaked: 0, openTime: extraArgs.openTime, waitPeriod: extraArgs.waitPeriod, lockTime: _lockTime, lockDuration: extraArgs.lockDuration, unlockTime: _unlockTime, canStake: false, canHarvest: false, NORT: _NORT, rewardTokens: rewardTokens, dynamicRewardsInPool: staticRewardsInPool, staticRewardsInPool: staticRewardsInPool, stakeList: emptyList, harvestList: emptyList }) ); uint256 _pid = poolInfo.length - 1; PoolInfo storage pool = poolInfo[_pid]; for (uint256 i; i < _NORT; i++) { pool.rewardTokens[i] = _rewardTokens[i]; pool.dynamicRewardsInPool[i] = _staticRewardsInPool[i]; pool.staticRewardsInPool[i] = _staticRewardsInPool[i]; } } /** * @notice Add your earnings to your stake * @dev compounding should be done after harvesting * @param _pid select the particular pool */ function compoundArcha(uint256 _pid, address userAddress, bool leaveRewards) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][userAddress]; uint256 NORT = pool.NORT; uint256 arrayLength = user.nonHarvestedRewards.length; uint256 pending; if (!leaveRewards) { uint256 reward = user.amount * pool.staticRewardsInPool[0]; uint256 lpSupply = pool.staked; pending = reward.div(lpSupply); } if (arrayLength > 0 && arrayLength == NORT) { uint256 newPending = pending.add(user.nonHarvestedRewards[0]); uint256 futureStake = newPending.add(user.amount); if (futureStake <= pool.maxStake) { pending = pending.add(user.nonHarvestedRewards[0]); user.nonHarvestedRewards[0] = 0; } else if (futureStake > pool.maxStake) { user.nonHarvestedRewards[0] = user.nonHarvestedRewards[0].add(pending); uint256 toMax = pool.maxStake.sub(user.amount); pending = toMax; user.nonHarvestedRewards[0] = user.nonHarvestedRewards[0].sub(toMax); } } if (arrayLength == 0) { uint256 reward = user.amount * pool.staticRewardsInPool[0]; uint256 lpSupply = pool.staked; pending = reward.div(lpSupply); uint256 futureStake = pending.add(user.amount); if (futureStake > pool.maxStake) { uint256 toMax = pool.maxStake.sub(user.amount); uint256 excess = pending.sub(toMax); pending = toMax; user.nonHarvestedRewards = new uint256[](NORT); user.nonHarvestedRewards[0] = excess; } } if (pending > 0) { pool.compounded = pool.compounded.add(pending); require(pending.add(user.amount) <= pool.maxStake, "you cannot stake more than the maximum"); (bool inAnotherPool, uint256 pid) = checkIfAlreadyInAPool(userAddress); if (inAnotherPool) { require(pid == _pid, "staking in more than one pool is forbidden"); } bool alreadyInAPool = inPool[userAddress][_pid]; if (!alreadyInAPool) { inPool[userAddress][_pid] = true; } user.amount = user.amount.add(pending); emit Stake(_pid, userAddress, pending); } } /** * @notice Harvest your earnings * @param _pid select the particular pool * @param leaveRewards decide if you want to leave rewards in the pool till next round */ function harvest(uint256 _pid, bool compound, bool leaveRewards) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (block.timestamp > pool.unlockTime && !(pool.canHarvest)) { pool.canHarvest = true; } require(pool.canHarvest, "pool is still locked"); require(!(user.harvested), "Harvest: you have already claimed rewards for this round"); pool.harvestList.push(msg.sender); update(_pid); uint256 NORT = pool.NORT; uint256 arrayLength = user.nonHarvestedRewards.length; user.harvested = true; if (compound && leaveRewards) { storeUnclaimedRewards(_pid, msg.sender); compoundArcha(_pid, msg.sender, leaveRewards); } else if (compound && !leaveRewards) { for (uint256 i; i < NORT; i++) { if (i == 0) { continue; } uint256 reward = user.amount * pool.staticRewardsInPool[i]; uint256 lpSupply = pool.staked; uint256 pending = reward.div(lpSupply); pool.dynamicRewardsInPool[i] = pool.dynamicRewardsInPool[i].sub(pending); if (arrayLength > 0 && arrayLength == NORT) { pending = pending.add(user.nonHarvestedRewards[i]); user.nonHarvestedRewards[i] = 0; } if (pending > 0) { emit Harvest(_pid, msg.sender, pending); IERC20Upgradeable(pool.rewardTokens[i]).safeTransfer(msg.sender, pending); } } compoundArcha(_pid, msg.sender, leaveRewards); } else if (!compound && leaveRewards) { storeUnclaimedRewards(_pid, msg.sender); } else if (!compound && !leaveRewards) { for (uint256 i; i < NORT; i++) { uint256 reward = user.amount * pool.staticRewardsInPool[i]; uint256 lpSupply = pool.staked; uint256 pending = reward.div(lpSupply); pool.dynamicRewardsInPool[i] = pool.dynamicRewardsInPool[i].sub(pending); if (arrayLength > 0 && arrayLength == NORT) { pending = pending.add(user.nonHarvestedRewards[i]); user.nonHarvestedRewards[i] = 0; } if (pending > 0) { emit Harvest(_pid, msg.sender, pending); IERC20Upgradeable(pool.rewardTokens[i]).safeTransfer(msg.sender, pending); } } } } /** * @notice prepare a pool for the next round of staking * @param _pid select the particular pool * @param extraArgs ["stakeToken", openTime, waitPeriod, lockDuration] * @param _NORT specify the number of diffrent tokens the pool will give out as reward * @param _rewardTokens an array containing the addresses of the different reward tokens * @param _staticRewardsInPool an array of token balances for each unique reward token in the pool. */ function nextRound(uint256 _pid, ExtraArgs memory extraArgs, uint256 _NORT, address[] memory _rewardTokens, uint256[] memory _staticRewardsInPool) external onlyOwner { require( _rewardTokens.length == _NORT && _rewardTokens.length == _staticRewardsInPool.length, "RP: array length mismatch" ); PoolInfo storage pool = poolInfo[_pid]; pool.stakeToken = extraArgs.stakeToken; pool.maxStake = extraArgs.maxStake; pool.staked = pool.staked.add(pool.compounded); pool.staked = pool.staked.sub(pool.unstaked); pool.compounded = 0; pool.unstaked = 0; _setTimeValues( _pid, extraArgs.openTime, extraArgs.waitPeriod, extraArgs.lockDuration); _changeNORT(_pid, _NORT); for (uint256 i; i < _NORT; i++) { pool.rewardTokens[i] = _rewardTokens[i]; pool.dynamicRewardsInPool[i] = _staticRewardsInPool[i]; pool.staticRewardsInPool[i] = _staticRewardsInPool[i]; } } /// @notice allows for sending back locked tokens function recoverERC20(address token, address recipient, uint256 amount) external onlyOwner { IERC20Upgradeable(token).safeTransfer(recipient, amount); } /** * @notice sets user.harvested to false for all users * @dev the startIndex and endIndex are used to split the tnx into smaller batches * @param _pid select the particular pool * @param startIndex is the starting point for this batch. * @param endIndex is the ending point for this batch. */ function reset(uint256 _pid, uint256 startIndex, uint256 endIndex) external onlyOwner { PoolInfo storage pool = poolInfo[_pid]; uint256 arrayLength = pool.harvestList.length; for (uint256 i = startIndex; i < endIndex; i++) { UserInfo storage user = userInfo[_pid][pool.harvestList[i]]; user.harvested = false; } address lastArgAddr = pool.harvestList[endIndex - 1]; address lastHarvester = pool.harvestList[arrayLength - 1]; if (lastHarvester == lastArgAddr) { address[] memory emptyList; pool.harvestList = emptyList; } } function setPoolReward(uint256 _pid, address token, uint256 amount) external onlyOwner { uint256 onePercent = amount.div(100); uint256 tShare = wPercent.mul(onePercent); uint256 mShare = amount.sub(tShare); emit RateUpdated(_pid, amount); IERC20Upgradeable(token).safeTransfer(sharks, mShare); IERC20Upgradeable(token).safeTransfer(whales, tShare); } /** * @notice Set or modify the token balances of a particular pool * @param _pid select the particular pool * @param rewards array of token balances for each reward token in the pool */ function setPoolRewards(uint256 _pid, uint256[] memory rewards) external onlyOwner { PoolInfo storage pool = poolInfo[_pid]; uint256 NORT = pool.NORT; require(rewards.length == NORT, "SPR: array length mismatch"); for (uint256 i; i < NORT; i++) { pool.dynamicRewardsInPool[i] = rewards[i]; pool.staticRewardsInPool[i] = rewards[i]; } } function setRates(uint256 _sPercent, uint256 _wPercent) external onlyOwner { require(_sPercent.add(_wPercent) == 100, "must sum up to 100%"); sPercent = _sPercent; wPercent = _wPercent; emit RateUpdated(_sPercent, _wPercent); } function setSharkPoolAddress(address _sharks) external { require(msg.sender == sharks, "sharks: caller is not the current sharks"); require(_sharks != address(0), "cannot set sharks as zero address"); sharks = _sharks; } function _setTimeValues( uint256 _pid, uint256 _openTime, uint256 _waitPeriod, uint256 _lockDuration ) internal { PoolInfo storage pool = poolInfo[_pid]; require( _openTime > block.timestamp, "open time must be a future time" ); pool.openTime = _openTime; pool.waitPeriod = _waitPeriod; pool.lockTime = _openTime.add(_waitPeriod); pool.lockDuration = _lockDuration; pool.unlockTime = pool.lockTime.add(_lockDuration); } function setTimeValues( uint256 _pid, uint256 _openTime, uint256 _waitPeriod, uint256 _lockDuration ) external onlyOwner { _setTimeValues(_pid, _openTime, _waitPeriod, _lockDuration); } /// @notice Update whales address. function setWhalePoolAddress(address _whales) external onlyOwner { require(_whales != address(0), "cannot set whales as zero address"); whales = _whales; } /** * @notice stake ERC20 tokens to earn rewards * @param _pid select the particular pool * @param _amount amount of tokens to be deposited by user */ function stake(uint256 _pid, uint256 _amount) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (block.timestamp > pool.lockTime && pool.canStake) { pool.canStake = false; } if ( block.timestamp > pool.openTime && block.timestamp < pool.lockTime && block.timestamp < pool.unlockTime && !(pool.canStake) ) { pool.canStake = true; } require( pool.canStake, "pool is not yet opened or is locked" ); require(_amount > 0, "you cannot stake a value less than 1"); require(_amount.add(user.amount) <= pool.maxStake, "you cannot stake more than the maximum"); (bool inAnotherPool, uint256 pid) = checkIfAlreadyInAPool(msg.sender); if (inAnotherPool) { require( pid == _pid, "staking in more than one pool isn't allowed" ); } bool alreadyInAPool = inPool[msg.sender][_pid]; if (!alreadyInAPool) { inPool[msg.sender][_pid] = true; } update(_pid); pool.stakeList.push(msg.sender); user.amount = user.amount.add(_amount); pool.staked = pool.staked.add(_amount); emit Stake(_pid, msg.sender, _amount); pool.stakeToken.safeTransferFrom( msg.sender, address(this), _amount ); } function storeUnclaimedRewards(uint256 _pid, address userAddress) internal { PoolInfo memory pool = poolInfo[_pid]; uint256 NORT = pool.NORT; UserInfo storage user = userInfo[_pid][userAddress]; uint256 arrayLength = user.nonHarvestedRewards.length; if (arrayLength == 0) { user.nonHarvestedRewards = new uint256[](NORT); for (uint256 x = 0; x < NORT; x++) { uint256 reward = user.amount * pool.staticRewardsInPool[x]; uint256 lpSupply = pool.staked; uint256 pending = reward.div(lpSupply); if (pending > 0) { user.nonHarvestedRewards[x] = pending; } } } if (arrayLength == NORT) { for (uint256 x = 0; x < NORT; x++) { uint256 reward = user.amount * pool.staticRewardsInPool[x]; uint256 lpSupply = pool.staked; uint256 pending = reward.div(lpSupply); if (pending > 0) { user.nonHarvestedRewards[x] = user.nonHarvestedRewards[x].add(pending); } } } } /** * @notice Exit without caring about rewards * @param _pid select the particular pool */ function unstake(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount > 0, "unstake: your staked balance is zero"); bool alreadyInAPool = inPool[msg.sender][_pid]; if (alreadyInAPool) { inPool[msg.sender][_pid] = false; } pool.unstaked = pool.unstaked.add(user.amount); uint256 staked = user.amount; user.amount = 0; emit Unstake(_pid, msg.sender, staked); pool.stakeToken.safeTransfer(msg.sender, staked); } function update(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.openTime) { return; } if ( block.timestamp > pool.openTime && block.timestamp < pool.lockTime && block.timestamp < pool.unlockTime ) { pool.canStake = true; pool.canHarvest = false; } if ( block.timestamp > pool.lockTime && block.timestamp < pool.unlockTime ) { pool.canStake = false; pool.canHarvest = false; } if ( block.timestamp > pool.unlockTime && pool.unlockTime > 0 ) { pool.canStake = false; pool.canHarvest = true; } } function _authorizeUpgrade(address newImplementation) internal onlyOwner override { // solhint-disable-previous-line no-empty-blocks } /* ========== READ ONLY FUNCTIONS ========== */ // will return default values (false, 0) if !(alreadyInAPool) function checkIfAlreadyInAPool(address user) internal view returns (bool inAnotherPool, uint256 pid) { for (uint256 poolId; poolId < poolInfo.length; poolId++) { if (poolInfo.length > 0) { bool alreadyInAPool = inPool[user][poolId]; if (alreadyInAPool) { return (alreadyInAPool, poolId); } } } } function dynamicRewardInPool(uint256 _pid) external view returns (uint256[] memory dynamicRewardsInPool) { PoolInfo memory pool = poolInfo[_pid]; dynamicRewardsInPool = pool.dynamicRewardsInPool; } function harvesters(uint256 _pid) external view returns (address[] memory) { PoolInfo memory pool = poolInfo[_pid]; return pool.harvestList; } function harvests(uint256 _pid) external view returns (uint256) { PoolInfo memory pool = poolInfo[_pid]; return pool.harvestList.length; } function isInArray(address[] memory array, address item) internal pure returns (bool) { for (uint256 i; i < array.length; i++) { if (array[i] == item) { return true; } } return false; } function nonHarvestedRewards(uint256 _pid, address staker) external view returns (uint256[] memory) { UserInfo memory user = userInfo[_pid][staker]; return user.nonHarvestedRewards; } function poolLength() external view returns (uint256) { return poolInfo.length; } function stakers(uint256 _pid) external view returns (address[] memory) { PoolInfo memory pool = poolInfo[_pid]; return pool.stakeList; } function stakes(uint256 _pid) external view returns (uint256) { PoolInfo memory pool = poolInfo[_pid]; if (pool.stakeList.length > 0) { uint256 counter = 1; uint256 index = counter - 1; address[] memory newArray = new address[](counter); newArray[index] = pool.stakeList[index]; for (uint256 i; i < pool.stakeList.length; i++) { if (!(isInArray(newArray, pool.stakeList[i]))) { counter += 1; index = counter - 1; address[] memory oldArray = newArray; newArray = new address[](counter); for (uint256 x; x < oldArray.length; x++) { newArray[x] = oldArray[x]; } newArray[index] = pool.stakeList[i]; } } return newArray.length; } else { return 0; } } function staticRewardInPool(uint256 _pid) external view returns (uint256[] memory staticRewardsInPool) { PoolInfo memory pool = poolInfo[_pid]; staticRewardsInPool = pool.staticRewardsInPool; } function tokensInPool(uint256 _pid) external view returns (address[] memory rewardTokens) { PoolInfo memory pool = poolInfo[_pid]; rewardTokens = pool.rewardTokens; } function unclaimedRewards(uint256 _pid, address _user) external view returns (uint256[] memory unclaimedReward) { PoolInfo memory pool = poolInfo[_pid]; UserInfo memory user = userInfo[_pid][_user]; uint256 NORT = pool.NORT; uint256 arrayLength = user.nonHarvestedRewards.length; if (block.timestamp > pool.lockTime && block.timestamp < pool.unlockTime && !(user.harvested) && pool.staked != 0) { uint256[] memory array = new uint256[](NORT); for (uint256 i; i < NORT; i++) { uint256 blocks = block.timestamp.sub(pool.lockTime); uint256 reward = blocks * user.amount * pool.staticRewardsInPool[i]; uint256 lpSupply = pool.staked * pool.lockDuration; uint256 pending = reward.div(lpSupply); if (arrayLength == NORT) { pending = pending.add(user.nonHarvestedRewards[i]); } array[i] = pending; } return array; } else if (block.timestamp > pool.unlockTime && !(user.harvested) && pool.staked != 0) { uint256[] memory array = new uint256[](NORT); for (uint256 i; i < NORT; i++) { uint256 reward = user.amount * pool.staticRewardsInPool[i]; uint256 lpSupply = pool.staked; uint256 pending = reward.div(lpSupply); if (arrayLength == NORT) { pending = pending.add(user.nonHarvestedRewards[i]); } array[i] = pending; } return array; } else { uint256[] memory array = new uint256[](NORT); for (uint256 i; i < NORT; i++) { uint256 pending = 0; if (arrayLength == NORT) { pending = user.nonHarvestedRewards[i]; } array[i] = pending; } return array; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sharks","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"whales","type":"uint256"}],"name":"RateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_NORT","type":"uint256"}],"name":"changeNORT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address[]","name":"_rewardTokens","type":"address[]"}],"name":"changeRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20Upgradeable","name":"stakeToken","type":"address"},{"internalType":"uint256","name":"openTime","type":"uint256"},{"internalType":"uint256","name":"waitPeriod","type":"uint256"},{"internalType":"uint256","name":"lockDuration","type":"uint256"},{"internalType":"uint256","name":"maxStake","type":"uint256"}],"internalType":"struct GabrielV3.ExtraArgs","name":"extraArgs","type":"tuple"},{"internalType":"uint256","name":"_NORT","type":"uint256"},{"internalType":"address[]","name":"_rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"_staticRewardsInPool","type":"uint256[]"}],"name":"createPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"dynamicRewardInPool","outputs":[{"internalType":"uint256[]","name":"dynamicRewardsInPool","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"compound","type":"bool"},{"internalType":"bool","name":"leaveRewards","type":"bool"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvesters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvests","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"inPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"sPercent","type":"uint256"},{"internalType":"uint256","name":"wPercent","type":"uint256"},{"internalType":"address","name":"sharks","type":"address"},{"internalType":"address","name":"whales","type":"address"}],"internalType":"struct GabrielV3.ConstructorArgs","name":"constructorArgs","type":"tuple"},{"components":[{"internalType":"contract IERC20Upgradeable","name":"stakeToken","type":"address"},{"internalType":"uint256","name":"openTime","type":"uint256"},{"internalType":"uint256","name":"waitPeriod","type":"uint256"},{"internalType":"uint256","name":"lockDuration","type":"uint256"},{"internalType":"uint256","name":"maxStake","type":"uint256"}],"internalType":"struct GabrielV3.ExtraArgs","name":"extraArgs","type":"tuple"},{"internalType":"uint256","name":"_NORT","type":"uint256"},{"internalType":"address[]","name":"_rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"_staticRewardsInPool","type":"uint256[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"components":[{"internalType":"contract IERC20Upgradeable","name":"stakeToken","type":"address"},{"internalType":"uint256","name":"openTime","type":"uint256"},{"internalType":"uint256","name":"waitPeriod","type":"uint256"},{"internalType":"uint256","name":"lockDuration","type":"uint256"},{"internalType":"uint256","name":"maxStake","type":"uint256"}],"internalType":"struct GabrielV3.ExtraArgs","name":"extraArgs","type":"tuple"},{"internalType":"uint256","name":"_NORT","type":"uint256"},{"internalType":"address[]","name":"_rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"_staticRewardsInPool","type":"uint256[]"}],"name":"nextRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"staker","type":"address"}],"name":"nonHarvestedRewards","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"bool","name":"canStake","type":"bool"},{"internalType":"bool","name":"canHarvest","type":"bool"},{"internalType":"contract IERC20Upgradeable","name":"stakeToken","type":"address"},{"internalType":"uint256","name":"compounded","type":"uint256"},{"internalType":"uint256","name":"lockDuration","type":"uint256"},{"internalType":"uint256","name":"lockTime","type":"uint256"},{"internalType":"uint256","name":"maxStake","type":"uint256"},{"internalType":"uint256","name":"NORT","type":"uint256"},{"internalType":"uint256","name":"openTime","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"uint256","name":"unstaked","type":"uint256"},{"internalType":"uint256","name":"waitPeriod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setPoolReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"rewards","type":"uint256[]"}],"name":"setPoolRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sPercent","type":"uint256"},{"internalType":"uint256","name":"_wPercent","type":"uint256"}],"name":"setRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sharks","type":"address"}],"name":"setSharkPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_openTime","type":"uint256"},{"internalType":"uint256","name":"_waitPeriod","type":"uint256"},{"internalType":"uint256","name":"_lockDuration","type":"uint256"}],"name":"setTimeValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whales","type":"address"}],"name":"setWhalePoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharks","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"stakers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"staticRewardInPool","outputs":[{"internalType":"uint256[]","name":"staticRewardsInPool","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"tokensInPool","outputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"unclaimedRewards","outputs":[{"internalType":"uint256[]","name":"unclaimedReward","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"harvested","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whales","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523060805234801562000014575f80fd5b505f54610100900460ff16158080156200003457505f54600160ff909116105b806200004f5750303b1580156200004f57505f5460ff166001145b620000b75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b5f805460ff191660011790558015620000d9575f805461ff0019166101001790555b80156200011f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50608051615c8e620001555f395f8181611085015281816110c501528181611a9c01528181611adc0152611c5e0152615c8e5ff3fe608060405260043610610233575f3560e01c806382ab890a11610129578063ca298bf0116100a8578063ea02cea41161006d578063ea02cea41461071c578063eb8101211461073b578063ebeda4fb14610784578063f2fde38b146107a3578063fd5e6dd1146107c2575f80fd5b8063ca298bf014610681578063d5a44f86146106a0578063dab47b3b146106bf578063dcafd2ff146106de578063e5ad8311146106fd575f80fd5b80639f73bc76116100ee5780639f73bc76146105e6578063a6801cbd14610605578063ac6af28014610624578063ad96acec14610643578063aee4729a14610662575f80fd5b806382ab890a146105175780638c555e85146105365780638da5cb5b1461055557806393f1a40b14610572578063957eda9e146105c7575f80fd5b806341d82370116101b557806352d1902d1161017a57806352d1902d1461049c578063620ebebb146104b05780636d93bc19146104c5578063715018a6146104e45780637b0472f0146104f8575f80fd5b806341d82370146103f557806346f90748146104145780634f1ef286146104335780635276194114610446578063527a526a14610465575f80fd5b80632e4f614e116101fb5780632e4f614e1461035757806335a423b0146103765780633659cfe614610395578063368ba47e146103b457806341a21b16146103c9575f80fd5b8063081e3eda146102375780631171bda91461025a5780631526fe271461027b578063247ac0c21461030c5780632e17de7814610338575b5f80fd5b348015610242575f80fd5b5060ce545b6040519081526020015b60405180910390f35b348015610265575f80fd5b506102796102743660046152bc565b6107e1565b005b348015610286575f80fd5b5061029a6102953660046152fa565b610802565b604080519d15158e529b151560208e01526001600160a01b03909a169a8c019a909a5260608b019790975260808a019590955260a089019390935260c088019190915260e08701526101008601526101208501526101408401526101608301919091526101808201526101a001610251565b348015610317575f80fd5b5061032b6103263660046152fa565b610878565b6040516102519190615311565b348015610343575f80fd5b506102796103523660046152fa565b610b1a565b348015610362575f80fd5b5061027961037136600461552a565b610c72565b348015610381575f80fd5b506102476103903660046152fa565b610dd9565b3480156103a0575f80fd5b506102796103af3660046155f9565b61107b565b3480156103bf575f80fd5b5061024760cb5481565b3480156103d4575f80fd5b506103e86103e33660046152fa565b611158565b6040516102519190615614565b348015610400575f80fd5b5061027961040f36600461564b565b6113fa565b34801561041f575f80fd5b506103e861042e36600461566b565b611410565b610279610441366004615699565b611a92565b348015610451575f80fd5b5061027961046036600461573a565b611b5d565b348015610470575f80fd5b5060cc54610484906001600160a01b031681565b6040516001600160a01b039091168152602001610251565b3480156104a7575f80fd5b50610247611c52565b3480156104bb575f80fd5b5061024760cd5481565b3480156104d0575f80fd5b506102796104df36600461577d565b611d03565b3480156104ef575f80fd5b50610279611f16565b348015610503575f80fd5b5061027961051236600461564b565b611f29565b348015610522575f80fd5b506102796105313660046152fa565b61221d565b348015610541575f80fd5b506102796105503660046157f4565b6122d6565b348015610560575f80fd5b506097546001600160a01b0316610484565b34801561057d575f80fd5b506105b261058c36600461566b565b60cf60209081525f92835260408084209091529082529020805460019091015460ff1682565b60408051928352901515602083015201610251565b3480156105d2575f80fd5b506102796105e1366004615833565b6127a5565b3480156105f1575f80fd5b506102796106003660046155f9565b61284e565b348015610610575f80fd5b5061027961061f366004615857565b6128d8565b34801561062f575f80fd5b5061027961063e36600461564b565b612a11565b34801561064e575f80fd5b506103e861065d36600461566b565b612aaf565b34801561066d575f80fd5b506103e861067c3660046152fa565b612b4a565b34801561068c575f80fd5b5061027961069b366004615880565b612dec565b3480156106ab575f80fd5b506102476106ba3660046152fa565b612eff565b3480156106ca575f80fd5b506102796106d93660046155f9565b6133bd565b3480156106e9575f80fd5b506102796106f83660046158b9565b6134aa565b348015610708575f80fd5b50610279610717366004615933565b613977565b348015610727575f80fd5b5061032b6107363660046152fa565b613991565b348015610746575f80fd5b50610774610755366004615962565b60c960209081525f928352604080842090915290825290205460ff1681565b6040519015158152602001610251565b34801561078f575f80fd5b5060ca54610484906001600160a01b031681565b3480156107ae575f80fd5b506102796107bd3660046155f9565b613c33565b3480156107cd575f80fd5b5061032b6107dc3660046152fa565b613ca9565b6107e9613f4b565b6107fd6001600160a01b0384168383613fa5565b505050565b60ce8181548110610811575f80fd5b5f918252602090912060109091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a015460ff808b169c506101008b04169a62010000909a046001600160a01b031699908d565b60605f60ce838154811061088e5761088e61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a08601939283018282801561099857602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161097a575b50505050508152602001600c82018054806020026020016040519081016040528092919081815260200182805480156109f857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116109da575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015610a5857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610a3a575b50505050508152602001600e8201805480602002602001604051908101604052809291908181526020018280548015610aae57602002820191905f5260205f20905b815481526020019060010190808311610a9a575b50505050508152602001600f8201805480602002602001604051908101604052809291908181526020018280548015610b0457602002820191905f5260205f20905b815481526020019060010190808311610af0575b505050919092525050506101c001519392505050565b5f60ce8281548110610b2e57610b2e61598c565b5f918252602080832085845260cf825260408085203386529092529220805460109092029092019250610bb45760405162461bcd60e51b8152602060048201526024808201527f756e7374616b653a20796f7572207374616b65642062616c616e6365206973206044820152637a65726f60e01b60648201526084015b60405180910390fd5b335f90815260c96020908152604080832086845290915290205460ff168015610bf957335f90815260c9602090815260408083208784529091529020805460ff191690555b81546009840154610c0991614008565b600984015581545f83556040517f15e1b1e6a67db05b5e4e898cc13f87b8485df622bfebf03d1508efa026a2e15c90610c47908790339085906159a0565b60405180910390a18354610c6b906201000090046001600160a01b03163383613fa5565b5050505050565b5f54610100900460ff1615808015610c9057505f54600160ff909116105b80610ca95750303b158015610ca957505f5460ff166001145b610d0c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bab565b5f805460ff191660011790558015610d2d575f805461ff0019166101001790555b855160cb55602086015160cd55604086015160ca80546001600160a01b039283166001600160a01b031991821617909155606088015160cc8054919093169116179055610d7861401a565b610d80614048565b610d8c858585856134aa565b8015610dd1575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f8060ce8381548110610dee57610dee61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a086019392830182828015610ef857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610eda575b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015610f5857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f3a575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015610fb857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f9a575b50505050508152602001600e820180548060200260200160405190810160405280929190818152602001828054801561100e57602002820191905f5260205f20905b815481526020019060010190808311610ffa575b50505050508152602001600f820180548060200260200160405190810160405280929190818152602001828054801561106457602002820191905f5260205f20905b815481526020019060010190808311611050575b505050919092525050506101a00151519392505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036110c35760405162461bcd60e51b8152600401610bab906159bf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661110b5f80516020615c12833981519152546001600160a01b031690565b6001600160a01b0316146111315760405162461bcd60e51b8152600401610bab90615a0b565b61113a8161406e565b604080515f8082526020820190925261115591839190614076565b50565b60605f60ce838154811061116e5761116e61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a08601939283018282801561127857602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161125a575b50505050508152602001600c82018054806020026020016040519081016040528092919081815260200182805480156112d857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116112ba575b50505050508152602001600d820180548060200260200160405190810160405280929190818152602001828054801561133857602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161131a575b50505050508152602001600e820180548060200260200160405190810160405280929190818152602001828054801561138e57602002820191905f5260205f20905b81548152602001906001019080831161137a575b50505050508152602001600f82018054806020026020016040519081016040528092919081815260200182805480156113e457602002820191905f5260205f20905b8154815260200190600101908083116113d0575b5050509190925250505061020001519392505050565b611402613f4b565b61140c82826141e0565b5050565b60605f60ce84815481106114265761142661598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a08601939283018282801561153057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611512575b50505050508152602001600c820180548060200260200160405190810160405280929190818152602001828054801561159057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611572575b50505050508152602001600d82018054806020026020016040519081016040528092919081815260200182805480156115f057602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116115d2575b50505050508152602001600e820180548060200260200160405190810160405280929190818152602001828054801561164657602002820191905f5260205f20905b815481526020019060010190808311611632575b50505050508152602001600f820180548060200260200160405190810160405280929190818152602001828054801561169c57602002820191905f5260205f20905b815481526020019060010190808311611688575b505050919092525050505f85815260cf602090815260408083206001600160a01b03881684528252808320815160608101835281548152600182015460ff161515818501526002820180548451818702810187018652818152979850959691959294938601939192909183018282801561173357602002820191905f5260205f20905b81548152602001906001019080831161171f575b5050509190925250505060e083015160408201515160a0850151929350909142118015611764575083610140015142105b801561177257508260200151155b8015611782575061012084015115155b156118cd575f826001600160401b038111156117a0576117a061535d565b6040519080825280602002602001820160405280156117c9578160200160208202803683370190505b5090505f5b838110156118c0575f6117ee8760a00151426142d590919063ffffffff16565b90505f87610220015183815181106118085761180861598c565b6020026020010151875f01518361181f9190615a6b565b6118299190615a6b565b90505f88608001518961012001516118419190615a6b565b90505f61184e83836142e0565b905087870361188a57611887896040015186815181106118705761187061598c565b60200260200101518261400890919063ffffffff16565b90505b8086868151811061189d5761189d61598c565b6020026020010181815250505050505080806118b890615a82565b9150506117ce565b509450611a8c9350505050565b836101400151421180156118e357508260200151155b80156118f3575061012084015115155b156119e3575f826001600160401b038111156119115761191161535d565b60405190808252806020026020018201604052801561193a578160200160208202803683370190505b5090505f5b838110156118c0575f866102200151828151811061195f5761195f61598c565b6020026020010151865f01516119759190615a6b565b6101208801519091505f61198983836142e0565b90508686036119ae576119ab886040015185815181106118705761187061598c565b90505b808585815181106119c1576119c161598c565b60200260200101818152505050505080806119db90615a82565b91505061193f565b5f826001600160401b038111156119fc576119fc61535d565b604051908082528060200260200182016040528015611a25578160200160208202803683370190505b5090505f5b838110156118c0575f848403611a5b5785604001518281518110611a5057611a5061598c565b602002602001015190505b80838381518110611a6e57611a6e61598c565b60209081029190910101525080611a8481615a82565b915050611a2a565b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003611ada5760405162461bcd60e51b8152600401610bab906159bf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b225f80516020615c12833981519152546001600160a01b031690565b6001600160a01b031614611b485760405162461bcd60e51b8152600401610bab90615a0b565b611b518261406e565b61140c82826001614076565b611b65613f4b565b5f60ce8381548110611b7957611b7961598c565b905f5260205f20906010020190505f8160050154905080835114611bdf5760405162461bcd60e51b815260206004820152601a60248201527f4352543a206172726179206c656e677468206d69736d617463680000000000006044820152606401610bab565b5f5b81811015610c6b57838181518110611bfb57611bfb61598c565b602002602001015183600c018281548110611c1857611c1861598c565b5f91825260209091200180546001600160a01b0319166001600160a01b039290921691909117905580611c4a81615a82565b915050611be1565b5f306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611cf15760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610bab565b505f80516020615c1283398151915290565b611d0b613f4b565b828251148015611d1c575080518251145b611d685760405162461bcd60e51b815260206004820152601960248201527f52503a206172726179206c656e677468206d69736d61746368000000000000006044820152606401610bab565b5f60ce8681548110611d7c57611d7c61598c565b5f9182526020909120865160109092020180546001600160a01b03909216620100000262010000600160b01b03199092169190911781556080860151600482015560018101546007820154919250611dd49190614008565b600782018190556009820154611dea91906142d5565b60078201555f600182018190556009820155602085015160408601516060870151611e1892899290916142eb565b611e2286856141e0565b5f5b84811015611f0d57838181518110611e3e57611e3e61598c565b602002602001015182600c018281548110611e5b57611e5b61598c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550828181518110611e9857611e9861598c565b602002602001015182600e018281548110611eb557611eb561598c565b905f5260205f200181905550828181518110611ed357611ed361598c565b602002602001015182600f018281548110611ef057611ef061598c565b5f9182526020909120015580611f0581615a82565b915050611e24565b50505050505050565b611f1e613f4b565b611f275f614398565b565b5f60ce8381548110611f3d57611f3d61598c565b5f918252602080832086845260cf825260408085203386529092529220600360109092029092019081015490925042118015611f7a5750815460ff165b15611f8857815460ff191682555b816006015442118015611f9e5750816003015442105b8015611fad5750816008015442105b8015611fbb5750815460ff16155b15611fcc57815460ff191660011782555b815460ff166120295760405162461bcd60e51b815260206004820152602360248201527f706f6f6c206973206e6f7420796574206f70656e6564206f72206973206c6f636044820152621ad95960ea1b6064820152608401610bab565b5f83116120845760405162461bcd60e51b8152602060048201526024808201527f796f752063616e6e6f74207374616b6520612076616c7565206c657373207468604482015263616e203160e01b6064820152608401610bab565b60048201548154612096908590614008565b11156120b45760405162461bcd60e51b8152600401610bab90615a9a565b5f806120bf336143e9565b91509150811561212c5785811461212c5760405162461bcd60e51b815260206004820152602b60248201527f7374616b696e6720696e206d6f7265207468616e206f6e6520706f6f6c20697360448201526a1b89dd08185b1b1bddd95960aa1b6064820152608401610bab565b335f90815260c96020908152604080832089845290915290205460ff168061217357335f90815260c9602090815260408083208a84529091529020805460ff191660011790555b61217c8761221d565b600d850180546001810182555f91825260209091200180546001600160a01b0319163317905583546121ae9087614008565b845560078501546121bf9087614008565b60078601556040517f02567b2553aeb44e4ddd5d68462774dc3de158cb0f2c2da1740e729b22086aff906121f890899033908a906159a0565b60405180910390a18454611f0d906201000090046001600160a01b031633308961444e565b5f60ce82815481106122315761223161598c565b905f5260205f20906010020190508060060154421161224e575050565b8060060154421180156122645750806003015442105b80156122735750806008015442105b1561228557805461ffff191660011781555b80600301544211801561229b5750806008015442105b156122aa57805461ffff191681555b8060080154421180156122c057505f8160080154115b1561140c57805461ffff19166101001781555050565b5f60ce84815481106122ea576122ea61598c565b5f918252602080832087845260cf82526040808520338652909252922060086010909202909201908101549092504211801561232d57508154610100900460ff16155b1561234057815461ff0019166101001782555b8154610100900460ff1661238d5760405162461bcd60e51b81526020600482015260146024820152731c1bdbdb081a5cc81cdd1a5b1b081b1bd8dad95960621b6044820152606401610bab565b600181015460ff16156124085760405162461bcd60e51b815260206004820152603860248201527f486172766573743a20796f75206861766520616c726561647920636c61696d6560448201527f64207265776172647320666f72207468697320726f756e6400000000000000006064820152608401610bab565b600b820180546001810182555f91825260209091200180546001600160a01b031916331790556124378561221d565b600582015460028201546001808401805460ff1916909117905585801561245b5750845b1561247a5761246a8733614486565b6124758733876148fb565b611f0d565b858015612485575084155b1561262b575f5b8281101561261f57801561260d575f85600f0182815481106124b0576124b061598c565b905f5260205f200154855f01546124c79190615a6b565b60078701549091505f6124da83836142e0565b905061250c8189600e0186815481106124f5576124f561598c565b905f5260205f2001546142d590919063ffffffff16565b88600e0185815481106125215761252161598c565b5f91825260209091200155841580159061253a57508585145b156125935761256f8760020185815481106125575761255761598c565b905f5260205f2001548261400890919063ffffffff16565b90505f8760020185815481106125875761258761598c565b5f918252602090912001555b8015612609577f393ccd03ff98115189a2796d79ffa176e434468dbeea90a87972324be8c507188b33836040516125cc939291906159a0565b60405180910390a161260933828a600c0187815481106125ee576125ee61598c565b5f918252602090912001546001600160a01b03169190613fa5565b5050505b8061261781615a82565b91505061248c565b506124758733876148fb565b851580156126365750845b15612645576124758733614486565b85158015612651575084155b15611f0d575f5b8281101561279b575f85600f0182815481106126765761267661598c565b905f5260205f200154855f015461268d9190615a6b565b60078701549091505f6126a083836142e0565b90506126bb8189600e0186815481106124f5576124f561598c565b88600e0185815481106126d0576126d061598c565b5f9182526020909120015584158015906126e957508585145b1561272a576127068760020185815481106125575761255761598c565b90505f87600201858154811061271e5761271e61598c565b5f918252602090912001555b8015612785577f393ccd03ff98115189a2796d79ffa176e434468dbeea90a87972324be8c507188b3383604051612763939291906159a0565b60405180910390a161278533828a600c0187815481106125ee576125ee61598c565b505050808061279390615a82565b915050612658565b5050505050505050565b6127ad613f4b565b5f6127b98260646142e0565b90505f6127d18260cd54614d6790919063ffffffff16565b90505f6127de84836142d5565b60408051888152602081018790529192507fb38780ddde1f073d91c150de2696f3f7085883648ba21cc5ef01029cb21d1916910160405180910390a160ca54612834906001600160a01b03878116911683613fa5565b60cc54610dd1906001600160a01b03878116911684613fa5565b612856613f4b565b6001600160a01b0381166128b65760405162461bcd60e51b815260206004820152602160248201527f63616e6e6f7420736574207768616c6573206173207a65726f206164647265736044820152607360f81b6064820152608401610bab565b60cc80546001600160a01b0319166001600160a01b0392909216919091179055565b6128e0613f4b565b5f60ce84815481106128f4576128f461598c565b5f9182526020909120601090910201600b810154909150835b8381101561297c575f86815260cf60205260408120600b850180548391908590811061293b5761293b61598c565b5f9182526020808320909101546001600160a01b031683528201929092526040019020600101805460ff19169055508061297481615a82565b91505061290d565b505f600b830161298d600186615ae0565b8154811061299d5761299d61598c565b5f9182526020822001546001600160a01b03169150600b84016129c1600185615ae0565b815481106129d1576129d161598c565b5f918252602090912001546001600160a01b03908116915082168103611f0d5760608051612a0690600b8701906080906151f8565b505050505050505050565b612a19613f4b565b612a238282614008565b606414612a685760405162461bcd60e51b81526020600482015260136024820152726d7573742073756d20757020746f203130302560681b6044820152606401610bab565b60cb82905560cd81905560408051838152602081018390527fb38780ddde1f073d91c150de2696f3f7085883648ba21cc5ef01029cb21d1916910160405180910390a15050565b5f82815260cf602090815260408083206001600160a01b0385168452825280832081516060818101845282548252600183015460ff1615158286015260028301805485518188028101880187528181529297969395860193830182828015612b3457602002820191905f5260205f20905b815481526020019060010190808311612b20575b5050509190925250505060400151949350505050565b60605f60ce8381548110612b6057612b6061598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a086019392830182828015612c6a57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311612c4c575b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015612cca57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311612cac575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015612d2a57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311612d0c575b50505050508152602001600e8201805480602002602001604051908101604052809291908181526020018280548015612d8057602002820191905f5260205f20905b815481526020019060010190808311612d6c575b50505050508152602001600f8201805480602002602001604051908101604052809291908181526020018280548015612dd657602002820191905f5260205f20905b815481526020019060010190808311612dc2575b5050509190925250505061022001519392505050565b612df4613f4b565b5f60ce8381548110612e0857612e0861598c565b905f5260205f20906010020190505f8160050154905080835114612e6e5760405162461bcd60e51b815260206004820152601a60248201527f5350523a206172726179206c656e677468206d69736d617463680000000000006044820152606401610bab565b5f5b81811015610c6b57838181518110612e8a57612e8a61598c565b602002602001015183600e018281548110612ea757612ea761598c565b905f5260205f200181905550838181518110612ec557612ec561598c565b602002602001015183600f018281548110612ee257612ee261598c565b5f9182526020909120015580612ef781615a82565b915050612e70565b5f8060ce8381548110612f1457612f1461598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a08601939283018282801561301e57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613000575b50505050508152602001600c820180548060200260200160405190810160405280929190818152602001828054801561307e57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613060575b50505050508152602001600d82018054806020026020016040519081016040528092919081815260200182805480156130de57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116130c0575b50505050508152602001600e820180548060200260200160405190810160405280929190818152602001828054801561313457602002820191905f5260205f20905b815481526020019060010190808311613120575b50505050508152602001600f820180548060200260200160405190810160405280929190818152602001828054801561318a57602002820191905f5260205f20905b815481526020019060010190808311613176575b50505050508152505090505f816101e001515111156133b55760015f6131b08280615ae0565b90505f826001600160401b038111156131cb576131cb61535d565b6040519080825280602002602001820160405280156131f4578160200160208202803683370190505b509050836101e00151828151811061320e5761320e61598c565b60200260200101518183815181106132285761322861598c565b60200260200101906001600160a01b031690816001600160a01b0316815250505f5b846101e00151518110156133aa5761328082866101e0015183815181106132735761327361598c565b6020026020010151614d72565b6133985761328f600185615af3565b935061329c600185615ae0565b925081846001600160401b038111156132b7576132b761535d565b6040519080825280602002602001820160405280156132e0578160200160208202803683370190505b5092505f5b8151811015613344578181815181106133005761330061598c565b602002602001015184828151811061331a5761331a61598c565b6001600160a01b03909216602092830291909101909101528061333c81615a82565b9150506132e5565b50856101e00151828151811061335c5761335c61598c565b60200260200101518385815181106133765761337661598c565b60200260200101906001600160a01b031690816001600160a01b031681525050505b806133a281615a82565b91505061324a565b505195945050505050565b505f92915050565b60ca546001600160a01b031633146134285760405162461bcd60e51b815260206004820152602860248201527f736861726b733a2063616c6c6572206973206e6f74207468652063757272656e6044820152677420736861726b7360c01b6064820152608401610bab565b6001600160a01b0381166134885760405162461bcd60e51b815260206004820152602160248201527f63616e6e6f742073657420736861726b73206173207a65726f206164647265736044820152607360f81b6064820152608401610bab565b60ca80546001600160a01b0319166001600160a01b0392909216919091179055565b6134b2613f4b565b8282511480156134c3575080518251145b61350f5760405162461bcd60e51b815260206004820152601960248201527f43503a206172726179206c656e677468206d69736d61746368000000000000006044820152606401610bab565b5f836001600160401b038111156135285761352861535d565b604051908082528060200260200182016040528015613551578160200160208202803683370190505b5090505f846001600160401b0381111561356d5761356d61535d565b604051908082528060200260200182016040528015613596578160200160208202803683370190505b5090506060428760200151116135ee5760405162461bcd60e51b815260206004820152601f60248201527f6f70656e2074696d65206d7573742062652061206675747572652074696d65006044820152606401610bab565b5f61360a8860400151896020015161400890919063ffffffff16565b90505f61362489606001518361400890919063ffffffff16565b905060ce6040518061024001604052805f151581526020015f151581526020018b5f01516001600160a01b031681526020015f81526020018b6060015181526020018481526020018b6080015181526020018a81526020018b6020015181526020015f81526020018381526020015f81526020018b60400151815260200185815260200187815260200185815260200186815260200186815250908060018154018082558091505060019003905f5260205f2090601002015f909190919091505f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548160ff0219169083151502179055506040820151815f0160026101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600101556080820151816002015560a0820151816003015560c0820151816004015560e08201518160050155610100820151816006015561012082015181600701556101408201518160080155610160820151816009015561018082015181600a01556101a082015181600b0190805190602001906137d29291906151f8565b506101c082015180516137ef91600c8401916020909101906151f8565b506101e0820151805161380c91600d8401916020909101906151f8565b50610200820151805161382991600e84019160209091019061525b565b50610220820151805161384691600f84019160209091019061525b565b505060ce545f915061385a90600190615ae0565b90505f60ce82815481106138705761387061598c565b905f5260205f20906010020190505f5b8a8110156139695789818151811061389a5761389a61598c565b602002602001015182600c0182815481106138b7576138b761598c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508881815181106138f4576138f461598c565b602002602001015182600e0182815481106139115761391161598c565b905f5260205f20018190555088818151811061392f5761392f61598c565b602002602001015182600f01828154811061394c5761394c61598c565b5f918252602090912001558061396181615a82565b915050613880565b505050505050505050505050565b61397f613f4b565b61398b848484846142eb565b50505050565b60605f60ce83815481106139a7576139a761598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a086019392830182828015613ab157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613a93575b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015613b1157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613af3575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015613b7157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613b53575b50505050508152602001600e8201805480602002602001604051908101604052809291908181526020018280548015613bc757602002820191905f5260205f20905b815481526020019060010190808311613bb3575b50505050508152602001600f8201805480602002602001604051908101604052809291908181526020018280548015613c1d57602002820191905f5260205f20905b815481526020019060010190808311613c09575b505050919092525050506101a001519392505050565b613c3b613f4b565b6001600160a01b038116613ca05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bab565b61115581614398565b60605f60ce8381548110613cbf57613cbf61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a086019392830182828015613dc957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613dab575b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015613e2957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613e0b575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015613e8957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613e6b575b50505050508152602001600e8201805480602002602001604051908101604052809291908181526020018280548015613edf57602002820191905f5260205f20905b815481526020019060010190808311613ecb575b50505050508152602001600f8201805480602002602001604051908101604052809291908181526020018280548015613f3557602002820191905f5260205f20905b815481526020019060010190808311613f21575b505050919092525050506101e001519392505050565b6097546001600160a01b03163314611f275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bab565b6040516001600160a01b0383166024820152604481018290526107fd90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614dd5565b5f6140138284615af3565b9392505050565b5f54610100900460ff166140405760405162461bcd60e51b8152600401610bab90615b06565b611f27614ea8565b5f54610100900460ff16611f275760405162461bcd60e51b8152600401610bab90615b06565b611155613f4b565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156140a9576107fd83614ed7565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015614103575060408051601f3d908101601f1916820190925261410091810190615b51565b60015b6141665760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610bab565b5f80516020615c1283398151915281146141d45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610bab565b506107fd838383614f72565b5f60ce83815481106141f4576141f461598c565b905f5260205f20906010020190505f826001600160401b0381111561421b5761421b61535d565b604051908082528060200260200182016040528015614244578160200160208202803683370190505b5090505f836001600160401b038111156142605761426061535d565b604051908082528060200260200182016040528015614289578160200160208202803683370190505b506005840185905582519091506142a990600c85019060208501906151f8565b5080516142bf90600e850190602084019061525b565b508051610dd190600f850190602084019061525b565b5f6140138284615ae0565b5f6140138284615b68565b5f60ce85815481106142ff576142ff61598c565b905f5260205f209060100201905042841161435c5760405162461bcd60e51b815260206004820152601f60248201527f6f70656e2074696d65206d7573742062652061206675747572652074696d65006044820152606401610bab565b60068101849055600a81018390556143748484614008565b600382018190556002820183905561438c9083614008565b60089091015550505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f805f5b60ce548110156144485760ce5415614436576001600160a01b0384165f90815260c96020908152604080832084845290915290205460ff1680156144345794909350915050565b505b8061444081615a82565b9150506143ed565b50915091565b6040516001600160a01b038085166024830152831660448201526064810182905261398b9085906323b872dd60e01b90608401613fd1565b5f60ce838154811061449a5761449a61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a0860193928301828280156145a457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311614586575b50505050508152602001600c820180548060200260200160405190810160405280929190818152602001828054801561460457602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116145e6575b50505050508152602001600d820180548060200260200160405190810160405280929190818152602001828054801561466457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311614646575b50505050508152602001600e82018054806020026020016040519081016040528092919081815260200182805480156146ba57602002820191905f5260205f20905b8154815260200190600101908083116146a6575b50505050508152602001600f820180548060200260200160405190810160405280929190818152602001828054801561471057602002820191905f5260205f20905b8154815260200190600101908083116146fc575b5050509190925250505060e08101515f85815260cf602090815260408083206001600160a01b03881684529091528120600281015493945091929081900361483957826001600160401b0381111561476a5761476a61535d565b604051908082528060200260200182016040528015614793578160200160208202803683370190505b5080516147aa91600285019160209091019061525b565b505f5b83811015614837575f85610220015182815181106147cd576147cd61598c565b6020026020010151845f01546147e39190615a6b565b6101208701519091505f6147f783836142e0565b9050801561482157808660020185815481106148155761481561598c565b5f918252602090912001555b505050808061482f90615a82565b9150506147ad565b505b828103610dd1575f5b83811015611f0d575f85610220015182815181106148625761486261598c565b6020026020010151845f01546148789190615a6b565b6101208701519091505f61488c83836142e0565b905080156148e5576148c4818760020186815481106148ad576148ad61598c565b905f5260205f20015461400890919063ffffffff16565b8660020185815481106148d9576148d961598c565b5f918252602090912001555b50505080806148f390615a82565b915050614842565b5f60ce848154811061490f5761490f61598c565b5f918252602080832087845260cf825260408085206001600160a01b03891686529092529083206010929092020160058101546002830154919450919285614995575f85600f015f815481106149675761496761598c565b905f5260205f200154855f015461497e9190615a6b565b600787015490915061499082826142e0565b925050505b5f821180156149a357508282145b15614aea575f6149d9856002015f815481106149c1576149c161598c565b905f5260205f2001548361400890919063ffffffff16565b85549091505f906149eb908390614008565b905086600401548111614a5057614a28866002015f81548110614a1057614a1061598c565b905f5260205f2001548461400890919063ffffffff16565b92505f866002015f81548110614a4057614a4061598c565b5f91825260209091200155614ae7565b8660040154811115614ae757614a7583876002015f815481106148ad576148ad61598c565b866002015f81548110614a8a57614a8a61598c565b5f91825260208220019190915586546004890154614aa7916142d5565b9050809350614ac581886002015f815481106124f5576124f561598c565b876002015f81548110614ada57614ada61598c565b5f91825260209091200155505b50505b815f03614bf6575f85600f015f81548110614b0757614b0761598c565b905f5260205f200154855f0154614b1e9190615a6b565b6007870154909150614b3082826142e0565b86549093505f90614b42908590614008565b90508760040154811115614bf257865460048901545f91614b6391906142d5565b90505f614b7086836142d5565b9050819550876001600160401b03811115614b8d57614b8d61535d565b604051908082528060200260200182016040528015614bb6578160200160208202803683370190505b508051614bcd9160028c019160209091019061525b565b5080896002015f81548110614be457614be461598c565b5f9182526020909120015550505b5050505b801561279b576001850154614c0b9082614008565b600186015560048501548454614c22908390614008565b1115614c405760405162461bcd60e51b8152600401610bab90615a9a565b5f80614c4b896143e9565b915091508115614cb757898114614cb75760405162461bcd60e51b815260206004820152602a60248201527f7374616b696e6720696e206d6f7265207468616e206f6e6520706f6f6c206973604482015269103337b93134b23232b760b11b6064820152608401610bab565b6001600160a01b0389165f90815260c9602090815260408083208d845290915290205460ff1680614d10576001600160a01b038a165f90815260c9602090815260408083208e84529091529020805460ff191660011790555b8654614d1c9085614008565b87556040517f02567b2553aeb44e4ddd5d68462774dc3de158cb0f2c2da1740e729b22086aff90614d52908d908d9088906159a0565b60405180910390a15050505050505050505050565b5f6140138284615a6b565b5f805b8351811015614dcc57826001600160a01b0316848281518110614d9a57614d9a61598c565b60200260200101516001600160a01b031603614dba576001915050611a8c565b80614dc481615a82565b915050614d75565b505f9392505050565b5f614e29826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614f969092919063ffffffff16565b905080515f1480614e49575080806020019051810190614e499190615b87565b6107fd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bab565b5f54610100900460ff16614ece5760405162461bcd60e51b8152600401610bab90615b06565b611f2733614398565b6001600160a01b0381163b614f445760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610bab565b5f80516020615c1283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614f7b83614fac565b5f82511180614f875750805b156107fd5761398b8383614feb565b6060614fa484845f85615010565b949350505050565b614fb581614ed7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606140138383604051806060016040528060278152602001615c32602791396150e7565b6060824710156150715760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bab565b5f80866001600160a01b0316858760405161508c9190615bc4565b5f6040518083038185875af1925050503d805f81146150c6576040519150601f19603f3d011682016040523d82523d5f602084013e6150cb565b606091505b50915091506150dc8783838761515b565b979650505050505050565b60605f80856001600160a01b0316856040516151039190615bc4565b5f60405180830381855af49150503d805f811461513b576040519150601f19603f3d011682016040523d82523d5f602084013e615140565b606091505b50915091506151518683838761515b565b9695505050505050565b606083156151c95782515f036151c2576001600160a01b0385163b6151c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bab565b5081614fa4565b614fa483838151156151de5781518083602001fd5b8060405162461bcd60e51b8152600401610bab9190615bdf565b828054828255905f5260205f2090810192821561524b579160200282015b8281111561524b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190615216565b50615257929150615294565b5090565b828054828255905f5260205f2090810192821561524b579160200282015b8281111561524b578251825591602001919060010190615279565b5b80821115615257575f8155600101615295565b6001600160a01b0381168114611155575f80fd5b5f805f606084860312156152ce575f80fd5b83356152d9816152a8565b925060208401356152e9816152a8565b929592945050506040919091013590565b5f6020828403121561530a575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b818110156153515783516001600160a01b03168352928401929184019160010161532c565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156153935761539361535d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156153c1576153c161535d565b604052919050565b5f60a082840312156153d9575f80fd5b60405160a081018181106001600160401b03821117156153fb576153fb61535d565b604052905080823561540c816152a8565b80825250602083013560208201526040830135604082015260608301356060820152608083013560808201525092915050565b5f6001600160401b038211156154575761545761535d565b5060051b60200190565b5f82601f830112615470575f80fd5b813560206154856154808361543f565b615399565b82815260059290921b840181019181810190868411156154a3575f80fd5b8286015b848110156154c75780356154ba816152a8565b83529183019183016154a7565b509695505050505050565b5f82601f8301126154e1575f80fd5b813560206154f16154808361543f565b82815260059290921b8401810191818101908684111561550f575f80fd5b8286015b848110156154c75780358352918301918301615513565b5f805f805f858703610180811215615540575f80fd5b608081121561554d575f80fd5b50615556615371565b86358152602087013560208201526040870135615572816152a8565b60408201526060870135615585816152a8565b6060820152945061559987608088016153c9565b935061012086013592506101408601356001600160401b03808211156155bd575f80fd5b6155c989838a01615461565b93506101608801359150808211156155df575f80fd5b506155ec888289016154d2565b9150509295509295909350565b5f60208284031215615609575f80fd5b8135614013816152a8565b602080825282518282018190525f9190848201906040850190845b818110156153515783518352928401929184019160010161562f565b5f806040838503121561565c575f80fd5b50508035926020909101359150565b5f806040838503121561567c575f80fd5b82359150602083013561568e816152a8565b809150509250929050565b5f80604083850312156156aa575f80fd5b82356156b5816152a8565b91506020838101356001600160401b03808211156156d1575f80fd5b818601915086601f8301126156e4575f80fd5b8135818111156156f6576156f661535d565b615708601f8201601f19168501615399565b9150808252878482850101111561571d575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f806040838503121561574b575f80fd5b8235915060208301356001600160401b03811115615767575f80fd5b61577385828601615461565b9150509250929050565b5f805f805f6101208688031215615792575f80fd5b853594506157a387602088016153c9565b935060c0860135925060e08601356001600160401b03808211156157c5575f80fd5b6157d189838a01615461565b93506101008801359150808211156155df575f80fd5b8015158114611155575f80fd5b5f805f60608486031215615806575f80fd5b833592506020840135615818816157e7565b91506040840135615828816157e7565b809150509250925092565b5f805f60608486031215615845575f80fd5b8335925060208401356152e9816152a8565b5f805f60608486031215615869575f80fd5b505081359360208301359350604090920135919050565b5f8060408385031215615891575f80fd5b8235915060208301356001600160401b038111156158ad575f80fd5b615773858286016154d2565b5f805f8061010085870312156158cd575f80fd5b6158d786866153c9565b935060a0850135925060c08501356001600160401b03808211156158f9575f80fd5b61590588838901615461565b935060e087013591508082111561591a575f80fd5b50615927878288016154d2565b91505092959194509250565b5f805f8060808587031215615946575f80fd5b5050823594602084013594506040840135936060013592509050565b5f8060408385031215615973575f80fd5b823561597e816152a8565b946020939093013593505050565b634e487b7160e01b5f52603260045260245ffd5b9283526001600160a01b03919091166020830152604082015260600190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417611a8c57611a8c615a57565b5f60018201615a9357615a93615a57565b5060010190565b60208082526026908201527f796f752063616e6e6f74207374616b65206d6f7265207468616e20746865206d6040820152656178696d756d60d01b606082015260800190565b81810381811115611a8c57611a8c615a57565b80820180821115611a8c57611a8c615a57565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215615b61575f80fd5b5051919050565b5f82615b8257634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215615b97575f80fd5b8151614013816157e7565b5f5b83811015615bbc578181015183820152602001615ba4565b50505f910152565b5f8251615bd5818460208701615ba2565b9190910192915050565b602081525f8251806020840152615bfd816040850160208701615ba2565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206305e49c12677390d8120f490458db2c6520c55df5678fd1ea7c796a3a986bce64736f6c63430008140033
Deployed Bytecode
0x608060405260043610610233575f3560e01c806382ab890a11610129578063ca298bf0116100a8578063ea02cea41161006d578063ea02cea41461071c578063eb8101211461073b578063ebeda4fb14610784578063f2fde38b146107a3578063fd5e6dd1146107c2575f80fd5b8063ca298bf014610681578063d5a44f86146106a0578063dab47b3b146106bf578063dcafd2ff146106de578063e5ad8311146106fd575f80fd5b80639f73bc76116100ee5780639f73bc76146105e6578063a6801cbd14610605578063ac6af28014610624578063ad96acec14610643578063aee4729a14610662575f80fd5b806382ab890a146105175780638c555e85146105365780638da5cb5b1461055557806393f1a40b14610572578063957eda9e146105c7575f80fd5b806341d82370116101b557806352d1902d1161017a57806352d1902d1461049c578063620ebebb146104b05780636d93bc19146104c5578063715018a6146104e45780637b0472f0146104f8575f80fd5b806341d82370146103f557806346f90748146104145780634f1ef286146104335780635276194114610446578063527a526a14610465575f80fd5b80632e4f614e116101fb5780632e4f614e1461035757806335a423b0146103765780633659cfe614610395578063368ba47e146103b457806341a21b16146103c9575f80fd5b8063081e3eda146102375780631171bda91461025a5780631526fe271461027b578063247ac0c21461030c5780632e17de7814610338575b5f80fd5b348015610242575f80fd5b5060ce545b6040519081526020015b60405180910390f35b348015610265575f80fd5b506102796102743660046152bc565b6107e1565b005b348015610286575f80fd5b5061029a6102953660046152fa565b610802565b604080519d15158e529b151560208e01526001600160a01b03909a169a8c019a909a5260608b019790975260808a019590955260a089019390935260c088019190915260e08701526101008601526101208501526101408401526101608301919091526101808201526101a001610251565b348015610317575f80fd5b5061032b6103263660046152fa565b610878565b6040516102519190615311565b348015610343575f80fd5b506102796103523660046152fa565b610b1a565b348015610362575f80fd5b5061027961037136600461552a565b610c72565b348015610381575f80fd5b506102476103903660046152fa565b610dd9565b3480156103a0575f80fd5b506102796103af3660046155f9565b61107b565b3480156103bf575f80fd5b5061024760cb5481565b3480156103d4575f80fd5b506103e86103e33660046152fa565b611158565b6040516102519190615614565b348015610400575f80fd5b5061027961040f36600461564b565b6113fa565b34801561041f575f80fd5b506103e861042e36600461566b565b611410565b610279610441366004615699565b611a92565b348015610451575f80fd5b5061027961046036600461573a565b611b5d565b348015610470575f80fd5b5060cc54610484906001600160a01b031681565b6040516001600160a01b039091168152602001610251565b3480156104a7575f80fd5b50610247611c52565b3480156104bb575f80fd5b5061024760cd5481565b3480156104d0575f80fd5b506102796104df36600461577d565b611d03565b3480156104ef575f80fd5b50610279611f16565b348015610503575f80fd5b5061027961051236600461564b565b611f29565b348015610522575f80fd5b506102796105313660046152fa565b61221d565b348015610541575f80fd5b506102796105503660046157f4565b6122d6565b348015610560575f80fd5b506097546001600160a01b0316610484565b34801561057d575f80fd5b506105b261058c36600461566b565b60cf60209081525f92835260408084209091529082529020805460019091015460ff1682565b60408051928352901515602083015201610251565b3480156105d2575f80fd5b506102796105e1366004615833565b6127a5565b3480156105f1575f80fd5b506102796106003660046155f9565b61284e565b348015610610575f80fd5b5061027961061f366004615857565b6128d8565b34801561062f575f80fd5b5061027961063e36600461564b565b612a11565b34801561064e575f80fd5b506103e861065d36600461566b565b612aaf565b34801561066d575f80fd5b506103e861067c3660046152fa565b612b4a565b34801561068c575f80fd5b5061027961069b366004615880565b612dec565b3480156106ab575f80fd5b506102476106ba3660046152fa565b612eff565b3480156106ca575f80fd5b506102796106d93660046155f9565b6133bd565b3480156106e9575f80fd5b506102796106f83660046158b9565b6134aa565b348015610708575f80fd5b50610279610717366004615933565b613977565b348015610727575f80fd5b5061032b6107363660046152fa565b613991565b348015610746575f80fd5b50610774610755366004615962565b60c960209081525f928352604080842090915290825290205460ff1681565b6040519015158152602001610251565b34801561078f575f80fd5b5060ca54610484906001600160a01b031681565b3480156107ae575f80fd5b506102796107bd3660046155f9565b613c33565b3480156107cd575f80fd5b5061032b6107dc3660046152fa565b613ca9565b6107e9613f4b565b6107fd6001600160a01b0384168383613fa5565b505050565b60ce8181548110610811575f80fd5b5f918252602090912060109091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a015460ff808b169c506101008b04169a62010000909a046001600160a01b031699908d565b60605f60ce838154811061088e5761088e61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a08601939283018282801561099857602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161097a575b50505050508152602001600c82018054806020026020016040519081016040528092919081815260200182805480156109f857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116109da575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015610a5857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610a3a575b50505050508152602001600e8201805480602002602001604051908101604052809291908181526020018280548015610aae57602002820191905f5260205f20905b815481526020019060010190808311610a9a575b50505050508152602001600f8201805480602002602001604051908101604052809291908181526020018280548015610b0457602002820191905f5260205f20905b815481526020019060010190808311610af0575b505050919092525050506101c001519392505050565b5f60ce8281548110610b2e57610b2e61598c565b5f918252602080832085845260cf825260408085203386529092529220805460109092029092019250610bb45760405162461bcd60e51b8152602060048201526024808201527f756e7374616b653a20796f7572207374616b65642062616c616e6365206973206044820152637a65726f60e01b60648201526084015b60405180910390fd5b335f90815260c96020908152604080832086845290915290205460ff168015610bf957335f90815260c9602090815260408083208784529091529020805460ff191690555b81546009840154610c0991614008565b600984015581545f83556040517f15e1b1e6a67db05b5e4e898cc13f87b8485df622bfebf03d1508efa026a2e15c90610c47908790339085906159a0565b60405180910390a18354610c6b906201000090046001600160a01b03163383613fa5565b5050505050565b5f54610100900460ff1615808015610c9057505f54600160ff909116105b80610ca95750303b158015610ca957505f5460ff166001145b610d0c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bab565b5f805460ff191660011790558015610d2d575f805461ff0019166101001790555b855160cb55602086015160cd55604086015160ca80546001600160a01b039283166001600160a01b031991821617909155606088015160cc8054919093169116179055610d7861401a565b610d80614048565b610d8c858585856134aa565b8015610dd1575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f8060ce8381548110610dee57610dee61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a086019392830182828015610ef857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610eda575b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015610f5857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f3a575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015610fb857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f9a575b50505050508152602001600e820180548060200260200160405190810160405280929190818152602001828054801561100e57602002820191905f5260205f20905b815481526020019060010190808311610ffa575b50505050508152602001600f820180548060200260200160405190810160405280929190818152602001828054801561106457602002820191905f5260205f20905b815481526020019060010190808311611050575b505050919092525050506101a00151519392505050565b6001600160a01b037f0000000000000000000000008af59fbeb98d9635db1625d58b257b6330d69d751630036110c35760405162461bcd60e51b8152600401610bab906159bf565b7f0000000000000000000000008af59fbeb98d9635db1625d58b257b6330d69d756001600160a01b031661110b5f80516020615c12833981519152546001600160a01b031690565b6001600160a01b0316146111315760405162461bcd60e51b8152600401610bab90615a0b565b61113a8161406e565b604080515f8082526020820190925261115591839190614076565b50565b60605f60ce838154811061116e5761116e61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a08601939283018282801561127857602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161125a575b50505050508152602001600c82018054806020026020016040519081016040528092919081815260200182805480156112d857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116112ba575b50505050508152602001600d820180548060200260200160405190810160405280929190818152602001828054801561133857602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161131a575b50505050508152602001600e820180548060200260200160405190810160405280929190818152602001828054801561138e57602002820191905f5260205f20905b81548152602001906001019080831161137a575b50505050508152602001600f82018054806020026020016040519081016040528092919081815260200182805480156113e457602002820191905f5260205f20905b8154815260200190600101908083116113d0575b5050509190925250505061020001519392505050565b611402613f4b565b61140c82826141e0565b5050565b60605f60ce84815481106114265761142661598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a08601939283018282801561153057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611512575b50505050508152602001600c820180548060200260200160405190810160405280929190818152602001828054801561159057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611572575b50505050508152602001600d82018054806020026020016040519081016040528092919081815260200182805480156115f057602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116115d2575b50505050508152602001600e820180548060200260200160405190810160405280929190818152602001828054801561164657602002820191905f5260205f20905b815481526020019060010190808311611632575b50505050508152602001600f820180548060200260200160405190810160405280929190818152602001828054801561169c57602002820191905f5260205f20905b815481526020019060010190808311611688575b505050919092525050505f85815260cf602090815260408083206001600160a01b03881684528252808320815160608101835281548152600182015460ff161515818501526002820180548451818702810187018652818152979850959691959294938601939192909183018282801561173357602002820191905f5260205f20905b81548152602001906001019080831161171f575b5050509190925250505060e083015160408201515160a0850151929350909142118015611764575083610140015142105b801561177257508260200151155b8015611782575061012084015115155b156118cd575f826001600160401b038111156117a0576117a061535d565b6040519080825280602002602001820160405280156117c9578160200160208202803683370190505b5090505f5b838110156118c0575f6117ee8760a00151426142d590919063ffffffff16565b90505f87610220015183815181106118085761180861598c565b6020026020010151875f01518361181f9190615a6b565b6118299190615a6b565b90505f88608001518961012001516118419190615a6b565b90505f61184e83836142e0565b905087870361188a57611887896040015186815181106118705761187061598c565b60200260200101518261400890919063ffffffff16565b90505b8086868151811061189d5761189d61598c565b6020026020010181815250505050505080806118b890615a82565b9150506117ce565b509450611a8c9350505050565b836101400151421180156118e357508260200151155b80156118f3575061012084015115155b156119e3575f826001600160401b038111156119115761191161535d565b60405190808252806020026020018201604052801561193a578160200160208202803683370190505b5090505f5b838110156118c0575f866102200151828151811061195f5761195f61598c565b6020026020010151865f01516119759190615a6b565b6101208801519091505f61198983836142e0565b90508686036119ae576119ab886040015185815181106118705761187061598c565b90505b808585815181106119c1576119c161598c565b60200260200101818152505050505080806119db90615a82565b91505061193f565b5f826001600160401b038111156119fc576119fc61535d565b604051908082528060200260200182016040528015611a25578160200160208202803683370190505b5090505f5b838110156118c0575f848403611a5b5785604001518281518110611a5057611a5061598c565b602002602001015190505b80838381518110611a6e57611a6e61598c565b60209081029190910101525080611a8481615a82565b915050611a2a565b92915050565b6001600160a01b037f0000000000000000000000008af59fbeb98d9635db1625d58b257b6330d69d75163003611ada5760405162461bcd60e51b8152600401610bab906159bf565b7f0000000000000000000000008af59fbeb98d9635db1625d58b257b6330d69d756001600160a01b0316611b225f80516020615c12833981519152546001600160a01b031690565b6001600160a01b031614611b485760405162461bcd60e51b8152600401610bab90615a0b565b611b518261406e565b61140c82826001614076565b611b65613f4b565b5f60ce8381548110611b7957611b7961598c565b905f5260205f20906010020190505f8160050154905080835114611bdf5760405162461bcd60e51b815260206004820152601a60248201527f4352543a206172726179206c656e677468206d69736d617463680000000000006044820152606401610bab565b5f5b81811015610c6b57838181518110611bfb57611bfb61598c565b602002602001015183600c018281548110611c1857611c1861598c565b5f91825260209091200180546001600160a01b0319166001600160a01b039290921691909117905580611c4a81615a82565b915050611be1565b5f306001600160a01b037f0000000000000000000000008af59fbeb98d9635db1625d58b257b6330d69d751614611cf15760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610bab565b505f80516020615c1283398151915290565b611d0b613f4b565b828251148015611d1c575080518251145b611d685760405162461bcd60e51b815260206004820152601960248201527f52503a206172726179206c656e677468206d69736d61746368000000000000006044820152606401610bab565b5f60ce8681548110611d7c57611d7c61598c565b5f9182526020909120865160109092020180546001600160a01b03909216620100000262010000600160b01b03199092169190911781556080860151600482015560018101546007820154919250611dd49190614008565b600782018190556009820154611dea91906142d5565b60078201555f600182018190556009820155602085015160408601516060870151611e1892899290916142eb565b611e2286856141e0565b5f5b84811015611f0d57838181518110611e3e57611e3e61598c565b602002602001015182600c018281548110611e5b57611e5b61598c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550828181518110611e9857611e9861598c565b602002602001015182600e018281548110611eb557611eb561598c565b905f5260205f200181905550828181518110611ed357611ed361598c565b602002602001015182600f018281548110611ef057611ef061598c565b5f9182526020909120015580611f0581615a82565b915050611e24565b50505050505050565b611f1e613f4b565b611f275f614398565b565b5f60ce8381548110611f3d57611f3d61598c565b5f918252602080832086845260cf825260408085203386529092529220600360109092029092019081015490925042118015611f7a5750815460ff165b15611f8857815460ff191682555b816006015442118015611f9e5750816003015442105b8015611fad5750816008015442105b8015611fbb5750815460ff16155b15611fcc57815460ff191660011782555b815460ff166120295760405162461bcd60e51b815260206004820152602360248201527f706f6f6c206973206e6f7420796574206f70656e6564206f72206973206c6f636044820152621ad95960ea1b6064820152608401610bab565b5f83116120845760405162461bcd60e51b8152602060048201526024808201527f796f752063616e6e6f74207374616b6520612076616c7565206c657373207468604482015263616e203160e01b6064820152608401610bab565b60048201548154612096908590614008565b11156120b45760405162461bcd60e51b8152600401610bab90615a9a565b5f806120bf336143e9565b91509150811561212c5785811461212c5760405162461bcd60e51b815260206004820152602b60248201527f7374616b696e6720696e206d6f7265207468616e206f6e6520706f6f6c20697360448201526a1b89dd08185b1b1bddd95960aa1b6064820152608401610bab565b335f90815260c96020908152604080832089845290915290205460ff168061217357335f90815260c9602090815260408083208a84529091529020805460ff191660011790555b61217c8761221d565b600d850180546001810182555f91825260209091200180546001600160a01b0319163317905583546121ae9087614008565b845560078501546121bf9087614008565b60078601556040517f02567b2553aeb44e4ddd5d68462774dc3de158cb0f2c2da1740e729b22086aff906121f890899033908a906159a0565b60405180910390a18454611f0d906201000090046001600160a01b031633308961444e565b5f60ce82815481106122315761223161598c565b905f5260205f20906010020190508060060154421161224e575050565b8060060154421180156122645750806003015442105b80156122735750806008015442105b1561228557805461ffff191660011781555b80600301544211801561229b5750806008015442105b156122aa57805461ffff191681555b8060080154421180156122c057505f8160080154115b1561140c57805461ffff19166101001781555050565b5f60ce84815481106122ea576122ea61598c565b5f918252602080832087845260cf82526040808520338652909252922060086010909202909201908101549092504211801561232d57508154610100900460ff16155b1561234057815461ff0019166101001782555b8154610100900460ff1661238d5760405162461bcd60e51b81526020600482015260146024820152731c1bdbdb081a5cc81cdd1a5b1b081b1bd8dad95960621b6044820152606401610bab565b600181015460ff16156124085760405162461bcd60e51b815260206004820152603860248201527f486172766573743a20796f75206861766520616c726561647920636c61696d6560448201527f64207265776172647320666f72207468697320726f756e6400000000000000006064820152608401610bab565b600b820180546001810182555f91825260209091200180546001600160a01b031916331790556124378561221d565b600582015460028201546001808401805460ff1916909117905585801561245b5750845b1561247a5761246a8733614486565b6124758733876148fb565b611f0d565b858015612485575084155b1561262b575f5b8281101561261f57801561260d575f85600f0182815481106124b0576124b061598c565b905f5260205f200154855f01546124c79190615a6b565b60078701549091505f6124da83836142e0565b905061250c8189600e0186815481106124f5576124f561598c565b905f5260205f2001546142d590919063ffffffff16565b88600e0185815481106125215761252161598c565b5f91825260209091200155841580159061253a57508585145b156125935761256f8760020185815481106125575761255761598c565b905f5260205f2001548261400890919063ffffffff16565b90505f8760020185815481106125875761258761598c565b5f918252602090912001555b8015612609577f393ccd03ff98115189a2796d79ffa176e434468dbeea90a87972324be8c507188b33836040516125cc939291906159a0565b60405180910390a161260933828a600c0187815481106125ee576125ee61598c565b5f918252602090912001546001600160a01b03169190613fa5565b5050505b8061261781615a82565b91505061248c565b506124758733876148fb565b851580156126365750845b15612645576124758733614486565b85158015612651575084155b15611f0d575f5b8281101561279b575f85600f0182815481106126765761267661598c565b905f5260205f200154855f015461268d9190615a6b565b60078701549091505f6126a083836142e0565b90506126bb8189600e0186815481106124f5576124f561598c565b88600e0185815481106126d0576126d061598c565b5f9182526020909120015584158015906126e957508585145b1561272a576127068760020185815481106125575761255761598c565b90505f87600201858154811061271e5761271e61598c565b5f918252602090912001555b8015612785577f393ccd03ff98115189a2796d79ffa176e434468dbeea90a87972324be8c507188b3383604051612763939291906159a0565b60405180910390a161278533828a600c0187815481106125ee576125ee61598c565b505050808061279390615a82565b915050612658565b5050505050505050565b6127ad613f4b565b5f6127b98260646142e0565b90505f6127d18260cd54614d6790919063ffffffff16565b90505f6127de84836142d5565b60408051888152602081018790529192507fb38780ddde1f073d91c150de2696f3f7085883648ba21cc5ef01029cb21d1916910160405180910390a160ca54612834906001600160a01b03878116911683613fa5565b60cc54610dd1906001600160a01b03878116911684613fa5565b612856613f4b565b6001600160a01b0381166128b65760405162461bcd60e51b815260206004820152602160248201527f63616e6e6f7420736574207768616c6573206173207a65726f206164647265736044820152607360f81b6064820152608401610bab565b60cc80546001600160a01b0319166001600160a01b0392909216919091179055565b6128e0613f4b565b5f60ce84815481106128f4576128f461598c565b5f9182526020909120601090910201600b810154909150835b8381101561297c575f86815260cf60205260408120600b850180548391908590811061293b5761293b61598c565b5f9182526020808320909101546001600160a01b031683528201929092526040019020600101805460ff19169055508061297481615a82565b91505061290d565b505f600b830161298d600186615ae0565b8154811061299d5761299d61598c565b5f9182526020822001546001600160a01b03169150600b84016129c1600185615ae0565b815481106129d1576129d161598c565b5f918252602090912001546001600160a01b03908116915082168103611f0d5760608051612a0690600b8701906080906151f8565b505050505050505050565b612a19613f4b565b612a238282614008565b606414612a685760405162461bcd60e51b81526020600482015260136024820152726d7573742073756d20757020746f203130302560681b6044820152606401610bab565b60cb82905560cd81905560408051838152602081018390527fb38780ddde1f073d91c150de2696f3f7085883648ba21cc5ef01029cb21d1916910160405180910390a15050565b5f82815260cf602090815260408083206001600160a01b0385168452825280832081516060818101845282548252600183015460ff1615158286015260028301805485518188028101880187528181529297969395860193830182828015612b3457602002820191905f5260205f20905b815481526020019060010190808311612b20575b5050509190925250505060400151949350505050565b60605f60ce8381548110612b6057612b6061598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a086019392830182828015612c6a57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311612c4c575b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015612cca57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311612cac575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015612d2a57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311612d0c575b50505050508152602001600e8201805480602002602001604051908101604052809291908181526020018280548015612d8057602002820191905f5260205f20905b815481526020019060010190808311612d6c575b50505050508152602001600f8201805480602002602001604051908101604052809291908181526020018280548015612dd657602002820191905f5260205f20905b815481526020019060010190808311612dc2575b5050509190925250505061022001519392505050565b612df4613f4b565b5f60ce8381548110612e0857612e0861598c565b905f5260205f20906010020190505f8160050154905080835114612e6e5760405162461bcd60e51b815260206004820152601a60248201527f5350523a206172726179206c656e677468206d69736d617463680000000000006044820152606401610bab565b5f5b81811015610c6b57838181518110612e8a57612e8a61598c565b602002602001015183600e018281548110612ea757612ea761598c565b905f5260205f200181905550838181518110612ec557612ec561598c565b602002602001015183600f018281548110612ee257612ee261598c565b5f9182526020909120015580612ef781615a82565b915050612e70565b5f8060ce8381548110612f1457612f1461598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a08601939283018282801561301e57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613000575b50505050508152602001600c820180548060200260200160405190810160405280929190818152602001828054801561307e57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613060575b50505050508152602001600d82018054806020026020016040519081016040528092919081815260200182805480156130de57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116130c0575b50505050508152602001600e820180548060200260200160405190810160405280929190818152602001828054801561313457602002820191905f5260205f20905b815481526020019060010190808311613120575b50505050508152602001600f820180548060200260200160405190810160405280929190818152602001828054801561318a57602002820191905f5260205f20905b815481526020019060010190808311613176575b50505050508152505090505f816101e001515111156133b55760015f6131b08280615ae0565b90505f826001600160401b038111156131cb576131cb61535d565b6040519080825280602002602001820160405280156131f4578160200160208202803683370190505b509050836101e00151828151811061320e5761320e61598c565b60200260200101518183815181106132285761322861598c565b60200260200101906001600160a01b031690816001600160a01b0316815250505f5b846101e00151518110156133aa5761328082866101e0015183815181106132735761327361598c565b6020026020010151614d72565b6133985761328f600185615af3565b935061329c600185615ae0565b925081846001600160401b038111156132b7576132b761535d565b6040519080825280602002602001820160405280156132e0578160200160208202803683370190505b5092505f5b8151811015613344578181815181106133005761330061598c565b602002602001015184828151811061331a5761331a61598c565b6001600160a01b03909216602092830291909101909101528061333c81615a82565b9150506132e5565b50856101e00151828151811061335c5761335c61598c565b60200260200101518385815181106133765761337661598c565b60200260200101906001600160a01b031690816001600160a01b031681525050505b806133a281615a82565b91505061324a565b505195945050505050565b505f92915050565b60ca546001600160a01b031633146134285760405162461bcd60e51b815260206004820152602860248201527f736861726b733a2063616c6c6572206973206e6f74207468652063757272656e6044820152677420736861726b7360c01b6064820152608401610bab565b6001600160a01b0381166134885760405162461bcd60e51b815260206004820152602160248201527f63616e6e6f742073657420736861726b73206173207a65726f206164647265736044820152607360f81b6064820152608401610bab565b60ca80546001600160a01b0319166001600160a01b0392909216919091179055565b6134b2613f4b565b8282511480156134c3575080518251145b61350f5760405162461bcd60e51b815260206004820152601960248201527f43503a206172726179206c656e677468206d69736d61746368000000000000006044820152606401610bab565b5f836001600160401b038111156135285761352861535d565b604051908082528060200260200182016040528015613551578160200160208202803683370190505b5090505f846001600160401b0381111561356d5761356d61535d565b604051908082528060200260200182016040528015613596578160200160208202803683370190505b5090506060428760200151116135ee5760405162461bcd60e51b815260206004820152601f60248201527f6f70656e2074696d65206d7573742062652061206675747572652074696d65006044820152606401610bab565b5f61360a8860400151896020015161400890919063ffffffff16565b90505f61362489606001518361400890919063ffffffff16565b905060ce6040518061024001604052805f151581526020015f151581526020018b5f01516001600160a01b031681526020015f81526020018b6060015181526020018481526020018b6080015181526020018a81526020018b6020015181526020015f81526020018381526020015f81526020018b60400151815260200185815260200187815260200185815260200186815260200186815250908060018154018082558091505060019003905f5260205f2090601002015f909190919091505f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548160ff0219169083151502179055506040820151815f0160026101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600101556080820151816002015560a0820151816003015560c0820151816004015560e08201518160050155610100820151816006015561012082015181600701556101408201518160080155610160820151816009015561018082015181600a01556101a082015181600b0190805190602001906137d29291906151f8565b506101c082015180516137ef91600c8401916020909101906151f8565b506101e0820151805161380c91600d8401916020909101906151f8565b50610200820151805161382991600e84019160209091019061525b565b50610220820151805161384691600f84019160209091019061525b565b505060ce545f915061385a90600190615ae0565b90505f60ce82815481106138705761387061598c565b905f5260205f20906010020190505f5b8a8110156139695789818151811061389a5761389a61598c565b602002602001015182600c0182815481106138b7576138b761598c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508881815181106138f4576138f461598c565b602002602001015182600e0182815481106139115761391161598c565b905f5260205f20018190555088818151811061392f5761392f61598c565b602002602001015182600f01828154811061394c5761394c61598c565b5f918252602090912001558061396181615a82565b915050613880565b505050505050505050505050565b61397f613f4b565b61398b848484846142eb565b50505050565b60605f60ce83815481106139a7576139a761598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a086019392830182828015613ab157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613a93575b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015613b1157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613af3575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015613b7157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613b53575b50505050508152602001600e8201805480602002602001604051908101604052809291908181526020018280548015613bc757602002820191905f5260205f20905b815481526020019060010190808311613bb3575b50505050508152602001600f8201805480602002602001604051908101604052809291908181526020018280548015613c1d57602002820191905f5260205f20905b815481526020019060010190808311613c09575b505050919092525050506101a001519392505050565b613c3b613f4b565b6001600160a01b038116613ca05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bab565b61115581614398565b60605f60ce8381548110613cbf57613cbf61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a086019392830182828015613dc957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613dab575b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015613e2957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613e0b575b50505050508152602001600d8201805480602002602001604051908101604052809291908181526020018280548015613e8957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613e6b575b50505050508152602001600e8201805480602002602001604051908101604052809291908181526020018280548015613edf57602002820191905f5260205f20905b815481526020019060010190808311613ecb575b50505050508152602001600f8201805480602002602001604051908101604052809291908181526020018280548015613f3557602002820191905f5260205f20905b815481526020019060010190808311613f21575b505050919092525050506101e001519392505050565b6097546001600160a01b03163314611f275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bab565b6040516001600160a01b0383166024820152604481018290526107fd90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614dd5565b5f6140138284615af3565b9392505050565b5f54610100900460ff166140405760405162461bcd60e51b8152600401610bab90615b06565b611f27614ea8565b5f54610100900460ff16611f275760405162461bcd60e51b8152600401610bab90615b06565b611155613f4b565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156140a9576107fd83614ed7565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015614103575060408051601f3d908101601f1916820190925261410091810190615b51565b60015b6141665760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610bab565b5f80516020615c1283398151915281146141d45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610bab565b506107fd838383614f72565b5f60ce83815481106141f4576141f461598c565b905f5260205f20906010020190505f826001600160401b0381111561421b5761421b61535d565b604051908082528060200260200182016040528015614244578160200160208202803683370190505b5090505f836001600160401b038111156142605761426061535d565b604051908082528060200260200182016040528015614289578160200160208202803683370190505b506005840185905582519091506142a990600c85019060208501906151f8565b5080516142bf90600e850190602084019061525b565b508051610dd190600f850190602084019061525b565b5f6140138284615ae0565b5f6140138284615b68565b5f60ce85815481106142ff576142ff61598c565b905f5260205f209060100201905042841161435c5760405162461bcd60e51b815260206004820152601f60248201527f6f70656e2074696d65206d7573742062652061206675747572652074696d65006044820152606401610bab565b60068101849055600a81018390556143748484614008565b600382018190556002820183905561438c9083614008565b60089091015550505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f805f5b60ce548110156144485760ce5415614436576001600160a01b0384165f90815260c96020908152604080832084845290915290205460ff1680156144345794909350915050565b505b8061444081615a82565b9150506143ed565b50915091565b6040516001600160a01b038085166024830152831660448201526064810182905261398b9085906323b872dd60e01b90608401613fd1565b5f60ce838154811061449a5761449a61598c565b5f9182526020918290206040805161024081018252601093909302909101805460ff80821615158552610100808304909116151585870152620100009091046001600160a01b0316848401526001820154606085015260028201546080850152600382015460a0850152600482015460c0850152600582015460e0850152600682015490840152600781015461012084015260088101546101408401526009810154610160840152600a810154610180840152600b81018054835181870281018701909452808452939491936101a0860193928301828280156145a457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311614586575b50505050508152602001600c820180548060200260200160405190810160405280929190818152602001828054801561460457602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116145e6575b50505050508152602001600d820180548060200260200160405190810160405280929190818152602001828054801561466457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311614646575b50505050508152602001600e82018054806020026020016040519081016040528092919081815260200182805480156146ba57602002820191905f5260205f20905b8154815260200190600101908083116146a6575b50505050508152602001600f820180548060200260200160405190810160405280929190818152602001828054801561471057602002820191905f5260205f20905b8154815260200190600101908083116146fc575b5050509190925250505060e08101515f85815260cf602090815260408083206001600160a01b03881684529091528120600281015493945091929081900361483957826001600160401b0381111561476a5761476a61535d565b604051908082528060200260200182016040528015614793578160200160208202803683370190505b5080516147aa91600285019160209091019061525b565b505f5b83811015614837575f85610220015182815181106147cd576147cd61598c565b6020026020010151845f01546147e39190615a6b565b6101208701519091505f6147f783836142e0565b9050801561482157808660020185815481106148155761481561598c565b5f918252602090912001555b505050808061482f90615a82565b9150506147ad565b505b828103610dd1575f5b83811015611f0d575f85610220015182815181106148625761486261598c565b6020026020010151845f01546148789190615a6b565b6101208701519091505f61488c83836142e0565b905080156148e5576148c4818760020186815481106148ad576148ad61598c565b905f5260205f20015461400890919063ffffffff16565b8660020185815481106148d9576148d961598c565b5f918252602090912001555b50505080806148f390615a82565b915050614842565b5f60ce848154811061490f5761490f61598c565b5f918252602080832087845260cf825260408085206001600160a01b03891686529092529083206010929092020160058101546002830154919450919285614995575f85600f015f815481106149675761496761598c565b905f5260205f200154855f015461497e9190615a6b565b600787015490915061499082826142e0565b925050505b5f821180156149a357508282145b15614aea575f6149d9856002015f815481106149c1576149c161598c565b905f5260205f2001548361400890919063ffffffff16565b85549091505f906149eb908390614008565b905086600401548111614a5057614a28866002015f81548110614a1057614a1061598c565b905f5260205f2001548461400890919063ffffffff16565b92505f866002015f81548110614a4057614a4061598c565b5f91825260209091200155614ae7565b8660040154811115614ae757614a7583876002015f815481106148ad576148ad61598c565b866002015f81548110614a8a57614a8a61598c565b5f91825260208220019190915586546004890154614aa7916142d5565b9050809350614ac581886002015f815481106124f5576124f561598c565b876002015f81548110614ada57614ada61598c565b5f91825260209091200155505b50505b815f03614bf6575f85600f015f81548110614b0757614b0761598c565b905f5260205f200154855f0154614b1e9190615a6b565b6007870154909150614b3082826142e0565b86549093505f90614b42908590614008565b90508760040154811115614bf257865460048901545f91614b6391906142d5565b90505f614b7086836142d5565b9050819550876001600160401b03811115614b8d57614b8d61535d565b604051908082528060200260200182016040528015614bb6578160200160208202803683370190505b508051614bcd9160028c019160209091019061525b565b5080896002015f81548110614be457614be461598c565b5f9182526020909120015550505b5050505b801561279b576001850154614c0b9082614008565b600186015560048501548454614c22908390614008565b1115614c405760405162461bcd60e51b8152600401610bab90615a9a565b5f80614c4b896143e9565b915091508115614cb757898114614cb75760405162461bcd60e51b815260206004820152602a60248201527f7374616b696e6720696e206d6f7265207468616e206f6e6520706f6f6c206973604482015269103337b93134b23232b760b11b6064820152608401610bab565b6001600160a01b0389165f90815260c9602090815260408083208d845290915290205460ff1680614d10576001600160a01b038a165f90815260c9602090815260408083208e84529091529020805460ff191660011790555b8654614d1c9085614008565b87556040517f02567b2553aeb44e4ddd5d68462774dc3de158cb0f2c2da1740e729b22086aff90614d52908d908d9088906159a0565b60405180910390a15050505050505050505050565b5f6140138284615a6b565b5f805b8351811015614dcc57826001600160a01b0316848281518110614d9a57614d9a61598c565b60200260200101516001600160a01b031603614dba576001915050611a8c565b80614dc481615a82565b915050614d75565b505f9392505050565b5f614e29826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614f969092919063ffffffff16565b905080515f1480614e49575080806020019051810190614e499190615b87565b6107fd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bab565b5f54610100900460ff16614ece5760405162461bcd60e51b8152600401610bab90615b06565b611f2733614398565b6001600160a01b0381163b614f445760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610bab565b5f80516020615c1283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614f7b83614fac565b5f82511180614f875750805b156107fd5761398b8383614feb565b6060614fa484845f85615010565b949350505050565b614fb581614ed7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606140138383604051806060016040528060278152602001615c32602791396150e7565b6060824710156150715760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bab565b5f80866001600160a01b0316858760405161508c9190615bc4565b5f6040518083038185875af1925050503d805f81146150c6576040519150601f19603f3d011682016040523d82523d5f602084013e6150cb565b606091505b50915091506150dc8783838761515b565b979650505050505050565b60605f80856001600160a01b0316856040516151039190615bc4565b5f60405180830381855af49150503d805f811461513b576040519150601f19603f3d011682016040523d82523d5f602084013e615140565b606091505b50915091506151518683838761515b565b9695505050505050565b606083156151c95782515f036151c2576001600160a01b0385163b6151c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bab565b5081614fa4565b614fa483838151156151de5781518083602001fd5b8060405162461bcd60e51b8152600401610bab9190615bdf565b828054828255905f5260205f2090810192821561524b579160200282015b8281111561524b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190615216565b50615257929150615294565b5090565b828054828255905f5260205f2090810192821561524b579160200282015b8281111561524b578251825591602001919060010190615279565b5b80821115615257575f8155600101615295565b6001600160a01b0381168114611155575f80fd5b5f805f606084860312156152ce575f80fd5b83356152d9816152a8565b925060208401356152e9816152a8565b929592945050506040919091013590565b5f6020828403121561530a575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b818110156153515783516001600160a01b03168352928401929184019160010161532c565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156153935761539361535d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156153c1576153c161535d565b604052919050565b5f60a082840312156153d9575f80fd5b60405160a081018181106001600160401b03821117156153fb576153fb61535d565b604052905080823561540c816152a8565b80825250602083013560208201526040830135604082015260608301356060820152608083013560808201525092915050565b5f6001600160401b038211156154575761545761535d565b5060051b60200190565b5f82601f830112615470575f80fd5b813560206154856154808361543f565b615399565b82815260059290921b840181019181810190868411156154a3575f80fd5b8286015b848110156154c75780356154ba816152a8565b83529183019183016154a7565b509695505050505050565b5f82601f8301126154e1575f80fd5b813560206154f16154808361543f565b82815260059290921b8401810191818101908684111561550f575f80fd5b8286015b848110156154c75780358352918301918301615513565b5f805f805f858703610180811215615540575f80fd5b608081121561554d575f80fd5b50615556615371565b86358152602087013560208201526040870135615572816152a8565b60408201526060870135615585816152a8565b6060820152945061559987608088016153c9565b935061012086013592506101408601356001600160401b03808211156155bd575f80fd5b6155c989838a01615461565b93506101608801359150808211156155df575f80fd5b506155ec888289016154d2565b9150509295509295909350565b5f60208284031215615609575f80fd5b8135614013816152a8565b602080825282518282018190525f9190848201906040850190845b818110156153515783518352928401929184019160010161562f565b5f806040838503121561565c575f80fd5b50508035926020909101359150565b5f806040838503121561567c575f80fd5b82359150602083013561568e816152a8565b809150509250929050565b5f80604083850312156156aa575f80fd5b82356156b5816152a8565b91506020838101356001600160401b03808211156156d1575f80fd5b818601915086601f8301126156e4575f80fd5b8135818111156156f6576156f661535d565b615708601f8201601f19168501615399565b9150808252878482850101111561571d575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f806040838503121561574b575f80fd5b8235915060208301356001600160401b03811115615767575f80fd5b61577385828601615461565b9150509250929050565b5f805f805f6101208688031215615792575f80fd5b853594506157a387602088016153c9565b935060c0860135925060e08601356001600160401b03808211156157c5575f80fd5b6157d189838a01615461565b93506101008801359150808211156155df575f80fd5b8015158114611155575f80fd5b5f805f60608486031215615806575f80fd5b833592506020840135615818816157e7565b91506040840135615828816157e7565b809150509250925092565b5f805f60608486031215615845575f80fd5b8335925060208401356152e9816152a8565b5f805f60608486031215615869575f80fd5b505081359360208301359350604090920135919050565b5f8060408385031215615891575f80fd5b8235915060208301356001600160401b038111156158ad575f80fd5b615773858286016154d2565b5f805f8061010085870312156158cd575f80fd5b6158d786866153c9565b935060a0850135925060c08501356001600160401b03808211156158f9575f80fd5b61590588838901615461565b935060e087013591508082111561591a575f80fd5b50615927878288016154d2565b91505092959194509250565b5f805f8060808587031215615946575f80fd5b5050823594602084013594506040840135936060013592509050565b5f8060408385031215615973575f80fd5b823561597e816152a8565b946020939093013593505050565b634e487b7160e01b5f52603260045260245ffd5b9283526001600160a01b03919091166020830152604082015260600190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417611a8c57611a8c615a57565b5f60018201615a9357615a93615a57565b5060010190565b60208082526026908201527f796f752063616e6e6f74207374616b65206d6f7265207468616e20746865206d6040820152656178696d756d60d01b606082015260800190565b81810381811115611a8c57611a8c615a57565b80820180821115611a8c57611a8c615a57565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215615b61575f80fd5b5051919050565b5f82615b8257634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215615b97575f80fd5b8151614013816157e7565b5f5b83811015615bbc578181015183820152602001615ba4565b50505f910152565b5f8251615bd5818460208701615ba2565b9190910192915050565b602081525f8251806020840152615bfd816040850160208701615ba2565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206305e49c12677390d8120f490458db2c6520c55df5678fd1ea7c796a3a986bce64736f6c63430008140033
Deployed Bytecode Sourcemap
58568:27028:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81799:95;;;;;;;;;;-1:-1:-1;81871:8:0;:15;81799:95;;;160:25:1;;;148:2;133:18;81799:95:0;;;;;;;;71718:166;;;;;;;;;;-1:-1:-1;71718:166:0;;;;;:::i;:::-;;:::i;:::-;;58993:26;;;;;;;;;;-1:-1:-1;58993:26:0;;;;;:::i;:::-;;:::i;:::-;;;;1502:14:1;;1495:22;1477:41;;1561:14;;1554:22;1549:2;1534:18;;1527:50;-1:-1:-1;;;;;1613:32:1;;;1593:18;;;1586:60;;;;1677:2;1662:18;;1655:34;;;;1720:3;1705:19;;1698:35;;;;1633:3;1749:19;;1742:35;;;;1808:3;1793:19;;1786:35;;;;1852:3;1837:19;;1830:35;1896:3;1881:19;;1874:35;1940:3;1925:19;;1918:35;1984:3;1969:19;;1962:36;2029:3;2014:19;;2007:36;;;;2074:3;2059:19;;2052:36;1464:3;1449:19;58993:26:0;978:1116:1;83299:189:0;;;;;;;;;;-1:-1:-1;83299:189:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;78590:609::-;;;;;;;;;;-1:-1:-1;78590:609:0;;;;;:::i;:::-;;:::i;60604:567::-;;;;;;;;;;-1:-1:-1;60604:567:0;;;;;:::i;:::-;;:::i;81148:161::-;;;;;;;;;;-1:-1:-1;81148:161:0;;;;;:::i;:::-;;:::i;52334:198::-;;;;;;;;;;-1:-1:-1;52334:198:0;;;;;:::i;:::-;;:::i;58893:23::-;;;;;;;;;;;;;;;;80747:220;;;;;;;;;;-1:-1:-1;80747:220:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61673:111::-;;;;;;;;;;-1:-1:-1;61673:111:0;;;;;:::i;:::-;;:::i;83496:2097::-;;;;;;;;;;-1:-1:-1;83496:2097:0;;;;;:::i;:::-;;:::i;52863:223::-;;;;;;:::i;:::-;;:::i;61792:370::-;;;;;;;;;;-1:-1:-1;61792:370:0;;;;;:::i;:::-;;:::i;58929:21::-;;;;;;;;;;-1:-1:-1;58929:21:0;;;;-1:-1:-1;;;;;58929:21:0;;;;;;-1:-1:-1;;;;;10102:32:1;;;10084:51;;10072:2;10057:18;58929:21:0;9938:203:1;51940:133:0;;;;;;;;;;;;;:::i;58957:23::-;;;;;;;;;;;;;;;;70607:1048;;;;;;;;;;-1:-1:-1;70607:1048:0;;;;;:::i;:::-;;:::i;57315:103::-;;;;;;;;;;;;;:::i;75702:1555::-;;;;;;;;;;-1:-1:-1;75702:1555:0;;;;;:::i;:::-;;:::i;79207:830::-;;;;;;;;;;-1:-1:-1;79207:830:0;;;;;:::i;:::-;;:::i;67453:2653::-;;;;;;;;;;-1:-1:-1;67453:2653:0;;;;;:::i;:::-;;:::i;56674:87::-;;;;;;;;;;-1:-1:-1;56747:6:0;;-1:-1:-1;;;;;56747:6:0;56674:87;;59026:64;;;;;;;;;;-1:-1:-1;59026:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11927:25:1;;;11995:14;;11988:22;11983:2;11968:18;;11961:50;11900:18;59026:64:0;11759:258:1;72889:409:0;;;;;;;;;;-1:-1:-1;72889:409:0;;;;;:::i;:::-;;:::i;75336:178::-;;;;;;;;;;-1:-1:-1;75336:178:0;;;;;:::i;:::-;;:::i;72228:653::-;;;;;;;;;;-1:-1:-1;72228:653:0;;;;;:::i;:::-;;:::i;73941:268::-;;;;;;;;;;-1:-1:-1;73941:268:0;;;;;:::i;:::-;;:::i;81585:206::-;;;;;;;;;;-1:-1:-1;81585:206:0;;;;;:::i;:::-;;:::i;83075:216::-;;;;;;;;;;-1:-1:-1;83075:216:0;;;;;:::i;:::-;;:::i;73522:411::-;;;;;;;;;;-1:-1:-1;73522:411:0;;;;;:::i;:::-;;:::i;82070:997::-;;;;;;;;;;-1:-1:-1;82070:997:0;;;;;:::i;:::-;;:::i;74217:252::-;;;;;;;;;;-1:-1:-1;74217:252:0;;;;;:::i;:::-;;:::i;62589:1924::-;;;;;;;;;;-1:-1:-1;62589:1924:0;;;;;:::i;:::-;;:::i;75048:240::-;;;;;;;;;;-1:-1:-1;75048:240:0;;;;;:::i;:::-;;:::i;80975:165::-;;;;;;;;;;-1:-1:-1;80975:165:0;;;;;:::i;:::-;;:::i;58798:58::-;;;;;;;;;;-1:-1:-1;58798:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14818:14:1;;14811:22;14793:41;;14781:2;14766:18;58798:58:0;14653:187:1;58865:21:0;;;;;;;;;;-1:-1:-1;58865:21:0;;;;-1:-1:-1;;;;;58865:21:0;;;57573:201;;;;;;;;;;-1:-1:-1;57573:201:0;;;;;:::i;:::-;;:::i;81902:160::-;;;;;;;;;;-1:-1:-1;81902:160:0;;;;;:::i;:::-;;:::i;71718:166::-;56560:13;:11;:13::i;:::-;71820:56:::1;-1:-1:-1::0;;;;;71820:37:0;::::1;71858:9:::0;71869:6;71820:37:::1;:56::i;:::-;71718:166:::0;;;:::o;58993:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58993:26:0;;;;;;;;;-1:-1:-1;;;;;58993:26:0;;;;:::o;83299:189::-;83358:29;83400:20;83423:8;83432:4;83423:14;;;;;;;;:::i;:::-;;;;;;;;;;83400:37;;;;;;;;83423:14;;;;;;;;83400:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83400:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83423:14;;83400:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83400:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83400:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83400:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;83400:37:0;;;;-1:-1:-1;;;83463:17:0;;;;83299:189;-1:-1:-1;;;83299:189:0:o;78590:609::-;78641:21;78665:8;78674:4;78665:14;;;;;;;;:::i;:::-;;;;;;;;;78714;;;:8;:14;;;;;;78729:10;78714:26;;;;;;;78759:11;;78665:14;;;;;;;;-1:-1:-1;78751:64:0;;;;-1:-1:-1;;;78751:64:0;;15179:2:1;78751:64:0;;;15161:21:1;15218:2;15198:18;;;15191:30;15257:34;15237:18;;;15230:62;-1:-1:-1;;;15308:18:1;;;15301:34;15352:19;;78751:64:0;;;;;;;;;78855:10;78826:19;78848:18;;;:6;:18;;;;;;;;:24;;;;;;;;;;;78883:79;;;;78925:10;78945:5;78918:18;;;:6;:18;;;;;;;;:24;;;;;;;;:32;;-1:-1:-1;;78918:32:0;;;78883:79;79006:11;;78988:13;;;;:30;;:17;:30::i;:::-;78972:13;;;:46;79046:11;;79029:14;79068:15;;79099:33;;;;;;79107:4;;79113:10;;79046:11;;79099:33;:::i;:::-;;;;;;;;79143:15;;:48;;:15;;;-1:-1:-1;;;;;79143:15:0;79172:10;79184:6;79143:28;:48::i;:::-;78630:569;;;;78590:609;:::o;60604:567::-;38841:19;38864:13;;;;;;38863:14;;38911:34;;;;-1:-1:-1;38929:12:0;;38944:1;38929:12;;;;:16;38911:34;38910:108;;;-1:-1:-1;38990:4:0;20514:19;:23;;;38951:66;;-1:-1:-1;39000:12:0;;;;;:17;38951:66;38888:204;;;;-1:-1:-1;;;38888:204:0;;15934:2:1;38888:204:0;;;15916:21:1;15973:2;15953:18;;;15946:30;16012:34;15992:18;;;15985:62;-1:-1:-1;;;16063:18:1;;;16056:44;16117:19;;38888:204:0;15732:410:1;38888:204:0;39103:12;:16;;-1:-1:-1;;39103:16:0;39118:1;39103:16;;;39130:67;;;;39165:13;:20;;-1:-1:-1;;39165:20:0;;;;;39130:67;60871:24;;60860:8:::1;:35:::0;60917:24:::1;::::0;::::1;::::0;60906:8:::1;:35:::0;60961:22:::1;::::0;::::1;::::0;60952:6:::1;:31:::0;;-1:-1:-1;;;;;60952:31:0;;::::1;-1:-1:-1::0;;;;;;60952:31:0;;::::1;;::::0;;;61003:22:::1;::::0;::::1;::::0;60994:6:::1;:31:::0;;;;;::::1;::::0;::::1;;::::0;;61036:16:::1;:14;:16::i;:::-;61063:24;:22;:24::i;:::-;61098:65;61109:9;61120:5;61127:13;61142:20;61098:10;:65::i;:::-;39223:14:::0;39219:102;;;39270:5;39254:21;;-1:-1:-1;;39254:21:0;;;39295:14;;-1:-1:-1;16299:36:1;;39295:14:0;;16287:2:1;16272:18;39295:14:0;;;;;;;39219:102;38830:498;60604:567;;;;;:::o;81148:161::-;81203:7;81223:20;81246:8;81255:4;81246:14;;;;;;;;:::i;:::-;;;;;;;;;;81223:37;;;;;;;;81246:14;;;;;;;;81223:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81223:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81246:14;;81223:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81223:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81223:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81223:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;81223:37:0;;;;-1:-1:-1;;;81278:16:0;;;:23;;81148:161;-1:-1:-1;;;81148:161:0:o;52334:198::-;-1:-1:-1;;;;;50810:6:0;50793:23;50801:4;50793:23;50785:80;;;;-1:-1:-1;;;50785:80:0;;;;;;;:::i;:::-;50908:6;-1:-1:-1;;;;;50884:30:0;:20;-1:-1:-1;;;;;;;;;;;43605:65:0;-1:-1:-1;;;;;43605:65:0;;43525:153;50884:20;-1:-1:-1;;;;;50884:30:0;;50876:87;;;;-1:-1:-1;;;50876:87:0;;;;;;;:::i;:::-;52416:36:::1;52434:17;52416;:36::i;:::-;52504:12;::::0;;52514:1:::1;52504:12:::0;;;::::1;::::0;::::1;::::0;;;52463:61:::1;::::0;52485:17;;52504:12;52463:21:::1;:61::i;:::-;52334:198:::0;:::o;80747:220::-;80813:37;80863:20;80886:8;80895:4;80886:14;;;;;;;;:::i;:::-;;;;;;;;;;80863:37;;;;;;;;80886:14;;;;;;;;80863:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;80863:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80886:14;;80863:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;80863:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;80863:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;80863:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;80863:37:0;;;;-1:-1:-1;;;80934:25:0;;;;80747:220;-1:-1:-1;;;80747:220:0:o;61673:111::-;56560:13;:11;:13::i;:::-;61752:24:::1;61764:4;61770:5;61752:11;:24::i;:::-;61673:111:::0;;:::o;83496:2097::-;83601:32;83651:20;83674:8;83683:4;83674:14;;;;;;;;:::i;:::-;;;;;;;;;;83651:37;;;;;;;;83674:14;;;;;;;;83651:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83651:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83674:14;;83651:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83651:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83651:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83651:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;83651:37:0;;;;-1:-1:-1;;;83699:20:0;83722:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;83722:21:0;;;;;;;;;83699:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83651:37;;-1:-1:-1;83699:20:0;;:44;;83722:21;;83699:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;83699:44:0;;;;-1:-1:-1;;;83769:9:0;;;;83811:24;;;;:31;83875:13;;;;83699:44;;-1:-1:-1;83769:9:0;;83857:15;:31;:68;;;;;83910:4;:15;;;83892;:33;83857:68;:89;;;;;83931:4;:14;;;83929:17;83857:89;:109;;;;-1:-1:-1;83950:11:0;;;;:16;;83857:109;83853:1725;;;83983:22;84022:4;-1:-1:-1;;;;;84008:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84008:19:0;;83983:44;;84047:9;84042:502;84062:4;84058:1;:8;84042:502;;;84092:14;84109:34;84129:4;:13;;;84109:15;:19;;:34;;;;:::i;:::-;84092:51;;84162:14;84202:4;:24;;;84227:1;84202:27;;;;;;;;:::i;:::-;;;;;;;84188:4;:11;;;84179:6;:20;;;;:::i;:::-;:50;;;;:::i;:::-;84162:67;;84248:16;84281:4;:17;;;84267:4;:11;;;:31;;;;:::i;:::-;84248:50;-1:-1:-1;84317:15:0;84335:20;:6;84248:50;84335:10;:20::i;:::-;84317:38;;84393:4;84378:11;:19;84374:118;;84432:40;84444:4;:24;;;84469:1;84444:27;;;;;;;;:::i;:::-;;;;;;;84432:7;:11;;:40;;;;:::i;:::-;84422:50;;84374:118;84521:7;84510:5;84516:1;84510:8;;;;;;;;:::i;:::-;;;;;;:18;;;;;84073:471;;;;84068:3;;;;;:::i;:::-;;;;84042:502;;;-1:-1:-1;84565:5:0;-1:-1:-1;84558:12:0;;-1:-1:-1;;;;84558:12:0;83853:1725;84610:4;:15;;;84592;:33;:54;;;;;84631:4;:14;;;84629:17;84592:54;:74;;;;-1:-1:-1;84650:11:0;;;;:16;;84592:74;84588:990;;;84683:22;84722:4;-1:-1:-1;;;;;84708:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84708:19:0;;84683:44;;84747:9;84742:419;84762:4;84758:1;:8;84742:419;;;84808:14;84839:4;:24;;;84864:1;84839:27;;;;;;;;:::i;:::-;;;;;;;84825:4;:11;;;:41;;;;:::i;:::-;84904:11;;;;84808:58;;-1:-1:-1;84885:16:0;84952:20;84808:58;84904:11;84952:10;:20::i;:::-;84934:38;;85010:4;84995:11;:19;84991:118;;85049:40;85061:4;:24;;;85086:1;85061:27;;;;;;;;:::i;85049:40::-;85039:50;;84991:118;85138:7;85127:5;85133:1;85127:8;;;;;;;;:::i;:::-;;;;;;:18;;;;;84773:388;;;84768:3;;;;;:::i;:::-;;;;84742:419;;84588:990;85220:22;85259:4;-1:-1:-1;;;;;85245:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;85245:19:0;;85220:44;;85284:9;85279:261;85299:4;85295:1;:8;85279:261;;;85329:15;85386:4;85371:11;:19;85367:105;;85425:4;:24;;;85450:1;85425:27;;;;;;;;:::i;:::-;;;;;;;85415:37;;85367:105;85517:7;85506:5;85512:1;85506:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;-1:-1:-1;85305:3:0;;;;:::i;:::-;;;;85279:261;;83496:2097;;;;;:::o;52863:223::-;-1:-1:-1;;;;;50810:6:0;50793:23;50801:4;50793:23;50785:80;;;;-1:-1:-1;;;50785:80:0;;;;;;;:::i;:::-;50908:6;-1:-1:-1;;;;;50884:30:0;:20;-1:-1:-1;;;;;;;;;;;43605:65:0;-1:-1:-1;;;;;43605:65:0;;43525:153;50884:20;-1:-1:-1;;;;;50884:30:0;;50876:87;;;;-1:-1:-1;;;50876:87:0;;;;;;;:::i;:::-;52979:36:::1;52997:17;52979;:36::i;:::-;53026:52;53048:17;53067:4;53073;53026:21;:52::i;61792:370::-:0;56560:13;:11;:13::i;:::-;61896:21:::1;61920:8;61929:4;61920:14;;;;;;;;:::i;:::-;;;;;;;;;;;61896:38;;61945:12;61960:4;:9;;;61945:24;;62012:4;61988:13;:20;:28;61980:67;;;::::0;-1:-1:-1;;;61980:67:0;;17819:2:1;61980:67:0::1;::::0;::::1;17801:21:1::0;17858:2;17838:18;;;17831:30;17897:28;17877:18;;;17870:56;17943:18;;61980:67:0::1;17617:350:1::0;61980:67:0::1;62063:9;62058:97;62078:4;62074:1;:8;62058:97;;;62127:13;62141:1;62127:16;;;;;;;;:::i;:::-;;;;;;;62104:4;:17;;62122:1;62104:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:39:::0;;-1:-1:-1;;;;;;62104:39:0::1;-1:-1:-1::0;;;;;62104:39:0;;;::::1;::::0;;;::::1;::::0;;62084:3;::::1;::::0;::::1;:::i;:::-;;;;62058:97;;51940:133:::0;52018:7;51246:4;-1:-1:-1;;;;;51255:6:0;51238:23;;51230:92;;;;-1:-1:-1;;;51230:92:0;;18174:2:1;51230:92:0;;;18156:21:1;18213:2;18193:18;;;18186:30;18252:34;18232:18;;;18225:62;18323:26;18303:18;;;18296:54;18367:19;;51230:92:0;17972:420:1;51230:92:0;-1:-1:-1;;;;;;;;;;;;51940:133:0;:::o;70607:1048::-;56560:13;:11;:13::i;:::-;70830:5:::1;70806:13;:20;:29;:97;;;;;70876:20;:27;70852:13;:20;:51;70806:97;70784:172;;;::::0;-1:-1:-1;;;70784:172:0;;18599:2:1;70784:172:0::1;::::0;::::1;18581:21:1::0;18638:2;18618:18;;;18611:30;18677:27;18657:18;;;18650:55;18722:18;;70784:172:0::1;18397:349:1::0;70784:172:0::1;70967:21;70991:8;71000:4;70991:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;71034:20;;70991:14:::1;::::0;;::::1;;71016:38:::0;;-1:-1:-1;;;;;71016:38:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;71016:38:0;;::::1;::::0;;;::::1;::::0;;71081:18:::1;::::0;::::1;::::0;71065:13:::1;::::0;::::1;:34:::0;-1:-1:-1;71140:15:0;::::1;::::0;71124:11:::1;::::0;::::1;::::0;70991:14;;-1:-1:-1;71124:32:0::1;::::0;:11;:15:::1;:32::i;:::-;71110:11;::::0;::::1;:46:::0;;;71197:13:::1;::::0;::::1;::::0;71181:30:::1;::::0;71110:46;71181:15:::1;:30::i;:::-;71167:11;::::0;::::1;:44:::0;71240:1:::1;71222:15;::::0;::::1;:19:::0;;;71252:13:::1;::::0;::::1;:17:::0;71302:18:::1;::::0;::::1;::::0;71322:20:::1;::::0;::::1;::::0;71344:22:::1;::::0;::::1;::::0;71280:87:::1;::::0;71296:4;;71302:18;;71280:14:::1;:87::i;:::-;71378:24;71390:4;71396:5;71378:11;:24::i;:::-;71418:9;71413:235;71433:5;71429:1;:9;71413:235;;;71483:13;71497:1;71483:16;;;;;;;;:::i;:::-;;;;;;;71460:4;:17;;71478:1;71460:20;;;;;;;;:::i;:::-;;;;;;;;;:39;;;;;-1:-1:-1::0;;;;;71460:39:0::1;;;;;-1:-1:-1::0;;;;;71460:39:0::1;;;;;;71545:20;71566:1;71545:23;;;;;;;;:::i;:::-;;;;;;;71514:4;:25;;71540:1;71514:28;;;;;;;;:::i;:::-;;;;;;;;:54;;;;71613:20;71634:1;71613:23;;;;;;;;:::i;:::-;;;;;;;71583:4;:24;;71608:1;71583:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:53:::0;71440:3;::::1;::::0;::::1;:::i;:::-;;;;71413:235;;;;70773:882;70607:1048:::0;;;;;:::o;57315:103::-;56560:13;:11;:13::i;:::-;57380:30:::1;57407:1;57380:18;:30::i;:::-;57315:103::o:0;75702:1555::-;75768:21;75792:8;75801:4;75792:14;;;;;;;;:::i;:::-;;;;;;;;;75841;;;:8;:14;;;;;;75856:10;75841:26;;;;;;;75900:13;75792:14;;;;;;;75900:13;;;;75792:14;;-1:-1:-1;75882:15:0;:31;:48;;;;-1:-1:-1;75917:13:0;;;;75882:48;75878:102;;;75947:21;;-1:-1:-1;;75947:21:0;;;75878:102;76026:4;:13;;;76008:15;:31;:79;;;;;76074:4;:13;;;76056:15;:31;76008:79;:129;;;;;76122:4;:15;;;76104;:33;76008:129;:162;;;;-1:-1:-1;76156:13:0;;;;76154:16;76008:162;75990:239;;;76197:20;;-1:-1:-1;;76197:20:0;76213:4;76197:20;;;75990:239;76261:13;;;;76239:98;;;;-1:-1:-1;;;76239:98:0;;18953:2:1;76239:98:0;;;18935:21:1;18992:2;18972:18;;;18965:30;19031:34;19011:18;;;19004:62;-1:-1:-1;;;19082:18:1;;;19075:33;19125:19;;76239:98:0;18751:399:1;76239:98:0;76366:1;76356:7;:11;76348:60;;;;-1:-1:-1;;;76348:60:0;;19357:2:1;76348:60:0;;;19339:21:1;19396:2;19376:18;;;19369:30;19435:34;19415:18;;;19408:62;-1:-1:-1;;;19486:18:1;;;19479:34;19530:19;;76348:60:0;19155:400:1;76348:60:0;76455:13;;;;76439:11;;76427:24;;:7;;:11;:24::i;:::-;:41;;76419:92;;;;-1:-1:-1;;;76419:92:0;;;;;;;:::i;:::-;76523:18;76543:11;76558:33;76580:10;76558:21;:33::i;:::-;76522:69;;;;76606:13;76602:162;;;76669:4;76662:3;:11;76636:116;;;;-1:-1:-1;;;76636:116:0;;20169:2:1;76636:116:0;;;20151:21:1;20208:2;20188:18;;;20181:30;20247:34;20227:18;;;20220:62;-1:-1:-1;;;20298:18:1;;;20291:41;20349:19;;76636:116:0;19967:407:1;76636:116:0;76803:10;76774:19;76796:18;;;:6;:18;;;;;;;;:24;;;;;;;;;;;;76831:79;;76874:10;76867:18;;;;:6;:18;;;;;;;;:24;;;;;;;;:31;;-1:-1:-1;;76867:31:0;76894:4;76867:31;;;76831:79;76920:12;76927:4;76920:6;:12::i;:::-;76943:14;;;:31;;;;;;;-1:-1:-1;76943:31:0;;;;;;;;;;-1:-1:-1;;;;;;76943:31:0;76963:10;76943:31;;;76999:11;;:24;;77015:7;76999:15;:24::i;:::-;76985:38;;77048:11;;;;:24;;77064:7;77048:15;:24::i;:::-;77034:11;;;:38;77088:32;;;;;;77094:4;;77100:10;;77112:7;;77088:32;:::i;:::-;;;;;;;;77131:15;;:118;;:15;;;-1:-1:-1;;;;;77131:15:0;77178:10;77211:4;77231:7;77131:32;:118::i;79207:830::-;79255:21;79279:8;79288:4;79279:14;;;;;;;;:::i;:::-;;;;;;;;;;;79255:38;;79327:4;:13;;;79308:15;:32;79304:71;;79357:7;79207:830;:::o;79304:71::-;79421:4;:13;;;79403:15;:31;:79;;;;;79469:4;:13;;;79451:15;:31;79403:79;:129;;;;;79517:4;:15;;;79499;:33;79403:129;79385:244;;;79559:20;;-1:-1:-1;;79594:23:0;79575:4;79594:23;;;79385:244;79675:4;:13;;;79657:15;:31;:81;;;;;79723:4;:15;;;79705;:33;79657:81;79639:197;;;79765:21;;-1:-1:-1;;79801:23:0;;;79639:197;79882:4;:15;;;79864;:33;:69;;;;;79932:1;79914:4;:15;;;:19;79864:69;79846:184;;;79960:21;;-1:-1:-1;;79996:22:0;79960:21;79996:22;;;79244:793;79207:830;:::o;67453:2653::-;67538:21;67562:8;67571:4;67562:14;;;;;;;;:::i;:::-;;;;;;;;;67611;;;:8;:14;;;;;;67626:10;67611:26;;;;;;;67670:15;67562:14;;;;;;;67670:15;;;;67562:14;;-1:-1:-1;67652:15:0;:33;:55;;;;-1:-1:-1;67691:15:0;;;;;;;67689:18;67652:55;67648:110;;;67724:22;;-1:-1:-1;;67724:22:0;;;;;67648:110;67776:15;;;;;;;67768:48;;;;-1:-1:-1;;;67768:48:0;;20581:2:1;67768:48:0;;;20563:21:1;20620:2;20600:18;;;20593:30;-1:-1:-1;;;20639:18:1;;;20632:50;20699:18;;67768:48:0;20379:344:1;67768:48:0;67837:14;;;;;;67835:17;67827:86;;;;-1:-1:-1;;;67827:86:0;;20930:2:1;67827:86:0;;;20912:21:1;20969:2;20949:18;;;20942:30;21008:34;20988:18;;;20981:62;21079:26;21059:18;;;21052:54;21123:19;;67827:86:0;20728:420:1;67827:86:0;67924:16;;;:33;;;;;;;-1:-1:-1;67924:33:0;;;;;;;;;;-1:-1:-1;;;;;;67924:33:0;67946:10;67924:33;;;67968:12;67975:4;67968:6;:12::i;:::-;68006:9;;;;68048:24;;;:31;68107:4;68090:14;;;:21;;-1:-1:-1;;68090:21:0;;;;;;68126:8;:24;;;;;68138:12;68126:24;68122:1977;;;68167:39;68189:4;68195:10;68167:21;:39::i;:::-;68221:45;68235:4;68241:10;68253:12;68221:13;:45::i;:::-;68122:1977;;;68288:8;:25;;;;;68301:12;68300:13;68288:25;68284:1815;;;68335:9;68330:787;68350:4;68346:1;:8;68330:787;;;68380:25;;68394:8;68380:25;68423:14;68454:4;:24;;68479:1;68454:27;;;;;;;;:::i;:::-;;;;;;;;;68440:4;:11;;;:41;;;;:::i;:::-;68519:11;;;;68423:58;;-1:-1:-1;68500:16:0;68567:20;68423:58;68519:11;68567:10;:20::i;:::-;68549:38;;68637:41;68670:7;68637:4;:25;;68663:1;68637:28;;;;;;;;:::i;:::-;;;;;;;;;:32;;:41;;;;:::i;:::-;68606:4;:25;;68632:1;68606:28;;;;;;;;:::i;:::-;;;;;;;;;;:72;68701:15;;;;;:38;;;68735:4;68720:11;:19;68701:38;68697:192;;;68774:40;68786:4;:24;;68811:1;68786:27;;;;;;;;:::i;:::-;;;;;;;;;68774:7;:11;;:40;;;;:::i;:::-;68764:50;;68867:1;68837:4;:24;;68862:1;68837:27;;;;;;;;:::i;:::-;;;;;;;;;;:31;68697:192;68911:11;;68907:195;;68952:34;68960:4;68966:10;68978:7;68952:34;;;;;;;;:::i;:::-;;;;;;;;69009:73;69062:10;69074:7;69027:4;:17;;69045:1;69027:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;69027:20:0;;69009:73;:52;:73::i;:::-;68361:756;;;68330:787;68356:3;;;;:::i;:::-;;;;68330:787;;;;69131:45;69145:4;69151:10;69163:12;69131:13;:45::i;68284:1815::-;69199:8;69198:9;:25;;;;;69211:12;69198:25;69194:905;;;69240:39;69262:4;69268:10;69240:21;:39::i;69194:905::-;69302:8;69301:9;:26;;;;;69315:12;69314:13;69301:26;69297:802;;;69349:9;69344:744;69364:4;69360:1;:8;69344:744;;;69394:14;69425:4;:24;;69450:1;69425:27;;;;;;;;:::i;:::-;;;;;;;;;69411:4;:11;;;:41;;;;:::i;:::-;69490:11;;;;69394:58;;-1:-1:-1;69471:16:0;69538:20;69394:58;69490:11;69538:10;:20::i;:::-;69520:38;;69608:41;69641:7;69608:4;:25;;69634:1;69608:28;;;;;;;;:::i;:41::-;69577:4;:25;;69603:1;69577:28;;;;;;;;:::i;:::-;;;;;;;;;;:72;69672:15;;;;;:38;;;69706:4;69691:11;:19;69672:38;69668:192;;;69745:40;69757:4;:24;;69782:1;69757:27;;;;;;;;:::i;69745:40::-;69735:50;;69838:1;69808:4;:24;;69833:1;69808:27;;;;;;;;:::i;:::-;;;;;;;;;;:31;69668:192;69882:11;;69878:195;;69923:34;69931:4;69937:10;69949:7;69923:34;;;;;;;;:::i;:::-;;;;;;;;69980:73;70033:10;70045:7;69998:4;:17;;70016:1;69998:20;;;;;;;;:::i;69980:73::-;69375:713;;;69370:3;;;;;:::i;:::-;;;;69344:744;;;;67527:2579;;;;67453:2653;;;:::o;72889:409::-;56560:13;:11;:13::i;:::-;72987:18:::1;73008:15;:6:::0;73019:3:::1;73008:10;:15::i;:::-;72987:36;;73034:14;73051:24;73064:10;73051:8;;:12;;:24;;;;:::i;:::-;73034:41:::0;-1:-1:-1;73086:14:0::1;73103:18;:6:::0;73034:41;73103:10:::1;:18::i;:::-;73137:25;::::0;;21327::1;;;21383:2;21368:18;;21361:34;;;73086:35:0;;-1:-1:-1;73137:25:0::1;::::0;21300:18:1;73137:25:0::1;;;;;;;73211:6;::::0;73173:53:::1;::::0;-1:-1:-1;;;;;73173:37:0;;::::1;::::0;73211:6:::1;73219::::0;73173:37:::1;:53::i;:::-;73275:6;::::0;73237:53:::1;::::0;-1:-1:-1;;;;;73237:37:0;;::::1;::::0;73275:6:::1;73283::::0;73237:37:::1;:53::i;75336:178::-:0;56560:13;:11;:13::i;:::-;-1:-1:-1;;;;;75420:21:0;::::1;75412:67;;;::::0;-1:-1:-1;;;75412:67:0;;21608:2:1;75412:67:0::1;::::0;::::1;21590:21:1::0;21647:2;21627:18;;;21620:30;21686:34;21666:18;;;21659:62;-1:-1:-1;;;21737:18:1;;;21730:31;21778:19;;75412:67:0::1;21406:397:1::0;75412:67:0::1;75490:6;:16:::0;;-1:-1:-1;;;;;;75490:16:0::1;-1:-1:-1::0;;;;;75490:16:0;;;::::1;::::0;;;::::1;::::0;;75336:178::o;72228:653::-;56560:13;:11;:13::i;:::-;72325:21:::1;72349:8;72358:4;72349:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;72396:16;::::0;::::1;:23:::0;72349:14;;-1:-1:-1;72447:10:0;72430:171:::1;72463:8;72459:1;:12;72430:171;;;72493:21;72517:14:::0;;;:8:::1;:14;::::0;;;;72532:16:::1;::::0;::::1;:19:::0;;72493:21;;72532:16;72549:1;;72532:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;72532:19:0::1;72517:35:::0;;;::::1;::::0;;;;;;;;72532:19;72567:14:::1;:22:::0;;-1:-1:-1;;72567:22:0::1;::::0;;-1:-1:-1;72473:3:0;::::1;::::0;::::1;:::i;:::-;;;;72430:171;;;-1:-1:-1::0;72613:19:0::1;72635:16;::::0;::::1;72652:12;72663:1;72652:8:::0;:12:::1;:::i;:::-;72635:30;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;72635:30:0::1;::::0;-1:-1:-1;72700:16:0::1;::::0;::::1;72717:15;72635:30:::0;72717:11;:15:::1;:::i;:::-;72700:33;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;72700:33:0;;::::1;::::0;-1:-1:-1;72748:28:0;::::1;::::0;;72744:130:::1;;72793:26;72834:28:::0;;::::1;::::0;:16:::1;::::0;::::1;::::0;:28;;::::1;:::i;:::-;;72778:96;72314:567;;;;72228:653:::0;;;:::o;73941:268::-;56560:13;:11;:13::i;:::-;74035:24:::1;:9:::0;74049;74035:13:::1;:24::i;:::-;74063:3;74035:31;74027:63;;;::::0;-1:-1:-1;;;74027:63:0;;22143:2:1;74027:63:0::1;::::0;::::1;22125:21:1::0;22182:2;22162:18;;;22155:30;-1:-1:-1;;;22201:18:1;;;22194:49;22260:18;;74027:63:0::1;21941:343:1::0;74027:63:0::1;74101:8;:20:::0;;;74132:8:::1;:20:::0;;;74168:33:::1;::::0;;21327:25:1;;;21383:2;21368:18;;21361:34;;;74168:33:0::1;::::0;21300:18:1;74168:33:0::1;;;;;;;73941:268:::0;;:::o;81585:206::-;81696:20;81719:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;81719:22:0;;;;;;;;;81696:45;;81667:16;81696:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81667:16;;81696:20;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;81696:45:0;;;;-1:-1:-1;;;81759:24:0;;;;81585:206;-1:-1:-1;;;;81585:206:0:o;83075:216::-;83140:36;83189:20;83212:8;83221:4;83212:14;;;;;;;;:::i;:::-;;;;;;;;;;83189:37;;;;;;;;83212:14;;;;;;;;83189:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83189:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83212:14;;83189:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83189:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83189:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83189:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;83189:37:0;;;;-1:-1:-1;;;83259:24:0;;;;83075:216;-1:-1:-1;;;83075:216:0:o;73522:411::-;56560:13;:11;:13::i;:::-;73616:21:::1;73640:8;73649:4;73640:14;;;;;;;;:::i;:::-;;;;;;;;;;;73616:38;;73665:12;73680:4;:9;;;73665:24;;73726:4;73708:7;:14;:22;73700:61;;;::::0;-1:-1:-1;;;73700:61:0;;22491:2:1;73700:61:0::1;::::0;::::1;22473:21:1::0;22530:2;22510:18;;;22503:30;22569:28;22549:18;;;22542:56;22615:18;;73700:61:0::1;22289:350:1::0;73700:61:0::1;73777:9;73772:154;73792:4;73788:1;:8;73772:154;;;73849:7;73857:1;73849:10;;;;;;;;:::i;:::-;;;;;;;73818:4;:25;;73844:1;73818:28;;;;;;;;:::i;:::-;;;;;;;;:41;;;;73904:7;73912:1;73904:10;;;;;;;;:::i;:::-;;;;;;;73874:4;:24;;73899:1;73874:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:40:::0;73798:3;::::1;::::0;::::1;:::i;:::-;;;;73772:154;;82070:997:::0;82123:7;82143:20;82166:8;82175:4;82166:14;;;;;;;;:::i;:::-;;;;;;;;;;82143:37;;;;;;;;82166:14;;;;;;;;82143:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;82143:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82166:14;;82143:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;82143:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;82143:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;82143:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82219:1;82195:4;:14;;;:21;:25;82191:869;;;82255:1;82237:15;82287:11;82255:1;;82287:11;:::i;:::-;82271:27;;82313:25;82355:7;-1:-1:-1;;;;;82341:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82341:22:0;;82313:50;;82396:4;:14;;;82411:5;82396:21;;;;;;;;:::i;:::-;;;;;;;82378:8;82387:5;82378:15;;;;;;;;:::i;:::-;;;;;;:39;-1:-1:-1;;;;;82378:39:0;;;-1:-1:-1;;;;;82378:39:0;;;;;82437:9;82432:539;82452:4;:14;;;:21;82448:1;:25;82432:539;;;82505:38;82515:8;82525:4;:14;;;82540:1;82525:17;;;;;;;;:::i;:::-;;;;;;;82505:9;:38::i;:::-;82499:457;;82569:12;82580:1;82569:12;;:::i;:::-;;-1:-1:-1;82612:11:0;82622:1;82569:12;82612:11;:::i;:::-;82604:19;-1:-1:-1;82674:8:0;82730:7;-1:-1:-1;;;;;82716:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82716:22:0;;82705:33;;82766:9;82761:118;82781:8;:15;82777:1;:19;82761:118;;;82844:8;82853:1;82844:11;;;;;;;;:::i;:::-;;;;;;;82830:8;82839:1;82830:11;;;;;;;;:::i;:::-;-1:-1:-1;;;;;82830:25:0;;;:11;;;;;;;;;;;:25;82798:3;;;;:::i;:::-;;;;82761:118;;;;82919:4;:14;;;82934:1;82919:17;;;;;;;;:::i;:::-;;;;;;;82901:8;82910:5;82901:15;;;;;;;;:::i;:::-;;;;;;:35;-1:-1:-1;;;;;82901:35:0;;;-1:-1:-1;;;;;82901:35:0;;;;;82546:410;82499:457;82475:3;;;;:::i;:::-;;;;82432:539;;;-1:-1:-1;82992:15:0;;82070:997;-1:-1:-1;;;;;82070:997:0:o;82191:869::-;-1:-1:-1;83047:1:0;;82070:997;-1:-1:-1;;82070:997:0:o;74217:252::-;74305:6;;-1:-1:-1;;;;;74305:6:0;74291:10;:20;74283:73;;;;-1:-1:-1;;;74283:73:0;;22976:2:1;74283:73:0;;;22958:21:1;23015:2;22995:18;;;22988:30;23054:34;23034:18;;;23027:62;-1:-1:-1;;;23105:18:1;;;23098:38;23153:19;;74283:73:0;22774:404:1;74283:73:0;-1:-1:-1;;;;;74375:21:0;;74367:67;;;;-1:-1:-1;;;74367:67:0;;23385:2:1;74367:67:0;;;23367:21:1;23424:2;23404:18;;;23397:30;23463:34;23443:18;;;23436:62;-1:-1:-1;;;23514:18:1;;;23507:31;23555:19;;74367:67:0;23183:397:1;74367:67:0;74445:6;:16;;-1:-1:-1;;;;;;74445:16:0;-1:-1:-1;;;;;74445:16:0;;;;;;;;;;74217:252::o;62589:1924::-;56560:13;:11;:13::i;:::-;62783:5:::1;62759:13;:20;:29;:84;;;;;62816:20;:27;62792:13;:20;:51;62759:84;62751:122;;;::::0;-1:-1:-1;;;62751:122:0;;23787:2:1;62751:122:0::1;::::0;::::1;23769:21:1::0;23826:2;23806:18;;;23799:30;23865:27;23845:18;;;23838:55;23910:18;;62751:122:0::1;23585:349:1::0;62751:122:0::1;62884:29;62930:5;-1:-1:-1::0;;;;;62916:20:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;62916:20:0::1;;62884:52;;62947:36;63000:5;-1:-1:-1::0;;;;;62986:20:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;62986:20:0::1;;62947:59;;63017:26;63097:15;63076:9;:18;;;:36;63054:117;;;::::0;-1:-1:-1;;;63054:117:0;;24141:2:1;63054:117:0::1;::::0;::::1;24123:21:1::0;24180:2;24160:18;;;24153:30;24219:33;24199:18;;;24192:61;24270:18;;63054:117:0::1;23939:355:1::0;63054:117:0::1;63182:17;63202:44;63225:9;:20;;;63202:9;:18;;;:22;;:44;;;;:::i;:::-;63182:64;;63257:19;63279:37;63293:9;:22;;;63279:9;:13;;:37;;;;:::i;:::-;63257:59;;63337:8;63365:790;;;;;;;;63824:5;63365:790;;;;;;63860:5;63365:790;;;;;;63405:9;:20;;;-1:-1:-1::0;;;;;63365:790:0::1;;;;;63531:1;63365:790;;;;63731:9;:22;;;63365:790;;;;63689:9;63365:790;;;;63482:9;:18;;;63365:790;;;;63890:5;63365:790;;;;63591:9;:18;;;63365:790;;;;63452:1;63365:790;;;;63784:11;63365:790;;;;63561:1;63365:790;;;;63640:9;:20;;;63365:790;;;;64130:9;63365:790;;;;63928:12;63365:790;;;;64089:9;63365:790;;;;63981:19;63365:790;;;;64040:19;63365:790;;::::0;63337:829:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;63337:829:0::1;;;;;-1:-1:-1::0;;;;;63337:829:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;63337:829:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;63337:829:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;63337:829:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;63337:829:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;64192:8:0::1;:15:::0;64177:12:::1;::::0;-1:-1:-1;64192:19:0::1;::::0;64210:1:::1;::::0;64192:19:::1;:::i;:::-;64177:34;;64222:21;64246:8;64255:4;64246:14;;;;;;;;:::i;:::-;;;;;;;;;;;64222:38;;64276:9;64271:235;64291:5;64287:1;:9;64271:235;;;64341:13;64355:1;64341:16;;;;;;;;:::i;:::-;;;;;;;64318:4;:17;;64336:1;64318:20;;;;;;;;:::i;:::-;;;;;;;;;:39;;;;;-1:-1:-1::0;;;;;64318:39:0::1;;;;;-1:-1:-1::0;;;;;64318:39:0::1;;;;;;64403:20;64424:1;64403:23;;;;;;;;:::i;:::-;;;;;;;64372:4;:25;;64398:1;64372:28;;;;;;;;:::i;:::-;;;;;;;;:54;;;;64471:20;64492:1;64471:23;;;;;;;;:::i;:::-;;;;;;;64441:4;:24;;64466:1;64441:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:53:::0;64298:3;::::1;::::0;::::1;:::i;:::-;;;;64271:235;;;;62740:1773;;;;;;;62589:1924:::0;;;;:::o;75048:240::-;56560:13;:11;:13::i;:::-;75221:59:::1;75236:4;75242:9;75253:11;75266:13;75221:14;:59::i;:::-;75048:240:::0;;;;:::o;80975:165::-;81032:16;81061:20;81084:8;81093:4;81084:14;;;;;;;;:::i;:::-;;;;;;;;;;81061:37;;;;;;;;81084:14;;;;;;;;81061:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81061:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81084:14;;81061:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81061:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81061:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81061:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;81061:37:0;;;;-1:-1:-1;;;81116:16:0;;;;80975:165;-1:-1:-1;;;80975:165:0:o;57573:201::-;56560:13;:11;:13::i;:::-;-1:-1:-1;;;;;57662:22:0;::::1;57654:73;;;::::0;-1:-1:-1;;;57654:73:0;;24501:2:1;57654:73:0::1;::::0;::::1;24483:21:1::0;24540:2;24520:18;;;24513:30;24579:34;24559:18;;;24552:62;-1:-1:-1;;;24630:18:1;;;24623:36;24676:19;;57654:73:0::1;24299:402:1::0;57654:73:0::1;57738:28;57757:8;57738:18;:28::i;81902:160::-:0;81956:16;81985:20;82008:8;82017:4;82008:14;;;;;;;;:::i;:::-;;;;;;;;;;81985:37;;;;;;;;82008:14;;;;;;;;81985:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81985:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82008:14;;81985:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81985:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81985:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81985:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;81985:37:0;;;;-1:-1:-1;;;82040:14:0;;;;81902:160;-1:-1:-1;;;81902:160:0:o;56839:132::-;56747:6;;-1:-1:-1;;;;;56747:6:0;54815:10;56903:23;56895:68;;;;-1:-1:-1;;;56895:68:0;;24908:2:1;56895:68:0;;;24890:21:1;;;24927:18;;;24920:30;24986:34;24966:18;;;24959:62;25038:18;;56895:68:0;24706:356:1;29302:188:0;29423:58;;-1:-1:-1;;;;;25259:32:1;;29423:58:0;;;25241:51:1;25308:18;;;25301:34;;;29396:86:0;;29416:5;;-1:-1:-1;;;29446:23:0;25214:18:1;;29423:58:0;;;;-1:-1:-1;;29423:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29423:58:0;-1:-1:-1;;;;;;29423:58:0;;;;;;;;;;29396:19;:86::i;9440:98::-;9498:7;9525:5;9529:1;9525;:5;:::i;:::-;9518:12;9440:98;-1:-1:-1;;;9440:98:0:o;56217:97::-;40984:13;;;;;;;40976:69;;;;-1:-1:-1;;;40976:69:0;;;;;;;:::i;:::-;56280:26:::1;:24;:26::i;49938:68::-:0;40984:13;;;;;;;40976:69;;;;-1:-1:-1;;;40976:69:0;;;;;;;:::i;80045:148::-;56560:13;:11;:13::i;44927:958::-;43027:66;45347:59;;;45343:535;;;45423:37;45442:17;45423:18;:37::i;45343:535::-;45526:17;-1:-1:-1;;;;;45497:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45497:63:0;;;;;;;;-1:-1:-1;;45497:63:0;;;;;;;;;;;;:::i;:::-;;;45493:306;;45727:56;;-1:-1:-1;;;45727:56:0;;26149:2:1;45727:56:0;;;26131:21:1;26188:2;26168:18;;;26161:30;26227:34;26207:18;;;26200:62;-1:-1:-1;;;26278:18:1;;;26271:44;26332:19;;45727:56:0;25947:410:1;45493:306:0;-1:-1:-1;;;;;;;;;;;45611:28:0;;45603:82;;;;-1:-1:-1;;;45603:82:0;;26564:2:1;45603:82:0;;;26546:21:1;26603:2;26583:18;;;26576:30;26642:34;26622:18;;;26615:62;-1:-1:-1;;;26693:18:1;;;26686:39;26742:19;;45603:82:0;26362:405:1;45603:82:0;45561:140;45813:53;45831:17;45850:4;45856:9;45813:17;:53::i;61230:435::-;61300:21;61324:8;61333:4;61324:14;;;;;;;;:::i;:::-;;;;;;;;;;;61300:38;;61349:29;61395:5;-1:-1:-1;;;;;61381:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61381:20:0;;61349:52;;61412:36;61465:5;-1:-1:-1;;;;;61451:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61451:20:0;-1:-1:-1;61482:9:0;;;:17;;;61510:32;;61412:59;;-1:-1:-1;61510:32:0;;:17;;;;:32;;;;;:::i;:::-;-1:-1:-1;61553:47:0;;;;:25;;;;:47;;;;;:::i;:::-;-1:-1:-1;61611:46:0;;;;:24;;;;:46;;;;;:::i;9821:98::-;9879:7;9906:5;9910:1;9906;:5;:::i;10577:98::-;10635:7;10662:5;10666:1;10662;:5;:::i;74477:563::-;74641:21;74665:8;74674:4;74665:14;;;;;;;;:::i;:::-;;;;;;;;;;;74641:38;;74724:15;74712:9;:27;74690:108;;;;-1:-1:-1;;;74690:108:0;;24141:2:1;74690:108:0;;;24123:21:1;24180:2;24160:18;;;24153:30;24219:33;24199:18;;;24192:61;24270:18;;74690:108:0;23939:355:1;74690:108:0;74809:13;;;:25;;;74845:15;;;:29;;;74901:26;74825:9;74863:11;74901:13;:26::i;:::-;74885:13;;;:42;;;74938:17;;;:33;;;75000:32;;74958:13;75000:17;:32::i;:::-;74982:15;;;;:50;-1:-1:-1;;;;74477:563:0:o;57934:191::-;58027:6;;;-1:-1:-1;;;;;58044:17:0;;;-1:-1:-1;;;;;;58044:17:0;;;;;;;58077:40;;58027:6;;;58044:17;58027:6;;58077:40;;58008:16;;58077:40;57997:128;57934:191;:::o;80323:416::-;80391:18;80411:11;80440:14;80435:297;80465:8;:15;80456:24;;80435:297;;;80511:8;:15;:19;80507:214;;-1:-1:-1;;;;;80573:12:0;;80551:19;80573:12;;;:6;:12;;;;;;;;:20;;;;;;;;;;;80612:94;;;;80663:14;80679:6;;-1:-1:-1;80323:416:0;-1:-1:-1;;80323:416:0:o;80612:94::-;80532:189;80507:214;80482:8;;;;:::i;:::-;;;;80435:297;;;;80323:416;;;:::o;29735:216::-;29874:68;;-1:-1:-1;;;;;27252:15:1;;;29874:68:0;;;27234:34:1;27304:15;;27284:18;;;27277:43;27336:18;;;27329:34;;;29847:96:0;;29867:5;;-1:-1:-1;;;29897:27:0;27169:18:1;;29874:68:0;26994:375:1;77265:1203:0;77351:20;77374:8;77383:4;77374:14;;;;;;;;:::i;:::-;;;;;;;;;;77351:37;;;;;;;;77374:14;;;;;;;;77351:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77351:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77374:14;;77351:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77351:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77351:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77351:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77351:37:0;;;;-1:-1:-1;;;77414:9:0;;;;77399:12;77458:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;77458:27:0;;;;;;;;;77518:24;;;:31;77351:37;;-1:-1:-1;77414:9:0;;77518:31;77564:16;;;77560:458;;77638:4;-1:-1:-1;;;;;77624:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77624:19:0;-1:-1:-1;77597:46:0;;;;:24;;;;:46;;;;;;:::i;:::-;;77663:9;77658:349;77682:4;77678:1;:8;77658:349;;;77712:14;77743:4;:24;;;77768:1;77743:27;;;;;;;;:::i;:::-;;;;;;;77729:4;:11;;;:41;;;;:::i;:::-;77808:11;;;;77712:58;;-1:-1:-1;77789:16:0;77856:20;77712:58;77808:11;77856:10;:20::i;:::-;77838:38;-1:-1:-1;77899:11:0;;77895:97;;77965:7;77935:4;:24;;77960:1;77935:27;;;;;;;;:::i;:::-;;;;;;;;;;:37;77895:97;77693:314;;;77688:3;;;;;:::i;:::-;;;;77658:349;;;;77560:458;78047:4;78032:11;:19;78028:433;;78073:9;78068:382;78092:4;78088:1;:8;78068:382;;;78122:14;78153:4;:24;;;78178:1;78153:27;;;;;;;;:::i;:::-;;;;;;;78139:4;:11;;;:41;;;;:::i;:::-;78218:11;;;;78122:58;;-1:-1:-1;78199:16:0;78266:20;78122:58;78218:11;78266:10;:20::i;:::-;78248:38;-1:-1:-1;78309:11:0;;78305:130;;78375:40;78407:7;78375:4;:24;;78400:1;78375:27;;;;;;;;:::i;:::-;;;;;;;;;:31;;:40;;;;:::i;:::-;78345:4;:24;;78370:1;78345:27;;;;;;;;:::i;:::-;;;;;;;;;;:70;78305:130;78103:347;;;78098:3;;;;;:::i;:::-;;;;78068:382;;64690:2561;64787:21;64811:8;64820:4;64811:14;;;;;;;;:::i;:::-;;;;;;;;;64860;;;:8;:14;;;;;;-1:-1:-1;;;;;64860:27:0;;;;;;;;;;64811:14;;;;;;64913:9;;;;64955:24;;;:31;64811:14;;-1:-1:-1;64860:27:0;;65028:12;65023:194;;65057:14;65088:4;:24;;65113:1;65088:27;;;;;;;;:::i;:::-;;;;;;;;;65074:4;:11;;;:41;;;;:::i;:::-;65149:11;;;;65057:58;;-1:-1:-1;65185:20:0;65057:58;65149:11;65185:10;:20::i;:::-;65175:30;;65042:175;;65023:194;65245:1;65231:11;:15;:38;;;;;65265:4;65250:11;:19;65231:38;65227:713;;;65286:18;65307:40;65319:4;:24;;65344:1;65319:27;;;;;;;;:::i;:::-;;;;;;;;;65307:7;:11;;:40;;;;:::i;:::-;65399:11;;65286:61;;-1:-1:-1;65362:19:0;;65384:27;;65286:61;;65384:14;:27::i;:::-;65362:49;;65445:4;:13;;;65430:11;:28;65426:499;;65489:40;65501:4;:24;;65526:1;65501:27;;;;;;;;:::i;:::-;;;;;;;;;65489:7;:11;;:40;;;;:::i;:::-;65479:50;;65578:1;65548:4;:24;;65573:1;65548:27;;;;;;;;:::i;:::-;;;;;;;;;;:31;65426:499;;;65619:4;:13;;;65605:11;:27;65601:324;;;65683:40;65715:7;65683:4;:24;;65708:1;65683:27;;;;;;;;:::i;:40::-;65653:4;:24;;65678:1;65653:27;;;;;;;;:::i;:::-;;;;;;;;;:70;;;;65776:11;;65758:13;;;;:30;;:17;:30::i;:::-;65742:46;;65817:5;65807:15;;65871:38;65903:5;65871:4;:24;;65896:1;65871:27;;;;;;;;:::i;:38::-;65841:4;:24;;65866:1;65841:27;;;;;;;;:::i;:::-;;;;;;;;;;:68;-1:-1:-1;65601:324:0;65271:669;;65227:713;65954:11;65969:1;65954:16;65950:598;;65987:14;66018:4;:24;;66043:1;66018:27;;;;;;;;:::i;:::-;;;;;;;;;66004:4;:11;;;:41;;;;:::i;:::-;66079:11;;;;65987:58;;-1:-1:-1;66115:20:0;65987:58;66079:11;66115:10;:20::i;:::-;66184:11;;66105:30;;-1:-1:-1;66150:19:0;;66172:24;;66105:30;;66172:11;:24::i;:::-;66150:46;;66229:4;:13;;;66215:11;:27;66211:322;;;66297:11;;66279:13;;;;66263;;66279:30;;:13;:17;:30::i;:::-;66263:46;-1:-1:-1;66328:14:0;66345:18;:7;66263:46;66345:11;:18::i;:::-;66328:35;;66392:5;66382:15;;66457:4;-1:-1:-1;;;;;66443:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66443:19:0;-1:-1:-1;66416:46:0;;;;:24;;;;:46;;;;;;:::i;:::-;;66511:6;66481:4;:24;;66506:1;66481:27;;;;;;;;:::i;:::-;;;;;;;;;;:36;-1:-1:-1;;66211:322:0;65972:576;;;65950:598;66562:11;;66558:686;;66608:15;;;;:28;;66628:7;66608:19;:28::i;:::-;66590:15;;;:46;66687:13;;;;66671:11;;66659:24;;:7;;:11;:24::i;:::-;:41;;66651:92;;;;-1:-1:-1;;;66651:92:0;;;;;;;:::i;:::-;66759:18;66779:11;66794:34;66816:11;66794:21;:34::i;:::-;66758:70;;;;66847:13;66843:120;;;66896:4;66889:3;:11;66881:66;;;;-1:-1:-1;;;66881:66:0;;27576:2:1;66881:66:0;;;27558:21:1;27615:2;27595:18;;;27588:30;27654:34;27634:18;;;27627:62;-1:-1:-1;;;27705:18:1;;;27698:40;27755:19;;66881:66:0;27374:406:1;66881:66:0;-1:-1:-1;;;;;66999:19:0;;66977;66999;;;:6;:19;;;;;;;;:25;;;;;;;;;;;;67039:88;;-1:-1:-1;;;;;67079:19:0;;;;;;:6;:19;;;;;;;;:25;;;;;;;;:32;;-1:-1:-1;;67079:32:0;67107:4;67079:32;;;67039:88;67155:11;;:24;;67171:7;67155:15;:24::i;:::-;67141:38;;67199:33;;;;;;67205:4;;67211:11;;67224:7;;67199:33;:::i;:::-;;;;;;;;66575:669;;;64776:2475;;;;;64690:2561;;;:::o;10178:98::-;10236:7;10263:5;10267:1;10263;:5;:::i;81317:260::-;81397:4;81419:9;81414:133;81434:5;:12;81430:1;:16;81414:133;;;81484:4;-1:-1:-1;;;;;81472:16:0;:5;81478:1;81472:8;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;81472:16:0;;81468:68;;81516:4;81509:11;;;;;81468:68;81448:3;;;;:::i;:::-;;;;81414:133;;;-1:-1:-1;81564:5:0;;81317:260;-1:-1:-1;;;81317:260:0:o;33702:660::-;34137:23;34163:69;34191:4;34163:69;;;;;;;;;;;;;;;;;34171:5;-1:-1:-1;;;;;34163:27:0;;;:69;;;;;:::i;:::-;34137:95;;34251:10;:17;34272:1;34251:22;:56;;;;34288:10;34277:30;;;;;;;;;;;;:::i;:::-;34243:111;;;;-1:-1:-1;;;34243:111:0;;28237:2:1;34243:111:0;;;28219:21:1;28276:2;28256:18;;;28249:30;28315:34;28295:18;;;28288:62;-1:-1:-1;;;28366:18:1;;;28359:40;28416:19;;34243:111:0;28035:406:1;56322:113:0;40984:13;;;;;;;40976:69;;;;-1:-1:-1;;;40976:69:0;;;;;;;:::i;:::-;56395:32:::1;54815:10:::0;56395:18:::1;:32::i;43774:284::-:0;-1:-1:-1;;;;;20514:19:0;;;43848:106;;;;-1:-1:-1;;;43848:106:0;;28648:2:1;43848:106:0;;;28630:21:1;28687:2;28667:18;;;28660:30;28726:34;28706:18;;;28699:62;-1:-1:-1;;;28777:18:1;;;28770:43;28830:19;;43848:106:0;28446:409:1;43848:106:0;-1:-1:-1;;;;;;;;;;;43965:85:0;;-1:-1:-1;;;;;;43965:85:0;-1:-1:-1;;;;;43965:85:0;;;;;;;;;;43774:284::o;44467:281::-;44576:29;44587:17;44576:10;:29::i;:::-;44634:1;44620:4;:11;:15;:28;;;;44639:9;44620:28;44616:125;;;44665:64;44705:17;44724:4;44665:39;:64::i;22974:229::-;23111:12;23143:52;23165:6;23173:4;23179:1;23182:12;23143:21;:52::i;:::-;23136:59;22974:229;-1:-1:-1;;;;22974:229:0:o;44171:155::-;44238:37;44257:17;44238:18;:37::i;:::-;44291:27;;-1:-1:-1;;;;;44291:27:0;;;;;;;;44171:155;:::o;25611:200::-;25694:12;25726:77;25747:6;25755:4;25726:77;;;;;;;;;;;;;;;;;:20;:77::i;24060:455::-;24230:12;24288:5;24263:21;:30;;24255:81;;;;-1:-1:-1;;;24255:81:0;;29062:2:1;24255:81:0;;;29044:21:1;29101:2;29081:18;;;29074:30;29140:34;29120:18;;;29113:62;-1:-1:-1;;;29191:18:1;;;29184:36;29237:19;;24255:81:0;28860:402:1;24255:81:0;24348:12;24362:23;24389:6;-1:-1:-1;;;;;24389:11:0;24408:5;24415:4;24389:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24347:73;;;;24438:69;24465:6;24473:7;24482:10;24494:12;24438:26;:69::i;:::-;24431:76;24060:455;-1:-1:-1;;;;;;;24060:455:0:o;26005:332::-;26150:12;26176;26190:23;26217:6;-1:-1:-1;;;;;26217:19:0;26237:4;26217:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26175:67;;;;26260:69;26287:6;26295:7;26304:10;26316:12;26260:26;:69::i;:::-;26253:76;26005:332;-1:-1:-1;;;;;;26005:332:0:o;26633:644::-;26818:12;26847:7;26843:427;;;26875:10;:17;26896:1;26875:22;26871:290;;-1:-1:-1;;;;;20514:19:0;;;27085:60;;;;-1:-1:-1;;;27085:60:0;;30016:2:1;27085:60:0;;;29998:21:1;30055:2;30035:18;;;30028:30;30094:31;30074:18;;;30067:59;30143:18;;27085:60:0;29814:353:1;27085:60:0;-1:-1:-1;27182:10:0;27175:17;;26843:427;27225:33;27233:10;27245:12;27980:17;;:21;27976:388;;28212:10;28206:17;28269:15;28256:10;28252:2;28248:19;28241:44;27976:388;28339:12;28332:20;;-1:-1:-1;;;28332:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;332:456;409:6;417;425;478:2;466:9;457:7;453:23;449:32;446:52;;;494:1;491;484:12;446:52;533:9;520:23;552:31;577:5;552:31;:::i;:::-;602:5;-1:-1:-1;659:2:1;644:18;;631:32;672:33;631:32;672:33;:::i;:::-;332:456;;724:7;;-1:-1:-1;;;778:2:1;763:18;;;;750:32;;332:456::o;793:180::-;852:6;905:2;893:9;884:7;880:23;876:32;873:52;;;921:1;918;911:12;873:52;-1:-1:-1;944:23:1;;793:180;-1:-1:-1;793:180:1:o;2099:658::-;2270:2;2322:21;;;2392:13;;2295:18;;;2414:22;;;2241:4;;2270:2;2493:15;;;;2467:2;2452:18;;;2241:4;2536:195;2550:6;2547:1;2544:13;2536:195;;;2615:13;;-1:-1:-1;;;;;2611:39:1;2599:52;;2706:15;;;;2671:12;;;;2647:1;2565:9;2536:195;;;-1:-1:-1;2748:3:1;;2099:658;-1:-1:-1;;;;;;2099:658:1:o;2762:127::-;2823:10;2818:3;2814:20;2811:1;2804:31;2854:4;2851:1;2844:15;2878:4;2875:1;2868:15;2894:253;2966:2;2960:9;3008:4;2996:17;;-1:-1:-1;;;;;3028:34:1;;3064:22;;;3025:62;3022:88;;;3090:18;;:::i;:::-;3126:2;3119:22;2894:253;:::o;3152:275::-;3223:2;3217:9;3288:2;3269:13;;-1:-1:-1;;3265:27:1;3253:40;;-1:-1:-1;;;;;3308:34:1;;3344:22;;;3305:62;3302:88;;;3370:18;;:::i;:::-;3406:2;3399:22;3152:275;;-1:-1:-1;3152:275:1:o;3432:747::-;3488:5;3536:4;3524:9;3519:3;3515:19;3511:30;3508:50;;;3554:1;3551;3544:12;3508:50;3587:2;3581:9;3629:4;3621:6;3617:17;3700:6;3688:10;3685:22;-1:-1:-1;;;;;3652:10:1;3649:34;3646:62;3643:88;;;3711:18;;:::i;:::-;3747:2;3740:22;3780:6;-1:-1:-1;3780:6:1;3810:23;;3842:33;3810:23;3842:33;:::i;:::-;3899:7;3891:6;3884:23;;3968:2;3957:9;3953:18;3940:32;3935:2;3927:6;3923:15;3916:57;4034:2;4023:9;4019:18;4006:32;4001:2;3993:6;3989:15;3982:57;4100:2;4089:9;4085:18;4072:32;4067:2;4059:6;4055:15;4048:57;4167:3;4156:9;4152:19;4139:33;4133:3;4125:6;4121:16;4114:59;;3432:747;;;;:::o;4184:183::-;4244:4;-1:-1:-1;;;;;4269:6:1;4266:30;4263:56;;;4299:18;;:::i;:::-;-1:-1:-1;4344:1:1;4340:14;4356:4;4336:25;;4184:183::o;4372:737::-;4426:5;4479:3;4472:4;4464:6;4460:17;4456:27;4446:55;;4497:1;4494;4487:12;4446:55;4533:6;4520:20;4559:4;4583:60;4599:43;4639:2;4599:43;:::i;:::-;4583:60;:::i;:::-;4677:15;;;4763:1;4759:10;;;;4747:23;;4743:32;;;4708:12;;;;4787:15;;;4784:35;;;4815:1;4812;4805:12;4784:35;4851:2;4843:6;4839:15;4863:217;4879:6;4874:3;4871:15;4863:217;;;4959:3;4946:17;4976:31;5001:5;4976:31;:::i;:::-;5020:18;;5058:12;;;;4896;;4863:217;;;-1:-1:-1;5098:5:1;4372:737;-1:-1:-1;;;;;;4372:737:1:o;5114:662::-;5168:5;5221:3;5214:4;5206:6;5202:17;5198:27;5188:55;;5239:1;5236;5229:12;5188:55;5275:6;5262:20;5301:4;5325:60;5341:43;5381:2;5341:43;:::i;5325:60::-;5419:15;;;5505:1;5501:10;;;;5489:23;;5485:32;;;5450:12;;;;5529:15;;;5526:35;;;5557:1;5554;5547:12;5526:35;5593:2;5585:6;5581:15;5605:142;5621:6;5616:3;5613:15;5605:142;;;5687:17;;5675:30;;5725:12;;;;5638;;5605:142;;5781:1366;5986:6;5994;6002;6010;6018;6062:9;6053:7;6049:23;6092:3;6088:2;6084:12;6081:32;;;6109:1;6106;6099:12;6081:32;6133:4;6129:2;6125:13;6122:33;;;6151:1;6148;6141:12;6122:33;;6177:22;;:::i;:::-;6235:9;6222:23;6215:5;6208:38;6306:2;6295:9;6291:18;6278:32;6273:2;6266:5;6262:14;6255:56;6363:2;6352:9;6348:18;6335:32;6376:33;6401:7;6376:33;:::i;:::-;6436:2;6425:14;;6418:31;6501:2;6486:18;;6473:32;6514:33;6473:32;6514:33;:::i;:::-;6574:2;6563:14;;6556:31;6567:5;-1:-1:-1;6630:58:1;6680:7;6673:4;6658:20;;6630:58;:::i;:::-;6620:68;;6735:3;6724:9;6720:19;6707:33;6697:43;;6791:3;6780:9;6776:19;6763:33;-1:-1:-1;;;;;6856:2:1;6848:6;6845:14;6842:34;;;6872:1;6869;6862:12;6842:34;6895:61;6948:7;6939:6;6928:9;6924:22;6895:61;:::i;:::-;6885:71;;7009:3;6998:9;6994:19;6981:33;6965:49;;7039:2;7029:8;7026:16;7023:36;;;7055:1;7052;7045:12;7023:36;;7078:63;7133:7;7122:8;7111:9;7107:24;7078:63;:::i;:::-;7068:73;;;5781:1366;;;;;;;;:::o;7152:247::-;7211:6;7264:2;7252:9;7243:7;7239:23;7235:32;7232:52;;;7280:1;7277;7270:12;7232:52;7319:9;7306:23;7338:31;7363:5;7338:31;:::i;7404:632::-;7575:2;7627:21;;;7697:13;;7600:18;;;7719:22;;;7546:4;;7575:2;7798:15;;;;7772:2;7757:18;;;7546:4;7841:169;7855:6;7852:1;7849:13;7841:169;;;7916:13;;7904:26;;7985:15;;;;7950:12;;;;7877:1;7870:9;7841:169;;8041:248;8109:6;8117;8170:2;8158:9;8149:7;8145:23;8141:32;8138:52;;;8186:1;8183;8176:12;8138:52;-1:-1:-1;;8209:23:1;;;8279:2;8264:18;;;8251:32;;-1:-1:-1;8041:248:1:o;8294:315::-;8362:6;8370;8423:2;8411:9;8402:7;8398:23;8394:32;8391:52;;;8439:1;8436;8429:12;8391:52;8475:9;8462:23;8452:33;;8535:2;8524:9;8520:18;8507:32;8548:31;8573:5;8548:31;:::i;:::-;8598:5;8588:15;;;8294:315;;;;;:::o;8614:898::-;8691:6;8699;8752:2;8740:9;8731:7;8727:23;8723:32;8720:52;;;8768:1;8765;8758:12;8720:52;8807:9;8794:23;8826:31;8851:5;8826:31;:::i;:::-;8876:5;-1:-1:-1;8900:2:1;8938:18;;;8925:32;-1:-1:-1;;;;;9006:14:1;;;9003:34;;;9033:1;9030;9023:12;9003:34;9071:6;9060:9;9056:22;9046:32;;9116:7;9109:4;9105:2;9101:13;9097:27;9087:55;;9138:1;9135;9128:12;9087:55;9174:2;9161:16;9196:2;9192;9189:10;9186:36;;;9202:18;;:::i;:::-;9244:53;9287:2;9268:13;;-1:-1:-1;;9264:27:1;9260:36;;9244:53;:::i;:::-;9231:66;;9320:2;9313:5;9306:17;9360:7;9355:2;9350;9346;9342:11;9338:20;9335:33;9332:53;;;9381:1;9378;9371:12;9332:53;9436:2;9431;9427;9423:11;9418:2;9411:5;9407:14;9394:45;9480:1;9475:2;9470;9463:5;9459:14;9455:23;9448:34;;9501:5;9491:15;;;;;8614:898;;;;;:::o;9517:416::-;9610:6;9618;9671:2;9659:9;9650:7;9646:23;9642:32;9639:52;;;9687:1;9684;9677:12;9639:52;9723:9;9710:23;9700:33;;9784:2;9773:9;9769:18;9756:32;-1:-1:-1;;;;;9803:6:1;9800:30;9797:50;;;9843:1;9840;9833:12;9797:50;9866:61;9919:7;9910:6;9899:9;9895:22;9866:61;:::i;:::-;9856:71;;;9517:416;;;;;:::o;10328:854::-;10500:6;10508;10516;10524;10532;10585:3;10573:9;10564:7;10560:23;10556:33;10553:53;;;10602:1;10599;10592:12;10553:53;10638:9;10625:23;10615:33;;10667:56;10715:7;10710:2;10699:9;10695:18;10667:56;:::i;:::-;10657:66;;10770:3;10759:9;10755:19;10742:33;10732:43;;10826:3;10815:9;10811:19;10798:33;-1:-1:-1;;;;;10891:2:1;10883:6;10880:14;10877:34;;;10907:1;10904;10897:12;10877:34;10930:61;10983:7;10974:6;10963:9;10959:22;10930:61;:::i;:::-;10920:71;;11044:3;11033:9;11029:19;11016:33;11000:49;;11074:2;11064:8;11061:16;11058:36;;;11090:1;11087;11080:12;11187:118;11273:5;11266:13;11259:21;11252:5;11249:32;11239:60;;11295:1;11292;11285:12;11310:444;11381:6;11389;11397;11450:2;11438:9;11429:7;11425:23;11421:32;11418:52;;;11466:1;11463;11456:12;11418:52;11502:9;11489:23;11479:33;;11562:2;11551:9;11547:18;11534:32;11575:28;11597:5;11575:28;:::i;:::-;11622:5;-1:-1:-1;11679:2:1;11664:18;;11651:32;11692:30;11651:32;11692:30;:::i;:::-;11741:7;11731:17;;;11310:444;;;;;:::o;12022:383::-;12099:6;12107;12115;12168:2;12156:9;12147:7;12143:23;12139:32;12136:52;;;12184:1;12181;12174:12;12136:52;12220:9;12207:23;12197:33;;12280:2;12269:9;12265:18;12252:32;12293:31;12318:5;12293:31;:::i;12410:316::-;12487:6;12495;12503;12556:2;12544:9;12535:7;12531:23;12527:32;12524:52;;;12572:1;12569;12562:12;12524:52;-1:-1:-1;;12595:23:1;;;12665:2;12650:18;;12637:32;;-1:-1:-1;12716:2:1;12701:18;;;12688:32;;12410:316;-1:-1:-1;12410:316:1:o;12731:416::-;12824:6;12832;12885:2;12873:9;12864:7;12860:23;12856:32;12853:52;;;12901:1;12898;12891:12;12853:52;12937:9;12924:23;12914:33;;12998:2;12987:9;12983:18;12970:32;-1:-1:-1;;;;;13017:6:1;13014:30;13011:50;;;13057:1;13054;13047:12;13011:50;13080:61;13133:7;13124:6;13113:9;13109:22;13080:61;:::i;13152:786::-;13315:6;13323;13331;13339;13392:3;13380:9;13371:7;13367:23;13363:33;13360:53;;;13409:1;13406;13399:12;13360:53;13432:47;13471:7;13460:9;13432:47;:::i;:::-;13422:57;;13526:3;13515:9;13511:19;13498:33;13488:43;;13582:3;13571:9;13567:19;13554:33;-1:-1:-1;;;;;13647:2:1;13639:6;13636:14;13633:34;;;13663:1;13660;13653:12;13633:34;13686:61;13739:7;13730:6;13719:9;13715:22;13686:61;:::i;:::-;13676:71;;13800:3;13789:9;13785:19;13772:33;13756:49;;13830:2;13820:8;13817:16;13814:36;;;13846:1;13843;13836:12;13814:36;;13869:63;13924:7;13913:8;13902:9;13898:24;13869:63;:::i;:::-;13859:73;;;13152:786;;;;;;;:::o;13943:385::-;14029:6;14037;14045;14053;14106:3;14094:9;14085:7;14081:23;14077:33;14074:53;;;14123:1;14120;14113:12;14074:53;-1:-1:-1;;14146:23:1;;;14216:2;14201:18;;14188:32;;-1:-1:-1;14267:2:1;14252:18;;14239:32;;14318:2;14303:18;14290:32;;-1:-1:-1;13943:385:1;-1:-1:-1;13943:385:1:o;14333:315::-;14401:6;14409;14462:2;14450:9;14441:7;14437:23;14433:32;14430:52;;;14478:1;14475;14468:12;14430:52;14517:9;14504:23;14536:31;14561:5;14536:31;:::i;:::-;14586:5;14638:2;14623:18;;;;14610:32;;-1:-1:-1;;;14333:315:1:o;14845:127::-;14906:10;14901:3;14897:20;14894:1;14887:31;14937:4;14934:1;14927:15;14961:4;14958:1;14951:15;15382:345;15584:25;;;-1:-1:-1;;;;;15645:32:1;;;;15640:2;15625:18;;15618:60;15709:2;15694:18;;15687:34;15572:2;15557:18;;15382:345::o;16346:408::-;16548:2;16530:21;;;16587:2;16567:18;;;16560:30;16626:34;16621:2;16606:18;;16599:62;-1:-1:-1;;;16692:2:1;16677:18;;16670:42;16744:3;16729:19;;16346:408::o;16759:::-;16961:2;16943:21;;;17000:2;16980:18;;;16973:30;17039:34;17034:2;17019:18;;17012:62;-1:-1:-1;;;17105:2:1;17090:18;;17083:42;17157:3;17142:19;;16759:408::o;17172:127::-;17233:10;17228:3;17224:20;17221:1;17214:31;17264:4;17261:1;17254:15;17288:4;17285:1;17278:15;17304:168;17377:9;;;17408;;17425:15;;;17419:22;;17405:37;17395:71;;17446:18;;:::i;17477:135::-;17516:3;17537:17;;;17534:43;;17557:18;;:::i;:::-;-1:-1:-1;17604:1:1;17593:13;;17477:135::o;19560:402::-;19762:2;19744:21;;;19801:2;19781:18;;;19774:30;19840:34;19835:2;19820:18;;19813:62;-1:-1:-1;;;19906:2:1;19891:18;;19884:36;19952:3;19937:19;;19560:402::o;21808:128::-;21875:9;;;21896:11;;;21893:37;;;21910:18;;:::i;22644:125::-;22709:9;;;22730:10;;;22727:36;;;22743:18;;:::i;25346:407::-;25548:2;25530:21;;;25587:2;25567:18;;;25560:30;25626:34;25621:2;25606:18;;25599:62;-1:-1:-1;;;25692:2:1;25677:18;;25670:41;25743:3;25728:19;;25346:407::o;25758:184::-;25828:6;25881:2;25869:9;25860:7;25856:23;25852:32;25849:52;;;25897:1;25894;25887:12;25849:52;-1:-1:-1;25920:16:1;;25758:184;-1:-1:-1;25758:184:1:o;26772:217::-;26812:1;26838;26828:132;;26882:10;26877:3;26873:20;26870:1;26863:31;26917:4;26914:1;26907:15;26945:4;26942:1;26935:15;26828:132;-1:-1:-1;26974:9:1;;26772:217::o;27785:245::-;27852:6;27905:2;27893:9;27884:7;27880:23;27876:32;27873:52;;;27921:1;27918;27911:12;27873:52;27953:9;27947:16;27972:28;27994:5;27972:28;:::i;29267:250::-;29352:1;29362:113;29376:6;29373:1;29370:13;29362:113;;;29452:11;;;29446:18;29433:11;;;29426:39;29398:2;29391:10;29362:113;;;-1:-1:-1;;29509:1:1;29491:16;;29484:27;29267:250::o;29522:287::-;29651:3;29689:6;29683:13;29705:66;29764:6;29759:3;29752:4;29744:6;29740:17;29705:66;:::i;:::-;29787:16;;;;;29522:287;-1:-1:-1;;29522:287:1:o;30172:396::-;30321:2;30310:9;30303:21;30284:4;30353:6;30347:13;30396:6;30391:2;30380:9;30376:18;30369:34;30412:79;30484:6;30479:2;30468:9;30464:18;30459:2;30451:6;30447:15;30412:79;:::i;:::-;30552:2;30531:15;-1:-1:-1;;30527:29:1;30512:45;;;;30559:2;30508:54;;30172:396;-1:-1:-1;;30172:396:1:o
Swarm Source
ipfs://6305e49c12677390d8120f490458db2c6520c55df5678fd1ea7c796a3a986bce
Loading...
Loading
Loading...
Loading
OVERVIEW
Implemented a new staking contract that incorporates upgradable codes. This update introduces compounding native token functionality and enhances harvest variation functions.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.